From dave@fromorbit.com Sun Feb 1 15:43:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AB8837F67 for ; Sun, 1 Feb 2015 15:43:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2768CAC003 for ; Sun, 1 Feb 2015 13:43:21 -0800 (PST) X-ASG-Debug-ID: 1422826998-04cbb0416abcc950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0uz0BRvGvaJyJ8Mh for ; Sun, 01 Feb 2015 13:43:19 -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: AtIHAF2dzlR5LHOVPGdsb2JhbABbgwaHVqtsAQEBAQEBBplCRAEBAQEBBgEBAQE4O4RpO4ECAweIWa1ppRGGBIkdhQcFhUuTeo4Igz2BZwELAYIwKoE0gT8BAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003p8-2d for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007wy-1Q for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Date: Mon, 2 Feb 2015 08:42:58 +1100 X-ASG-Orig-Subj: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Message-Id: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422826999 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi folks, After listening to Eric swear about the per-cpu counter implementation we have for the in-core superblock all week, I decided the best thing to do woul dbe to simply replace them with generic per-cpu counters. The current icsb counters were implemented long before we had generic counter infrastructure, and it's remained that way because if it ain't broke.... Anyway, we do have a couple of issues with the counters to do with enforcing the maximum inode count on small filesystems. Fixing these problems is what Eric spend time swearing about. Anyway, to cut a long story short, there is nothing unique about the inode counters - neither the allocated inode count nor the free inode count need to be accurate at zero as they are not used for ENOSPC enforcement at this limit, and the allocated inode count doesn't need to be perfectly accurate at the maximum count, either. Hence we can just replace them with generic per-cpu coutners without second thoughts. The free block counter is a little different. We need to be able to accurately determine zero free blocks due to ENOSPC detection requirements, and this is where all the complexity came from in the existing infrastructure. The key technique that the existing infrastructure uses to be accurate at zero is that it goes back to a global lock and serialisation as it approaches zero. hence we trade off scalability for accuracy at ENOSPC. It turns out we can play the same trick with the generic per-cpu counter infrastructure. They allow a customised "batch" value, which is the threshold at which the local per-cpu counter is folded back into the global counter. By setting this batch to 1 we effectively serialise all modifications to the counter as any change will be over the batch fold threshold. Hence we can add a simple check on the global counter value and switch from large batch values to small values as we approach the zero threshold. This patchset has passed xfstests with no regressions, and there are no performance impacts measurable on my 16p test VM on inode allocation/freeing intensive workloads, nor on delayed allocation workloads (which reserve a block at a time and hence trigger extremely frequent updates) at IO rates of over 1GB/s. it also fixes the maxicount enforcement issue on small filesystems that started this off... SGI: this is a change that you are going to want to test for regressions on one of your large machines that has multiple GB/s of IO bandwidth. I don't expect there to be any problems, but if there are we might need to tweak batch thresholds based on CPU count...... This patchset is based on for-next, as it is dependent on the superblock logging changes that are already queued for the next cycle. Diffstat is as follows: fs/xfs/libxfs/xfs_bmap.c | 16 +- fs/xfs/libxfs/xfs_format.h | 96 +------ fs/xfs/libxfs/xfs_ialloc.c | 6 +- fs/xfs/libxfs/xfs_sb.c | 43 +-- fs/xfs/xfs_fsops.c | 16 +- fs/xfs/xfs_iomap.c | 3 +- fs/xfs/xfs_linux.h | 9 - fs/xfs/xfs_log_recover.c | 5 +- fs/xfs/xfs_mount.c | 730 ++++++----------------------------------------- fs/xfs/xfs_mount.h | 67 +---- fs/xfs/xfs_rtalloc.c | 6 +- fs/xfs/xfs_super.c | 101 +++++-- fs/xfs/xfs_super.h | 83 ++++++ fs/xfs/xfs_trans.c | 19 +- 14 files changed, 309 insertions(+), 891 deletions(-) Comments, thoughts? -Dave. From dave@fromorbit.com Sun Feb 1 15:43:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 201FB7F69 for ; Sun, 1 Feb 2015 15:43:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93FCAAC001 for ; Sun, 1 Feb 2015 13:43:24 -0800 (PST) X-ASG-Debug-ID: 1422827001-04cbb04169bcc950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9YNnbFfjuZcX932V for ; Sun, 01 Feb 2015 13:43:22 -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: AkgIAF2dzlR5LHOVPGdsb2JhbABbgwaBK4Yrq2wBAQEBAQEGmC+BE0QBAQEBAQYBAQEBODuEDQEFDhkvDyQIGDE5AwcUGYgs0nqGBIkdCkKEOwWFS5N6hUeFRIY6gWcBCwEwHIFkKjGBAwEeBoEaAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003pB-49 for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007xB-3E for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: use generic percpu counters for free inode counter Date: Mon, 2 Feb 2015 08:43:01 +1100 X-ASG-Orig-Subj: [PATCH 3/5] xfs: use generic percpu counters for free inode counter Message-Id: <1422826983-29570-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> References: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422827001 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. The free inode counter is not used for any limit enforcement - the per-AG free inode counters are used during allocation to determine if there are inode available for allocation. Hence we don't need any of the complexity of the hand-rolled counters and we can simply replace them with generic per-cpu counters similar to the inode counter. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_sb.c | 8 ++++--- fs/xfs/xfs_fsops.c | 2 +- fs/xfs/xfs_mount.c | 62 +++++++++++++++++--------------------------------- fs/xfs/xfs_super.c | 4 +++- fs/xfs/xfs_super.h | 2 +- fs/xfs/xfs_trans.c | 5 ++-- 6 files changed, 33 insertions(+), 50 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 7bfa527..42e5c89 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -359,7 +359,8 @@ __xfs_sb_from_disk( to->sb_imax_pct = from->sb_imax_pct; if (percpu_counter_initialized(&to->sb_icount)) percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); - to->sb_ifree = be64_to_cpu(from->sb_ifree); + if (percpu_counter_initialized(&to->sb_icount)) + percpu_counter_set(&to->sb_ifree, be64_to_cpu(from->sb_ifree)); to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); to->sb_frextents = be64_to_cpu(from->sb_frextents); to->sb_uquotino = be64_to_cpu(from->sb_uquotino); @@ -494,7 +495,7 @@ xfs_sb_to_disk( to->sb_inprogress = from->sb_inprogress; to->sb_imax_pct = from->sb_imax_pct; to->sb_icount = cpu_to_be64(percpu_counter_sum(&from->sb_icount)); - to->sb_ifree = cpu_to_be64(from->sb_ifree); + to->sb_ifree = cpu_to_be64(percpu_counter_sum(&from->sb_ifree)); to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); to->sb_frextents = cpu_to_be64(from->sb_frextents); @@ -540,6 +541,7 @@ xfs_sb_verify( /* don't need to validate icount here */ sb.sb_icount.counters = NULL; + sb.sb_ifree.counters = NULL; /* * Use call variant which doesn't convert quota flags from disk @@ -751,7 +753,7 @@ xfs_initialize_perag_data( * Overwrite incore superblock counters with just-read data */ spin_lock(&mp->m_sb_lock); - sbp->sb_ifree = ifree; + percpu_counter_set(&sbp->sb_ifree, ifree); percpu_counter_set(&sbp->sb_icount, ialloc); sbp->sb_fdblocks = bfree + bfreelst + btree; spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 9cc34d2..619a9f3 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -632,11 +632,11 @@ xfs_fs_counts( { xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); + cnt->freeino = percpu_counter_read_positive(&mp->m_sb.sb_ifree); spin_lock(&mp->m_sb_lock); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; - cnt->freeino = mp->m_sb.sb_ifree; spin_unlock(&mp->m_sb_lock); return 0; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index df5ec55..8e8924f 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1136,13 +1136,12 @@ xfs_mod_incore_sb_unlocked( } return 0; case XFS_SBS_IFREE: - lcounter = (long long)mp->m_sb.sb_ifree; - lcounter += delta; - if (lcounter < 0) { + percpu_counter_add(&mp->m_sb.sb_ifree, delta); + if (percpu_counter_compare(&mp->m_sb.sb_ifree, 0) < 0) { ASSERT(0); + percpu_counter_add(&mp->m_sb.sb_ifree, -delta); return -EINVAL; } - mp->m_sb.sb_ifree = lcounter; return 0; case XFS_SBS_FDBLOCKS: lcounter = (long long) @@ -1288,9 +1287,9 @@ xfs_mod_incore_sb( int status; #ifdef HAVE_PERCPU_SB - ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); + ASSERT(field != XFS_SBS_FDBLOCKS); #endif - if (field == XFS_SBS_ICOUNT) + if (field == XFS_SBS_ICOUNT || field == XFS_SBS_IFREE) return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); spin_lock(&mp->m_sb_lock); @@ -1495,7 +1494,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); break; @@ -1506,15 +1504,12 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - mp->m_sb.sb_ifree += cntp->icsb_ifree; mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); xfs_icsb_unlock(mp); @@ -1536,11 +1531,13 @@ xfs_icsb_init_counters( if (i) return ENOMEM; + i = percpu_counter_init(&mp->m_sb.sb_ifree, 0, GFP_KERNEL); + if (i) + goto free_icount; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (!mp->m_sb_cnts) { - percpu_counter_destroy(&mp->m_sb.sb_icount); - return -ENOMEM; - } + if (!mp->m_sb_cnts) + goto free_ifree; for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); @@ -1562,6 +1559,12 @@ xfs_icsb_init_counters( #endif /* CONFIG_HOTPLUG_CPU */ return 0; + +free_ifree: + percpu_counter_destroy(&mp->m_sb.sb_ifree); +free_icount: + percpu_counter_destroy(&mp->m_sb.sb_icount); + return -ENOMEM; } void @@ -1574,7 +1577,6 @@ xfs_icsb_reinit_counters( * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); } @@ -1589,6 +1591,7 @@ xfs_icsb_destroy_counters( } percpu_counter_destroy(&mp->m_sb.sb_icount); + percpu_counter_destroy(&mp->m_sb.sb_ifree); mutex_destroy(&mp->m_icsb_mutex); } @@ -1652,7 +1655,6 @@ xfs_icsb_count( for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_ifree += cntp->icsb_ifree; cnt->icsb_fdblocks += cntp->icsb_fdblocks; } @@ -1665,7 +1667,7 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); return test_bit(field, &mp->m_icsb_counters); } @@ -1676,7 +1678,7 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); /* * If we are already disabled, then there is nothing to do @@ -1695,9 +1697,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_IFREE: - mp->m_sb.sb_ifree = cnt.icsb_ifree; - break; case XFS_SBS_FDBLOCKS: mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; break; @@ -1719,15 +1718,12 @@ xfs_icsb_enable_counter( xfs_icsb_cnts_t *cntp; int i; - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_IFREE: - cntp->icsb_ifree = count + resid; - break; case XFS_SBS_FDBLOCKS: cntp->icsb_fdblocks = count + resid; break; @@ -1750,8 +1746,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_count(mp, &cnt, flags); - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) - mp->m_sb.sb_ifree = cnt.icsb_ifree; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; } @@ -1803,12 +1797,6 @@ xfs_icsb_balance_counter_locked( /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_IFREE: - count = mp->m_sb.sb_ifree; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; case XFS_SBS_FDBLOCKS: count = mp->m_sb.sb_fdblocks; resid = do_div(count, weight); @@ -1863,14 +1851,6 @@ again: } switch (field) { - case XFS_SBS_IFREE: - lcounter = icsbp->icsb_ifree; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_ifree = lcounter; - break; - case XFS_SBS_FDBLOCKS: BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 408e2fe..c17bfa4 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1088,6 +1088,7 @@ xfs_fs_statfs( struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; __uint64_t sb_icount; + __uint64_t sb_ifree; xfs_extlen_t lsize; __int64_t ffree; @@ -1100,6 +1101,7 @@ xfs_fs_statfs( xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); sb_icount = percpu_counter_sum(&sbp->sb_icount); + sb_ifree = percpu_counter_sum(&sbp->sb_ifree); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; @@ -1116,7 +1118,7 @@ xfs_fs_statfs( mp->m_maxicount); /* make sure statp->f_ffree does not underflow */ - ffree = statp->f_files - (sb_icount - sbp->sb_ifree); + ffree = statp->f_files - (sb_icount - sb_ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index fa5603c..6efc7a2 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -98,8 +98,8 @@ struct xfs_sb { /* statistics */ struct percpu_counter sb_icount; /* allocated inodes */ + struct percpu_counter sb_ifree; /* free inodes */ - __uint64_t sb_ifree; /* free inodes */ __uint64_t sb_fdblocks; /* free data blocks */ __uint64_t sb_frextents; /* free realtime extents */ xfs_ino_t sb_uquotino; /* user quota inode */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index d78b0ae..c54d4b7 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -560,8 +560,7 @@ xfs_trans_unreserve_and_mod_sb( } if (ifreedelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, - ifreedelta, rsvd); + error = xfs_mod_incore_sb(mp, XFS_SBS_IFREE, ifreedelta, rsvd); if (error) goto out_undo_icount; } @@ -630,7 +629,7 @@ xfs_trans_unreserve_and_mod_sb( out_undo_ifreecount: if (ifreedelta) - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); + xfs_mod_incore_sb(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); out_undo_icount: if (idelta) xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); -- 2.0.0 From dave@fromorbit.com Sun Feb 1 15:43:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0BC867F67 for ; Sun, 1 Feb 2015 15:43:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF6C98F8037 for ; Sun, 1 Feb 2015 13:43:23 -0800 (PST) X-ASG-Debug-ID: 1422826998-04cbb0416abcc950002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6o8U9h8WEdra6pSf for ; Sun, 01 Feb 2015 13:43:21 -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: AkcIAF2dzlR5LHOVPGdsb2JhbABbgwaBK4Yrq2wBAQEBAQEGmUJEAQEBAQEGAQEBATg7hA0BBQ4ZLw8kCEk5AwcUGYgs0nqGBIknhH0FhUuTeosLhjqBZwELAYIwKjGBAwEeBoEaAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003pA-3d for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007x6-2l for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: use generic percpu counters for inode counter Date: Mon, 2 Feb 2015 08:43:00 +1100 X-ASG-Orig-Subj: [PATCH 2/5] xfs: use generic percpu counters for inode counter Message-Id: <1422826983-29570-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> References: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422827000 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. There are some warts around the use of them for the inode counter as the hand rolled counter is designed to be accurate at zero, but has no specific accurracy at any other value. This design causes problems for the maximum inode count threshold enforcement, as there is no trigger that balances the counters as they get close tothe maximum threshold. Instead of designing new triggers for balancing, just replace the handrolled per-cpu counter with a generic counter directly in the incore superblock. This enables us to update the counter throught eh normal superblock modification funtions, rather than having to go around them and then fall back to the normal modificaiton functions if the per-cpu nature of the counter has been turned off. The result is a much simpler counter implementation that can be used accurately across it's entire range of values rather than just near to zero values. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_ialloc.c | 6 +++-- fs/xfs/libxfs/xfs_sb.c | 10 +++++--- fs/xfs/xfs_fsops.c | 3 ++- fs/xfs/xfs_mount.c | 58 +++++++++++++++++----------------------------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_super.c | 8 ++++--- fs/xfs/xfs_super.h | 4 +++- fs/xfs/xfs_trans.c | 5 ++-- 8 files changed, 44 insertions(+), 51 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..95a1762 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -376,7 +376,8 @@ xfs_ialloc_ag_alloc( */ newlen = args.mp->m_ialloc_inos; if (args.mp->m_maxicount && - args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) + percpu_counter_read(&args.mp->m_sb.sb_icount) + newlen > + args.mp->m_maxicount) return -ENOSPC; args.minlen = args.maxlen = args.mp->m_ialloc_blks; /* @@ -1340,7 +1341,8 @@ xfs_dialloc( * inode. */ if (mp->m_maxicount && - mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { + percpu_counter_read(&mp->m_sb.sb_icount) + mp->m_ialloc_inos > + mp->m_maxicount) { noroom = 1; okalloc = 0; } diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 4cf335b..7bfa527 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -357,7 +357,8 @@ __xfs_sb_from_disk( to->sb_rextslog = from->sb_rextslog; to->sb_inprogress = from->sb_inprogress; to->sb_imax_pct = from->sb_imax_pct; - to->sb_icount = be64_to_cpu(from->sb_icount); + if (percpu_counter_initialized(&to->sb_icount)) + percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); to->sb_ifree = be64_to_cpu(from->sb_ifree); to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); to->sb_frextents = be64_to_cpu(from->sb_frextents); @@ -492,7 +493,7 @@ xfs_sb_to_disk( to->sb_rextslog = from->sb_rextslog; to->sb_inprogress = from->sb_inprogress; to->sb_imax_pct = from->sb_imax_pct; - to->sb_icount = cpu_to_be64(from->sb_icount); + to->sb_icount = cpu_to_be64(percpu_counter_sum(&from->sb_icount)); to->sb_ifree = cpu_to_be64(from->sb_ifree); to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); to->sb_frextents = cpu_to_be64(from->sb_frextents); @@ -537,6 +538,9 @@ xfs_sb_verify( struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_sb sb; + /* don't need to validate icount here */ + sb.sb_icount.counters = NULL; + /* * Use call variant which doesn't convert quota flags from disk * format, because xfs_mount_validate_sb checks the on-disk flags. @@ -748,7 +752,7 @@ xfs_initialize_perag_data( */ spin_lock(&mp->m_sb_lock); sbp->sb_ifree = ifree; - sbp->sb_icount = ialloc; + percpu_counter_set(&sbp->sb_icount, ialloc); sbp->sb_fdblocks = bfree + bfreelst + btree; spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index f711452..9cc34d2 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -631,11 +631,12 @@ xfs_fs_counts( xfs_fsop_counts_t *cnt) { xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); + spin_lock(&mp->m_sb_lock); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; cnt->freeino = mp->m_sb.sb_ifree; - cnt->allocino = mp->m_sb.sb_icount; spin_unlock(&mp->m_sb_lock); return 0; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 6015f54..df5ec55 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1127,13 +1127,13 @@ xfs_mod_incore_sb_unlocked( */ switch (field) { case XFS_SBS_ICOUNT: - lcounter = (long long)mp->m_sb.sb_icount; - lcounter += delta; - if (lcounter < 0) { + /* deltas are +/-64, hence the large batch size of 128. */ + __percpu_counter_add(&mp->m_sb.sb_icount, delta, 128); + if (percpu_counter_compare(&mp->m_sb.sb_icount, 0) < 0) { ASSERT(0); + percpu_counter_add(&mp->m_sb.sb_icount, -delta); return -EINVAL; } - mp->m_sb.sb_icount = lcounter; return 0; case XFS_SBS_IFREE: lcounter = (long long)mp->m_sb.sb_ifree; @@ -1288,8 +1288,11 @@ xfs_mod_incore_sb( int status; #ifdef HAVE_PERCPU_SB - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); + ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); #endif + if (field == XFS_SBS_ICOUNT) + return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); + spin_lock(&mp->m_sb_lock); status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); spin_unlock(&mp->m_sb_lock); @@ -1492,7 +1495,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); @@ -1504,17 +1506,14 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - mp->m_sb.sb_icount += cntp->icsb_icount; mp->m_sb.sb_ifree += cntp->icsb_ifree; mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); @@ -1533,9 +1532,15 @@ xfs_icsb_init_counters( xfs_icsb_cnts_t *cntp; int i; + i = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); + if (i) + return ENOMEM; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (mp->m_sb_cnts == NULL) + if (!mp->m_sb_cnts) { + percpu_counter_destroy(&mp->m_sb.sb_icount); return -ENOMEM; + } for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); @@ -1569,7 +1574,6 @@ xfs_icsb_reinit_counters( * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); @@ -1583,6 +1587,9 @@ xfs_icsb_destroy_counters( unregister_hotcpu_notifier(&mp->m_icsb_notifier); free_percpu(mp->m_sb_cnts); } + + percpu_counter_destroy(&mp->m_sb.sb_icount); + mutex_destroy(&mp->m_icsb_mutex); } @@ -1645,7 +1652,6 @@ xfs_icsb_count( for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_icount += cntp->icsb_icount; cnt->icsb_ifree += cntp->icsb_ifree; cnt->icsb_fdblocks += cntp->icsb_fdblocks; } @@ -1659,7 +1665,7 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); return test_bit(field, &mp->m_icsb_counters); } @@ -1670,7 +1676,7 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); /* * If we are already disabled, then there is nothing to do @@ -1689,9 +1695,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_ICOUNT: - mp->m_sb.sb_icount = cnt.icsb_icount; - break; case XFS_SBS_IFREE: mp->m_sb.sb_ifree = cnt.icsb_ifree; break; @@ -1716,15 +1719,12 @@ xfs_icsb_enable_counter( xfs_icsb_cnts_t *cntp; int i; - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_ICOUNT: - cntp->icsb_icount = count + resid; - break; case XFS_SBS_IFREE: cntp->icsb_ifree = count + resid; break; @@ -1750,8 +1750,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_count(mp, &cnt, flags); - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_ICOUNT)) - mp->m_sb.sb_icount = cnt.icsb_icount; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) mp->m_sb.sb_ifree = cnt.icsb_ifree; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) @@ -1805,12 +1803,6 @@ xfs_icsb_balance_counter_locked( /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_ICOUNT: - count = mp->m_sb.sb_icount; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; case XFS_SBS_IFREE: count = mp->m_sb.sb_ifree; resid = do_div(count, weight); @@ -1871,14 +1863,6 @@ again: } switch (field) { - case XFS_SBS_ICOUNT: - lcounter = icsbp->icsb_icount; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_icount = lcounter; - break; - case XFS_SBS_IFREE: lcounter = icsbp->icsb_ifree; lcounter += delta; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9d62134..9499a8f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -41,7 +41,6 @@ struct xfs_da_geometry; typedef struct xfs_icsb_cnts { uint64_t icsb_fdblocks; uint64_t icsb_ifree; - uint64_t icsb_icount; unsigned long icsb_flags; } xfs_icsb_cnts_t; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7583044..408e2fe 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1087,6 +1087,7 @@ xfs_fs_statfs( struct xfs_sb *sbp = &mp->m_sb; struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; + __uint64_t sb_icount; xfs_extlen_t lsize; __int64_t ffree; @@ -1098,6 +1099,7 @@ xfs_fs_statfs( statp->f_fsid.val[1] = (u32)(id >> 32); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + sb_icount = percpu_counter_sum(&sbp->sb_icount); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; @@ -1106,15 +1108,15 @@ xfs_fs_statfs( statp->f_bfree = statp->f_bavail = sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); fakeinos = statp->f_bfree << sbp->sb_inopblog; - statp->f_files = - MIN(sbp->sb_icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); + statp->f_files = MIN(sb_icount + fakeinos, + (__uint64_t)XFS_MAXINUMBER); if (mp->m_maxicount) statp->f_files = min_t(typeof(statp->f_files), statp->f_files, mp->m_maxicount); /* make sure statp->f_ffree does not underflow */ - ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); + ffree = statp->f_files - (sb_icount - sbp->sb_ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index a02236b..fa5603c 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -96,7 +96,9 @@ struct xfs_sb { __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ __uint8_t sb_imax_pct; /* max % of fs for inode space */ /* statistics */ - __uint64_t sb_icount; /* allocated inodes */ + + struct percpu_counter sb_icount; /* allocated inodes */ + __uint64_t sb_ifree; /* free inodes */ __uint64_t sb_fdblocks; /* free data blocks */ __uint64_t sb_frextents; /* free realtime extents */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index eb90cd5..d78b0ae 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -554,8 +554,7 @@ xfs_trans_unreserve_and_mod_sb( } if (idelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, - idelta, rsvd); + error = xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, idelta, rsvd); if (error) goto out_undo_fdblocks; } @@ -634,7 +633,7 @@ out_undo_ifreecount: xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); out_undo_icount: if (idelta) - xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd); + xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); out_undo_fdblocks: if (blkdelta) xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); -- 2.0.0 From dave@fromorbit.com Sun Feb 1 15:43:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5663C7F69 for ; Sun, 1 Feb 2015 15:43:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB5A5AC003 for ; Sun, 1 Feb 2015 13:43:26 -0800 (PST) X-ASG-Debug-ID: 1422827001-04cbb04169bcc950002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id I35BW0DGK5NyvdQy for ; Sun, 01 Feb 2015 13:43:23 -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: AkgIAF2dzlR5LHOVPGdsb2JhbABbgwaBK4Yrq2wBAQEBAQEGmC+BE0QBAQEBAQYBAQEBODuEDQEFJy8zCBgxOQMHFBmILNJ6hgSJJ0KEOwWFS5N6hUeDVogogWcBCwEtAxyBZCoxgQOBPwEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003p9-3E for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007x1-2G for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Date: Mon, 2 Feb 2015 08:42:59 +1100 X-ASG-Orig-Subj: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-Id: <1422826983-29570-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> References: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422827003 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With the removal of the bitfield based superblock logging code, the in-core struct xfs_sb is no longer tied to the on-disk format. That means it can be moved out of xfs_format.h and into a kernel specific header. This allows the in-core superblock change size, shape and structure to suit the requirements of the in-memory processing rather than be constrained by the on-disk layout. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_format.h | 96 ++-------------------------------------------- fs/xfs/libxfs/xfs_sb.c | 4 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_mount.c | 18 ++++----- fs/xfs/xfs_mount.h | 2 +- fs/xfs/xfs_rtalloc.c | 6 +-- fs/xfs/xfs_super.c | 6 +-- fs/xfs/xfs_super.h | 81 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 103 insertions(+), 112 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 8eb7189..2c8d11f 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -91,98 +91,7 @@ struct xfs_ifork; XFS_SB_VERSION2_FTYPE) /* - * Superblock - in core version. Must match the ondisk version below. - * Must be padded to 64 bit alignment. - */ -typedef struct xfs_sb { - __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ - __uint32_t sb_blocksize; /* logical block size, bytes */ - xfs_rfsblock_t sb_dblocks; /* number of data blocks */ - xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */ - xfs_rtblock_t sb_rextents; /* number of realtime extents */ - uuid_t sb_uuid; /* file system unique id */ - xfs_fsblock_t sb_logstart; /* starting block of log if internal */ - xfs_ino_t sb_rootino; /* root inode number */ - xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */ - xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */ - xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */ - xfs_agblock_t sb_agblocks; /* size of an allocation group */ - xfs_agnumber_t sb_agcount; /* number of allocation groups */ - xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */ - xfs_extlen_t sb_logblocks; /* number of log blocks */ - __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ - __uint16_t sb_sectsize; /* volume sector size, bytes */ - __uint16_t sb_inodesize; /* inode size, bytes */ - __uint16_t sb_inopblock; /* inodes per block */ - char sb_fname[12]; /* file system name */ - __uint8_t sb_blocklog; /* log2 of sb_blocksize */ - __uint8_t sb_sectlog; /* log2 of sb_sectsize */ - __uint8_t sb_inodelog; /* log2 of sb_inodesize */ - __uint8_t sb_inopblog; /* log2 of sb_inopblock */ - __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ - __uint8_t sb_rextslog; /* log2 of sb_rextents */ - __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ - __uint8_t sb_imax_pct; /* max % of fs for inode space */ - /* statistics */ - /* - * These fields must remain contiguous. If you really - * want to change their layout, make sure you fix the - * code in xfs_trans_apply_sb_deltas(). - */ - __uint64_t sb_icount; /* allocated inodes */ - __uint64_t sb_ifree; /* free inodes */ - __uint64_t sb_fdblocks; /* free data blocks */ - __uint64_t sb_frextents; /* free realtime extents */ - /* - * End contiguous fields. - */ - xfs_ino_t sb_uquotino; /* user quota inode */ - xfs_ino_t sb_gquotino; /* group quota inode */ - __uint16_t sb_qflags; /* quota flags */ - __uint8_t sb_flags; /* misc. flags */ - __uint8_t sb_shared_vn; /* shared version number */ - xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */ - __uint32_t sb_unit; /* stripe or raid unit */ - __uint32_t sb_width; /* stripe or raid width */ - __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ - __uint8_t sb_logsectlog; /* log2 of the log sector size */ - __uint16_t sb_logsectsize; /* sector size for the log, bytes */ - __uint32_t sb_logsunit; /* stripe unit size for the log */ - __uint32_t sb_features2; /* additional feature bits */ - - /* - * bad features2 field as a result of failing to pad the sb structure to - * 64 bits. Some machines will be using this field for features2 bits. - * Easiest just to mark it bad and not use it for anything else. - * - * This is not kept up to date in memory; it is always overwritten by - * the value in sb_features2 when formatting the incore superblock to - * the disk buffer. - */ - __uint32_t sb_bad_features2; - - /* version 5 superblock fields start here */ - - /* feature masks */ - __uint32_t sb_features_compat; - __uint32_t sb_features_ro_compat; - __uint32_t sb_features_incompat; - __uint32_t sb_features_log_incompat; - - __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; - - xfs_ino_t sb_pquotino; /* project quota inode */ - xfs_lsn_t sb_lsn; /* last write sequence */ - - /* must be padded to 64 bit alignment */ -} xfs_sb_t; - -#define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc) - -/* - * Superblock - on disk version. Must match the in core version above. - * Must be padded to 64 bit alignment. + * Superblock - on disk version. Must be padded to 64 bit alignment. */ typedef struct xfs_dsb { __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ @@ -255,6 +164,7 @@ typedef struct xfs_dsb { __be32 sb_features_incompat; __be32 sb_features_log_incompat; +#define XFS_SB_CRC_OFF offsetof(struct xfs_dsb, sb_crc) __le32 sb_crc; /* superblock crc */ __be32 sb_pad; @@ -562,7 +472,7 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +static inline int xfs_sb_version_hasfinobt(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe9..4cf335b 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -107,7 +107,7 @@ xfs_perag_put( STATIC int xfs_mount_validate_sb( xfs_mount_t *mp, - xfs_sb_t *sbp, + struct xfs_sb *sbp, bool check_inprogress, bool check_version) { @@ -714,7 +714,7 @@ xfs_initialize_perag_data( { xfs_agnumber_t index; xfs_perag_t *pag; - xfs_sb_t *sbp = &mp->m_sb; + struct xfs_sb *sbp = &mp->m_sb; uint64_t ifree = 0; uint64_t ialloc = 0; uint64_t bfree = 0; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a5a945f..81d7f24 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4410,7 +4410,7 @@ xlog_do_recover( { int error; xfs_buf_t *bp; - xfs_sb_t *sbp; + struct xfs_sb *sbp; /* * First replay the images in the log. diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4fa80e6..6015f54 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -166,7 +166,7 @@ xfs_free_perag( */ int xfs_sb_validate_fsb_count( - xfs_sb_t *sbp, + struct xfs_sb *sbp, __uint64_t nblocks) { ASSERT(PAGE_SHIFT >= sbp->sb_blocklog); @@ -189,7 +189,7 @@ xfs_initialize_perag( xfs_perag_t *pag; xfs_agino_t agino; xfs_ino_t ino; - xfs_sb_t *sbp = &mp->m_sb; + struct xfs_sb *sbp = &mp->m_sb; int error = -ENOMEM; /* @@ -368,7 +368,7 @@ release_buf: STATIC int xfs_update_alignment(xfs_mount_t *mp) { - xfs_sb_t *sbp = &(mp->m_sb); + struct xfs_sb *sbp = &(mp->m_sb); if (mp->m_dalign) { /* @@ -434,7 +434,7 @@ xfs_update_alignment(xfs_mount_t *mp) STATIC void xfs_set_maxicount(xfs_mount_t *mp) { - xfs_sb_t *sbp = &(mp->m_sb); + struct xfs_sb *sbp = &(mp->m_sb); __uint64_t icount; if (sbp->sb_imax_pct) { @@ -461,7 +461,7 @@ xfs_set_maxicount(xfs_mount_t *mp) STATIC void xfs_set_rw_sizes(xfs_mount_t *mp) { - xfs_sb_t *sbp = &(mp->m_sb); + struct xfs_sb *sbp = &(mp->m_sb); int readio_log, writeio_log; if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { @@ -630,7 +630,7 @@ int xfs_mountfs( xfs_mount_t *mp) { - xfs_sb_t *sbp = &(mp->m_sb); + struct xfs_sb *sbp = &(mp->m_sb); xfs_inode_t *rip; __uint64_t resblks; uint quotamount = 0; @@ -642,9 +642,9 @@ xfs_mountfs( /* * Check for a mismatched features2 values. Older kernels read & wrote * into the wrong sb offset for sb_features2 on some platforms due to - * xfs_sb_t not being 64bit size aligned when sb_features2 was added, - * which made older superblock reading/writing routines swap it as a - * 64-bit value. + * struct xfs_sb not being 64bit size aligned when sb_features2 was + * added, which made older superblock reading/writing routines swap it + * as a 64-bit value. * * For backwards compatibility, we make both slots equal. * diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a5b2ff8..9d62134 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -81,7 +81,7 @@ typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ struct xfs_ail *m_ail; /* fs active log item list */ - xfs_sb_t m_sb; /* copy of fs superblock */ + struct xfs_sb m_sb; /* copy of fs superblock */ spinlock_t m_sb_lock; /* sb counter lock */ struct xfs_buf *m_sb_bp; /* buffer for superblock */ char *m_fsname; /* filesystem name */ diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index f2079b6..7e15ec9 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -897,10 +897,10 @@ xfs_growfs_rt( xfs_extlen_t nrsumblocks; /* new number of summary blocks */ uint nrsumlevels; /* new rt summary levels */ uint nrsumsize; /* new size of rt summary, bytes */ - xfs_sb_t *nsbp; /* new superblock */ + struct xfs_sb *nsbp; /* new superblock */ xfs_extlen_t rbmblocks; /* current number of rt bitmap blocks */ xfs_extlen_t rsumblocks; /* current number of rt summary blks */ - xfs_sb_t *sbp; /* old superblock */ + struct xfs_sb *sbp; /* old superblock */ xfs_fsblock_t sumbno; /* summary block number */ sbp = &mp->m_sb; @@ -1227,7 +1227,7 @@ xfs_rtmount_inodes( xfs_mount_t *mp) /* file system mount structure */ { int error; /* error return value */ - xfs_sb_t *sbp; + struct xfs_sb *sbp; sbp = &mp->m_sb; if (sbp->sb_rbmino == NULLFSINO) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 40d2ac5..7583044 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -602,7 +602,7 @@ xfs_set_inode32(struct xfs_mount *mp, xfs_agnumber_t agcount) { xfs_agnumber_t index = 0; xfs_agnumber_t maxagi = 0; - xfs_sb_t *sbp = &mp->m_sb; + struct xfs_sb *sbp = &mp->m_sb; xfs_agnumber_t max_metadata; xfs_agino_t agino; xfs_ino_t ino; @@ -1084,7 +1084,7 @@ xfs_fs_statfs( struct kstatfs *statp) { struct xfs_mount *mp = XFS_M(dentry->d_sb); - xfs_sb_t *sbp = &mp->m_sb; + struct xfs_sb *sbp = &mp->m_sb; struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; xfs_extlen_t lsize; @@ -1198,7 +1198,7 @@ xfs_fs_remount( char *options) { struct xfs_mount *mp = XFS_M(sb); - xfs_sb_t *sbp = &mp->m_sb; + struct xfs_sb *sbp = &mp->m_sb; substring_t args[MAX_OPT_ARGS]; char *p; int error; diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 2b830c2..a02236b 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -61,6 +61,87 @@ struct xfs_mount; struct xfs_buftarg; struct block_device; +/* + * Superblock - in core version. This does not have ot match the size and shape + * of the on-disk superblock, but must contain all the fields that we use in the + * on-disk superblock. + */ +struct xfs_sb { + __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ + __uint32_t sb_blocksize; /* logical block size, bytes */ + xfs_rfsblock_t sb_dblocks; /* number of data blocks */ + xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */ + xfs_rtblock_t sb_rextents; /* number of realtime extents */ + uuid_t sb_uuid; /* file system unique id */ + xfs_fsblock_t sb_logstart; /* starting block of log if internal */ + xfs_ino_t sb_rootino; /* root inode number */ + xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */ + xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */ + xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */ + xfs_agblock_t sb_agblocks; /* size of an allocation group */ + xfs_agnumber_t sb_agcount; /* number of allocation groups */ + xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */ + xfs_extlen_t sb_logblocks; /* number of log blocks */ + __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ + __uint16_t sb_sectsize; /* volume sector size, bytes */ + __uint16_t sb_inodesize; /* inode size, bytes */ + __uint16_t sb_inopblock; /* inodes per block */ + char sb_fname[12]; /* file system name */ + __uint8_t sb_blocklog; /* log2 of sb_blocksize */ + __uint8_t sb_sectlog; /* log2 of sb_sectsize */ + __uint8_t sb_inodelog; /* log2 of sb_inodesize */ + __uint8_t sb_inopblog; /* log2 of sb_inopblock */ + __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ + __uint8_t sb_rextslog; /* log2 of sb_rextents */ + __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ + __uint8_t sb_imax_pct; /* max % of fs for inode space */ + /* statistics */ + __uint64_t sb_icount; /* allocated inodes */ + __uint64_t sb_ifree; /* free inodes */ + __uint64_t sb_fdblocks; /* free data blocks */ + __uint64_t sb_frextents; /* free realtime extents */ + xfs_ino_t sb_uquotino; /* user quota inode */ + xfs_ino_t sb_gquotino; /* group quota inode */ + __uint16_t sb_qflags; /* quota flags */ + __uint8_t sb_flags; /* misc. flags */ + __uint8_t sb_shared_vn; /* shared version number */ + xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */ + __uint32_t sb_unit; /* stripe or raid unit */ + __uint32_t sb_width; /* stripe or raid width */ + __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ + __uint8_t sb_logsectlog; /* log2 of the log sector size */ + __uint16_t sb_logsectsize; /* sector size for the log, bytes */ + __uint32_t sb_logsunit; /* stripe unit size for the log */ + __uint32_t sb_features2; /* additional feature bits */ + + /* + * bad features2 field as a result of failing to pad the sb structure to + * 64 bits. Some machines will be using this field for features2 bits. + * Easiest just to mark it bad and not use it for anything else. + * + * This is not kept up to date in memory; it is always overwritten by + * the value in sb_features2 when formatting the incore superblock to + * the disk buffer. + */ + __uint32_t sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + __uint32_t sb_features_log_incompat; + + __uint32_t sb_crc; /* superblock crc */ + __uint32_t sb_pad; + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + + /* must be padded to 64 bit alignment */ +}; + extern __uint64_t xfs_max_file_offset(unsigned int); extern void xfs_flush_inodes(struct xfs_mount *mp); -- 2.0.0 From dave@fromorbit.com Sun Feb 1 15:43:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D780A7F6A for ; Sun, 1 Feb 2015 15:43:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C6F748F8039 for ; Sun, 1 Feb 2015 13:43:27 -0800 (PST) X-ASG-Debug-ID: 1422827003-04cbb04168bcc950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id zrhwfPLDvnidSpGI for ; Sun, 01 Feb 2015 13:43:24 -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: AkkIAF2dzlR5LHOVPGdsb2JhbABRCoMGgSuGK6tsAQEBAQEBBpgvgRNEAQEBAQEGAQEBATg7hA0BBQ4MDS8PJAgYMTkDBxQZiCzSeoYEiRgFCkKEOwWFS48ZhGGFR4N9gUeGOoFnAQsBMByBZCoxgQOBPwEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003pD-5R for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007xL-4L for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: Remove icsb infrastructure Date: Mon, 2 Feb 2015 08:43:03 +1100 X-ASG-Orig-Subj: [PATCH 5/5] xfs: Remove icsb infrastructure Message-Id: <1422826983-29570-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> References: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422827003 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that the in-cor superblock infrastructure has been replaced with generic per-cpu counters, we don't need it anymore. Nuke it from orbit so we are sure that it won't haunt us again... Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 16 +- fs/xfs/libxfs/xfs_sb.c | 10 +- fs/xfs/xfs_fsops.c | 2 - fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_linux.h | 9 - fs/xfs/xfs_log_recover.c | 3 - fs/xfs/xfs_mount.c | 509 ----------------------------------------------- fs/xfs/xfs_mount.h | 64 +----- fs/xfs/xfs_super.c | 76 +++++-- 9 files changed, 67 insertions(+), 623 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015..ac4d64e 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2212,7 +2212,7 @@ xfs_bmap_add_extent_delay_real( diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); if (diff > 0) { - error = xfs_icsb_modify_counters(bma->ip->i_mount, + error = xfs_mod_incore_sb(bma->ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), 0); ASSERT(!error); @@ -2265,7 +2265,7 @@ xfs_bmap_add_extent_delay_real( temp += bma->cur->bc_private.b.allocated; ASSERT(temp <= da_old); if (temp < da_old) - xfs_icsb_modify_counters(bma->ip->i_mount, + xfs_mod_incore_sb(bma->ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(da_old - temp), 0); } @@ -2944,7 +2944,7 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, + xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, (int64_t)(oldlen - newlen), 0); /* * Nothing to do for disk quota accounting here. @@ -4163,14 +4163,14 @@ xfs_bmapi_reserve_delalloc( error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, -((int64_t)extsz), 0); } else { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, -((int64_t)alen), 0); } if (error) goto out_unreserve_quota; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, -((int64_t)indlen), 0); if (error) goto out_unreserve_blocks; @@ -4200,7 +4200,7 @@ out_unreserve_blocks: if (rt) xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); else - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); + xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, alen, 0); out_unreserve_quota: if (XFS_IS_QUOTA_ON(mp)) xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? @@ -5013,7 +5013,7 @@ xfs_bmap_del_extent( */ ASSERT(da_old >= da_new); if (da_old > da_new) { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), 0); } done: @@ -5290,7 +5290,7 @@ xfs_bunmapi( ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)del.br_blockcount, 0); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index bdde5c7..676f2a1 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -754,17 +754,11 @@ xfs_initialize_perag_data( btree += pag->pagf_btreeblks; xfs_perag_put(pag); } - /* - * Overwrite incore superblock counters with just-read data - */ - spin_lock(&mp->m_sb_lock); + + /* Overwrite incore superblock counters with just-read data */ percpu_counter_set(&sbp->sb_ifree, ifree); percpu_counter_set(&sbp->sb_icount, ialloc); percpu_counter_set(&sbp->sb_fdblocks, bfree + bfreelst + btree); - spin_unlock(&mp->m_sb_lock); - - /* Fixup the per-cpu counters as well. */ - xfs_icsb_reinit_counters(mp); return 0; } diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index ccb00cd..28389e0 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -630,7 +630,6 @@ xfs_fs_counts( xfs_mount_t *mp, xfs_fsop_counts_t *cnt) { - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); cnt->freeino = percpu_counter_read_positive(&mp->m_sb.sb_ifree); cnt->freedata = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks) - @@ -694,7 +693,6 @@ xfs_reserve_blocks( */ retry: spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, 0); /* * If our previous reservation was larger than the current value, diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 310433a..67a41f2 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -460,7 +460,6 @@ xfs_iomap_prealloc_size( alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), alloc_blocks); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); freesp = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks); if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { shift = 2; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index c31d2c2..7c7842c 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -116,15 +116,6 @@ typedef __uint64_t __psunsigned_t; #undef XFS_NATIVE_HOST #endif -/* - * Feature macros (disable/enable) - */ -#ifdef CONFIG_SMP -#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#else -#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#endif - #define irix_sgid_inherit xfs_params.sgid_inherit.val #define irix_symlink_mode xfs_params.symlink_mode.val #define xfs_panic_mask xfs_params.panic_mask.val diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 81d7f24..80d2146 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4465,9 +4465,6 @@ xlog_do_recover( ASSERT(xfs_sb_good_version(sbp)); xfs_buf_relse(bp); - /* We've re-read the superblock so re-initialize per-cpu counters */ - xfs_icsb_reinit_counters(log->l_mp); - xlog_recover_check_summary(log); /* Normal transactions can now occur */ diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 0e37248..07498f0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -43,18 +43,6 @@ #include "xfs_sysfs.h" -#ifdef HAVE_PERCPU_SB -STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_balance_counter_locked(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); -#else - -#define xfs_icsb_balance_counter(mp, a, b) do { } while (0) -#define xfs_icsb_balance_counter_locked(mp, a, b) do { } while (0) -#endif - static DEFINE_MUTEX(xfs_uuid_table_mutex); static int xfs_uuid_table_size; static uuid_t *xfs_uuid_table; @@ -347,9 +335,6 @@ reread: goto reread; } - /* Initialize per-cpu counters */ - xfs_icsb_reinit_counters(mp); - /* no need to be quiet anymore, so reset the buf ops */ bp->b_ops = &xfs_sb_buf_ops; @@ -1087,8 +1072,6 @@ xfs_log_sbcount(xfs_mount_t *mp) if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) return 0; - xfs_icsb_sync_counters(mp, 0); - /* * we don't need to do this if we are updating the superblock * counters on every modification. @@ -1446,495 +1429,3 @@ xfs_dev_is_read_only( } return 0; } - -#ifdef HAVE_PERCPU_SB -/* - * Per-cpu incore superblock counters - * - * Simple concept, difficult implementation - * - * Basically, replace the incore superblock counters with a distributed per cpu - * counter for contended fields (e.g. free block count). - * - * Difficulties arise in that the incore sb is used for ENOSPC checking, and - * hence needs to be accurately read when we are running low on space. Hence - * there is a method to enable and disable the per-cpu counters based on how - * much "stuff" is available in them. - * - * Basically, a counter is enabled if there is enough free resource to justify - * running a per-cpu fast-path. If the per-cpu counter runs out (i.e. a local - * ENOSPC), then we disable the counters to synchronise all callers and - * re-distribute the available resources. - * - * If, once we redistributed the available resources, we still get a failure, - * we disable the per-cpu counter and go through the slow path. - * - * The slow path is the current xfs_mod_incore_sb() function. This means that - * when we disable a per-cpu counter, we need to drain its resources back to - * the global superblock. We do this after disabling the counter to prevent - * more threads from queueing up on the counter. - * - * Essentially, this means that we still need a lock in the fast path to enable - * synchronisation between the global counters and the per-cpu counters. This - * is not a problem because the lock will be local to a CPU almost all the time - * and have little contention except when we get to ENOSPC conditions. - * - * Basically, this lock becomes a barrier that enables us to lock out the fast - * path while we do things like enabling and disabling counters and - * synchronising the counters. - * - * Locking rules: - * - * 1. m_sb_lock before picking up per-cpu locks - * 2. per-cpu locks always picked up via for_each_online_cpu() order - * 3. accurate counter sync requires m_sb_lock + per cpu locks - * 4. modifying per-cpu counters requires holding per-cpu lock - * 5. modifying global counters requires holding m_sb_lock - * 6. enabling or disabling a counter requires holding the m_sb_lock - * and _none_ of the per-cpu locks. - * - * Disabled counters are only ever re-enabled by a balance operation - * that results in more free resources per CPU than a given threshold. - * To ensure counters don't remain disabled, they are rebalanced when - * the global resource goes above a higher threshold (i.e. some hysteresis - * is present to prevent thrashing). - */ - -#ifdef CONFIG_HOTPLUG_CPU -/* - * hot-plug CPU notifier support. - * - * We need a notifier per filesystem as we need to be able to identify - * the filesystem to balance the counters out. This is achieved by - * having a notifier block embedded in the xfs_mount_t and doing pointer - * magic to get the mount pointer from the notifier block address. - */ -STATIC int -xfs_icsb_cpu_notify( - struct notifier_block *nfb, - unsigned long action, - void *hcpu) -{ - xfs_icsb_cnts_t *cntp; - xfs_mount_t *mp; - - mp = (xfs_mount_t *)container_of(nfb, xfs_mount_t, m_icsb_notifier); - cntp = (xfs_icsb_cnts_t *) - per_cpu_ptr(mp->m_sb_cnts, (unsigned long)hcpu); - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - /* Easy Case - initialize the area and locks, and - * then rebalance when online does everything else for us. */ - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - break; - case CPU_ONLINE: - case CPU_ONLINE_FROZEN: - xfs_icsb_lock(mp); - xfs_icsb_unlock(mp); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - /* Disable all the counters, then fold the dead cpu's - * count into the total on the global superblock and - * re-enable the counters. */ - xfs_icsb_lock(mp); - spin_lock(&mp->m_sb_lock); - - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - - spin_unlock(&mp->m_sb_lock); - xfs_icsb_unlock(mp); - break; - } - - return NOTIFY_OK; -} -#endif /* CONFIG_HOTPLUG_CPU */ - -int -xfs_icsb_init_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - i = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); - if (i) - return ENOMEM; - - i = percpu_counter_init(&mp->m_sb.sb_ifree, 0, GFP_KERNEL); - if (i) - goto free_icount; - - i = percpu_counter_init(&mp->m_sb.sb_fdblocks, 0, GFP_KERNEL); - if (i) - goto free_ifree; - - mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (!mp->m_sb_cnts) - goto free_fdblocks; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - } - - mutex_init(&mp->m_icsb_mutex); - - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - -#ifdef CONFIG_HOTPLUG_CPU - mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; - mp->m_icsb_notifier.priority = 0; - register_hotcpu_notifier(&mp->m_icsb_notifier); -#endif /* CONFIG_HOTPLUG_CPU */ - - return 0; - -free_fdblocks: - percpu_counter_destroy(&mp->m_sb.sb_fdblocks); -free_ifree: - percpu_counter_destroy(&mp->m_sb.sb_ifree); -free_icount: - percpu_counter_destroy(&mp->m_sb.sb_icount); - return -ENOMEM; -} - -void -xfs_icsb_reinit_counters( - xfs_mount_t *mp) -{ - xfs_icsb_lock(mp); - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - xfs_icsb_unlock(mp); -} - -void -xfs_icsb_destroy_counters( - xfs_mount_t *mp) -{ - if (mp->m_sb_cnts) { - unregister_hotcpu_notifier(&mp->m_icsb_notifier); - free_percpu(mp->m_sb_cnts); - } - - percpu_counter_destroy(&mp->m_sb.sb_icount); - percpu_counter_destroy(&mp->m_sb.sb_ifree); - percpu_counter_destroy(&mp->m_sb.sb_fdblocks); - - mutex_destroy(&mp->m_icsb_mutex); -} - -STATIC void -xfs_icsb_lock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - while (test_and_set_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags)) { - ndelay(1000); - } -} - -STATIC void -xfs_icsb_unlock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - clear_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags); -} - - -STATIC void -xfs_icsb_lock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_lock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_unlock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_unlock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_count( - xfs_mount_t *mp, - xfs_icsb_cnts_t *cnt, - int flags) -{ - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_lock_all_counters(mp); - - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_unlock_all_counters(mp); -} - -STATIC int -xfs_icsb_counter_disabled( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - return test_bit(field, &mp->m_icsb_counters); -} - -STATIC void -xfs_icsb_disable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - xfs_icsb_cnts_t cnt; - - /* - * If we are already disabled, then there is nothing to do - * here. We check before locking all the counters to avoid - * the expensive lock operation when being called in the - * slow path and the counter is already disabled. This is - * safe because the only time we set or clear this state is under - * the m_icsb_mutex. - */ - if (xfs_icsb_counter_disabled(mp, field)) - return; - - xfs_icsb_lock_all_counters(mp); - if (!test_and_set_bit(field, &mp->m_icsb_counters)) { - /* drain back to superblock */ - - xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); - switch(field) { - default: - BUG(); - } - } - - xfs_icsb_unlock_all_counters(mp); -} - -STATIC void -xfs_icsb_enable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field, - uint64_t count, - uint64_t resid) -{ - int i; - - xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - switch (field) { - default: - BUG(); - break; - } - resid = 0; - } - clear_bit(field, &mp->m_icsb_counters); - xfs_icsb_unlock_all_counters(mp); -} - -void -xfs_icsb_sync_counters_locked( - xfs_mount_t *mp, - int flags) -{ - xfs_icsb_cnts_t cnt; - - xfs_icsb_count(mp, &cnt, flags); -} - -/* - * Accurate update of per-cpu counters to incore superblock - */ -void -xfs_icsb_sync_counters( - xfs_mount_t *mp, - int flags) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, flags); - spin_unlock(&mp->m_sb_lock); -} - -/* - * Balance and enable/disable counters as necessary. - * - * Thresholds for re-enabling counters are somewhat magic. inode counts are - * chosen to be the same number as single on disk allocation chunk per CPU, and - * free blocks is something far enough zero that we aren't going thrash when we - * get near ENOSPC. We also need to supply a minimum we require per cpu to - * prevent looping endlessly when xfs_alloc_space asks for more than will - * be distributed to a single CPU but each CPU has enough blocks to be - * reenabled. - * - * Note that we can be called when counters are already disabled. - * xfs_icsb_disable_counter() optimises the counter locking in this case to - * prevent locking every per-cpu counter needlessly. - */ - -#define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 -#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ - (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) -STATIC void -xfs_icsb_balance_counter_locked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int min_per_cpu) -{ - uint64_t count, resid; - - /* disable counter and sync counter */ - xfs_icsb_disable_counter(mp, field); - - /* update counters - first CPU gets residual*/ - switch (field) { - default: - BUG(); - count = resid = 0; /* quiet, gcc */ - break; - } - - xfs_icsb_enable_counter(mp, field, count, resid); -} - -STATIC void -xfs_icsb_balance_counter( - xfs_mount_t *mp, - xfs_sb_field_t fields, - int min_per_cpu) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_balance_counter_locked(mp, fields, min_per_cpu); - spin_unlock(&mp->m_sb_lock); -} - -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - xfs_icsb_cnts_t *icsbp; - int ret = 0; - - might_sleep(); -again: - preempt_disable(); - icsbp = this_cpu_ptr(mp->m_sb_cnts); - - /* - * if the counter is disabled, go to slow path - */ - if (unlikely(xfs_icsb_counter_disabled(mp, field))) - goto slow_path; - xfs_icsb_lock_cntr(icsbp); - if (unlikely(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock_cntr(icsbp); - goto slow_path; - } - - switch (field) { - default: - BUG(); - goto balance_counter; /* be still, gcc */ - } - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - return 0; - -slow_path: - preempt_enable(); - - /* - * serialise with a mutex so we don't burn lots of cpu on - * the superblock lock. We still need to hold the superblock - * lock, however, when we modify the global structures. - */ - xfs_icsb_lock(mp); - - /* - * Now running atomically. - * - * If the counter is enabled, someone has beaten us to rebalancing. - * Drop the lock and try again in the fast path.... - */ - if (!(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock(mp); - goto again; - } - - /* - * The counter is currently disabled. Because we are - * running atomically here, we know a rebalance cannot - * be in progress. Hence we can go straight to operating - * on the global superblock. We do not call xfs_mod_incore_sb() - * here even though we need to get the m_sb_lock. Doing so - * will cause us to re-enter this function and deadlock. - * Hence we get the m_sb_lock ourselves and then call - * xfs_mod_incore_sb_unlocked() as the unlocked path operates - * directly on the global counters. - */ - spin_lock(&mp->m_sb_lock); - ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - spin_unlock(&mp->m_sb_lock); - - /* - * Now that we've modified the global superblock, we - * may be able to re-enable the distributed counters - * (e.g. lots of space just got freed). After that - * we are done. - */ - if (ret != -ENOSPC) - xfs_icsb_balance_counter(mp, field, 0); - xfs_icsb_unlock(mp); - return ret; - -balance_counter: - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - - /* - * We may have multiple threads here if multiple per-cpu - * counters run dry at the same time. This will mean we can - * do more balances than strictly necessary but it is not - * the common slowpath case. - */ - xfs_icsb_lock(mp); - - /* - * running atomically. - * - * This will leave the counter in the correct state for future - * accesses. After the rebalance, we simply try again and our retry - * will either succeed through the fast path or slow path without - * another balance operation being required. - */ - xfs_icsb_balance_counter(mp, field, delta); - xfs_icsb_unlock(mp); - goto again; -} - -#endif diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 9499a8f..4e22e96 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -29,42 +29,8 @@ struct xfs_quotainfo; struct xfs_dir_ops; struct xfs_da_geometry; -#ifdef HAVE_PERCPU_SB - -/* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. - */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ - -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif +int xfs_sb_init_percpu_counters(struct xfs_mount *); +void xfs_sb_destroy_percpu_counters(struct xfs_mount *); /* dynamic preallocation free space thresholds, 5% down to 1% */ enum { @@ -151,12 +117,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_reclaim_work; /* background inode reclaim */ struct delayed_work m_eofblocks_work; /* background eof blocks @@ -289,26 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* * This structure is for use by the xfs_mod_incore_sb_batch() routine. * xfs_growfs can specify a few fields which are more than int limit */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 0fa688a..7a0bc92 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1035,23 +1035,6 @@ xfs_free_fsname( kfree(mp->m_logname); } -STATIC void -xfs_fs_put_super( - struct super_block *sb) -{ - struct xfs_mount *mp = XFS_M(sb); - - xfs_filestream_unmount(mp); - xfs_unmountfs(mp); - - xfs_freesb(mp); - xfs_icsb_destroy_counters(mp); - xfs_destroy_mount_workqueues(mp); - xfs_close_devices(mp); - xfs_free_fsname(mp); - kfree(mp); -} - STATIC int xfs_fs_sync_fs( struct super_block *sb, @@ -1100,8 +1083,6 @@ xfs_fs_statfs( statp->f_fsid.val[0] = (u32)id; statp->f_fsid.val[1] = (u32)(id >> 32); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - sb_icount = percpu_counter_sum(&sbp->sb_icount); sb_ifree = percpu_counter_sum(&sbp->sb_ifree); sb_fdblocks = percpu_counter_sum(&sbp->sb_fdblocks); @@ -1407,6 +1388,42 @@ xfs_finish_flags( return 0; } +static int +xfs_init_percpu_counters( + struct xfs_mount *mp) +{ + int error; + + error = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); + if (error) + return ENOMEM; + + error = percpu_counter_init(&mp->m_sb.sb_ifree, 0, GFP_KERNEL); + if (error) + goto free_icount; + + error = percpu_counter_init(&mp->m_sb.sb_fdblocks, 0, GFP_KERNEL); + if (error) + goto free_ifree; + + return 0; + +free_ifree: + percpu_counter_destroy(&mp->m_sb.sb_ifree); +free_icount: + percpu_counter_destroy(&mp->m_sb.sb_icount); + return -ENOMEM; +} + +static void +xfs_destroy_percpu_counters( + struct xfs_mount *mp) +{ + percpu_counter_destroy(&mp->m_sb.sb_icount); + percpu_counter_destroy(&mp->m_sb.sb_ifree); + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); +} + STATIC int xfs_fs_fill_super( struct super_block *sb, @@ -1455,7 +1472,7 @@ xfs_fs_fill_super( if (error) goto out_close_devices; - error = xfs_icsb_init_counters(mp); + error = xfs_init_percpu_counters(mp); if (error) goto out_destroy_workqueues; @@ -1513,7 +1530,7 @@ xfs_fs_fill_super( out_free_sb: xfs_freesb(mp); out_destroy_counters: - xfs_icsb_destroy_counters(mp); + xfs_destroy_percpu_counters(mp); out_destroy_workqueues: xfs_destroy_mount_workqueues(mp); out_close_devices: @@ -1530,6 +1547,23 @@ out_destroy_workqueues: goto out_free_sb; } +STATIC void +xfs_fs_put_super( + struct super_block *sb) +{ + struct xfs_mount *mp = XFS_M(sb); + + xfs_filestream_unmount(mp); + xfs_unmountfs(mp); + + xfs_freesb(mp); + xfs_destroy_percpu_counters(mp); + xfs_destroy_mount_workqueues(mp); + xfs_close_devices(mp); + xfs_free_fsname(mp); + kfree(mp); +} + STATIC struct dentry * xfs_fs_mount( struct file_system_type *fs_type, -- 2.0.0 From dave@fromorbit.com Sun Feb 1 15:43:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 66DBA7F6A for ; Sun, 1 Feb 2015 15:43:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47431304032 for ; Sun, 1 Feb 2015 13:43:26 -0800 (PST) X-ASG-Debug-ID: 1422826998-04cbb0416abcc950003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id RxBSAQPknjmSFLFL for ; Sun, 01 Feb 2015 13:43:23 -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: AkcIAF2dzlR5LHOVPGdsb2JhbABbgwaBK4Yrq2wBAQEBAQEGmUJEAQEBAQEGAQEBATg7hA0BBQ4ZLw8kCEk5AwcUGYgs0nqGBIknhH0FhUuTeosLhjqBZwELAYIwKjGBAwEeBoEaAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 08:13:17 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YI2IW-0003pC-4k for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YI2IW-0007xG-3i for xfs@oss.sgi.com; Mon, 02 Feb 2015 08:43:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: use generic percpu counters for free block counter Date: Mon, 2 Feb 2015 08:43:02 +1100 X-ASG-Orig-Subj: [PATCH 4/5] xfs: use generic percpu counters for free block counter Message-Id: <1422826983-29570-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> References: <1422826983-29570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422827002 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. The free block counter is special in that it is used for ENOSPC detection outside transaction contexts for for delayed allocation. This means that the counter needs to be accurate at zero. The current per-cpu counter code jumps through lots of hoops to ensure we never run past zero, but we don't need to make all those jumps with the generic counter implementation. The generic counter implementation allows us to pass a "batch" threshold at which the addition/subtraction to the counter value will be folded back into global value under lock. We can use this feature to reduce the batch size as we approach 0 in a very similar manner to the existing counters and their rebalance algorithm. If we use a batch size of 1 as we approach 0, then every addition and subtraction will be done against the global value and hence allow accurate detection of zero threshold crossing. Hence we can replace the handrolled, accurate-at-zero counters with generic percpu counters. Note: this removes just enough of the icsb infrastructure to compile without warnings. The rest will go in subsequent commits. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_sb.c | 11 +++- fs/xfs/xfs_fsops.c | 9 +-- fs/xfs/xfs_iomap.c | 2 +- fs/xfs/xfs_mount.c | 167 ++++++++++++++++++++++++------------------------- fs/xfs/xfs_super.c | 11 +++- fs/xfs/xfs_super.h | 2 +- fs/xfs/xfs_trans.c | 9 ++- 7 files changed, 109 insertions(+), 102 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 42e5c89..bdde5c7 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -357,11 +357,15 @@ __xfs_sb_from_disk( to->sb_rextslog = from->sb_rextslog; to->sb_inprogress = from->sb_inprogress; to->sb_imax_pct = from->sb_imax_pct; + if (percpu_counter_initialized(&to->sb_icount)) percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); if (percpu_counter_initialized(&to->sb_icount)) percpu_counter_set(&to->sb_ifree, be64_to_cpu(from->sb_ifree)); - to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); + if (percpu_counter_initialized(&to->sb_fdblocks)) + percpu_counter_set(&to->sb_fdblocks, + be64_to_cpu(from->sb_fdblocks)); + to->sb_frextents = be64_to_cpu(from->sb_frextents); to->sb_uquotino = be64_to_cpu(from->sb_uquotino); to->sb_gquotino = be64_to_cpu(from->sb_gquotino); @@ -496,7 +500,7 @@ xfs_sb_to_disk( to->sb_imax_pct = from->sb_imax_pct; to->sb_icount = cpu_to_be64(percpu_counter_sum(&from->sb_icount)); to->sb_ifree = cpu_to_be64(percpu_counter_sum(&from->sb_ifree)); - to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); + to->sb_fdblocks = cpu_to_be64(percpu_counter_sum(&from->sb_fdblocks)); to->sb_frextents = cpu_to_be64(from->sb_frextents); to->sb_flags = from->sb_flags; @@ -542,6 +546,7 @@ xfs_sb_verify( /* don't need to validate icount here */ sb.sb_icount.counters = NULL; sb.sb_ifree.counters = NULL; + sb.sb_fdblocks.counters = NULL; /* * Use call variant which doesn't convert quota flags from disk @@ -755,7 +760,7 @@ xfs_initialize_perag_data( spin_lock(&mp->m_sb_lock); percpu_counter_set(&sbp->sb_ifree, ifree); percpu_counter_set(&sbp->sb_icount, ialloc); - sbp->sb_fdblocks = bfree + bfreelst + btree; + percpu_counter_set(&sbp->sb_fdblocks, bfree + bfreelst + btree); spin_unlock(&mp->m_sb_lock); /* Fixup the per-cpu counters as well. */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 619a9f3..ccb00cd 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -633,9 +633,10 @@ xfs_fs_counts( xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); cnt->freeino = percpu_counter_read_positive(&mp->m_sb.sb_ifree); + cnt->freedata = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks) - + XFS_ALLOC_SET_ASIDE(mp); spin_lock(&mp->m_sb_lock); - cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; spin_unlock(&mp->m_sb_lock); return 0; @@ -710,7 +711,8 @@ retry: } else { __int64_t free; - free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + free = percpu_counter_sum(&mp->m_sb.sb_fdblocks) - + XFS_ALLOC_SET_ASIDE(mp); if (!free) goto out; /* ENOSPC and fdblks_delta = 0 */ @@ -749,8 +751,7 @@ out: * the extra reserve blocks from the reserve..... */ int error; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - fdblks_delta, 0); + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, fdblks_delta, 0); if (error == -ENOSPC) goto retry; } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index ccb1dd0..310433a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -461,7 +461,7 @@ xfs_iomap_prealloc_size( alloc_blocks); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - freesp = mp->m_sb.sb_fdblocks; + freesp = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks); if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { shift = 2; if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8e8924f..0e37248 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1117,7 +1117,8 @@ xfs_mod_incore_sb_unlocked( { int scounter; /* short counter for 32 bit fields */ long long lcounter; /* long counter for 64 bit fields */ - long long res_used, rem; + long long res_used; + s32 batch; /* * With the in-core superblock spin lock held, switch @@ -1144,47 +1145,80 @@ xfs_mod_incore_sb_unlocked( } return 0; case XFS_SBS_FDBLOCKS: - lcounter = (long long) - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); if (delta > 0) { /* Putting blocks back */ + if (mp->m_resblks == mp->m_resblks_avail) { + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); + return 0; + } + + /* put blocks back into reserve pool first */ + 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; } else { - rem = delta - res_used; + delta -= res_used; mp->m_resblks_avail = mp->m_resblks; - lcounter += rem; - } - } else { /* Taking blocks away */ - lcounter += delta; - if (lcounter >= 0) { - mp->m_sb.sb_fdblocks = lcounter + - XFS_ALLOC_SET_ASIDE(mp); - return 0; + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); } + spin_unlock(&mp->m_sb_lock); + return 0; - /* - * We are out of blocks, use any available reserved - * blocks if were allowed to. - */ - if (!rsvd) - return -ENOSPC; + } - lcounter = (long long)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - return 0; - } - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return -ENOSPC; + /* + * Taking blocks away, need to be more accurate the closer we + * are to zero. + * + * batch size is set to a maximum of 1024 blocks - if we are + * allocating of freeing extents larger than this then we aren't + * going to be hammering the counter lock so a lock per update + * is not a problem. + * + * If the counter has a value of less than 2 * max batch size, + * then make everything serialise as we are real close to + * ENOSPC. + */ +#define __BATCH 1024 + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, + 2 * __BATCH) < 0) + batch = 1; + else + batch = __BATCH; + + __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { + /* we had space! */ + return 0; } - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - return 0; + /* + * lock up the sb for dipping into reserves before releasing + * the space that took us to ENOSPC. + */ + spin_lock(&mp->m_sb_lock); + percpu_counter_add(&mp->m_sb.sb_fdblocks, -delta); + if (!rsvd) + goto fdblocks_enospc; + + lcounter = (long long)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); +fdblocks_enospc: + spin_unlock(&mp->m_sb_lock); + return -ENOSPC; + case XFS_SBS_FREXTENTS: lcounter = (long long)mp->m_sb.sb_frextents; lcounter += delta; @@ -1286,11 +1320,14 @@ xfs_mod_incore_sb( { int status; -#ifdef HAVE_PERCPU_SB - ASSERT(field != XFS_SBS_FDBLOCKS); -#endif - if (field == XFS_SBS_ICOUNT || field == XFS_SBS_IFREE) + switch (field) { + case XFS_SBS_ICOUNT: + case XFS_SBS_IFREE: + case XFS_SBS_FDBLOCKS: return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); + default: + break; + } spin_lock(&mp->m_sb_lock); status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); @@ -1309,7 +1346,7 @@ xfs_mod_incore_sb( * * Note that this function may not be used for the superblock values that * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_icsb_modify_counters is required for these. + * xfs_mod_incore_sb is required for these. */ int xfs_mod_incore_sb_batch( @@ -1494,7 +1531,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); break; case CPU_DEAD: @@ -1504,13 +1540,9 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); xfs_icsb_unlock(mp); break; @@ -1535,9 +1567,13 @@ xfs_icsb_init_counters( if (i) goto free_icount; + i = percpu_counter_init(&mp->m_sb.sb_fdblocks, 0, GFP_KERNEL); + if (i) + goto free_ifree; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); if (!mp->m_sb_cnts) - goto free_ifree; + goto free_fdblocks; for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); @@ -1560,6 +1596,8 @@ xfs_icsb_init_counters( return 0; +free_fdblocks: + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); free_ifree: percpu_counter_destroy(&mp->m_sb.sb_ifree); free_icount: @@ -1577,7 +1615,6 @@ xfs_icsb_reinit_counters( * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); } @@ -1592,6 +1629,7 @@ xfs_icsb_destroy_counters( percpu_counter_destroy(&mp->m_sb.sb_icount); percpu_counter_destroy(&mp->m_sb.sb_ifree); + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); mutex_destroy(&mp->m_icsb_mutex); } @@ -1645,18 +1683,11 @@ xfs_icsb_count( xfs_icsb_cnts_t *cnt, int flags) { - xfs_icsb_cnts_t *cntp; - int i; - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); if (!(flags & XFS_ICSB_LAZY_COUNT)) xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_fdblocks += cntp->icsb_fdblocks; - } if (!(flags & XFS_ICSB_LAZY_COUNT)) xfs_icsb_unlock_all_counters(mp); @@ -1667,7 +1698,6 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT(field == XFS_SBS_FDBLOCKS); return test_bit(field, &mp->m_icsb_counters); } @@ -1678,8 +1708,6 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT(field == XFS_SBS_FDBLOCKS); - /* * If we are already disabled, then there is nothing to do * here. We check before locking all the counters to avoid @@ -1697,9 +1725,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_FDBLOCKS: - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; - break; default: BUG(); } @@ -1715,18 +1740,11 @@ xfs_icsb_enable_counter( uint64_t count, uint64_t resid) { - xfs_icsb_cnts_t *cntp; int i; - ASSERT(field == XFS_SBS_FDBLOCKS); - xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { - cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_FDBLOCKS: - cntp->icsb_fdblocks = count + resid; - break; default: BUG(); break; @@ -1745,9 +1763,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_cnts_t cnt; xfs_icsb_count(mp, &cnt, flags); - - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; } /* @@ -1789,20 +1804,12 @@ xfs_icsb_balance_counter_locked( int min_per_cpu) { uint64_t count, resid; - int weight = num_online_cpus(); - uint64_t min = (uint64_t)min_per_cpu; /* disable counter and sync counter */ xfs_icsb_disable_counter(mp, field); /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_FDBLOCKS: - count = mp->m_sb.sb_fdblocks; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) - return; - break; default: BUG(); count = resid = 0; /* quiet, gcc */ @@ -1831,7 +1838,6 @@ xfs_icsb_modify_counters( int rsvd) { xfs_icsb_cnts_t *icsbp; - long long lcounter; /* long counter for 64 bit fields */ int ret = 0; might_sleep(); @@ -1851,18 +1857,9 @@ again: } switch (field) { - case XFS_SBS_FDBLOCKS: - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); - - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - break; default: BUG(); - break; + goto balance_counter; /* be still, gcc */ } xfs_icsb_unlock_cntr(icsbp); preempt_enable(); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c17bfa4..0fa688a 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1089,6 +1089,7 @@ xfs_fs_statfs( __uint64_t fakeinos, id; __uint64_t sb_icount; __uint64_t sb_ifree; + __uint64_t sb_fdblocks; xfs_extlen_t lsize; __int64_t ffree; @@ -1100,15 +1101,20 @@ xfs_fs_statfs( statp->f_fsid.val[1] = (u32)(id >> 32); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + sb_icount = percpu_counter_sum(&sbp->sb_icount); sb_ifree = percpu_counter_sum(&sbp->sb_ifree); + sb_fdblocks = percpu_counter_sum(&sbp->sb_fdblocks); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; statp->f_blocks = sbp->sb_dblocks - lsize; - statp->f_bfree = statp->f_bavail = - sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + spin_unlock(&mp->m_sb_lock); + + statp->f_bfree = sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + statp->f_bavail = statp->f_bfree; + fakeinos = statp->f_bfree << sbp->sb_inopblog; statp->f_files = MIN(sb_icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); @@ -1121,7 +1127,6 @@ xfs_fs_statfs( ffree = statp->f_files - (sb_icount - sb_ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); - spin_unlock(&mp->m_sb_lock); if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) == diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 6efc7a2..f649d1a 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -99,8 +99,8 @@ struct xfs_sb { struct percpu_counter sb_icount; /* allocated inodes */ struct percpu_counter sb_ifree; /* free inodes */ + struct percpu_counter sb_fdblocks; /* free data blocks */ - __uint64_t sb_fdblocks; /* free data blocks */ __uint64_t sb_frextents; /* free realtime extents */ xfs_ino_t sb_uquotino; /* user quota inode */ xfs_ino_t sb_gquotino; /* group quota inode */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index c54d4b7..b7da423 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -184,7 +184,7 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, + error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -268,7 +268,7 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, + xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, (int64_t)blocks, rsvd); tp->t_blk_res = 0; } @@ -547,8 +547,7 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - blkdelta, rsvd); + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, blkdelta, rsvd); if (error) goto out; } @@ -635,7 +634,7 @@ out_undo_icount: xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); out_undo_fdblocks: if (blkdelta) - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); + xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); out: ASSERT(error == 0); return; -- 2.0.0 From david@fromorbit.com Sun Feb 1 17:08:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D06D7F87 for ; Sun, 1 Feb 2015 17:08:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C3A4AC002 for ; Sun, 1 Feb 2015 15:08:01 -0800 (PST) X-ASG-Debug-ID: 1422832079-04cbb04168bcd900001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id sRF8HmDGFzhjlELd for ; Sun, 01 Feb 2015 15:07:59 -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: AjcVAGCxzlR5LHOVPGdsb2JhbABbgwaBK4Iyg3mrbAEBAQEBAQaYKQICAQECgRJEAQEBAQEGAQEBATg7hA0BBScTHCMQCAMOCgklDwUlAwcaE4gs0jsBAQEBAQUBAQEBHhiFbIl0B4MWgRMFjSaLB5JdhCQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 09:34:36 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YI3Yh-0003vx-2P; Mon, 02 Feb 2015 10:04:03 +1100 Date: Mon, 2 Feb 2015 10:04:03 +1100 From: Dave Chinner To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't allocate an ioend for direct I/O completions Message-ID: <20150201230403.GD4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't allocate an ioend for direct I/O completions References: <1422485661-520-1-git-send-email-hch@lst.de> <20150130144223.GA27441@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150130144223.GA27441@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422832079 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14842 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Jan 30, 2015 at 09:42:23AM -0500, Brian Foster wrote: > On Wed, Jan 28, 2015 at 11:54:21PM +0100, Christoph Hellwig wrote: > > Back in the days when the direct I/O ->end_io callback could be called > > from interrupt context for AIO we needed a structure to hand off to the > > workqueue, and reused the ioend structure for this purpose. These days > > ->end_io is always called from user or workqueue context, which allows us > > to avoid this memory allocation and simplify the code significantly. > > > > Signed-off-by: Christoph Hellwig > > --- > > Looks mostly Ok to me. In fact, with xfs_finish_ioend_sync() calling > xfs_end_io() directly, I don't see how we currently get into the wq at > all. Anyways, a few notes... I've pulled this in after making the couple of minor changes that Brian suggested.... > > @@ -1507,39 +1514,17 @@ xfs_vm_direct_IO( > > { > > struct inode *inode = iocb->ki_filp->f_mapping->host; > > struct block_device *bdev = xfs_find_bdev_for_inode(inode); > > - struct xfs_ioend *ioend = NULL; > > - ssize_t ret; > > > > if (rw & WRITE) { > > A nit, but I guess you could kill the braces here now too. Given it's a multi-line return statement, the braces are fine. FWIW, when we have a if () { return ...} else { return ... } we normally kill the else. i.e: if (rw & WRITE) { return foo( bar, baz); } return .....; So I modified it like this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 1 17:09:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7824C7F88 for ; Sun, 1 Feb 2015 17:09:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 583668F8033 for ; Sun, 1 Feb 2015 15:09:12 -0800 (PST) X-ASG-Debug-ID: 1422832150-04cbb04168bcd910001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id UlAzBZO7S52zov27 for ; Sun, 01 Feb 2015 15:09:10 -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: AjYVAGCxzlR5LHOVPGdsb2JhbABbgwaBK4Iyg3mrbAEBAQEBAQaYKQICAQECgRJEAQEBAQEGAQEBATg7hA0BBTocIxAIAw4KCSUPBSUDBxoTiCzSOwEBAQcCAR8YhWyJdAeDFoETAQSYLYo1iCiEJCoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Feb 2015 09:37:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YI3bR-0003wV-9O; Mon, 02 Feb 2015 10:06:53 +1100 Date: Mon, 2 Feb 2015 10:06:53 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 18/20] xfs: factor out a xfs_update_prealloc_flags() helper Message-ID: <20150201230653.GE4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 18/20] xfs: factor out a xfs_update_prealloc_flags() helper References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-19-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1421925006-24231-19-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1422832150 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14842 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 22, 2015 at 12:10:04PM +0100, Christoph Hellwig wrote: > This logic is duplicated in xfs_file_fallocate and xfs_ioc_space, and > we'll need another copy of it for pNFS block support. > > Signed-off-by: Christoph Hellwig This stands alone, so I'm pulling it into the XFS tree without waiting for the rest of the patch set. Cheers, Dave. -- Dave Chinner david@fromorbit.com From skoptyakov@yahoo-inc.com Sun Feb 1 23:59:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A60DE7F90 for ; Sun, 1 Feb 2015 23:59:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 840E18F8033 for ; Sun, 1 Feb 2015 21:59:20 -0800 (PST) X-ASG-Debug-ID: 1422856753-04cbb04169bd2cd0001-NocioJ Received: from contrabass.corbina.net (contrabass.corbina.net [85.21.78.5]) by cuda.sgi.com with ESMTP id H26SQMJnZ8wjTrFZ for ; Sun, 01 Feb 2015 21:59:14 -0800 (PST) X-Barracuda-Envelope-From: skoptyakov@yahoo-inc.com X-Barracuda-Apparent-Source-IP: 85.21.78.5 Received: from corbina.ru (violin.corbina.net [195.14.50.30]) by contrabass.corbina.net (Postfix) with ESMTP id 11C41E641B; Mon, 2 Feb 2015 09:59:13 +0400 (MSK) Received: from [1.85.17.82] (account barmalei@post.ru HELO Unknown) by corbina.ru (CommuniGate Pro SMTP 6.0.10) with ESMTPA id 448384081; Mon, 02 Feb 2015 08:58:55 +0300 Received-SPF: neutral receiver=fe1-mc.corbina.ru; client-ip=1.85.17.82; envelope-from=skoptyakov@yahoo-inc.com Message-ID: <3C398FDCD70327A4787D34BE3A82FED3@ydfoga> From: =?iso-8859-5?B?7uDY4dre3eHj2+zi?= To: , , , Subject: =?iso-8859-5?B?urC0sMHCwCC9tbSyuLa4vL7Bwrg=?= Date: Mon, 2 Feb 2015 06:58:42 +0100 X-ASG-Orig-Subj: =?iso-8859-5?B?urC0sMHCwCC9tbSyuLa4vL7Bwrg=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0316_01D03EB5.ADE67A30" X-Priority: 3 X-Barracuda-Connect: contrabass.corbina.net[85.21.78.5] X-Barracuda-Start-Time: 1422856754 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. ------=_NextPart_000_0316_01D03EB5.ADE67A30 Content-Type: text/plain; charset="iso-8859-5" Content-Transfer-Encoding: base64 st3Y3NDd2NUhIL/g3tjX3ujb2CDh4+nV4eLS1d3d69Ug2Nfc1d3V3djvINfV3NXb7N3e094g19Da 3t3e1NDi1dvs4eLS0Cwg2tDh0O7p2NXh7yDh1NXb3tog4SDX1dzb8dksIN7k3uDc29Xd2O8g3+DQ 0iDd0CDe0erV2uLrIN3V1NLY1tjc3uHi2CDYINzd3tPeINTg49Pe094gKN7h3d7S3evVIN/j3dri 6yDY19zV3dXd2Nkg4dwuINIg3+DY297W1d3Y2CkNCg== ------=_NextPart_000_0316_01D03EB5.ADE67A30 Content-Type: application/octet-stream; name="izmeneniya_zem_prava.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="izmeneniya_zem_prava.docx" UEsDBBQABgAIAAAAIQDzw/lWjQEAAMEFAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 VEtPwkAQvpv4H5q9mnbBgzGGwkHxqCRiPC/baVnsPrKzKPx7Z0EbJEBR9NKknZ3vMd35eoOFrpM3 8KisyVk367AEjLSFMlXOnsf36TVLMAhTiNoayNkSkA3652e98dIBJtRtMGfTENwN5yinoAVm1oGh Smm9FoFefcWdkK+iAn7Z6VxxaU0AE9IQMVi/dwelmNchGS7o81qJhxpZcrs+GLlyJpyrlRSBlPI3 U2yxpJ8MGXWuzuBUObwgGYzvZIiV/QT7+2au2upTOjqbOagi1SNN06sCkpHw4UFoUs7frS94YeVc k+3sMPMOa7YslYSmP6I5byUg0m/SddZUtFDmy/JeHRiWNeDfq1jjHkn/osJ0WJYg6X60z0NjGk1n a4qN3nY2CIGGdAzJ91ubtg0dP5FbJbzD5OnfVGyAtwopaZvGYlLDERP/4TAa6FYRgSIC+OrZPVnH CuYQJW3GyFuHFDn+F7a/MiV2p7RyDnxQ0KTKrhVrGCmuTvYHMRALKHZw81UA9z8AAAD//wMAUEsD BBQABgAIAAAAIQAekRq38wAAAE4CAAALAAgCX3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9h yH032woi0tneSKF3IusDhJnsAXcOzKTavr2jILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99r eG23iwdQWchbmoJnDUfOsGlub9YvPJGUoTyMMaui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1 jKu6vsf0VwOamabaWQ1pZ+9AtcdYNl/WDl03Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDP JZ2RYqwKNuBpotX1RP9fi46FLAmhCYnP83x1nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD/ /wMAUEsDBBQABgAIAAAAIQB4LeSCOwEAAD0EAAAcAAgBd29yZC9fcmVscy9kb2N1bWVudC54bWwu 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 CwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDP/AABEIAvUB6wMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAA AQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgj QrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz dHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX 2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/ xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEK FiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SF hoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo 6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP38ooooAKKKKACiiigAooooAK5r4pfE60+Fnh1bye3u NQu7mZbaysLYp9ovZWP3UDEDCrudmJwqIzHpXS1418f7eG/+NHhRpIo2k03SdQlhZgCVaSW0QsvH BCqwz3DmgDmdb8VfFDxVqLXY8Yab4VhO5Y9P0vSorxUXexUvNcAs77SASqRqcAhRzVX7R8Tv+io3 n/ggsP8A43W7RQBhfaPid/0VG8/8EFh/8brR+H3ibx7pPxb8J2ur+OZ9e0zVr2e0uLR9JtLcMBZX MytvjQMMNEvQjP6Vc/A/lUOl8fF/wB/2GLgf+Uu/oAi+IHiXx7q3xa8WW2keObjQtM0i9gtLe0TS bS4Cg2VtMx3yIWOXlbqT/Ss37R8Tv+io3n/ggsP/AI3Wxqn/ACV34gf9hiD/ANNdjUoORQBhfaPi d/0VG8/8EFh/8bq/4Z8f/ErwLqBubzXLHxzp7sPOsrmxi0+7RQr/APHvLFiMuWK/LKuCFxuTJajX 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 Ta6lFXjzX5b2ty6xTjW5ltZe7vu7Lu9bWb1ta+j5nL8/v2Dv2yVtPiR8CItd+PGtaldXHxKstJmu Lj4rXuqaP4ntbvwnJJKGS5vJN1z9v+xC4sH81NPupoo4WxcBpvc5P2oLTwp+1N4i8QfCX9on/hMN H/4Smw8K32i6v42/t20hu5YNT/tTUJoWkePTrZZVs5I1RYI1Gk3hgiEMjCX6o8Bf8FB9d8Y+NfCd pc/DmDStE1GHRbbxFcy+IGN/oeo6rFI9pFDa/ZQt1a5WNWuDNC484fuSUkVPoLxB8M9C8VeNNA8Q 6lp0V7q/hb7Q2kzSszLYPOgjllRM7BKY9yCTbvVJJVVgskgbWtepdrRKTTtvpyXjpayaWqVl76cU kknnCa5VG93yK19etRqWurd3a97+61K92l+Ivjv9pX4paL+w/p+v654/+JHhTRNQ8QyS6fd+IviT cafZ+K7218LyHUGsPElpebjZXF+Dc6bEsjW11MjQ+VDDgxejfFD/AIKVfEbx6PjdY/8ACZ3fw2En hnwJaaKfixo3irwRpvh83OpajDcyX15YQwT2lxdBIN1zDJFDliiTNHbM9fsjRUytJyTWknF26KyS aS2Sdu22mqVhq6gop6pNX9ZKSfdtW1bd3du9z8bfhT+3J43trLxH4p+GniPW9a1rwr8K/ENp4g0Q eP8AUvHI8M65aXFsba8n06+xKbHyEmms7yMyy3yzlJZGCoW1/wBhH9py/wDGX7U3ws0LR/jRqXxU 8QeH/G+rab4ul03x/qM0XinSJLK6W01m00S7mmtpdNlm8qSea3uJls5YQlukUcjRx/r3RVwnacZv Wy187ycnrur8zVuq+Pmai1nKlem4X67/APbqitNrq179H8KjrcoooqDUKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKAPOf2vfAOg/FL9l7x74d8VeMb7wB4W1nQ7q01rxDaXdpZy6VYvGRcSCe 6jkgiHlbwZHQ7FJYFWAYeDfCz9iH4dfG7T7Px/8ADT48+K9Y05tC0jw/omt+Fbzw3f2Gnto8twI7 q2dNOkhe4LXV+kwk8yI/bJh5SlYvK9W/bs+FHiH4qfCPRW8NaTbeJb7wn4p0jxPL4fnlhiXxDBZX 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 vgN4g+CngfUf+Ff/AAwvfhbo93PZDxV/wjfheawt5JLW6YEal9ltyCYpmZT5+3a5YfMc16jXyh+y P+wP8Tf2Y/FviHW7/wCMumeNb/VfC/8AYdgdV8P6reHTLhLy6ubeUz3us3N3PbIbplMEs5kOPluI 12ov1ZbLIltGJnSSYKA7IhRWbHJAJJAz2ycepq5KNlyv/gatJf8AgKX36dllFyu+b/h9E2/nJu3X TXzqeHPC+meD9Naz0jTrDS7Rp5rkwWdukEZlmkaWWTaoA3vI7uzdWZ2JySTV6iioLCiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKzfGWt3Hhrwhquo2lhNqt3p9nNcw2URIkv HRCyxLgE5YgKMA8noelTOahFyeyKhBykordmlRX51j/gsN8eB+2tafs/t+zV4Cj+I954B/4WCtq3 xauRAltlh9iaT+wuLzepTaAYs/8ALXHNffvw/wDEV34v8BaJq1/pk+iX2qWEF3c6dOSZbCSSNXaF iVU7kJKnKg5XoOlacrs32/zkvnrGS07eaMlNNpd/8k/lpJP5+TNeiiipLCivnH/gqv8At46l/wAE 1f2Nta+L9j4LsfHlt4dvbOC/0yfXW0h/IuJ1txJFILa4DusskXyMqAqXO/KhW+ibC6+3WMM+3b50 avtznGRnFOK5oua2Tt87J/k0Oa5XFP7SbXydmS0UUUhBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFeTftSftZad+zfc+DtDt9Mm8T+PPiTqp0Twp4et7mO3k1K4WJ5pppZHz5NrBCjSz TBXKKAFSR2SNhatR6tpL1eiC2jfZNv0Su38kes0V8DWn/BcL+1vih4gNh8N7C8+GnhX4uW3wb1PV k8WbvE0WqTOkCXaaMtoytZm6YorfbBM0aPIIcqUr1fQP+CgXiaL/AIKny/s1eIvh9oWnQ3fgufx1 pPiXTvFMt81zZJe/ZEintJLGEQzMwdiEmlVQFAZsnDpr2ii4favb5QVR/wDkjUtd1sOacOZS+za/ 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 AA0ATAMAAC07AwAAAA== ------=_NextPart_000_0316_01D03EB5.ADE67A30-- From david@fromorbit.com Mon Feb 2 00:21:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD7757F90 for ; Mon, 2 Feb 2015 00:21:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AEA49304077 for ; Sun, 1 Feb 2015 22:21:09 -0800 (PST) X-ASG-Debug-ID: 1422858063-04bdf01eed9c3db0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id tPMjUn62k93c2GLA for ; Sun, 01 Feb 2015 22:21:04 -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: At8MADEWz1R5LHOVPGdsb2JhbABbgwYiMFmCMoN5q2QMAQEBAQEBBpI0AoVzBIEYRAEBAQEBBgEBAQE4O4RpOyQ0BSUDBy2ILK4EpTQYhWyKEYIXDECBMAWFS4dbhTGFVoomiDeBZwwBgjAqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail06.adl2.internode.on.net with ESMTP; 02 Feb 2015 16:51:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIANa-0004bE-4i for xfs@oss.sgi.com; Mon, 02 Feb 2015 17:21:02 +1100 Date: Mon, 2 Feb 2015 17:21:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 1790736 Message-ID: <20150202062102.GH6282@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 1790736 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="MGYHOYXEY6WxJCY8" 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: 1422858064 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --MGYHOYXEY6WxJCY8 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: 1790736 Merge branch 'xfs-ioctl-setattr-cleanup' into for-next New Commits: Brian Foster (1): [4d94902] xfs: remove incorrect error negation in attr_multi ioctl Christoph Hellwig (2): [8add71c] xfs: factor out a xfs_update_prealloc_flags() helper [2ba6623] xfs: don't allocate an ioend for direct I/O completions Dave Chinner (10): [3fd1b0d] Merge branch 'xfs-misc-fixes-for-3.20-3' into for-next [817b6c4] xfs: FSX_NONBLOCK is not used [29a17c0] xfs: separate xflags from xfs_ioctl_setattr [8f3d17a] xfs: factor out xfs_ioctl_setattr transaciton preamble [f96291f] xfs: disaggregate xfs_ioctl_setattr [fd179b9] xfs: kill xfs_ioctl_setattr behaviour mask [41c1452] xfs: XFS_IOCTL_SETXATTR can run in user namespaces [d4388d3c] xfs: factor extsize hint checking out of xfs_ioctl_setattr [23bd073] xfs: factor projid hint checking out of xfs_ioctl_setattr [1790736] Merge branch 'xfs-ioctl-setattr-cleanup' into for-next Iustin Pop (1): [9b94fcc] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Wang, Yalin (1): [f3d2155] xfs: change kmem_free to use generic kvfree() Code Diffstat: fs/xfs/kmem.c | 10 - fs/xfs/kmem.h | 5 +- fs/xfs/xfs_aops.c | 149 +++++++-------- fs/xfs/xfs_aops.h | 3 - fs/xfs/xfs_file.c | 64 ++++--- fs/xfs/xfs_inode.h | 9 + fs/xfs/xfs_ioctl.c | 501 +++++++++++++++++++++++++----------------------= ---- fs/xfs/xfs_ioctl32.c | 2 +- 8 files changed, 360 insertions(+), 383 deletions(-) --=20 Dave Chinner david@fromorbit.com --MGYHOYXEY6WxJCY8 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJUzxdNAAoJEK3oKUf0dfodv6EQAL50006ViebOdq6cg6DQvK1+ 72EWe9tzzCTFE1zTv9plQ6EB0MQJSdWQSMyv+MlikoYN809ekciWFt97F50AyR0m vcYvVQT5g/SpPjZ0SUdV7r7WpkdWUCWHxVUOngLmYCYOYoOLsCCSxI2EhlBZ38sr OvKppQWs3n9UJh4EvwKISziRXyTpJN8lD7FPVjDnOpBpSr3O8eIaMbjRLDNejE/V V1P4x0vkD2G1v32RSgKPU43tcKJWuS1ayrDrLwCVJAfn2QLK4WSWXE1VFBZzc8Xz sBXWrvx4BK+m0rSBAtHMQRxSq9YNfuwQQgdSfdnsY9llv+8ZlVOWWTUxBpiku08v wcvpvM6OULXEU3F8GnyFUglnFGsJhDDTadiI1GQFWTBKUAQ5sm7LoS/aIImaE11q 06bYiYrO0LCxbJeNeS2xdfF3NWYk1qjvAMbjWVqR40MLdz8aQgBZJv85JQpO/JLi 0DTtG5knXct/tsTgvOICSi9R5b/zHUVRfewOPpimPHR9XvJgyQ6cLi9S8vg0eJP/ pGNnpJpg2Kck6L05l6GMEXF1bQGtgJAWhVOdnQgDlcmfoqdW545WSyHLJurnz1Ix syWHOT/ARF9eCZe+CWe9SESjjBIHkiFV567iXDi27lsAvA0A5ojLcRKRGNfoqUOc tD15xrV22mbvuO0S7M5F =RT3i -----END PGP SIGNATURE----- --MGYHOYXEY6WxJCY8-- From adrscube@gmail.com Mon Feb 2 00:35:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 07CFC7F9C for ; Mon, 2 Feb 2015 00:35:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB32A8F8081 for ; Sun, 1 Feb 2015 22:34:59 -0800 (PST) X-ASG-Debug-ID: 1422858898-04cb6c2e6cc01e90001-NocioJ Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by cuda.sgi.com with ESMTP id G74NozfvozfCFyfW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 01 Feb 2015 22:34:58 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.52 Received: by mail-pa0-f52.google.com with SMTP id kx10so78347656pab.11 for ; Sun, 01 Feb 2015 22:34:58 -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 :content-type; bh=a/FFk/5rijvNs5cCFAZCcdHufmq1kX7lq0QykKpOOsQ=; b=PAK8OrTOUgX95sVt6sv6Qnyz64yR5lsplFm/kNVB8sgypYu/2+ywh04dsF5JPjMsf6 SLzaA6jAtmot31x6XhZhKm6P972DtCWiapZcex4gut26xtlCPcJto7VwzAt5+6SpqEp5 o/XDmcFYfXQLu+4wn9XcYJJwMp4G6I2vfCr6HqPWMLoWHaf+gUVSSZ31i43E8OdTelZ5 T2NTz8tdJR9iTHOBzfpE3bH/7yqg2nz/mBYY7WlbQRAMRyg1dBwrHrj+cv8cYCr5AblD IF4MZPsPFZq7ghnBw/lZpJ+cpKoU69XbFQHLBlkfpMD2OMSnzN8EG0Nj4jGkxFG8IfF1 Ty1A== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.35.207 with SMTP id k15mr26507784pdj.166.1422858898072; Sun, 01 Feb 2015 22:34:58 -0800 (PST) Received: by 10.70.11.33 with HTTP; Sun, 1 Feb 2015 22:34:58 -0800 (PST) In-Reply-To: References: <54c1c12e.230a460a.4729.11fc@mx.google.com> <20150128015757.GT16552@dastard> <20150128205956.GA6282@dastard> <20150130013456.GA4251@dastard> Date: Mon, 2 Feb 2015 12:04:58 +0530 Message-ID: Subject: Re: [PATCH 2/2] xfs_spaceman: Accounting for AGFL blocks From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs_spaceman: Accounting for AGFL blocks To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f52.google.com[209.85.220.52] X-Barracuda-Start-Time: 1422858898 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, On Fri, Jan 30, 2015 at 1:55 PM, Dhruvesh Rathore wrote: > http://oss.sgi.com/archives/xfs/2015-01/msg00484.html > http://oss.sgi.com/archives/xfs/2015-01/msg00486.html > http://oss.sgi.com/archives/xfs/2015-01/msg00487.html > http://oss.sgi.com/archives/xfs/2015-01/msg00488.html > http://oss.sgi.com/archives/xfs/2015-01/msg00489.html We were wondering if you had a chance to review the above sent patches. :) Regards, A-DRS From fengguang.wu@intel.com Mon Feb 2 01:01:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EB6157F47 for ; Mon, 2 Feb 2015 01:01:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA71A8F8054 for ; Sun, 1 Feb 2015 23:01:22 -0800 (PST) X-ASG-Debug-ID: 1422860480-04cb6c2e6cc025c0001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id 6Vy46GlzDIcPDxEm for ; Sun, 01 Feb 2015 23:01:21 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP; 01 Feb 2015 22:54:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,504,1418112000"; d="scan'208";a="521177603" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by orsmga003.jf.intel.com with ESMTP; 01 Feb 2015 22:53:48 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1YIB0W-000NTa-Qt; Mon, 02 Feb 2015 15:01:16 +0800 Date: Mon, 2 Feb 2015 15:00:42 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [PATCH dgc-xfs] xfs: xfs_ioctl_setattr_check_extsize can be static Message-ID: <20150202070042.GA111291@lkp-sb04> X-ASG-Orig-Subj: [PATCH dgc-xfs] xfs: xfs_ioctl_setattr_check_extsize can be static References: <201502021535.BvQbm6Lm%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502021535.BvQbm6Lm%fengguang.wu@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.115] X-Barracuda-Start-Time: 1422860480 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS fs/xfs/xfs_ioctl.c:1102:1: sparse: symbol 'xfs_ioctl_setattr_check_extsize' was not declared. Should it be static? Signed-off-by: Fengguang Wu --- xfs_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 9f80853..992b669 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1098,7 +1098,7 @@ out_cancel: return ERR_PTR(error); } -int +static int xfs_ioctl_setattr_check_extsize( struct xfs_inode *ip, struct fsxattr *fa) From fengguang.wu@intel.com Mon Feb 2 01:01:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B250B7FA3 for ; Mon, 2 Feb 2015 01:01:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A16AF8F8054 for ; Sun, 1 Feb 2015 23:01:28 -0800 (PST) X-ASG-Debug-ID: 1422860483-04cbb04167bd3ba0001-NocioJ Received: from mga01.intel.com ([192.55.52.88]) by cuda.sgi.com with ESMTP id Jhn8YswenvrHHMvF for ; Sun, 01 Feb 2015 23:01:23 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.88 X-Barracuda-IPDD: Level2 [intel.com/192.55.52.88] Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 01 Feb 2015 23:01:22 -0800 X-Barracuda-IPDD: Level2 [intel.com/192.55.52.88] X-Barracuda-IPDD: Level2 [intel.com/192.55.52.88] X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,504,1418112000"; d="scan'208";a="679535770" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by orsmga002.jf.intel.com with ESMTP; 01 Feb 2015 23:01:18 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1YIB0W-000NTA-HW; Mon, 02 Feb 2015 15:01:16 +0800 Date: Mon, 2 Feb 2015 15:00:42 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [dgc-xfs:xfs-ioctl-setattr-cleanup 10/12] fs/xfs/xfs_ioctl.c:1102:1: sparse: symbol 'xfs_ioctl_setattr_check_extsize' was not declared. Should it be static? Message-ID: <201502021535.BvQbm6Lm%fengguang.wu@intel.com> X-ASG-Orig-Subj: [dgc-xfs:xfs-ioctl-setattr-cleanup 10/12] fs/xfs/xfs_ioctl.c:1102:1: sparse: symbol 'xfs_ioctl_setattr_check_extsize' was not declared. Should it be static? MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 1422860483 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 tree: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs xfs-ioctl-setattr-cleanup head: 9b94fcc39822b450af823b3d8cbef6b53ce87ed9 commit: d4388d3c0988ec00787ad1f8e63b5e2a6abef1dc [10/12] xfs: factor extsize hint checking out of xfs_ioctl_setattr reproduce: # apt-get install sparse git checkout d4388d3c0988ec00787ad1f8e63b5e2a6abef1dc make ARCH=x86_64 allmodconfig make C=1 CF=-D__CHECK_ENDIAN__ sparse warnings: (new ones prefixed by >>) >> fs/xfs/xfs_ioctl.c:1102:1: sparse: symbol 'xfs_ioctl_setattr_check_extsize' was not declared. Should it be static? Please review and possibly fold the followup patch. --- 0-DAY kernel test infrastructure Open Source Technology Center http://lists.01.org/mailman/listinfo/kbuild Intel Corporation From fengguang.wu@intel.com Mon Feb 2 01:07:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3E9D47F96 for ; Mon, 2 Feb 2015 01:07:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B9868F80C7 for ; Sun, 1 Feb 2015 23:07:21 -0800 (PST) X-ASG-Debug-ID: 1422860840-04cbb0416abd3e30001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id mRmCKNLQGB6gcWhQ for ; Sun, 01 Feb 2015 23:07:20 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 01 Feb 2015 23:00:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,862,1389772800"; d="scan'208";a="448560780" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by FMSMGA003.fm.intel.com with ESMTP; 01 Feb 2015 22:53:15 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1YIB6L-000R87-9B; Mon, 02 Feb 2015 15:07:17 +0800 Date: Mon, 2 Feb 2015 15:06:25 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [PATCH dgc-xfs] xfs: xfs_ioctl_setattr_check_projid can be static Message-ID: <20150202070625.GA12869@lkp-sb04> X-ASG-Orig-Subj: [PATCH dgc-xfs] xfs: xfs_ioctl_setattr_check_projid can be static References: <201502021514.DMjnGg1n%fengguang.wu@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502021514.DMjnGg1n%fengguang.wu@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.115] X-Barracuda-Start-Time: 1422860840 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS fs/xfs/xfs_ioctl.c:1146:1: sparse: symbol 'xfs_ioctl_setattr_check_projid' was not declared. Should it be static? Signed-off-by: Fengguang Wu --- xfs_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 1f186d2..1060513 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1142,7 +1142,7 @@ xfs_ioctl_setattr_check_extsize( return 0; } -int +static int xfs_ioctl_setattr_check_projid( struct xfs_inode *ip, struct fsxattr *fa) From fengguang.wu@intel.com Mon Feb 2 01:07:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 214FB7F96 for ; Mon, 2 Feb 2015 01:07:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E764F8F80C7 for ; Sun, 1 Feb 2015 23:07:22 -0800 (PST) X-ASG-Debug-ID: 1422860840-04bdf01eed9c4a40001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id JsJOIE3mJ5rKbUYq for ; Sun, 01 Feb 2015 23:07:21 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.65 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP; 01 Feb 2015 23:02:46 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,504,1418112000"; d="scan'208";a="660168172" Received: from bee.sh.intel.com (HELO bee) ([10.239.97.14]) by fmsmga001.fm.intel.com with ESMTP; 01 Feb 2015 23:07:19 -0800 Received: from kbuild by bee with local (Exim 4.83) (envelope-from ) id 1YIB6L-000R8B-I3; Mon, 02 Feb 2015 15:07:17 +0800 Date: Mon, 2 Feb 2015 15:06:25 +0800 From: kbuild test robot To: Dave Chinner Cc: kbuild-all@01.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: [dgc-xfs:xfs-ioctl-setattr-cleanup 11/12] fs/xfs/xfs_ioctl.c:1146:1: sparse: symbol 'xfs_ioctl_setattr_check_projid' was not declared. Should it be static? Message-ID: <201502021514.DMjnGg1n%fengguang.wu@intel.com> X-ASG-Orig-Subj: [dgc-xfs:xfs-ioctl-setattr-cleanup 11/12] fs/xfs/xfs_ioctl.c:1146:1: sparse: symbol 'xfs_ioctl_setattr_check_projid' was not declared. Should it be static? MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1422860841 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- tree: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs xfs-ioctl-setattr-cleanup head: 9b94fcc39822b450af823b3d8cbef6b53ce87ed9 commit: 23bd0735cfdf5322170a9ef48c7d47c2e6567ba8 [11/12] xfs: factor projid hint checking out of xfs_ioctl_setattr reproduce: # apt-get install sparse git checkout 23bd0735cfdf5322170a9ef48c7d47c2e6567ba8 make ARCH=x86_64 allmodconfig make C=1 CF=-D__CHECK_ENDIAN__ sparse warnings: (new ones prefixed by >>) fs/xfs/xfs_ioctl.c:1102:1: sparse: symbol 'xfs_ioctl_setattr_check_extsize' was not declared. Should it be static? >> fs/xfs/xfs_ioctl.c:1146:1: sparse: symbol 'xfs_ioctl_setattr_check_projid' was not declared. Should it be static? Please review and possibly fold the followup patch. --- 0-DAY kernel test infrastructure Open Source Technology Center http://lists.01.org/mailman/listinfo/kbuild Intel Corporation From hch@lst.de Mon Feb 2 01:27:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA61E7FAF for ; Mon, 2 Feb 2015 01:27:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96FAF8F8037 for ; Sun, 1 Feb 2015 23:27:20 -0800 (PST) X-ASG-Debug-ID: 1422862038-04cbb04168bd4430001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id eo9lu1k7ETpwk1Q8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Feb 2015 23:27:19 -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 ED6091432C; Mon, 2 Feb 2015 08:27:16 +0100 (CET) Date: Mon, 2 Feb 2015 08:27:16 +0100 From: Christoph Hellwig To: Dave Chinner Cc: Brian Foster , Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't allocate an ioend for direct I/O completions Message-ID: <20150202072716.GA9378@lst.de> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't allocate an ioend for direct I/O completions References: <1422485661-520-1-git-send-email-hch@lst.de> <20150130144223.GA27441@laptop.bfoster> <20150201230403.GD4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150201230403.GD4251@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422862038 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14851 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 10:04:03AM +1100, Dave Chinner wrote: > > A nit, but I guess you could kill the braces here now too. > > Given it's a multi-line return statement, the braces are fine. FWIW, > when we have a if () { return ...} else { return ... } we normally > kill the else. i.e: > > if (rw & WRITE) { > return foo( > bar, > baz); > } > return .....; > > So I modified it like this. For an if/else that is 100% symmetric like read vs write I prefer to keep the else, otherwise I agree. But in the end it's a very minor point, so it doesn't really matter. From hch@lst.de Mon Feb 2 01:30:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 043EB7FA9 for ; Mon, 2 Feb 2015 01:30:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E24298F804B for ; Sun, 1 Feb 2015 23:30:28 -0800 (PST) X-ASG-Debug-ID: 1422862226-04cbb04168bd4590001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id WrPkScWsHkYAL2uk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Feb 2015 23:30:27 -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 EF5B61432C; Mon, 2 Feb 2015 08:30:24 +0100 (CET) Date: Mon, 2 Feb 2015 08:30:24 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150202073024.GA9399@lst.de> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150129205232.GB11064@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422862227 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14851 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Jan 29, 2015 at 03:52:32PM -0500, J. Bruce Fields wrote: > Who can give us ACKs on these last five fs/xfs patches? (And is it > going to cause trouble if they go in through the nfsd tree?) We'd need ACKs from Dave. He already has pulled in two patches so we might run into some conflicts. Maybe the best idea is to add the exportfs patch to both the XFS and nfsd trees, so each of them can pull in the rest? Or we could commit the two XFS preparation patches to both tree and get something that compiles and works in the nfsd tree. From BATV+51d913603f524f51faf0+4180+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 2 02:41:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 721027FA9 for ; Mon, 2 Feb 2015 02:41:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 506968F8033 for ; Mon, 2 Feb 2015 00:41:07 -0800 (PST) X-ASG-Debug-ID: 1422866462-04bdf01eef9c6af0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id sCy5mBFTlytMymN0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 00:41:02 -0800 (PST) X-Barracuda-Envelope-From: BATV+51d913603f524f51faf0+4180+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 1YICZ4-0000Lu-LK; Mon, 02 Feb 2015 08:41:02 +0000 Date: Mon, 2 Feb 2015 00:41:02 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-ID: <20150202084102.GA28121@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1422866462 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14852 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > /* > - * Superblock - in core version. Must match the ondisk version below. > - * Must be padded to 64 bit alignment. > - */ > -typedef struct xfs_sb { > - __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ > - __uint32_t sb_blocksize; /* logical block size, bytes */ > -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) > +static inline int xfs_sb_version_hasfinobt(struct xfs_sb *sbp) So xfs_format.h now requires struct xfs_sb to be defined before it can be included? I guess we need to move these macros around as well. > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > index 2b830c2..a02236b 100644 > --- a/fs/xfs/xfs_super.h > +++ b/fs/xfs/xfs_super.h > @@ -61,6 +61,87 @@ struct xfs_mount; > struct xfs_buftarg; > struct block_device; > > +/* > + * Superblock - in core version. This does not have ot match the size and shape > + * of the on-disk superblock, but must contain all the fields that we use in the > + * on-disk superblock. > + */ > +struct xfs_sb { Is this really the right header? xfs_super.h only really is for bits related to linux super block operastions. I'd expect to move it close to stuct xfs_mount, and maybe even merge it into that in the long run. From bounce@client14.emailinfra.biz Mon Feb 2 03:59:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=DATE_IN_PAST_03_06, HTML_MESSAGE,NORMAL_HTTP_TO_IP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2964E7FBE for ; Mon, 2 Feb 2015 03:59:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1803B304032 for ; Mon, 2 Feb 2015 01:59:34 -0800 (PST) X-ASG-Debug-ID: 1422871170-04cbb04168bd7cd0001-NocioJ Received: from server14.emailinfra.biz (server14.emailinfra.biz [64.49.234.26]) by cuda.sgi.com with ESMTP id AuhSTzvj16wpUvlq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 01:59:31 -0800 (PST) X-Barracuda-Envelope-From: bounce@client14.emailinfra.biz X-Barracuda-Apparent-Source-IP: 64.49.234.26 Received: from client14 by server14.emailinfra.biz with local (Exim 4.84) (envelope-from ) id 1YIDn0-0007tu-Qk for xfs@oss.sgi.com; Mon, 02 Feb 2015 09:59:30 +0000 To: xfs@oss.sgi.com Subject: =?UTF-8?B?4pyIIFdpbnRlciBTZWFzb24ncyBCaWdnZXN0IFRyYXZlbCBEZWFsczogU3BlY2lhbCBDdXN0b21pemVkIFBhY2thZ2UgZm9yIFlvdSA=?= Message-ID: <4d02ebf1f03db70e370fcc98a28110f1@64.49.234.26> X-ASG-Orig-Subj: =?UTF-8?B?4pyIIFdpbnRlciBTZWFzb24ncyBCaWdnZXN0IFRyYXZlbCBEZWFsczogU3BlY2lhbCBDdXN0b21pemVkIFBhY2thZ2UgZm9yIFlvdSA=?= Date: Mon, 02 Feb 2015 06:32:08 +0000 From: "Charu Garg" Reply-To: noreply@client14.emailinfra.biz MIME-Version: 1.0 X-Mailer-LID: 17,18 List-Unsubscribe: X-Mailer-SID: 105 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_33e61e1ca030f4a340fe68be5d88bf15" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server14.emailinfra.biz X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [511 513] / [47 12] X-AntiAbuse: Sender Address Domain - client14.emailinfra.biz X-Get-Message-Sender-Via: server14.emailinfra.biz: authenticated_id: client14/from_h X-Barracuda-Connect: server14.emailinfra.biz[64.49.234.26] X-Barracuda-Start-Time: 1422871171 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.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, HTML_MESSAGE, NORMAL_HTTP_TO_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14853 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 HTML_MESSAGE BODY: HTML included in message 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 --b1_33e61e1ca030f4a340fe68be5d88bf15 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://64.49.234.26/~client14/display.php?M=6141039&C=3ade59a0490e29fa47b1692522a56aa4&S=105&L=18&N=15 To stop receiving these emails:http://64.49.234.26/~client14/unsubscribe.php?M=6141039&C=3ade59a0490e29fa47b1692522a56aa4&L=18&N=105 --b1_33e61e1ca030f4a340fe68be5d88bf15 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Holiday in India
popular-india.com
TOP INDIAN DESTINATIONS TO VISIT THIS SEASON
Kerala

3 Days / 2 Nights
Munnar | Wayanad | Cherai Beach

Get Tour Quote

Kerala

Manali

4 Days / 3 Nights
Rohtang Pass | Hadimba Temple | Solang Valley

Get Tour Quote

Manali

Andaman

6 Days / 5 Nights
Seawalk | Water Sports | Beach Camping

Get Tour Quote

Andaman

Shimla

4 Days / 3 Nights
Kufri | Naldhera | Green Valley

Get Tour Quote

Shimla

Darjeeling/Sikkim

3 Days / 2 Nights
Darjeeling | Sikkim | Gangtok

Get Tour Quote

North East

Rajasthan

4 Days / 3 Nights
Palaces | Luxury Hotels | Tiger Reserve

Get Tour Quote

Rajasthan

--b1_33e61e1ca030f4a340fe68be5d88bf15-- From hch@lst.de Mon Feb 2 06:43:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 29D117FC3 for ; Mon, 2 Feb 2015 06:43:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07204304032 for ; Mon, 2 Feb 2015 04:43:53 -0800 (PST) X-ASG-Debug-ID: 1422881030-04bdf01eed9cc240001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id zc5Qsa9HTFpYrANT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 04:43:51 -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 7AA201431F; Mon, 2 Feb 2015 13:43:49 +0100 (CET) Date: Mon, 2 Feb 2015 13:43:49 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150202124349.GA15598@lst.de> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150129203346.GA11064@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422881031 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Jan 29, 2015 at 03:33:46PM -0500, J. Bruce Fields wrote: > Is there no old_stateid case for layout stateids? And is there any > chance of wraparound? (I was comparing to check_stateid_generation and > expecting the only difference to be the handling of the generation-zero > case.) 12.5.3. explicitly mentions that LAYOUTGET and LAYOUTRETURN might be outstading and processed in parallel, and sais that pNFS operations use special stateid rules. It does not explicitly say that old stateids are ok, but the model described in there very much requires the server to not reject them. > > +static inline u64 > > +layout_end(struct nfsd4_layout_seg *seg) > > +{ > > + u64 end = seg->offset + seg->length; > > + return end >= seg->offset ? seg->length : NFS4_MAX_UINT64; > > Shouldn't that be > > return end >= seg->offset ? end : NFS_MAX_UINT64; > > ? Yes. This is an interesting one that sneaked in, and it turns out besides dislabling layout merging it didn't have adverse effects. > > +} > > + > > +static void > > +layout_update_len(struct nfsd4_layout_seg *lo, u64 end) > > +{ > > + if (end == NFS4_MAX_UINT64) > > + lo->length = NFS4_MAX_UINT64; > > Is this case necessary? > > > + else > > + lo->length = end - lo->offset; We use NFS4_MAX_UINT64 as a magic value for layouts until the field end, as specified in the standard. But because we do all kinds of calculations using the end value we need to propagate that magic from and to it. > Should any of these have OP_MODIFIES_SOMETHING set? (Basically: would > we be in trouble if we succesfully completed one of these operations and > then weren't able to encode the result?) All but GETDEVICEINFO should get it. I've implemented all your suggested changes and will send out and update after doing a little more testing. From bfields@fieldses.org Mon Feb 2 08:28:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5011F7FC7 for ; Mon, 2 Feb 2015 08:28:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C74D304051 for ; Mon, 2 Feb 2015 06:28:33 -0800 (PST) X-ASG-Debug-ID: 1422887312-04cbb0416abdd330001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id xu0FfnEuIDRRN1CE for ; Mon, 02 Feb 2015 06:28:32 -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 2626D3D1C; Mon, 2 Feb 2015 09:28:32 -0500 (EST) Date: Mon, 2 Feb 2015 09:28:32 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150202142832.GC22301@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> <20150202124349.GA15598@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202124349.GA15598@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1422887312 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 01:43:49PM +0100, Christoph Hellwig wrote: > On Thu, Jan 29, 2015 at 03:33:46PM -0500, J. Bruce Fields wrote: > > Is there no old_stateid case for layout stateids? And is there any > > chance of wraparound? (I was comparing to check_stateid_generation and > > expecting the only difference to be the handling of the generation-zero > > case.) > > 12.5.3. explicitly mentions that LAYOUTGET and LAYOUTRETURN might be > outstading and processed in parallel, and sais that pNFS operations > use special stateid rules. It does not explicitly say that old stateids > are ok, but the model described in there very much requires the server > to not reject them. > > > > +static inline u64 > > > +layout_end(struct nfsd4_layout_seg *seg) > > > +{ > > > + u64 end = seg->offset + seg->length; > > > + return end >= seg->offset ? seg->length : NFS4_MAX_UINT64; > > > > Shouldn't that be > > > > return end >= seg->offset ? end : NFS_MAX_UINT64; > > > > ? > > Yes. This is an interesting one that sneaked in, and it turns out > besides dislabling layout merging it didn't have adverse effects. > > > > +} > > > + > > > +static void > > > +layout_update_len(struct nfsd4_layout_seg *lo, u64 end) > > > +{ > > > + if (end == NFS4_MAX_UINT64) > > > + lo->length = NFS4_MAX_UINT64; > > > > Is this case necessary? > > > > > + else > > > + lo->length = end - lo->offset; > > > We use NFS4_MAX_UINT64 as a magic value for layouts until the > field end, as specified in the standard. But because we do all > kinds of calculations using the end value we need to propagate > that magic from and to it. > > > Should any of these have OP_MODIFIES_SOMETHING set? (Basically: would > > we be in trouble if we succesfully completed one of these operations and > > then weren't able to encode the result?) > > All but GETDEVICEINFO should get it. > > I've implemented all your suggested changes and will send out and update > after doing a little more testing. Thanks! I didn't notice anything that looked like a big problem to me, so absent any objections I'll commit the revised versions for 3.20 once we figure out how to handle the xfs stuff. --b. From hch@lst.de Mon Feb 2 08:56:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 400837FCD for ; Mon, 2 Feb 2015 08:56:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE60DAC002 for ; Mon, 2 Feb 2015 06:56:23 -0800 (PST) X-ASG-Debug-ID: 1422888981-04cb6c2e6bc0c730001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id yvtGnOE1kTaPuwkT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 06:56:22 -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 87260AAB39; Mon, 2 Feb 2015 15:56:19 +0100 (CET) Date: Mon, 2 Feb 2015 15:56:19 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150202145619.GA18387@lst.de> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> <20150202124349.GA15598@lst.de> <20150202142832.GC22301@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202142832.GC22301@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422888982 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Feb 02, 2015 at 09:28:32AM -0500, J. Bruce Fields wrote: > I didn't notice anything that looked like a big problem to me, so absent > any objections I'll commit the revised versions for 3.20 once we figure > out how to handle the xfs stuff. Do you want the resend to be on top of Jeffs locks tree, or do you want me to be based just on the nfsd changes, which would require a fairly trivial merge once both of the trees hit mainline? From bfields@fieldses.org Mon Feb 2 09:00:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75CF67F61 for ; Mon, 2 Feb 2015 09:00:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52EC3304032 for ; Mon, 2 Feb 2015 07:00:34 -0800 (PST) X-ASG-Debug-ID: 1422889232-04cb6c2e6ac0c8d0001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id Evk8vXGycGoNmdhq for ; Mon, 02 Feb 2015 07:00:33 -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 69C1740DF; Mon, 2 Feb 2015 10:00:32 -0500 (EST) Date: Mon, 2 Feb 2015 10:00:32 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150202150032.GD22301@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> <20150202124349.GA15598@lst.de> <20150202142832.GC22301@fieldses.org> <20150202145619.GA18387@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202145619.GA18387@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1422889233 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 03:56:19PM +0100, Christoph Hellwig wrote: > On Mon, Feb 02, 2015 at 09:28:32AM -0500, J. Bruce Fields wrote: > > I didn't notice anything that looked like a big problem to me, so absent > > any objections I'll commit the revised versions for 3.20 once we figure > > out how to handle the xfs stuff. > > Do you want the resend to be on top of Jeffs locks tree, or do you > want me to be based just on the nfsd changes, which would require > a fairly trivial merge once both of the trees hit mainline? I'm planning to pull Jeff's tree and then apply these on top. (Even if the conflict's fairly trivial I'm just happier being able to test the combination exactly as they're commited.) I'll do that now, should be pushed out in an hour or two. --b. From bfoster@redhat.com Mon Feb 2 10:28:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 379287F7B for ; Mon, 2 Feb 2015 10:28:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 164CD8F804B for ; Mon, 2 Feb 2015 08:28:02 -0800 (PST) X-ASG-Debug-ID: 1422894481-04bdf01eee9d2660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BhBTtUvNSPU4T2LB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 08:28:01 -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 (8.14.4/8.14.4) with ESMTP id t12GRx0G007918 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 2 Feb 2015 11:28:00 -0500 Received: from laptop.bfoster (vpn-59-67.rdu2.redhat.com [10.10.59.67]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t12GRtj9005914 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 2 Feb 2015 11:27:58 -0500 Date: Mon, 2 Feb 2015 11:27:55 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] libxfs: report VERSION in libxfs_fs_repair_cmn_err() Message-ID: <20150202162755.GA6096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] libxfs: report VERSION in libxfs_fs_repair_cmn_err() References: <54CB2487.6040602@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54CB2487.6040602@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1422894481 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Jan 30, 2015 at 12:28:23AM -0600, Eric Sandeen wrote: > Because this is usually the first question asked... > > Signed-off-by: Eric Sandeen > --- Good idea. Reviewed-by: Brian Foster > > diff --git a/libxfs/util.c b/libxfs/util.c > index 9504e33..6464a1b 100644 > --- a/libxfs/util.c > +++ b/libxfs/util.c > @@ -718,6 +718,7 @@ libxfs_fs_repair_cmn_err(int level, xfs_mount_t *mp, char *fmt, ...) > va_start(ap, fmt); > vfprintf(stderr, fmt, ap); > fprintf(stderr, " This is a bug.\n"); > + fprintf(stderr, "%s version %s\n", progname, VERSION); > fprintf(stderr, "Please capture the filesystem metadata with " > "xfs_metadump and\nreport it to xfs@oss.sgi.com.\n"); > va_end(ap); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+51d913603f524f51faf0+4180+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 2 10:44:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F36BE7FD8 for ; Mon, 2 Feb 2015 10:44:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D74728F8033 for ; Mon, 2 Feb 2015 08:44:11 -0800 (PST) X-ASG-Debug-ID: 1422895449-04cbb04169be0490001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CEseJcEyEVZG63EY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 08:44:10 -0800 (PST) X-Barracuda-Envelope-From: BATV+51d913603f524f51faf0+4180+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 1YIK6b-0007A5-Cq; Mon, 02 Feb 2015 16:44:09 +0000 Date: Mon, 2 Feb 2015 08:44:09 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter Message-ID: <20150202164409.GA695@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1422895450 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 4cf335b..7bfa527 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -357,7 +357,8 @@ __xfs_sb_from_disk( > to->sb_rextslog = from->sb_rextslog; > to->sb_inprogress = from->sb_inprogress; > to->sb_imax_pct = from->sb_imax_pct; > - to->sb_icount = be64_to_cpu(from->sb_icount); > + if (percpu_counter_initialized(&to->sb_icount)) > + percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); Why would the percpu counter not be initialized here? Oh, I guess this is for xfs_sb_verify(). But why can't xfs_mount_validate_sb simply operate on the disk endian SB to avoid that whole issue? > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 6015f54..df5ec55 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1127,13 +1127,13 @@ xfs_mod_incore_sb_unlocked( > */ > switch (field) { > case XFS_SBS_ICOUNT: > + /* deltas are +/-64, hence the large batch size of 128. */ > + __percpu_counter_add(&mp->m_sb.sb_icount, delta, 128); > + if (percpu_counter_compare(&mp->m_sb.sb_icount, 0) < 0) { > ASSERT(0); > + percpu_counter_add(&mp->m_sb.sb_icount, -delta); > return -EINVAL; > } > return 0; > case XFS_SBS_IFREE: > lcounter = (long long)mp->m_sb.sb_ifree; > @@ -1288,8 +1288,11 @@ xfs_mod_incore_sb( > int status; > > #ifdef HAVE_PERCPU_SB > - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); > + ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); > #endif > + if (field == XFS_SBS_ICOUNT) > + return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > + Why is this multiplexd through xfs_mod_incore_sb_unlocked while needing a different locking context? Shouldn't we simply use a different helper for this case? > xfs_icsb_cnts_t *cntp; > int i; > > + i = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); > + if (i) > + return ENOMEM; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > - if (mp->m_sb_cnts == NULL) > + if (!mp->m_sb_cnts) { > + percpu_counter_destroy(&mp->m_sb.sb_icount); > return -ENOMEM; > + } > > for_each_online_cpu(i) { Reusing a variable for both an errno value and a loop iterator is not very readable, just add an additional "error" variabe. Also percpu_counter_init returns a proper egative errno value, no need to turn that into the incorrect postive ENOMEM. Additionally should this use goto unwining? > if (idelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, > - idelta, rsvd); > + error = xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, idelta, rsvd); Why go through xfs_mod_incore_sb here instead of directly jumping to the function that does the work? From BATV+51d913603f524f51faf0+4180+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 2 10:48:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DCE527FE5 for ; Mon, 2 Feb 2015 10:48:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB713304053 for ; Mon, 2 Feb 2015 08:48:49 -0800 (PST) X-ASG-Debug-ID: 1422895728-04cb6c2e6cc0fa00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id IUqxgceC3AdCFSi4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 08:48:48 -0800 (PST) X-Barracuda-Envelope-From: BATV+51d913603f524f51faf0+4180+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 1YIKB6-0000rg-01; Mon, 02 Feb 2015 16:48:48 +0000 Date: Mon, 2 Feb 2015 08:48:47 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter Message-ID: <20150202164847.GB695@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1422895728 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > case XFS_SBS_FDBLOCKS: > > if (delta > 0) { /* Putting blocks back */ > + if (mp->m_resblks == mp->m_resblks_avail) { > + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); > + return 0; > + } > + > + /* put blocks back into reserve pool first */ > + 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; > } else { > + delta -= res_used; > mp->m_resblks_avail = mp->m_resblks; > + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); > } > + spin_unlock(&mp->m_sb_lock); > + return 0; > > + } > > + /* > + * Taking blocks away, need to be more accurate the closer we > + * are to zero. > + * > + * batch size is set to a maximum of 1024 blocks - if we are > + * allocating of freeing extents larger than this then we aren't > + * going to be hammering the counter lock so a lock per update > + * is not a problem. > + * > + * If the counter has a value of less than 2 * max batch size, > + * then make everything serialise as we are real close to > + * ENOSPC. > + */ > +#define __BATCH 1024 > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > + 2 * __BATCH) < 0) > + batch = 1; > + else > + batch = __BATCH; > + > + __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { > + /* we had space! */ > + return 0; > } > > + /* > + * lock up the sb for dipping into reserves before releasing > + * the space that took us to ENOSPC. > + */ > + spin_lock(&mp->m_sb_lock); > + percpu_counter_add(&mp->m_sb.sb_fdblocks, -delta); > + if (!rsvd) > + goto fdblocks_enospc; > + > + lcounter = (long long)mp->m_resblks_avail + delta; > + if (lcounter >= 0) { > + mp->m_resblks_avail = lcounter; > + spin_unlock(&mp->m_sb_lock); > + return 0; > + } > + printk_once(KERN_WARNING > + "Filesystem \"%s\": reserve blocks depleted! " > + "Consider increasing reserve pool size.", > + mp->m_fsname); > +fdblocks_enospc: > + spin_unlock(&mp->m_sb_lock); > + return -ENOSPC; > + This screams for having two different helpers for removing vs adding back reserved blocks. From bfoster@redhat.com Mon Feb 2 11:10:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B44A7F5A for ; Mon, 2 Feb 2015 11:10:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C1EEAC006 for ; Mon, 2 Feb 2015 09:10:27 -0800 (PST) X-ASG-Debug-ID: 1422897025-04cb6c2e6cc10220001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v90pGRrAJMqu0Prs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 09:10:26 -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 (8.14.4/8.14.4) with ESMTP id t12HANIm026513 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 2 Feb 2015 12:10:24 -0500 Received: from laptop.bfoster (vpn-59-67.rdu2.redhat.com [10.10.59.67]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t12HAJUG025562 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 2 Feb 2015 12:10:22 -0500 Date: Mon, 2 Feb 2015 12:10:19 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: use generic percpu counters for free inode counter Message-ID: <20150202171019.GB6096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: use generic percpu counters for free inode counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1422897026 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 02, 2015 at 08:43:01AM +1100, Dave Chinner wrote: > From: Dave Chinner > > XFS has hand-rolled per-cpu counters for the superblock since before > there was any generic implementation. The free inode counter is not > used for any limit enforcement - the per-AG free inode counters are > used during allocation to determine if there are inode available for > allocation. > > Hence we don't need any of the complexity of the hand-rolled > counters and we can simply replace them with generic per-cpu > counters similar to the inode counter. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_sb.c | 8 ++++--- > fs/xfs/xfs_fsops.c | 2 +- > fs/xfs/xfs_mount.c | 62 +++++++++++++++++--------------------------------- > fs/xfs/xfs_super.c | 4 +++- > fs/xfs/xfs_super.h | 2 +- > fs/xfs/xfs_trans.c | 5 ++-- > 6 files changed, 33 insertions(+), 50 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 7bfa527..42e5c89 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -359,7 +359,8 @@ __xfs_sb_from_disk( > to->sb_imax_pct = from->sb_imax_pct; > if (percpu_counter_initialized(&to->sb_icount)) > percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); > - to->sb_ifree = be64_to_cpu(from->sb_ifree); > + if (percpu_counter_initialized(&to->sb_icount)) sb_ifree Brian > + percpu_counter_set(&to->sb_ifree, be64_to_cpu(from->sb_ifree)); > to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); > to->sb_frextents = be64_to_cpu(from->sb_frextents); > to->sb_uquotino = be64_to_cpu(from->sb_uquotino); > @@ -494,7 +495,7 @@ xfs_sb_to_disk( > to->sb_inprogress = from->sb_inprogress; > to->sb_imax_pct = from->sb_imax_pct; > to->sb_icount = cpu_to_be64(percpu_counter_sum(&from->sb_icount)); > - to->sb_ifree = cpu_to_be64(from->sb_ifree); > + to->sb_ifree = cpu_to_be64(percpu_counter_sum(&from->sb_ifree)); > to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); > to->sb_frextents = cpu_to_be64(from->sb_frextents); > > @@ -540,6 +541,7 @@ xfs_sb_verify( > > /* don't need to validate icount here */ > sb.sb_icount.counters = NULL; > + sb.sb_ifree.counters = NULL; > > /* > * Use call variant which doesn't convert quota flags from disk > @@ -751,7 +753,7 @@ xfs_initialize_perag_data( > * Overwrite incore superblock counters with just-read data > */ > spin_lock(&mp->m_sb_lock); > - sbp->sb_ifree = ifree; > + percpu_counter_set(&sbp->sb_ifree, ifree); > percpu_counter_set(&sbp->sb_icount, ialloc); > sbp->sb_fdblocks = bfree + bfreelst + btree; > spin_unlock(&mp->m_sb_lock); > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 9cc34d2..619a9f3 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -632,11 +632,11 @@ xfs_fs_counts( > { > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); > + cnt->freeino = percpu_counter_read_positive(&mp->m_sb.sb_ifree); > > spin_lock(&mp->m_sb_lock); > cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > cnt->freertx = mp->m_sb.sb_frextents; > - cnt->freeino = mp->m_sb.sb_ifree; > spin_unlock(&mp->m_sb_lock); > return 0; > } > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index df5ec55..8e8924f 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1136,13 +1136,12 @@ xfs_mod_incore_sb_unlocked( > } > return 0; > case XFS_SBS_IFREE: > - lcounter = (long long)mp->m_sb.sb_ifree; > - lcounter += delta; > - if (lcounter < 0) { > + percpu_counter_add(&mp->m_sb.sb_ifree, delta); > + if (percpu_counter_compare(&mp->m_sb.sb_ifree, 0) < 0) { > ASSERT(0); > + percpu_counter_add(&mp->m_sb.sb_ifree, -delta); > return -EINVAL; > } > - mp->m_sb.sb_ifree = lcounter; > return 0; > case XFS_SBS_FDBLOCKS: > lcounter = (long long) > @@ -1288,9 +1287,9 @@ xfs_mod_incore_sb( > int status; > > #ifdef HAVE_PERCPU_SB > - ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); > + ASSERT(field != XFS_SBS_FDBLOCKS); > #endif > - if (field == XFS_SBS_ICOUNT) > + if (field == XFS_SBS_ICOUNT || field == XFS_SBS_IFREE) > return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > > spin_lock(&mp->m_sb_lock); > @@ -1495,7 +1494,6 @@ xfs_icsb_cpu_notify( > case CPU_ONLINE: > case CPU_ONLINE_FROZEN: > xfs_icsb_lock(mp); > - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > break; > @@ -1506,15 +1504,12 @@ xfs_icsb_cpu_notify( > * re-enable the counters. */ > xfs_icsb_lock(mp); > spin_lock(&mp->m_sb_lock); > - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); > xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > > - mp->m_sb.sb_ifree += cntp->icsb_ifree; > mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > spin_unlock(&mp->m_sb_lock); > xfs_icsb_unlock(mp); > @@ -1536,11 +1531,13 @@ xfs_icsb_init_counters( > if (i) > return ENOMEM; > > + i = percpu_counter_init(&mp->m_sb.sb_ifree, 0, GFP_KERNEL); > + if (i) > + goto free_icount; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > - if (!mp->m_sb_cnts) { > - percpu_counter_destroy(&mp->m_sb.sb_icount); > - return -ENOMEM; > - } > + if (!mp->m_sb_cnts) > + goto free_ifree; > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > @@ -1562,6 +1559,12 @@ xfs_icsb_init_counters( > #endif /* CONFIG_HOTPLUG_CPU */ > > return 0; > + > +free_ifree: > + percpu_counter_destroy(&mp->m_sb.sb_ifree); > +free_icount: > + percpu_counter_destroy(&mp->m_sb.sb_icount); > + return -ENOMEM; > } > > void > @@ -1574,7 +1577,6 @@ xfs_icsb_reinit_counters( > * initial balance kicks us off correctly > */ > mp->m_icsb_counters = -1; > - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > } > @@ -1589,6 +1591,7 @@ xfs_icsb_destroy_counters( > } > > percpu_counter_destroy(&mp->m_sb.sb_icount); > + percpu_counter_destroy(&mp->m_sb.sb_ifree); > > mutex_destroy(&mp->m_icsb_mutex); > } > @@ -1652,7 +1655,6 @@ xfs_icsb_count( > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - cnt->icsb_ifree += cntp->icsb_ifree; > cnt->icsb_fdblocks += cntp->icsb_fdblocks; > } > > @@ -1665,7 +1667,7 @@ xfs_icsb_counter_disabled( > xfs_mount_t *mp, > xfs_sb_field_t field) > { > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > return test_bit(field, &mp->m_icsb_counters); > } > > @@ -1676,7 +1678,7 @@ xfs_icsb_disable_counter( > { > xfs_icsb_cnts_t cnt; > > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > > /* > * If we are already disabled, then there is nothing to do > @@ -1695,9 +1697,6 @@ xfs_icsb_disable_counter( > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > switch(field) { > - case XFS_SBS_IFREE: > - mp->m_sb.sb_ifree = cnt.icsb_ifree; > - break; > case XFS_SBS_FDBLOCKS: > mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > break; > @@ -1719,15 +1718,12 @@ xfs_icsb_enable_counter( > xfs_icsb_cnts_t *cntp; > int i; > > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > > xfs_icsb_lock_all_counters(mp); > for_each_online_cpu(i) { > cntp = per_cpu_ptr(mp->m_sb_cnts, i); > switch (field) { > - case XFS_SBS_IFREE: > - cntp->icsb_ifree = count + resid; > - break; > case XFS_SBS_FDBLOCKS: > cntp->icsb_fdblocks = count + resid; > break; > @@ -1750,8 +1746,6 @@ xfs_icsb_sync_counters_locked( > > xfs_icsb_count(mp, &cnt, flags); > > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) > - mp->m_sb.sb_ifree = cnt.icsb_ifree; > if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > } > @@ -1803,12 +1797,6 @@ xfs_icsb_balance_counter_locked( > > /* update counters - first CPU gets residual*/ > switch (field) { > - case XFS_SBS_IFREE: > - count = mp->m_sb.sb_ifree; > - resid = do_div(count, weight); > - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) > - return; > - break; > case XFS_SBS_FDBLOCKS: > count = mp->m_sb.sb_fdblocks; > resid = do_div(count, weight); > @@ -1863,14 +1851,6 @@ again: > } > > switch (field) { > - case XFS_SBS_IFREE: > - lcounter = icsbp->icsb_ifree; > - lcounter += delta; > - if (unlikely(lcounter < 0)) > - goto balance_counter; > - icsbp->icsb_ifree = lcounter; > - break; > - > case XFS_SBS_FDBLOCKS: > BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 408e2fe..c17bfa4 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1088,6 +1088,7 @@ xfs_fs_statfs( > struct xfs_inode *ip = XFS_I(dentry->d_inode); > __uint64_t fakeinos, id; > __uint64_t sb_icount; > + __uint64_t sb_ifree; > xfs_extlen_t lsize; > __int64_t ffree; > > @@ -1100,6 +1101,7 @@ xfs_fs_statfs( > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > sb_icount = percpu_counter_sum(&sbp->sb_icount); > + sb_ifree = percpu_counter_sum(&sbp->sb_ifree); > > spin_lock(&mp->m_sb_lock); > statp->f_bsize = sbp->sb_blocksize; > @@ -1116,7 +1118,7 @@ xfs_fs_statfs( > mp->m_maxicount); > > /* make sure statp->f_ffree does not underflow */ > - ffree = statp->f_files - (sb_icount - sbp->sb_ifree); > + ffree = statp->f_files - (sb_icount - sb_ifree); > statp->f_ffree = max_t(__int64_t, ffree, 0); > > spin_unlock(&mp->m_sb_lock); > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > index fa5603c..6efc7a2 100644 > --- a/fs/xfs/xfs_super.h > +++ b/fs/xfs/xfs_super.h > @@ -98,8 +98,8 @@ struct xfs_sb { > /* statistics */ > > struct percpu_counter sb_icount; /* allocated inodes */ > + struct percpu_counter sb_ifree; /* free inodes */ > > - __uint64_t sb_ifree; /* free inodes */ > __uint64_t sb_fdblocks; /* free data blocks */ > __uint64_t sb_frextents; /* free realtime extents */ > xfs_ino_t sb_uquotino; /* user quota inode */ > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index d78b0ae..c54d4b7 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -560,8 +560,7 @@ xfs_trans_unreserve_and_mod_sb( > } > > if (ifreedelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, > - ifreedelta, rsvd); > + error = xfs_mod_incore_sb(mp, XFS_SBS_IFREE, ifreedelta, rsvd); > if (error) > goto out_undo_icount; > } > @@ -630,7 +629,7 @@ xfs_trans_unreserve_and_mod_sb( > > out_undo_ifreecount: > if (ifreedelta) > - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); > + xfs_mod_incore_sb(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); > out_undo_icount: > if (idelta) > xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 2 11:11:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8272F7FEF for ; Mon, 2 Feb 2015 11:11:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44D74304053 for ; Mon, 2 Feb 2015 09:11:21 -0800 (PST) X-ASG-Debug-ID: 1422897079-04bdf01eed9d3aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fUSNn3lWt8WakTAm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 09:11:20 -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 (8.14.4/8.14.4) with ESMTP id t12HBIZB018502 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 2 Feb 2015 12:11:18 -0500 Received: from laptop.bfoster (vpn-59-67.rdu2.redhat.com [10.10.59.67]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t12HBESb014412 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 2 Feb 2015 12:11:17 -0500 Date: Mon, 2 Feb 2015 12:11:14 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: Remove icsb infrastructure Message-ID: <20150202171113.GC6096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: Remove icsb infrastructure References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1422897080 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 02, 2015 at 08:43:03AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Now that the in-cor superblock infrastructure has been replaced with > generic per-cpu counters, we don't need it anymore. Nuke it from > orbit so we are sure that it won't haunt us again... > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_bmap.c | 16 +- > fs/xfs/libxfs/xfs_sb.c | 10 +- > fs/xfs/xfs_fsops.c | 2 - > fs/xfs/xfs_iomap.c | 1 - > fs/xfs/xfs_linux.h | 9 - > fs/xfs/xfs_log_recover.c | 3 - > fs/xfs/xfs_mount.c | 509 ----------------------------------------------- > fs/xfs/xfs_mount.h | 64 +----- > fs/xfs/xfs_super.c | 76 +++++-- > 9 files changed, 67 insertions(+), 623 deletions(-) > ... > +static int > +xfs_init_percpu_counters( > + struct xfs_mount *mp) > +{ > + int error; > + > + error = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); > + if (error) > + return ENOMEM; -ENOMEM Brian > + > + error = percpu_counter_init(&mp->m_sb.sb_ifree, 0, GFP_KERNEL); > + if (error) > + goto free_icount; > + > + error = percpu_counter_init(&mp->m_sb.sb_fdblocks, 0, GFP_KERNEL); > + if (error) > + goto free_ifree; > + > + return 0; > + > +free_ifree: > + percpu_counter_destroy(&mp->m_sb.sb_ifree); > +free_icount: > + percpu_counter_destroy(&mp->m_sb.sb_icount); > + return -ENOMEM; > +} > + > +static void > +xfs_destroy_percpu_counters( > + struct xfs_mount *mp) > +{ > + percpu_counter_destroy(&mp->m_sb.sb_icount); > + percpu_counter_destroy(&mp->m_sb.sb_ifree); > + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); > +} > + > STATIC int > xfs_fs_fill_super( > struct super_block *sb, > @@ -1455,7 +1472,7 @@ xfs_fs_fill_super( > if (error) > goto out_close_devices; > > - error = xfs_icsb_init_counters(mp); > + error = xfs_init_percpu_counters(mp); > if (error) > goto out_destroy_workqueues; > > @@ -1513,7 +1530,7 @@ xfs_fs_fill_super( > out_free_sb: > xfs_freesb(mp); > out_destroy_counters: > - xfs_icsb_destroy_counters(mp); > + xfs_destroy_percpu_counters(mp); > out_destroy_workqueues: > xfs_destroy_mount_workqueues(mp); > out_close_devices: > @@ -1530,6 +1547,23 @@ out_destroy_workqueues: > goto out_free_sb; > } > > +STATIC void > +xfs_fs_put_super( > + struct super_block *sb) > +{ > + struct xfs_mount *mp = XFS_M(sb); > + > + xfs_filestream_unmount(mp); > + xfs_unmountfs(mp); > + > + xfs_freesb(mp); > + xfs_destroy_percpu_counters(mp); > + xfs_destroy_mount_workqueues(mp); > + xfs_close_devices(mp); > + xfs_free_fsname(mp); > + kfree(mp); > +} > + > STATIC struct dentry * > xfs_fs_mount( > struct file_system_type *fs_type, > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 2 11:11:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9331A7F5F for ; Mon, 2 Feb 2015 11:11:42 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45095304053 for ; Mon, 2 Feb 2015 09:11:42 -0800 (PST) X-ASG-Debug-ID: 1422897100-04bdf01eec9d3ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iVYff1ogrFh7GMGG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 09:11:40 -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 (8.14.4/8.14.4) with ESMTP id t12HBcvg006732 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 2 Feb 2015 12:11:39 -0500 Received: from laptop.bfoster (vpn-59-67.rdu2.redhat.com [10.10.59.67]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t12HBXkx026436 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 2 Feb 2015 12:11:36 -0500 Date: Mon, 2 Feb 2015 12:11:33 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter Message-ID: <20150202171133.GD6096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1422897100 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 02, 2015 at 08:43:02AM +1100, Dave Chinner wrote: > XFS has hand-rolled per-cpu counters for the superblock since before > there was any generic implementation. The free block counter is > special in that it is used for ENOSPC detection outside transaction > contexts for for delayed allocation. This means that the counter > needs to be accurate at zero. The current per-cpu counter code jumps > through lots of hoops to ensure we never run past zero, but we don't > need to make all those jumps with the generic counter > implementation. > > The generic counter implementation allows us to pass a "batch" > threshold at which the addition/subtraction to the counter value > will be folded back into global value under lock. We can use this > feature to reduce the batch size as we approach 0 in a very similar > manner to the existing counters and their rebalance algorithm. If we > use a batch size of 1 as we approach 0, then every addition and > subtraction will be done against the global value and hence allow > accurate detection of zero threshold crossing. > > Hence we can replace the handrolled, accurate-at-zero counters with > generic percpu counters. > > Note: this removes just enough of the icsb infrastructure to compile > without warnings. The rest will go in subsequent commits. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_sb.c | 11 +++- > fs/xfs/xfs_fsops.c | 9 +-- > fs/xfs/xfs_iomap.c | 2 +- > fs/xfs/xfs_mount.c | 167 ++++++++++++++++++++++++------------------------- > fs/xfs/xfs_super.c | 11 +++- > fs/xfs/xfs_super.h | 2 +- > fs/xfs/xfs_trans.c | 9 ++- > 7 files changed, 109 insertions(+), 102 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 42e5c89..bdde5c7 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -357,11 +357,15 @@ __xfs_sb_from_disk( > to->sb_rextslog = from->sb_rextslog; > to->sb_inprogress = from->sb_inprogress; > to->sb_imax_pct = from->sb_imax_pct; > + > if (percpu_counter_initialized(&to->sb_icount)) > percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); > if (percpu_counter_initialized(&to->sb_icount)) > percpu_counter_set(&to->sb_ifree, be64_to_cpu(from->sb_ifree)); > - to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); > + if (percpu_counter_initialized(&to->sb_fdblocks)) > + percpu_counter_set(&to->sb_fdblocks, > + be64_to_cpu(from->sb_fdblocks)); > + > to->sb_frextents = be64_to_cpu(from->sb_frextents); > to->sb_uquotino = be64_to_cpu(from->sb_uquotino); > to->sb_gquotino = be64_to_cpu(from->sb_gquotino); > @@ -496,7 +500,7 @@ xfs_sb_to_disk( > to->sb_imax_pct = from->sb_imax_pct; > to->sb_icount = cpu_to_be64(percpu_counter_sum(&from->sb_icount)); > to->sb_ifree = cpu_to_be64(percpu_counter_sum(&from->sb_ifree)); > - to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); > + to->sb_fdblocks = cpu_to_be64(percpu_counter_sum(&from->sb_fdblocks)); > to->sb_frextents = cpu_to_be64(from->sb_frextents); > > to->sb_flags = from->sb_flags; > @@ -542,6 +546,7 @@ xfs_sb_verify( > /* don't need to validate icount here */ > sb.sb_icount.counters = NULL; > sb.sb_ifree.counters = NULL; > + sb.sb_fdblocks.counters = NULL; > > /* > * Use call variant which doesn't convert quota flags from disk > @@ -755,7 +760,7 @@ xfs_initialize_perag_data( > spin_lock(&mp->m_sb_lock); > percpu_counter_set(&sbp->sb_ifree, ifree); > percpu_counter_set(&sbp->sb_icount, ialloc); > - sbp->sb_fdblocks = bfree + bfreelst + btree; > + percpu_counter_set(&sbp->sb_fdblocks, bfree + bfreelst + btree); > spin_unlock(&mp->m_sb_lock); > > /* Fixup the per-cpu counters as well. */ > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 619a9f3..ccb00cd 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -633,9 +633,10 @@ xfs_fs_counts( > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > cnt->allocino = percpu_counter_read_positive(&mp->m_sb.sb_icount); > cnt->freeino = percpu_counter_read_positive(&mp->m_sb.sb_ifree); > + cnt->freedata = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks) - > + XFS_ALLOC_SET_ASIDE(mp); > > spin_lock(&mp->m_sb_lock); > - cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > cnt->freertx = mp->m_sb.sb_frextents; > spin_unlock(&mp->m_sb_lock); > return 0; > @@ -710,7 +711,8 @@ retry: > } else { > __int64_t free; > > - free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + free = percpu_counter_sum(&mp->m_sb.sb_fdblocks) - > + XFS_ALLOC_SET_ASIDE(mp); > if (!free) > goto out; /* ENOSPC and fdblks_delta = 0 */ > > @@ -749,8 +751,7 @@ out: > * the extra reserve blocks from the reserve..... > */ > int error; > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - fdblks_delta, 0); > + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, fdblks_delta, 0); > if (error == -ENOSPC) > goto retry; > } > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index ccb1dd0..310433a 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -461,7 +461,7 @@ xfs_iomap_prealloc_size( > alloc_blocks); > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > - freesp = mp->m_sb.sb_fdblocks; > + freesp = percpu_counter_read_positive(&mp->m_sb.sb_fdblocks); > if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > shift = 2; > if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 8e8924f..0e37248 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1117,7 +1117,8 @@ xfs_mod_incore_sb_unlocked( > { > int scounter; /* short counter for 32 bit fields */ > long long lcounter; /* long counter for 64 bit fields */ > - long long res_used, rem; > + long long res_used; > + s32 batch; > > /* > * With the in-core superblock spin lock held, switch > @@ -1144,47 +1145,80 @@ xfs_mod_incore_sb_unlocked( > } > return 0; > case XFS_SBS_FDBLOCKS: > - lcounter = (long long) > - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); > > if (delta > 0) { /* Putting blocks back */ > + if (mp->m_resblks == mp->m_resblks_avail) { > + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); > + return 0; > + } > + > + /* put blocks back into reserve pool first */ > + 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; > } else { > - rem = delta - res_used; > + delta -= res_used; > mp->m_resblks_avail = mp->m_resblks; > - lcounter += rem; > - } > - } else { /* Taking blocks away */ > - lcounter += delta; > - if (lcounter >= 0) { > - mp->m_sb.sb_fdblocks = lcounter + > - XFS_ALLOC_SET_ASIDE(mp); > - return 0; > + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); > } > + spin_unlock(&mp->m_sb_lock); > + return 0; > > - /* > - * We are out of blocks, use any available reserved > - * blocks if were allowed to. > - */ > - if (!rsvd) > - return -ENOSPC; > + } > > - lcounter = (long long)mp->m_resblks_avail + delta; > - if (lcounter >= 0) { > - mp->m_resblks_avail = lcounter; > - return 0; > - } > - printk_once(KERN_WARNING > - "Filesystem \"%s\": reserve blocks depleted! " > - "Consider increasing reserve pool size.", > - mp->m_fsname); > - return -ENOSPC; > + /* > + * Taking blocks away, need to be more accurate the closer we > + * are to zero. > + * > + * batch size is set to a maximum of 1024 blocks - if we are > + * allocating of freeing extents larger than this then we aren't > + * going to be hammering the counter lock so a lock per update > + * is not a problem. > + * IIUC, the batch size determines the point at which the local cpu delta is folded back into the global counter (under lock). If we're allocating large extents, these will surpass the batch size and result in a locked update. Smaller updates are aggregated into the cpu counter and folded in at some later time. > + * If the counter has a value of less than 2 * max batch size, > + * then make everything serialise as we are real close to > + * ENOSPC. > + */ > +#define __BATCH 1024 > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > + 2 * __BATCH) < 0) > + batch = 1; > + else > + batch = __BATCH; > + The general approach seems logical. I do wonder whether blocks is the right scale as opposed to block count normalized against some fixed I/O size (to account for different block sizes). Also, it seems like speculative preallocation could hide some of the overhead here, depending on workload of course. Had that factored into your testing? > + __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { > + /* we had space! */ > + return 0; > } > > - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > - return 0; > + /* > + * lock up the sb for dipping into reserves before releasing > + * the space that took us to ENOSPC. > + */ > + spin_lock(&mp->m_sb_lock); Can you elaborate on the locking here, why it's needed where it wasn't before? Brian > + percpu_counter_add(&mp->m_sb.sb_fdblocks, -delta); > + if (!rsvd) > + goto fdblocks_enospc; > + > + lcounter = (long long)mp->m_resblks_avail + delta; > + if (lcounter >= 0) { > + mp->m_resblks_avail = lcounter; > + spin_unlock(&mp->m_sb_lock); > + return 0; > + } > + printk_once(KERN_WARNING > + "Filesystem \"%s\": reserve blocks depleted! " > + "Consider increasing reserve pool size.", > + mp->m_fsname); > +fdblocks_enospc: > + spin_unlock(&mp->m_sb_lock); > + return -ENOSPC; > + > case XFS_SBS_FREXTENTS: > lcounter = (long long)mp->m_sb.sb_frextents; > lcounter += delta; > @@ -1286,11 +1320,14 @@ xfs_mod_incore_sb( > { > int status; > > -#ifdef HAVE_PERCPU_SB > - ASSERT(field != XFS_SBS_FDBLOCKS); > -#endif > - if (field == XFS_SBS_ICOUNT || field == XFS_SBS_IFREE) > + switch (field) { > + case XFS_SBS_ICOUNT: > + case XFS_SBS_IFREE: > + case XFS_SBS_FDBLOCKS: > return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > + default: > + break; > + } > > spin_lock(&mp->m_sb_lock); > status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > @@ -1309,7 +1346,7 @@ xfs_mod_incore_sb( > * > * Note that this function may not be used for the superblock values that > * are tracked with the in-memory per-cpu counters - a direct call to > - * xfs_icsb_modify_counters is required for these. > + * xfs_mod_incore_sb is required for these. > */ > int > xfs_mod_incore_sb_batch( > @@ -1494,7 +1531,6 @@ xfs_icsb_cpu_notify( > case CPU_ONLINE: > case CPU_ONLINE_FROZEN: > xfs_icsb_lock(mp); > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > break; > case CPU_DEAD: > @@ -1504,13 +1540,9 @@ xfs_icsb_cpu_notify( > * re-enable the counters. */ > xfs_icsb_lock(mp); > spin_lock(&mp->m_sb_lock); > - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > - > - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > spin_unlock(&mp->m_sb_lock); > xfs_icsb_unlock(mp); > break; > @@ -1535,9 +1567,13 @@ xfs_icsb_init_counters( > if (i) > goto free_icount; > > + i = percpu_counter_init(&mp->m_sb.sb_fdblocks, 0, GFP_KERNEL); > + if (i) > + goto free_ifree; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > if (!mp->m_sb_cnts) > - goto free_ifree; > + goto free_fdblocks; > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > @@ -1560,6 +1596,8 @@ xfs_icsb_init_counters( > > return 0; > > +free_fdblocks: > + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); > free_ifree: > percpu_counter_destroy(&mp->m_sb.sb_ifree); > free_icount: > @@ -1577,7 +1615,6 @@ xfs_icsb_reinit_counters( > * initial balance kicks us off correctly > */ > mp->m_icsb_counters = -1; > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > } > > @@ -1592,6 +1629,7 @@ xfs_icsb_destroy_counters( > > percpu_counter_destroy(&mp->m_sb.sb_icount); > percpu_counter_destroy(&mp->m_sb.sb_ifree); > + percpu_counter_destroy(&mp->m_sb.sb_fdblocks); > > mutex_destroy(&mp->m_icsb_mutex); > } > @@ -1645,18 +1683,11 @@ xfs_icsb_count( > xfs_icsb_cnts_t *cnt, > int flags) > { > - xfs_icsb_cnts_t *cntp; > - int i; > - > memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > xfs_icsb_lock_all_counters(mp); > > - for_each_online_cpu(i) { > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - cnt->icsb_fdblocks += cntp->icsb_fdblocks; > - } > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > xfs_icsb_unlock_all_counters(mp); > @@ -1667,7 +1698,6 @@ xfs_icsb_counter_disabled( > xfs_mount_t *mp, > xfs_sb_field_t field) > { > - ASSERT(field == XFS_SBS_FDBLOCKS); > return test_bit(field, &mp->m_icsb_counters); > } > > @@ -1678,8 +1708,6 @@ xfs_icsb_disable_counter( > { > xfs_icsb_cnts_t cnt; > > - ASSERT(field == XFS_SBS_FDBLOCKS); > - > /* > * If we are already disabled, then there is nothing to do > * here. We check before locking all the counters to avoid > @@ -1697,9 +1725,6 @@ xfs_icsb_disable_counter( > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > switch(field) { > - case XFS_SBS_FDBLOCKS: > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > - break; > default: > BUG(); > } > @@ -1715,18 +1740,11 @@ xfs_icsb_enable_counter( > uint64_t count, > uint64_t resid) > { > - xfs_icsb_cnts_t *cntp; > int i; > > - ASSERT(field == XFS_SBS_FDBLOCKS); > - > xfs_icsb_lock_all_counters(mp); > for_each_online_cpu(i) { > - cntp = per_cpu_ptr(mp->m_sb_cnts, i); > switch (field) { > - case XFS_SBS_FDBLOCKS: > - cntp->icsb_fdblocks = count + resid; > - break; > default: > BUG(); > break; > @@ -1745,9 +1763,6 @@ xfs_icsb_sync_counters_locked( > xfs_icsb_cnts_t cnt; > > xfs_icsb_count(mp, &cnt, flags); > - > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > } > > /* > @@ -1789,20 +1804,12 @@ xfs_icsb_balance_counter_locked( > int min_per_cpu) > { > uint64_t count, resid; > - int weight = num_online_cpus(); > - uint64_t min = (uint64_t)min_per_cpu; > > /* disable counter and sync counter */ > xfs_icsb_disable_counter(mp, field); > > /* update counters - first CPU gets residual*/ > switch (field) { > - case XFS_SBS_FDBLOCKS: > - count = mp->m_sb.sb_fdblocks; > - resid = do_div(count, weight); > - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) > - return; > - break; > default: > BUG(); > count = resid = 0; /* quiet, gcc */ > @@ -1831,7 +1838,6 @@ xfs_icsb_modify_counters( > int rsvd) > { > xfs_icsb_cnts_t *icsbp; > - long long lcounter; /* long counter for 64 bit fields */ > int ret = 0; > > might_sleep(); > @@ -1851,18 +1857,9 @@ again: > } > > switch (field) { > - case XFS_SBS_FDBLOCKS: > - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); > - > - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > - lcounter += delta; > - if (unlikely(lcounter < 0)) > - goto balance_counter; > - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > - break; > default: > BUG(); > - break; > + goto balance_counter; /* be still, gcc */ > } > xfs_icsb_unlock_cntr(icsbp); > preempt_enable(); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index c17bfa4..0fa688a 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1089,6 +1089,7 @@ xfs_fs_statfs( > __uint64_t fakeinos, id; > __uint64_t sb_icount; > __uint64_t sb_ifree; > + __uint64_t sb_fdblocks; > xfs_extlen_t lsize; > __int64_t ffree; > > @@ -1100,15 +1101,20 @@ xfs_fs_statfs( > statp->f_fsid.val[1] = (u32)(id >> 32); > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > + > sb_icount = percpu_counter_sum(&sbp->sb_icount); > sb_ifree = percpu_counter_sum(&sbp->sb_ifree); > + sb_fdblocks = percpu_counter_sum(&sbp->sb_fdblocks); > > spin_lock(&mp->m_sb_lock); > statp->f_bsize = sbp->sb_blocksize; > lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; > statp->f_blocks = sbp->sb_dblocks - lsize; > - statp->f_bfree = statp->f_bavail = > - sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + spin_unlock(&mp->m_sb_lock); > + > + statp->f_bfree = sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + statp->f_bavail = statp->f_bfree; > + > fakeinos = statp->f_bfree << sbp->sb_inopblog; > statp->f_files = MIN(sb_icount + fakeinos, > (__uint64_t)XFS_MAXINUMBER); > @@ -1121,7 +1127,6 @@ xfs_fs_statfs( > ffree = statp->f_files - (sb_icount - sb_ifree); > statp->f_ffree = max_t(__int64_t, ffree, 0); > > - spin_unlock(&mp->m_sb_lock); > > if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) == > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > index 6efc7a2..f649d1a 100644 > --- a/fs/xfs/xfs_super.h > +++ b/fs/xfs/xfs_super.h > @@ -99,8 +99,8 @@ struct xfs_sb { > > struct percpu_counter sb_icount; /* allocated inodes */ > struct percpu_counter sb_ifree; /* free inodes */ > + struct percpu_counter sb_fdblocks; /* free data blocks */ > > - __uint64_t sb_fdblocks; /* free data blocks */ > __uint64_t sb_frextents; /* free realtime extents */ > xfs_ino_t sb_uquotino; /* user quota inode */ > xfs_ino_t sb_gquotino; /* group quota inode */ > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index c54d4b7..b7da423 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -184,7 +184,7 @@ xfs_trans_reserve( > * fail if the count would go below zero. > */ > if (blocks > 0) { > - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > + error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, > -((int64_t)blocks), rsvd); > if (error != 0) { > current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > @@ -268,7 +268,7 @@ undo_log: > > undo_blocks: > if (blocks > 0) { > - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > + xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, > (int64_t)blocks, rsvd); > tp->t_blk_res = 0; > } > @@ -547,8 +547,7 @@ xfs_trans_unreserve_and_mod_sb( > > /* apply the per-cpu counters */ > if (blkdelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - blkdelta, rsvd); > + error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, blkdelta, rsvd); > if (error) > goto out; > } > @@ -635,7 +634,7 @@ out_undo_icount: > xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); > out_undo_fdblocks: > if (blkdelta) > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); > + xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); > out: > ASSERT(error == 0); > return; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hch@lst.de Mon Feb 2 12:56:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 515AF7FBE for ; Mon, 2 Feb 2015 12:56:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E76B8F8040 for ; Mon, 2 Feb 2015 10:56:50 -0800 (PST) X-ASG-Debug-ID: 1422903399-04cb6c2e6ac127d0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id FgY7SPnNHv4RsdNU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Feb 2015 10:56:39 -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 A9E26AAACE; Mon, 2 Feb 2015 19:56:38 +0100 (CET) Date: Mon, 2 Feb 2015 19:56:38 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150202185638.GB23319@lst.de> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> <20150202124349.GA15598@lst.de> <20150202142832.GC22301@fieldses.org> <20150202145619.GA18387@lst.de> <20150202150032.GD22301@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202150032.GD22301@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422903399 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Feb 02, 2015 at 10:00:32AM -0500, J. Bruce Fields wrote: > I'm planning to pull Jeff's tree and then apply these on top. (Even if > the conflict's fairly trivial I'm just happier being able to test the > combination exactly as they're commited.) > > I'll do that now, should be pushed out in an hour or two. I've pushed out a pnfsd-for-3.20-3 branch to git://git.infradead.org/users/hch/pnfs.git Or do you want me to resend the whole thing? From david@fromorbit.com Mon Feb 2 13:24:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE85A7FFD for ; Mon, 2 Feb 2015 13:24:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDA678F8037 for ; Mon, 2 Feb 2015 11:24:25 -0800 (PST) X-ASG-Debug-ID: 1422905062-04cbb04167be5f80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lbxRCi3C1l5GZcOq for ; Mon, 02 Feb 2015 11:24:23 -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: AlQMAGDOz1R5LHOVPGdsb2JhbABagwaBK4Iyg3mrdAEBAQEBAQaYKQQCAoEcRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1iUBKxiFbIl0B4QpBZgtijWIKIJUgVAqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 05:54:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMbM-00064N-AY; Tue, 03 Feb 2015 06:24:04 +1100 Date: Tue, 3 Feb 2015 06:24:04 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150202192404.GI6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202073024.GA9399@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: 1422905062 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 08:30:24AM +0100, Christoph Hellwig wrote: > On Thu, Jan 29, 2015 at 03:52:32PM -0500, J. Bruce Fields wrote: > > Who can give us ACKs on these last five fs/xfs patches? (And is it > > going to cause trouble if they go in through the nfsd tree?) > > > We'd need ACKs from Dave. He already has pulled in two patches so > we might run into some conflicts. Maybe the best idea is to add the > exportfs patch to both the XFS and nfsd trees, so each of them can > pull in the rest? Or we could commit the two XFS preparation patches > to both tree and get something that compiles and works in the nfsd > tree. This patch has already been committed to the XFS repo. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 2 13:30:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6D96B7F5F for ; Mon, 2 Feb 2015 13:30:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18B71AC005 for ; Mon, 2 Feb 2015 11:30:38 -0800 (PST) X-ASG-Debug-ID: 1422905422-04bdf01eec9d7430001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 0Ig02iAvOFCjCe0E for ; Mon, 02 Feb 2015 11:30:22 -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: AlQMALPPz1R5LHOVPGdsb2JhbABagwaBK4Iyg3mrdAEBAQEBAQaYKQQCAoEcRAEBAQEBBgEBAQE4O4QMAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIJQfWHwEBCAIgGIVsiXQHhCkFmC2KNYgogiEfgWQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 06:00:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMhR-00065K-1e; Tue, 03 Feb 2015 06:30:21 +1100 Date: Tue, 3 Feb 2015 06:30:21 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-ID: <20150202193020.GJ6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-2-git-send-email-david@fromorbit.com> <20150202084102.GA28121@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202084102.GA28121@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: 1422905422 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 12:41:02AM -0800, Christoph Hellwig wrote: > > /* > > - * Superblock - in core version. Must match the ondisk version below. > > - * Must be padded to 64 bit alignment. > > - */ > > -typedef struct xfs_sb { > > - __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ > > - __uint32_t sb_blocksize; /* logical block size, bytes */ > > > -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) > > +static inline int xfs_sb_version_hasfinobt(struct xfs_sb *sbp) > > So xfs_format.h now requires struct xfs_sb to be defined before it > can be included? I guess we need to move these macros around as well. Yes, that's why I moved it to xfs_super.h, which is included from xfs_linux.h. I just wanted to move it from xfs_format.h to /somewhere/ to demonstrate that it isn't part of the on-disk format anymore. > > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > > index 2b830c2..a02236b 100644 > > --- a/fs/xfs/xfs_super.h > > +++ b/fs/xfs/xfs_super.h > > @@ -61,6 +61,87 @@ struct xfs_mount; > > struct xfs_buftarg; > > struct block_device; > > > > +/* > > + * Superblock - in core version. This does not have ot match the size and shape > > + * of the on-disk superblock, but must contain all the fields that we use in the > > + * on-disk superblock. > > + */ > > +struct xfs_sb { > > Is this really the right header? xfs_super.h only really is for bits > related to linux super block operastions. No, probably not, but it was expedient and good enough for an RFC and sanity testing. I thought about xfs_mount.h, but then realised that just introduces a new dependency between xfs_mount.h and libxfs, which is something I'm trying to reduce. > I'd expect to move it close to stuct xfs_mount, and maybe even merge > it into that in the long run. I guess moving the structure there is fine, but we still want all the version functions to be shared with userspace, which then makes for an interesting set of dependencies. Any other ideas? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 2 13:33:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 511DD8000 for ; Mon, 2 Feb 2015 13:33:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CE84304062 for ; Mon, 2 Feb 2015 11:33:51 -0800 (PST) X-ASG-Debug-ID: 1422905626-04cb6c2e6ac13780001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JM5VhEjBmhppehHH for ; Mon, 02 Feb 2015 11:33:49 -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: AlUMALPPz1R5LHOVPGdsb2JhbABagwaBK4Iyg3mrdAEBAQEBAQaYKQQCAoEcRAEBAQEBBgEBAQE4O4QMAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTiCUH1h8BAQEHAiAYhWyJdAeEKQWYLZJdhCQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 06:03:45 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMki-00065x-JL; Tue, 03 Feb 2015 06:33:44 +1100 Date: Tue, 3 Feb 2015 06:33:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter Message-ID: <20150202193344.GK6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-3-git-send-email-david@fromorbit.com> <20150202164409.GA695@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202164409.GA695@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: 1422905626 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Feb 02, 2015 at 08:44:09AM -0800, Christoph Hellwig wrote: > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > > index 4cf335b..7bfa527 100644 > > --- a/fs/xfs/libxfs/xfs_sb.c > > +++ b/fs/xfs/libxfs/xfs_sb.c > > @@ -357,7 +357,8 @@ __xfs_sb_from_disk( > > to->sb_rextslog = from->sb_rextslog; > > to->sb_inprogress = from->sb_inprogress; > > to->sb_imax_pct = from->sb_imax_pct; > > - to->sb_icount = be64_to_cpu(from->sb_icount); > > + if (percpu_counter_initialized(&to->sb_icount)) > > + percpu_counter_set(&to->sb_icount, be64_to_cpu(from->sb_icount)); > > Why would the percpu counter not be initialized here? Oh, I guess > this is for xfs_sb_verify(). But why can't xfs_mount_validate_sb simply > operate on the disk endian SB to avoid that whole issue? Possibly. I'll look into it. > > @@ -1288,8 +1288,11 @@ xfs_mod_incore_sb( > > int status; > > > > #ifdef HAVE_PERCPU_SB > > - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); > > + ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); > > #endif > > + if (field == XFS_SBS_ICOUNT) > > + return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > > + > > Why is this multiplexd through xfs_mod_incore_sb_unlocked while needing > a different locking context? Shouldn't we simply use a different helper > for this case? Again, expedient. To fix, I need to export xfs_mod_incore_sb_unlocked(). > > xfs_icsb_cnts_t *cntp; > > int i; > > > > + i = percpu_counter_init(&mp->m_sb.sb_icount, 0, GFP_KERNEL); > > + if (i) > > + return ENOMEM; > > + > > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > > - if (mp->m_sb_cnts == NULL) > > + if (!mp->m_sb_cnts) { > > + percpu_counter_destroy(&mp->m_sb.sb_icount); > > return -ENOMEM; > > + } > > > > for_each_online_cpu(i) { > > Reusing a variable for both an errno value and a loop iterator is > not very readable, just add an additional "error" variabe. In the end it gets renamed to error. I'll fix it up. > Also percpu_counter_init returns a proper egative errno value, no need > to turn that into the incorrect postive ENOMEM. Oversight. Will fix. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 2 13:34:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 839778000 for ; Mon, 2 Feb 2015 13:34:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5EB568F8037 for ; Mon, 2 Feb 2015 11:34:45 -0800 (PST) X-ASG-Debug-ID: 1422905682-04bdf01eef9d7600001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GEN8oukvNy88tDT1 for ; Mon, 02 Feb 2015 11:34:43 -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: AlQMALzQz1R5LHOVPGdsb2JhbABagwaBK4Iyg3mrdAEBAQEBAQaYKQQCAoEdRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1hgBAQgCIBiFbIl0B4QpAQSYLZJdhCQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 06:04:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMlQ-000669-8a; Tue, 03 Feb 2015 06:34:28 +1100 Date: Tue, 3 Feb 2015 06:34:28 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter Message-ID: <20150202193428.GL6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-5-git-send-email-david@fromorbit.com> <20150202164847.GB695@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202164847.GB695@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: 1422905682 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Feb 02, 2015 at 08:48:47AM -0800, Christoph Hellwig wrote: > > This screams for having two different helpers for removing vs adding back > reserved blocks. Yup, that it does. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 2 13:39:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 598748008 for ; Mon, 2 Feb 2015 13:39:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CEC78F8050 for ; Mon, 2 Feb 2015 11:39:51 -0800 (PST) X-ASG-Debug-ID: 1422905988-04cbb0416abe6610001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id W9kXjdgIpCKzhSsu for ; Mon, 02 Feb 2015 11:39:48 -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: AlUMAAPSz1R5LHOVPGdsb2JhbABSCIMGgSuCMoN5q3QBAQEBAQEGmCkEAgKBHUQBAQEBAQYBAQEBODuEDAEBAQMBJxMcIwULCAMOCgkMGQ8FJQMHGhOIJQfWAgEBCAIgGIVsiR5WBwqEHwWNJosHgRiLC4J9gz2EJCoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 06:09:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMqZ-00067Y-9n; Tue, 03 Feb 2015 06:39:47 +1100 Date: Tue, 3 Feb 2015 06:39:47 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter Message-ID: <20150202193947.GM6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: use generic percpu counters for free block counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-5-git-send-email-david@fromorbit.com> <20150202171133.GD6096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202171133.GD6096@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1422905988 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Feb 02, 2015 at 12:11:33PM -0500, Brian Foster wrote: > On Mon, Feb 02, 2015 at 08:43:02AM +1100, Dave Chinner wrote: > > + /* > > + * Taking blocks away, need to be more accurate the closer we > > + * are to zero. > > + * > > + * batch size is set to a maximum of 1024 blocks - if we are > > + * allocating of freeing extents larger than this then we aren't > > + * going to be hammering the counter lock so a lock per update > > + * is not a problem. > > + * > > IIUC, the batch size determines the point at which the local cpu delta > is folded back into the global counter (under lock). If we're allocating > large extents, these will surpass the batch size and result in a locked > update. Smaller updates are aggregated into the cpu counter and folded > in at some later time. Right. > > + * If the counter has a value of less than 2 * max batch size, > > + * then make everything serialise as we are real close to > > + * ENOSPC. > > + */ > > +#define __BATCH 1024 > > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > > + 2 * __BATCH) < 0) > > + batch = 1; > > + else > > + batch = __BATCH; > > + > > The general approach seems logical. I do wonder whether blocks is the > right scale as opposed to block count normalized against some fixed I/O > size (to account for different block sizes). We allocate in blocks, so the IO size is really irrelevant. The scalability issue at hand is page-by-page space reservation during delayed allocation, so really the block size makes less difference to performance than the page size.... > Also, it seems like speculative preallocation could hide some of the > overhead here, depending on workload of course. Had that factored into > your testing? Yes, somewhat, though I shuld do some testing using 4k direct IO and buffered IO with allocsize set appropriately. > > > + __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); > > + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, > > + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { > > + /* we had space! */ > > + return 0; > > } > > > > - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > > - return 0; > > + /* > > + * lock up the sb for dipping into reserves before releasing > > + * the space that took us to ENOSPC. > > + */ > > + spin_lock(&mp->m_sb_lock); > > Can you elaborate on the locking here, why it's needed where it wasn't > before? The lock protects the reserved pool. And it was used before as the only time we called into this function was with the m_sb_lock held. this is a bit of a hack because we now call into the function without the lock held.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 2 13:43:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BADAB7FF9 for ; Mon, 2 Feb 2015 13:43:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4480EAC004 for ; Mon, 2 Feb 2015 11:43:04 -0800 (PST) X-ASG-Debug-ID: 1422906181-04bdf01eed9d7940001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FDbExknP9nHFuc53 for ; Mon, 02 Feb 2015 11:43:02 -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: AlQMAAPSz1R5LHOVPGdsb2JhbABagwaBK4Iyg3mrdAEBAQEBAQaYKQQCAoEdRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1gIBKxiFbIQKhWoHhCkFmC2KNYgoglSBUCoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Feb 2015 06:13:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIMtg-00067p-C6; Tue, 03 Feb 2015 06:43:00 +1100 Date: Tue, 3 Feb 2015 06:43:00 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150202194300.GN6282@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202192404.GI6282@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: 1422906181 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 03, 2015 at 06:24:04AM +1100, Dave Chinner wrote: > On Mon, Feb 02, 2015 at 08:30:24AM +0100, Christoph Hellwig wrote: > > On Thu, Jan 29, 2015 at 03:52:32PM -0500, J. Bruce Fields wrote: > > > Who can give us ACKs on these last five fs/xfs patches? (And is it > > > going to cause trouble if they go in through the nfsd tree?) > > > > > > We'd need ACKs from Dave. He already has pulled in two patches so > > we might run into some conflicts. Maybe the best idea is to add the > > exportfs patch to both the XFS and nfsd trees, so each of them can > > pull in the rest? Or we could commit the two XFS preparation patches > > to both tree and get something that compiles and works in the nfsd > > tree. > > This patch has already been committed to the XFS repo. And it looks like I missed the sync transaction on growfs patch, too, so I'll commit that one later today. As to the pNFSD specific changes, I haven't really looked them over in any great detail yet. My main concern is that there are no specific regression tests for this yet, I'm not sure how we go about verifying it actually works properly and we don't inadvertantly break it in the future. Christoph? Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Mon Feb 2 13:48:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 29AF97FFE for ; Mon, 2 Feb 2015 13:48:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 15A5E8F8052 for ; Mon, 2 Feb 2015 11:48:27 -0800 (PST) X-ASG-Debug-ID: 1422906506-04cb6c2e6ac13ca0001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id 9ACchkDnLAwoq8WD for ; Mon, 02 Feb 2015 11:48:26 -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 0F4C93D1C; Mon, 2 Feb 2015 14:48:26 -0500 (EST) Date: Mon, 2 Feb 2015 14:48:26 -0500 From: "J. Bruce Fields" To: Dave Chinner Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150202194826.GG22301@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202194300.GN6282@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1422906506 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14866 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 03, 2015 at 06:43:00AM +1100, Dave Chinner wrote: > On Tue, Feb 03, 2015 at 06:24:04AM +1100, Dave Chinner wrote: > > On Mon, Feb 02, 2015 at 08:30:24AM +0100, Christoph Hellwig wrote: > > > On Thu, Jan 29, 2015 at 03:52:32PM -0500, J. Bruce Fields wrote: > > > > Who can give us ACKs on these last five fs/xfs patches? (And is it > > > > going to cause trouble if they go in through the nfsd tree?) > > > > > > > > > We'd need ACKs from Dave. He already has pulled in two patches so > > > we might run into some conflicts. Maybe the best idea is to add the > > > exportfs patch to both the XFS and nfsd trees, so each of them can > > > pull in the rest? Or we could commit the two XFS preparation patches > > > to both tree and get something that compiles and works in the nfsd > > > tree. > > > > This patch has already been committed to the XFS repo. > > And it looks like I missed the sync transaction on growfs patch, > too, so I'll commit that one later today. > > As to the pNFSD specific changes, I haven't really looked them over > in any great detail yet. My main concern is that there are no > specific regression tests for this yet, I'm not sure how we go about > verifying it actually works properly and we don't inadvertantly > break it in the future. Christoph? Previously: http://lkml.kernel.org/r/20150106175611.GA16413@lst.de > - any advice on testing? Is there was some simple > virtual setup that would allow any loser with no special > hardware (e.g., me) to check whether they've broken the > block server? Run two kvm VMs that share the same disk. Create an XFS filesystem on the MDS, and export it. If the client has blkmapd running (on Debian it needs to be started manually) it will use pNFS for accessing the filesystem. Verify that using the per-operation counters in /proc/self/mounstats. Repeat with additional clients as nessecary. Alternatively set up a simple iSCSI target using tgt or lio and connect to it from multiple clients. Which sounds reasonable to me, but I haven't tried to incorporate this into my regression testing yet. --b. From adrscube@gmail.com Tue Feb 3 08:37:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 973E57FB7 for ; Tue, 3 Feb 2015 08:37:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 769BA8F8065 for ; Tue, 3 Feb 2015 06:37:54 -0800 (PST) X-ASG-Debug-ID: 1422974272-04cbb04168bfa950001-NocioJ Received: from mail-pa0-f45.google.com (mail-pa0-f45.google.com [209.85.220.45]) by cuda.sgi.com with ESMTP id ajFKcMYlg0UwXUKN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Feb 2015 06:37:53 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.45 Received: by mail-pa0-f45.google.com with SMTP id et14so96976452pad.4 for ; Tue, 03 Feb 2015 06:37:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=oCO3JxdUAeEdEwviJlsaY7Fb3OohebN1+I5IMM4hco4=; b=lN/0ekzgbsffUS2B8ARIeyxtpFP2orVYsiIQtk931R5POqFpAxJxb95myxIh+bREAY I+oWXIhr8GMa38D/EMazhtjT/3rrOVjjVNZIK6e7mg1HygKiGcIsmK7sui9YuBfXPR/p 8eZy6mlV36kvPGDb6xGkjkZluMGT4+YRb2I9535C6Al012PH/V2OHgIKXpBt6JWtm9lR kOxiIRcPIBmDlXvCy+iLwEkQjtu0Hv2i9e/2eneeCeqooMekgxfC5yiX09luAkU0qas5 ORh+WkzCWwOTwqeukORpc7sEtB/qV7AP3FUIMV+/icuNTVWprF3JoiaGuOBP2Ql0KO1Q pluw== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.66.120.67 with SMTP id la3mr29563431pab.66.1422974272557; Tue, 03 Feb 2015 06:37:52 -0800 (PST) Received: by 10.70.11.33 with HTTP; Tue, 3 Feb 2015 06:37:52 -0800 (PST) Date: Tue, 3 Feb 2015 20:07:52 +0530 Message-ID: Subject: [RFD] Allowing xfs_fsr to defragment portions of a file From: Dhruvesh Rathore X-ASG-Orig-Subj: [RFD] Allowing xfs_fsr to defragment portions of a file To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f45.google.com[209.85.220.45] X-Barracuda-Start-Time: 1422974273 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, The xfs_fsr utility in its current state does not support defragmentation of parts of file. Either the entire file is defragmented, or if free space is not available then the operation is not performed. We would like to enhance the utility allowing it to defragment parts of the file, when the free space is not available to defragment the entire file. --------------------------------------------------------------------------------------------------------------- Our initial task was to understand how xfs_fsr currently defragments the file: 1) In /fsr/xfs_fsr.c from main() the control is passed to fsrfile(). In fsrfile(), we open the original file and collect bstat information. A call is then made to fsrfile_common() 2) In fsrfile_common() we check if sufficient free space is available to defragment the file, and if not then we exit. If free space is available, then a call is made to packfile() 3) In packfile(), read_fd_bmap() function provides us with the current number of extents used by the file (cur_nextents) and the ideal number of extents needed to save the file (nextents). In function read_fd_bmap() the the outmap[ ] structure is also populated. 4) packfile() will initially allocate new extents (nextents) to the temporary file and then copy(swap) extents form the existing file. We then fchown() the new temp file and space occupied by the prev fragmented copy is then freed. --------------------------------------------------------------------------------------------------------------- Our understanding to the approach of defragmenting portions of a file is as follows: 1) In fsrfile_common(), a new function will be called when the code determines that there is insufficient free space to defragment the entire file. 2) The new function performs the following tasks: -> Call read_fd_bmap() to get cur_nextents and nextents(ideal). Using nextents we will then have to determine how many extents can be defragmented against the free space available. -> Creating a temp file will not be feasible as it will create a problem when we want to change owners. -> The function will have to hence focus on swapping the existing extents from the fragmented file. For this a swap_extent() function will be needed, which will take arguments as the current extent and the location(in free space) where it needs to be swapped to. For the above functionality Dave suggested that we have a look at EXT4_IOC_MOVE_EXT and its usage. We are however unsure of how to compress the extents which have been chosen for defragmentation and keep the other extents untouched. We are also in doubt about how to proceed without creating a temp file for defragmentation. Any thoughts, comments, opinions etc, are welcome Thank you. Regards A-DRS. From bfields@fieldses.org Tue Feb 3 10:08:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D5FC47FFE for ; Tue, 3 Feb 2015 10:08:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73C19AC003 for ; Tue, 3 Feb 2015 08:08:50 -0800 (PST) X-ASG-Debug-ID: 1422979726-04cbb04169bfd350001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id ZgSplsYgYFxg56KD for ; Tue, 03 Feb 2015 08:08:46 -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 794FB40E0; Tue, 3 Feb 2015 11:08:45 -0500 (EST) Date: Tue, 3 Feb 2015 11:08:45 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/20] nfsd: implement pNFS operations Message-ID: <20150203160845.GO22301@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 10/20] nfsd: implement pNFS operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-11-git-send-email-hch@lst.de> <20150129203346.GA11064@fieldses.org> <20150202124349.GA15598@lst.de> <20150202142832.GC22301@fieldses.org> <20150202145619.GA18387@lst.de> <20150202150032.GD22301@fieldses.org> <20150202185638.GB23319@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202185638.GB23319@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1422979726 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 02, 2015 at 07:56:38PM +0100, Christoph Hellwig wrote: > On Mon, Feb 02, 2015 at 10:00:32AM -0500, J. Bruce Fields wrote: > > I'm planning to pull Jeff's tree and then apply these on top. (Even if > > the conflict's fairly trivial I'm just happier being able to test the > > combination exactly as they're commited.) > > > > I'll do that now, should be pushed out in an hour or two. > > I've pushed out a pnfsd-for-3.20-3 branch to > git://git.infradead.org/users/hch/pnfs.git > > Or do you want me to resend the whole thing? No, looks fine to me as is. Thanks! I'll play around with it a little more and then push it out. GETLAYOUT is going to be annoying if we need big layouts. We'll have to figure out what to do with that reply size estimation, and clients will have to figure out how to get the maxresponsesized_cached right, I guess? Oh well. --b. From sandeen@redhat.com Tue Feb 3 10:33:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 771D78005 for ; Tue, 3 Feb 2015 10:33:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66E60304053 for ; Tue, 3 Feb 2015 08:33:31 -0800 (PST) X-ASG-Debug-ID: 1422981209-04cbb04168bfdf00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QNCmGuxfVopHv1fy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 08:33:30 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t13GXTlm001762 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 3 Feb 2015 11:33:29 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t13GXSG1007457 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 3 Feb 2015 11:33:29 -0500 Message-ID: <54D0F858.5010804@redhat.com> Date: Tue, 03 Feb 2015 10:33:28 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: fix panic_mask documentation Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: fix panic_mask documentation Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1422981210 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This bit of the docs didn't quite reflect reality. Signed-off-by: Eric Sandeen --- diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 5be51fd..157d440 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -287,7 +287,7 @@ The following sysctls are available for the XFS filesystem: XFS_ERRLEVEL_LOW: 1 XFS_ERRLEVEL_HIGH: 5 - fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127) + fs.xfs.panic_mask (Min: 0 Default: 0 Max: 255) Causes certain error conditions to call BUG(). Value is a bitmask; AND together the tags which represent errors which should cause panics: @@ -299,6 +299,7 @@ The following sysctls are available for the XFS filesystem: XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010 XFS_PTAG_SHUTDOWN_IOERROR 0x00000020 XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 + XFS_PTAG_FSBLOCK_ZERO 0x00000080 This option is intended for debugging only. From hch@lst.de Tue Feb 3 12:35:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C1EB7F6F for ; Tue, 3 Feb 2015 12:35:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADE7AAC002 for ; Tue, 3 Feb 2015 10:35:42 -0800 (PST) X-ASG-Debug-ID: 1422988535-04cb6c2e69c30da0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id PxisHKIr3tZxdVmt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 10:35:36 -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 2A7FF1434E; Tue, 3 Feb 2015 19:35:33 +0100 (CET) Date: Tue, 3 Feb 2015 19:35:33 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Dave Chinner , Christoph Hellwig , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150203183533.GA16929@lst.de> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> <20150202194826.GG22301@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202194826.GG22301@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1422988536 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14903 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Feb 02, 2015 at 02:48:26PM -0500, J. Bruce Fields wrote: > Previously: http://lkml.kernel.org/r/20150106175611.GA16413@lst.de > > > - any advice on testing? Is there was some simple > > virtual setup that would allow any loser with no special > > hardware (e.g., me) to check whether they've broken the > > block server? > > Run two kvm VMs that share the same disk. Create an XFS > filesystem on the MDS, and export it. If the client has blkmapd > running (on Debian it needs to be started manually) it will use > pNFS for accessing the filesystem. Verify that using the > per-operation counters in /proc/self/mounstats. Repeat with > additional clients as nessecary. > > Alternatively set up a simple iSCSI target using tgt or lio and > connect to it from multiple clients. > > Which sounds reasonable to me, but I haven't tried to incorporate this > into my regression testing yet. Additionally I can offer the following script to generate recalls, which don't really happen during normal operation. I don't really know how to write a proper testcase that coordinates access to the exported filesystem and nfs unless it runs locally on the same node, though. It would need some higher level, network aware test harness: ----- snip ----- #!/bin/sh set +x # wait for grace period touch /mnt/nfs1/foo dd if=/dev/zero of=/mnt/nfs1/foo bs=128M count=32 conv=fdatasync oflag=direct & sleep 2 echo "" > /mnt/test/foo && echo "recall done" From bfoster@redhat.com Tue Feb 3 13:08:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EDD7801C for ; Tue, 3 Feb 2015 13:08:19 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F286B8F8071 for ; Tue, 3 Feb 2015 11:08:15 -0800 (PST) X-ASG-Debug-ID: 1422990493-04cb6c2e69c31f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8zlWoQshv0UmpaHI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 11:08:14 -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 (8.14.4/8.14.4) with ESMTP id t13J8BMO015035 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 3 Feb 2015 14:08:12 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t13J8BoI021664 for ; Tue, 3 Feb 2015 14:08:11 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id F2E951256B4; Tue, 3 Feb 2015 14:08:09 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC] xfs: support min/max agbno args in block allocator Date: Tue, 3 Feb 2015 14:08:09 -0500 X-ASG-Orig-Subj: [PATCH RFC] xfs: support min/max agbno args in block allocator Message-Id: <1422990489-34821-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: 1422990494 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block allocator supports various arguments to tweak block allocation behavior and set allocation requirements. The sparse inode chunk feature introduces a new requirement not supported by the current arguments. Sparse inode allocations must convert or merge into an inode record that describes a fixed length chunk (64 inodes x inodesize). Full inode chunk allocations by definition always result in valid inode records. Sparse chunk allocations are smaller and the associated records can refer to blocks not owned by the inode chunk. This model can result in invalid inode records in certain cases. For example, if a sparse allocation occurs near the start of an AG, the aligned inode record for that chunk might refer to agbno 0. If an allocation occurs towards the end of the AG and the AG size is not aligned, the inode record could refer to blocks beyond the end of the AG. While neither of these scenarios directly result in corruption, they both insert invalid inode records and at minimum cause repair to complain, are unlikely to merge into full chunks over time and set land mines for other areas of code. To guarantee sparse inode chunk allocation creates valid inode records, support the ability to specify an agbno range limit for XFS_ALLOCTYPE_NEAR_BNO block allocations. The min/max agbno's are specified in the allocation arguments and limit the block allocation algorithms to that range. The starting 'agbno' hint is clamped to the range if the specified agbno is out of range. If no sufficient extent is available within the range, the allocation fails. For backwards compatibility, the min/max fields can be initialized to 0 to disable range limiting (e.g., equivalent to min=0,max=agsize). Signed-off-by: Brian Foster --- Hi all, This is a mechanism I hacked together to address the sparse inode chunk allocation issue described in the commit log description above. It's lightly tested and RFC because there are currently no users. I wanted to get any design thoughts before it's incorporated into the next sparse inode chunks set. For context, the sparse inode allocation code that takes advantage of this looks something like this: /* * The inode record will be aligned to full chunk size. We must * prevent sparse allocation from AG boundaries that result in * invalid inode records, such as records that start at agbno 0 * or extend beyond the AG. * * Set min agbno to the first aligned, non-zero agbno and max to * the last aligned agbno that is at least one full chunk from * the end of the AG. */ args.min_agbno = args.mp->m_sb.sb_inoalignmt; args.max_agbno = round_down(args.mp->m_sb.sb_agblocks, args.mp->m_sb.sb_inoalignmt) - args.mp->m_ialloc_blks; ... Thoughts appreciated. Brian fs/xfs/libxfs/xfs_alloc.c | 42 +++++++++++++++++++++++++++++++++++++----- fs/xfs/libxfs/xfs_alloc.h | 2 ++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf44..0ddf6c9 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -149,13 +149,27 @@ xfs_alloc_compute_aligned( { xfs_agblock_t bno; xfs_extlen_t len; + xfs_extlen_t diff; /* Trim busy sections out of found extent */ xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + /* + * If we have a largish extent that happens to start before min_agbno, + * see if we can shift it into range... + */ + if (bno < args->min_agbno && bno + len > args->min_agbno) { + diff = args->min_agbno - bno; + if (len > diff) { + bno += diff; + len -= diff; + } + } + if (args->alignment > 1 && len >= args->minlen) { xfs_agblock_t aligned_bno = roundup(bno, args->alignment); - xfs_extlen_t diff = aligned_bno - bno; + + diff = aligned_bno - bno; *resbno = aligned_bno; *reslen = diff >= len ? 0 : len - diff; @@ -790,9 +804,13 @@ xfs_alloc_find_best_extent( * The good extent is closer than this one. */ if (!dir) { + if (*sbnoa > args->max_agbno) + goto out_use_good; if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { + if (*sbnoa < args->min_agbno) + goto out_use_good; if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -879,6 +897,17 @@ xfs_alloc_ag_vextent_near( dofirst = prandom_u32() & 1; #endif + /* handle unitialized agbno range so caller doesn't have to */ + if (!args->min_agbno && !args->max_agbno) + args->max_agbno = args->mp->m_sb.sb_agblocks - 1; + ASSERT(args->min_agbno <= args->max_agbno); + + /* clamp agbno to the range if it's outside */ + if (args->agbno < args->min_agbno) + args->agbno = args->min_agbno; + if (args->agbno > args->max_agbno) + args->agbno = args->max_agbno; + restart: bno_cur_lt = NULL; bno_cur_gt = NULL; @@ -971,6 +1000,8 @@ restart: <bnoa, <lena); if (ltlena < args->minlen) continue; + if (ltbnoa < args->min_agbno || ltbnoa > args->max_agbno) + continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ASSERT(args->len >= args->minlen); @@ -1091,11 +1122,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); - if (ltlena >= args->minlen) + if (ltlena >= args->minlen && ltbnoa >= args->min_agbno) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) goto error0; - if (!i) { + if (!i || ltbnoa < args->min_agbno) { xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); bno_cur_lt = NULL; @@ -1107,11 +1138,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, gtbno, gtlen, >bnoa, >lena); - if (gtlena >= args->minlen) + if (gtlena >= args->minlen && gtbnoa <= args->max_agbno) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) goto error0; - if (!i) { + if (!i || gtbnoa > args->max_agbno) { xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR); bno_cur_gt = NULL; @@ -1211,6 +1242,7 @@ restart: ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltnew >= args->min_agbno && ltnew <= args->max_agbno); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index d1b4b6a..29f27b2 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -112,6 +112,8 @@ typedef struct xfs_alloc_arg { xfs_extlen_t total; /* total blocks needed in xaction */ xfs_extlen_t alignment; /* align answer to multiple of this */ xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */ + xfs_agblock_t min_agbno; /* set an agbno range for NEAR allocs */ + xfs_agblock_t max_agbno; /* ... */ xfs_extlen_t len; /* output: actual size of extent */ xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ xfs_alloctype_t otype; /* original allocation type */ -- 1.8.3.1 From BATV+3f638bb7db22d3ac725a+4181+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 3 15:37:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0578E7FCC for ; Tue, 3 Feb 2015 15:37:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E88998F8081 for ; Tue, 3 Feb 2015 13:37:45 -0800 (PST) X-ASG-Debug-ID: 1422999464-04cb6c2e6bc37300001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id E4PGRVvANdCZebAm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 13:37:44 -0800 (PST) X-Barracuda-Envelope-From: BATV+3f638bb7db22d3ac725a+4181+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 1YIlAG-0008PF-18; Tue, 03 Feb 2015 21:37:44 +0000 Date: Tue, 3 Feb 2015 13:37:44 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-ID: <20150203213744.GA31631@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-2-git-send-email-david@fromorbit.com> <20150202084102.GA28121@infradead.org> <20150202193020.GJ6282@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202193020.GJ6282@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1422999464 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Feb 03, 2015 at 06:30:21AM +1100, Dave Chinner wrote: > > I'd expect to move it close to stuct xfs_mount, and maybe even merge > > it into that in the long run. > > I guess moving the structure there is fine, but we still want all > the version functions to be shared with userspace, which then makes > for an interesting set of dependencies. Any other ideas? Are they really worth the sharing? If they are worth it we'll need somethign that can expect a xfs_sb/xfs_mount to be defined. From BATV+3f638bb7db22d3ac725a+4181+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 3 15:38:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D04F8021 for ; Tue, 3 Feb 2015 15:38:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD5D7AC00C for ; Tue, 3 Feb 2015 13:38:33 -0800 (PST) X-ASG-Debug-ID: 1422999512-04cbb04169c087f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GnXo7cMFzhs0PANs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 13:38:32 -0800 (PST) X-Barracuda-Envelope-From: BATV+3f638bb7db22d3ac725a+4181+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 1YIlB2-0008Uw-7n; Tue, 03 Feb 2015 21:38:32 +0000 Date: Tue, 3 Feb 2015 13:38:32 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter Message-ID: <20150203213832.GB31631@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: use generic percpu counters for inode counter References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-3-git-send-email-david@fromorbit.com> <20150202164409.GA695@infradead.org> <20150202193344.GK6282@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202193344.GK6282@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1422999512 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Feb 03, 2015 at 06:33:44AM +1100, Dave Chinner wrote: > > Why would the percpu counter not be initialized here? Oh, I guess > > this is for xfs_sb_verify(). But why can't xfs_mount_validate_sb simply > > operate on the disk endian SB to avoid that whole issue? > > Possibly. I'll look into it. A simpler alternative would be to move them out of __xfs_sb_from_disk into the one caller that needs these values. From david@fromorbit.com Tue Feb 3 15:46:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B7A6F7FD8 for ; Tue, 3 Feb 2015 15:46:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F47AAC006 for ; Tue, 3 Feb 2015 13:46:13 -0800 (PST) X-ASG-Debug-ID: 1422999970-04bdf01eeda00a50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qSUHaHYy3FXkz5sY for ; Tue, 03 Feb 2015 13:46:11 -0800 (PST) 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: A2CcDAA5QNFUPJVzLHlagwaBK4Iyg3msFQEBAQEBAQaYKQQCAoEfRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1nwBAQgCIBiFbIl0B4QpBZgxijiIKIQkKjGCQgEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Feb 2015 08:16:10 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIlIP-0000RW-4Q; Wed, 04 Feb 2015 08:46:09 +1100 Date: Wed, 4 Feb 2015 08:46:09 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-ID: <20150203214608.GJ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-2-git-send-email-david@fromorbit.com> <20150202084102.GA28121@infradead.org> <20150202193020.GJ6282@dastard> <20150203213744.GA31631@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203213744.GA31631@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: 1422999971 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 03, 2015 at 01:37:44PM -0800, Christoph Hellwig wrote: > On Tue, Feb 03, 2015 at 06:30:21AM +1100, Dave Chinner wrote: > > > I'd expect to move it close to stuct xfs_mount, and maybe even merge > > > it into that in the long run. > > > > I guess moving the structure there is fine, but we still want all > > the version functions to be shared with userspace, which then makes > > for an interesting set of dependencies. Any other ideas? > > Are they really worth the sharing? If they are worth it we'll > need somethign that can expect a xfs_sb/xfs_mount to be defined. I suppose we could stop sharing them - they change rarely enough and it's only a few lines of code for each new feature that would then need to be duplicated. Not a huge burden... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3f638bb7db22d3ac725a+4181+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 3 15:50:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 74C248028 for ; Tue, 3 Feb 2015 15:50:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 35DB08F8071 for ; Tue, 3 Feb 2015 13:50:46 -0800 (PST) X-ASG-Debug-ID: 1423000243-04bdf01eeca00cc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 93gA0isoPG3wSc84 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 13:50:43 -0800 (PST) X-Barracuda-Envelope-From: BATV+3f638bb7db22d3ac725a+4181+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 1YIlMp-0007xw-8D; Tue, 03 Feb 2015 21:50:43 +0000 Date: Tue, 3 Feb 2015 13:50:43 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Message-ID: <20150203215043.GA21885@infradead.org> X-ASG-Orig-Subj: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb References: <1422826983-29570-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1422826983-29570-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1423000243 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS FYI, I think we should just get rid of the horrible xfs_mod_incore_sb(_batch) interface as part of this. The patch below applies on top of your series. diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index ac4d64e..a45e929b 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2212,9 +2212,8 @@ xfs_bmap_add_extent_delay_real( diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); if (diff > 0) { - error = xfs_mod_incore_sb(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), 0); + error = xfs_sb_mod_fdblocks(bma->ip->i_mount, + -((int64_t)diff), false); ASSERT(!error); if (error) goto done; @@ -2265,9 +2264,8 @@ xfs_bmap_add_extent_delay_real( temp += bma->cur->bc_private.b.allocated; ASSERT(temp <= da_old); if (temp < da_old) - xfs_mod_incore_sb(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - (int64_t)(da_old - temp), 0); + xfs_sb_mod_fdblocks(bma->ip->i_mount, + (int64_t)(da_old - temp), false); } /* clear out the allocated field, done with it now in any case. */ @@ -2944,8 +2942,8 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), 0); + xfs_sb_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), + false); /* * Nothing to do for disk quota accounting here. */ @@ -4159,19 +4157,15 @@ xfs_bmapi_reserve_delalloc( indlen = (xfs_extlen_t)xfs_bmap_worst_indlen(ip, alen); ASSERT(indlen > 0); - if (rt) { - error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - -((int64_t)extsz), 0); - } else { - error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, - -((int64_t)alen), 0); - } + if (rt) + error = xfs_sb_mod_frextents(mp, -((int64_t)extsz)); + else + error = xfs_sb_mod_fdblocks(mp, -((int64_t)alen), false); if (error) goto out_unreserve_quota; - error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, - -((int64_t)indlen), 0); + error = xfs_sb_mod_fdblocks(mp, -((int64_t)indlen), false); if (error) goto out_unreserve_blocks; @@ -4198,9 +4192,9 @@ xfs_bmapi_reserve_delalloc( out_unreserve_blocks: if (rt) - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); + xfs_sb_mod_frextents(mp, extsz); else - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, alen, 0); + xfs_sb_mod_fdblocks(mp, alen, false); out_unreserve_quota: if (XFS_IS_QUOTA_ON(mp)) xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? @@ -5012,10 +5006,8 @@ xfs_bmap_del_extent( * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) { - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), 0); - } + if (da_old > da_new) + xfs_sb_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); done: *logflagsp = flags; return error; @@ -5284,14 +5276,13 @@ xfs_bunmapi( rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); do_div(rtexts, mp->m_sb.sb_rextsize); - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, 0); + xfs_sb_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_incore_sb(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, 0); + xfs_sb_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); diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 2c8d11f..2a6dfac 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -175,69 +175,6 @@ typedef struct xfs_dsb { } xfs_dsb_t; /* - * Sequence number values for the fields. - */ -typedef enum { - XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS, - XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO, - XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS, - XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS, - XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE, - XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG, - XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG, - XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT, - XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO, - XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, - XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, - XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, - XFS_SBS_PQUOTINO, XFS_SBS_LSN, - XFS_SBS_FIELDCOUNT -} xfs_sb_field_t; - -/* - * Mask values, defined based on the xfs_sb_field_t values. - * Only define the ones we're using. - */ -#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) -#define XFS_SB_UUID XFS_SB_MVAL(UUID) -#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) -#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) -#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) -#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) -#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) -#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) -#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) -#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) -#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) -#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) -#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) -#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) -#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) -#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) -#define XFS_SB_FEATURES2 (XFS_SB_MVAL(FEATURES2) | \ - XFS_SB_MVAL(BAD_FEATURES2)) -#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) -#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) -#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) -#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) -#define XFS_SB_CRC XFS_SB_MVAL(CRC) -#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) -#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) -#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) -#define XFS_SB_MOD_BITS \ - (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ - XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ - XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_FEATURES_COMPAT | XFS_SB_FEATURES_RO_COMPAT | \ - XFS_SB_FEATURES_INCOMPAT | XFS_SB_FEATURES_LOG_INCOMPAT | \ - XFS_SB_PQUOTINO) - - -/* * Misc. Flags - warning - these will be cleared by xfs_repair unless * a feature bit is set when the flag is used. */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 28389e0..be2d795e 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -749,7 +749,7 @@ out: * the extra reserve blocks from the reserve..... */ int error; - error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, fdblks_delta, 0); + error = xfs_sb_mod_fdblocks(mp, fdblks_delta, false); if (error == -ENOSPC) goto retry; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 07498f0..8a6bbf4 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1082,292 +1082,135 @@ xfs_log_sbcount(xfs_mount_t *mp) return xfs_sync_sb(mp, true); } -/* - * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply - * a delta to a specified field in the in-core superblock. Simply - * switch on the field indicated and apply the delta to that field. - * Fields are not allowed to dip below zero, so if the delta would - * do this do not apply it and return EINVAL. - * - * The m_sb_lock must be held when this routine is called. - */ -STATIC int -xfs_mod_incore_sb_unlocked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) +int +xfs_sb_mod_fdblocks( + struct xfs_mount *mp, + int64_t delta, + bool rsvd) { - int scounter; /* short counter for 32 bit fields */ - long long lcounter; /* long counter for 64 bit fields */ - long long res_used; - s32 batch; + int64_t lcounter; + long long res_used; + s32 batch; - /* - * With the in-core superblock spin lock held, switch - * on the indicated field. Apply the delta to the - * proper field. If the fields value would dip below - * 0, then do not apply the delta and return EINVAL. - */ - switch (field) { - case XFS_SBS_ICOUNT: - /* deltas are +/-64, hence the large batch size of 128. */ - __percpu_counter_add(&mp->m_sb.sb_icount, delta, 128); - if (percpu_counter_compare(&mp->m_sb.sb_icount, 0) < 0) { - ASSERT(0); - percpu_counter_add(&mp->m_sb.sb_icount, -delta); - return -EINVAL; - } - return 0; - case XFS_SBS_IFREE: - percpu_counter_add(&mp->m_sb.sb_ifree, delta); - if (percpu_counter_compare(&mp->m_sb.sb_ifree, 0) < 0) { - ASSERT(0); - percpu_counter_add(&mp->m_sb.sb_ifree, -delta); - return -EINVAL; + if (delta > 0) { /* Putting blocks back */ + if (mp->m_resblks == mp->m_resblks_avail) { + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); + return 0; } - return 0; - case XFS_SBS_FDBLOCKS: - - if (delta > 0) { /* Putting blocks back */ - if (mp->m_resblks == mp->m_resblks_avail) { - percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); - return 0; - } - /* put blocks back into reserve pool first */ - spin_lock(&mp->m_sb_lock); - res_used = (long long) - (mp->m_resblks - mp->m_resblks_avail); + /* put blocks back into reserve pool first */ + 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; - } else { - delta -= res_used; + if (res_used > delta) { + mp->m_resblks_avail += delta; + } else { + delta -= res_used; mp->m_resblks_avail = mp->m_resblks; - percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); - } - spin_unlock(&mp->m_sb_lock); - return 0; - + percpu_counter_add(&mp->m_sb.sb_fdblocks, delta); } + spin_unlock(&mp->m_sb_lock); + return 0; - /* - * Taking blocks away, need to be more accurate the closer we - * are to zero. - * - * batch size is set to a maximum of 1024 blocks - if we are - * allocating of freeing extents larger than this then we aren't - * going to be hammering the counter lock so a lock per update - * is not a problem. - * - * If the counter has a value of less than 2 * max batch size, - * then make everything serialise as we are real close to - * ENOSPC. - */ -#define __BATCH 1024 - if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, - 2 * __BATCH) < 0) - batch = 1; - else - batch = __BATCH; - - __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); - if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, - XFS_ALLOC_SET_ASIDE(mp)) >= 0) { - /* we had space! */ - return 0; - } + } - /* - * lock up the sb for dipping into reserves before releasing - * the space that took us to ENOSPC. - */ - spin_lock(&mp->m_sb_lock); - percpu_counter_add(&mp->m_sb.sb_fdblocks, -delta); - if (!rsvd) - goto fdblocks_enospc; - - lcounter = (long long)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - spin_unlock(&mp->m_sb_lock); - return 0; - } - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); -fdblocks_enospc: - spin_unlock(&mp->m_sb_lock); - return -ENOSPC; + /* + * Taking blocks away, need to be more accurate the closer we + * are to zero. + * + * batch size is set to a maximum of 1024 blocks - if we are + * allocating of freeing extents larger than this then we aren't + * going to be hammering the counter lock so a lock per update + * is not a problem. + * + * If the counter has a value of less than 2 * max batch size, + * then make everything serialise as we are real close to + * ENOSPC. + */ +#define __BATCH 1024 + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, + 2 * __BATCH) < 0) + batch = 1; + else + batch = __BATCH; - case XFS_SBS_FREXTENTS: - lcounter = (long long)mp->m_sb.sb_frextents; - lcounter += delta; - if (lcounter < 0) { - return -ENOSPC; - } - mp->m_sb.sb_frextents = lcounter; - return 0; - case XFS_SBS_DBLOCKS: - lcounter = (long long)mp->m_sb.sb_dblocks; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_dblocks = lcounter; - return 0; - case XFS_SBS_AGCOUNT: - scounter = mp->m_sb.sb_agcount; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_agcount = scounter; - return 0; - case XFS_SBS_IMAX_PCT: - scounter = mp->m_sb.sb_imax_pct; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_imax_pct = scounter; + __percpu_counter_add(&mp->m_sb.sb_fdblocks, delta, batch); + if (percpu_counter_compare(&mp->m_sb.sb_fdblocks, + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { + /* we had space! */ return 0; - case XFS_SBS_REXTSIZE: - scounter = mp->m_sb.sb_rextsize; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextsize = scounter; - return 0; - case XFS_SBS_RBMBLOCKS: - scounter = mp->m_sb.sb_rbmblocks; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rbmblocks = scounter; - return 0; - case XFS_SBS_RBLOCKS: - lcounter = (long long)mp->m_sb.sb_rblocks; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rblocks = lcounter; - return 0; - case XFS_SBS_REXTENTS: - lcounter = (long long)mp->m_sb.sb_rextents; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextents = lcounter; - return 0; - case XFS_SBS_REXTSLOG: - scounter = mp->m_sb.sb_rextslog; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextslog = scounter; + } + + /* + * lock up the sb for dipping into reserves before releasing + * the space that took us to ENOSPC. + */ + spin_lock(&mp->m_sb_lock); + percpu_counter_add(&mp->m_sb.sb_fdblocks, -delta); + if (!rsvd) + goto fdblocks_enospc; + + lcounter = (long long)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); return 0; - default: - ASSERT(0); - return -EINVAL; } + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); +fdblocks_enospc: + spin_unlock(&mp->m_sb_lock); + return -ENOSPC; } -/* - * xfs_mod_incore_sb() is used to change a field in the in-core - * superblock structure by the specified delta. This modification - * is protected by the m_sb_lock. Just use the xfs_mod_incore_sb_unlocked() - * routine to do the work. - */ int -xfs_mod_incore_sb( +xfs_sb_mod_frextents( struct xfs_mount *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) + int64_t delta) { - int status; - - switch (field) { - case XFS_SBS_ICOUNT: - case XFS_SBS_IFREE: - case XFS_SBS_FDBLOCKS: - return xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - default: - break; - } + int64_t lcounter = mp->m_sb.sb_frextents; + int ret = 0; spin_lock(&mp->m_sb_lock); - status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); + lcounter += delta; + if (lcounter < 0) + ret = -ENOSPC; + else + mp->m_sb.sb_frextents = lcounter; spin_unlock(&mp->m_sb_lock); - - return status; + return ret; } -/* - * Change more than one field in the in-core superblock structure at a time. - * - * The fields and changes to those fields are specified in the array of - * xfs_mod_sb structures passed in. Either all of the specified deltas - * will be applied or none of them will. If any modified field dips below 0, - * then all modifications will be backed out and EINVAL will be returned. - * - * Note that this function may not be used for the superblock values that - * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_mod_incore_sb is required for these. - */ int -xfs_mod_incore_sb_batch( +xfs_sb_mod_icount( struct xfs_mount *mp, - xfs_mod_sb_t *msb, - uint nmsb, - int rsvd) + int64_t delta) { - xfs_mod_sb_t *msbp; - int error = 0; - - /* - * Loop through the array of mod structures and apply each individually. - * If any fail, then back out all those which have already been applied. - * Do all of this within the scope of the m_sb_lock so that all of the - * changes will be atomic. - */ - spin_lock(&mp->m_sb_lock); - for (msbp = msb; msbp < (msb + nmsb); msbp++) { - ASSERT(msbp->msb_field < XFS_SBS_ICOUNT || - msbp->msb_field > XFS_SBS_FDBLOCKS); - - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, - msbp->msb_delta, rsvd); - if (error) - goto unwind; + /* deltas are +/-64, hence the large batch size of 128. */ + __percpu_counter_add(&mp->m_sb.sb_icount, delta, 128); + if (percpu_counter_compare(&mp->m_sb.sb_icount, 0) < 0) { + ASSERT(0); + percpu_counter_add(&mp->m_sb.sb_icount, -delta); + return -EINVAL; } - spin_unlock(&mp->m_sb_lock); return 0; +} -unwind: - while (--msbp >= msb) { - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, - -msbp->msb_delta, rsvd); - ASSERT(error == 0); +int +xfs_sb_mod_ifree( + struct xfs_mount *mp, + int64_t delta) +{ + percpu_counter_add(&mp->m_sb.sb_ifree, delta); + if (percpu_counter_compare(&mp->m_sb.sb_ifree, 0) < 0) { + ASSERT(0); + percpu_counter_add(&mp->m_sb.sb_ifree, -delta); + return -EINVAL; } - spin_unlock(&mp->m_sb_lock); - return error; + return 0; } /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 4e22e96..9bb06eb 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -249,15 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * This structure is for use by the xfs_mod_incore_sb_batch() routine. - * xfs_growfs can specify a few fields which are more than int limit - */ -typedef struct xfs_mod_sb { - xfs_sb_field_t msb_field; /* Field to modify, see below */ - int64_t msb_delta; /* Change to make to specified field */ -} xfs_mod_sb_t; - -/* * Per-ag incore structure, copies of information in agf and agi, to improve the * performance of allocation group selection. */ @@ -313,9 +304,6 @@ extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, xfs_agnumber_t *maxagi); extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, - uint, int); extern int xfs_mount_log_sb(xfs_mount_t *); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); @@ -327,6 +315,11 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); extern void xfs_set_low_space_thresholds(struct xfs_mount *); +extern int xfs_sb_mod_fdblocks(struct xfs_mount *, int64_t, bool); +extern int xfs_sb_mod_frextents(struct xfs_mount *, int64_t); +extern int xfs_sb_mod_icount(struct xfs_mount *, int64_t); +extern int xfs_sb_mod_ifree(struct xfs_mount *, int64_t); + #endif /* __KERNEL__ */ #endif /* __XFS_MOUNT_H__ */ diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index b7da423..b704d5d 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -173,7 +173,7 @@ xfs_trans_reserve( uint rtextents) { int error = 0; - int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; /* Mark this thread as being in a transaction */ current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -184,8 +184,8 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, - -((int64_t)blocks), rsvd); + error = xfs_sb_mod_fdblocks(tp->t_mountp, + -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return -ENOSPC; @@ -236,8 +236,8 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (rtextents > 0) { - error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, - -((int64_t)rtextents), rsvd); + error = xfs_sb_mod_frextents(tp->t_mountp, + -((int64_t)rtextents)); if (error) { error = -ENOSPC; goto undo_log; @@ -268,8 +268,7 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, - (int64_t)blocks, rsvd); + xfs_sb_mod_fdblocks(tp->t_mountp, (int64_t)blocks, rsvd); tp->t_blk_res = 0; } @@ -488,6 +487,54 @@ xfs_trans_apply_sb_deltas( sizeof(sbp->sb_frextents) - 1); } +STATIC int +xfs_sb_mod8( + uint8_t *field, + int8_t delta) +{ + int8_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + +STATIC int +xfs_sb_mod32( + uint32_t *field, + int32_t delta) +{ + int32_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + +STATIC int +xfs_sb_mod64( + uint64_t *field, + int64_t delta) +{ + int64_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + /* * xfs_trans_unreserve_and_mod_sb() is called to release unused reservations * and apply superblock counter changes to the in-core superblock. The @@ -495,13 +542,6 @@ xfs_trans_apply_sb_deltas( * applied to the in-core superblock. The idea is that that has already been * done. * - * This is done efficiently with a single call to xfs_mod_incore_sb_batch(). - * However, we have to ensure that we only modify each superblock field only - * once because the application of the delta values may not be atomic. That can - * lead to ENOSPC races occurring if we have two separate modifcations of the - * free space counter to put back the entire reservation and then take away - * what we used. - * * If we are not logging superblock counters, then the inode allocated/free and * used block counts are not updated in the on disk superblock. In this case, * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we @@ -511,18 +551,14 @@ void xfs_trans_unreserve_and_mod_sb( xfs_trans_t *tp) { - xfs_mod_sb_t msb[9]; /* If you add cases, add entries */ - xfs_mod_sb_t *msbp; xfs_mount_t *mp = tp->t_mountp; - /* REFERENCED */ int error; - int rsvd; + bool rsvd; int64_t blkdelta = 0; int64_t rtxdelta = 0; int64_t idelta = 0; int64_t ifreedelta = 0; - msbp = msb; rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; /* calculate deltas */ @@ -547,94 +583,110 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, blkdelta, rsvd); + error = xfs_sb_mod_fdblocks(mp, blkdelta, rsvd); if (error) goto out; } if (idelta) { - error = xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, idelta, rsvd); + error = xfs_sb_mod_icount(mp, idelta); if (error) goto out_undo_fdblocks; } if (ifreedelta) { - error = xfs_mod_incore_sb(mp, XFS_SBS_IFREE, ifreedelta, rsvd); + error = xfs_sb_mod_ifree(mp, ifreedelta); if (error) goto out_undo_icount; } /* apply remaining deltas */ - if (rtxdelta != 0) { - msbp->msb_field = XFS_SBS_FREXTENTS; - msbp->msb_delta = rtxdelta; - msbp++; - } + if (rtxdelta == 0 && !(tp->t_flags & XFS_TRANS_SB_DIRTY)) + return; - if (tp->t_flags & XFS_TRANS_SB_DIRTY) { - if (tp->t_dblocks_delta != 0) { - msbp->msb_field = XFS_SBS_DBLOCKS; - msbp->msb_delta = tp->t_dblocks_delta; - msbp++; - } - if (tp->t_agcount_delta != 0) { - msbp->msb_field = XFS_SBS_AGCOUNT; - msbp->msb_delta = tp->t_agcount_delta; - msbp++; - } - if (tp->t_imaxpct_delta != 0) { - msbp->msb_field = XFS_SBS_IMAX_PCT; - msbp->msb_delta = tp->t_imaxpct_delta; - msbp++; - } - if (tp->t_rextsize_delta != 0) { - msbp->msb_field = XFS_SBS_REXTSIZE; - msbp->msb_delta = tp->t_rextsize_delta; - msbp++; - } - if (tp->t_rbmblocks_delta != 0) { - msbp->msb_field = XFS_SBS_RBMBLOCKS; - msbp->msb_delta = tp->t_rbmblocks_delta; - msbp++; - } - if (tp->t_rblocks_delta != 0) { - msbp->msb_field = XFS_SBS_RBLOCKS; - msbp->msb_delta = tp->t_rblocks_delta; - msbp++; - } - if (tp->t_rextents_delta != 0) { - msbp->msb_field = XFS_SBS_REXTENTS; - msbp->msb_delta = tp->t_rextents_delta; - msbp++; - } - if (tp->t_rextslog_delta != 0) { - msbp->msb_field = XFS_SBS_REXTSLOG; - msbp->msb_delta = tp->t_rextslog_delta; - msbp++; - } + spin_lock(&mp->m_sb_lock); + if (rtxdelta) { + error = xfs_sb_mod64(&mp->m_sb.sb_frextents, rtxdelta); + if (error) + goto out_undo_ifree; } - - /* - * If we need to change anything, do it. - */ - if (msbp > msb) { - error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, - (uint)(msbp - msb), rsvd); + if (tp->t_dblocks_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_dblocks, tp->t_dblocks_delta); if (error) - goto out_undo_ifreecount; + goto out_undo_frextents; } - + if (tp->t_agcount_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_agcount, tp->t_agcount_delta); + if (error) + goto out_undo_dblocks; + } + if (tp->t_imaxpct_delta != 0) { + error = xfs_sb_mod8(&mp->m_sb.sb_imax_pct, tp->t_imaxpct_delta); + if (error) + goto out_undo_agcount; + } + if (tp->t_rextsize_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_rextsize, tp->t_rextsize_delta); + if (error) + goto out_undo_imaxpct; + } + if (tp->t_rbmblocks_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, tp->t_rbmblocks_delta); + if (error) + goto out_undo_rextsize; + } + if (tp->t_rblocks_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_rblocks, tp->t_rblocks_delta); + if (error) + goto out_undo_rbmblocks; + } + if (tp->t_rextents_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_rextents, tp->t_rextents_delta); + if (error) + goto out_undo_rblocks; + } + if (tp->t_rextslog_delta != 0) { + error = xfs_sb_mod8(&mp->m_sb.sb_rextslog, tp->t_rextslog_delta); + if (error) + goto out_undo_rextents; + } + spin_unlock(&mp->m_sb_lock); return; -out_undo_ifreecount: +out_undo_rextents: + if (tp->t_rextents_delta) + xfs_sb_mod64(&mp->m_sb.sb_rextents, -tp->t_rextents_delta); +out_undo_rblocks: + if (tp->t_rblocks_delta) + xfs_sb_mod64(&mp->m_sb.sb_rblocks, -tp->t_rblocks_delta); +out_undo_rbmblocks: + if (tp->t_rbmblocks_delta) + xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, -tp->t_rbmblocks_delta); +out_undo_rextsize: + if (tp->t_rextsize_delta) + xfs_sb_mod32(&mp->m_sb.sb_rextsize, -tp->t_rextsize_delta); +out_undo_imaxpct: + if (tp->t_rextsize_delta) + xfs_sb_mod8(&mp->m_sb.sb_imax_pct, -tp->t_imaxpct_delta); +out_undo_agcount: + if (tp->t_agcount_delta) + xfs_sb_mod32(&mp->m_sb.sb_agcount, -tp->t_agcount_delta); +out_undo_dblocks: + if (tp->t_dblocks_delta) + xfs_sb_mod64(&mp->m_sb.sb_dblocks, -tp->t_dblocks_delta); +out_undo_frextents: + if (rtxdelta) + xfs_sb_mod64(&mp->m_sb.sb_frextents, -rtxdelta); +out_undo_ifree: + spin_unlock(&mp->m_sb_lock); if (ifreedelta) - xfs_mod_incore_sb(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); + xfs_sb_mod_ifree(mp, -ifreedelta); out_undo_icount: if (idelta) - xfs_mod_incore_sb(mp, XFS_SBS_ICOUNT, -idelta, rsvd); + xfs_sb_mod_icount(mp, -idelta); out_undo_fdblocks: if (blkdelta) - xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); + xfs_sb_mod_fdblocks(mp, -blkdelta, rsvd); out: ASSERT(error == 0); return; From BATV+3f638bb7db22d3ac725a+4181+infradead.org+hch@bombadil.srs.infradead.org Tue Feb 3 16:02:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5D057802D for ; Tue, 3 Feb 2015 16:02:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C7088F8081 for ; Tue, 3 Feb 2015 14:02:09 -0800 (PST) X-ASG-Debug-ID: 1423000928-04cb6c2e6bc37de0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VGwb5JAacBEfiWkc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 14:02:08 -0800 (PST) X-Barracuda-Envelope-From: BATV+3f638bb7db22d3ac725a+4181+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 1YIlXs-0002oh-3c; Tue, 03 Feb 2015 22:02:08 +0000 Date: Tue, 3 Feb 2015 14:02:08 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Message-ID: <20150203220208.GA10498@infradead.org> X-ASG-Orig-Subj: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <20150203215043.GA21885@infradead.org> <20150203215850.GK4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203215850.GK4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1423000928 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Feb 04, 2015 at 08:58:50AM +1100, Dave Chinner wrote: > It probably needs to be split up into several patches, though. I can > do that over the next few days and add it to the patchset if you > want. The icsb changes are 3.21 material, anyway, so there's no > real hurry on this.... Might be best if you fold the changes for the three counters that your series touch into those patches. Then I can split the remainder up into one for the real time extents as the only one called from code outside the transction subsystem, and then the final one to redo the batch changess from the transaction code. From david@fromorbit.com Tue Feb 3 16:04:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 07BE6802D for ; Tue, 3 Feb 2015 16:04:07 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DCDDC304062 for ; Tue, 3 Feb 2015 14:04:03 -0800 (PST) X-ASG-Debug-ID: 1423001040-04cbb04169c092b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oYHaNyCnaAJIvfrG for ; Tue, 03 Feb 2015 14:04:01 -0800 (PST) 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: A2CcDADHQ9FUPJVzLHlagwaBK4Iyg3msFQEBAQEBAQaYKQQCAoEZRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1nsBAQgCIBiFbIl0B4QpBZgxgRiOC4M9giQcgWQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Feb 2015 08:28:50 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIlUg-0000Sz-8v; Wed, 04 Feb 2015 08:58:50 +1100 Date: Wed, 4 Feb 2015 08:58:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Message-ID: <20150203215850.GK4251@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <20150203215043.GA21885@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203215043.GA21885@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: 1423001040 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Feb 03, 2015 at 01:50:43PM -0800, Christoph Hellwig wrote: > FYI, I think we should just get rid of the horrible xfs_mod_incore_sb(_batch) > interface as part of this. The patch below applies on top of your > series. I like it - getting rid of those field bitmasks altogether is a great result. It probably needs to be split up into several patches, though. I can do that over the next few days and add it to the patchset if you want. The icsb changes are 3.21 material, anyway, so there's no real hurry on this.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 3 16:13:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C74CB8036 for ; Tue, 3 Feb 2015 16:13:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4613304077 for ; Tue, 3 Feb 2015 14:13:40 -0800 (PST) X-ASG-Debug-ID: 1423001617-04cbb04167c096f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id LAwcuKHHCu7o5LBE for ; Tue, 03 Feb 2015 14:13:38 -0800 (PST) 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: A2CcDAA5R9FUPJVzLHlagwaBK4Iyg3msFQEBAQEBAQaYKQQCAoEURAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1wkBKxiFbIl0B4QpBY0piwiBGI4Lgz2EJCoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Feb 2015 08:43:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YIliy-0000ZK-F9; Wed, 04 Feb 2015 09:13:36 +1100 Date: Wed, 4 Feb 2015 09:13:36 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb Message-ID: <20150203221336.GL4251@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 0/5] xfs: use generic percpu counters for icsb References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <20150203215043.GA21885@infradead.org> <20150203215850.GK4251@dastard> <20150203220208.GA10498@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203220208.GA10498@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: 1423001617 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Feb 03, 2015 at 02:02:08PM -0800, Christoph Hellwig wrote: > On Wed, Feb 04, 2015 at 08:58:50AM +1100, Dave Chinner wrote: > > It probably needs to be split up into several patches, though. I can > > do that over the next few days and add it to the patchset if you > > want. The icsb changes are 3.21 material, anyway, so there's no > > real hurry on this.... > > Might be best if you fold the changes for the three counters that > your series touch into those patches. Then I can split the remainder > up into one for the real time extents as the only one called from > code outside the transction subsystem, and then the final one to > redo the batch changess from the transaction code. Sounds like a plan to me. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 3 17:36:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3E6438000 for ; Tue, 3 Feb 2015 17:36:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1AC668F8073 for ; Tue, 3 Feb 2015 15:36:18 -0800 (PST) X-ASG-Debug-ID: 1423006575-04bdf01eeea041d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id KxnFWKaDXEP8JwSB for ; Tue, 03 Feb 2015 15:36:15 -0800 (PST) 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: A2CcDAAEWtFUPJVzLHlagwaBK4Iyg3msFgEBAQEBAQaYKQQCAoEVRAEBAQEBBgEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gs1mkBAQgCIBiFbIl0B4QpBZgxijiIKIQkKjGCQgEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Feb 2015 10:04:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YImza-0000lp-BI; Wed, 04 Feb 2015 10:34:50 +1100 Date: Wed, 4 Feb 2015 10:34:50 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format Message-ID: <20150203233450.GM4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: struct xfs_sb is no longer tied to the on-disk format References: <1422826983-29570-1-git-send-email-david@fromorbit.com> <1422826983-29570-2-git-send-email-david@fromorbit.com> <20150202084102.GA28121@infradead.org> <20150202193020.GJ6282@dastard> <20150203213744.GA31631@infradead.org> <20150203214608.GJ4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203214608.GJ4251@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: 1423006575 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 04, 2015 at 08:46:09AM +1100, Dave Chinner wrote: > On Tue, Feb 03, 2015 at 01:37:44PM -0800, Christoph Hellwig wrote: > > On Tue, Feb 03, 2015 at 06:30:21AM +1100, Dave Chinner wrote: > > > > I'd expect to move it close to stuct xfs_mount, and maybe even merge > > > > it into that in the long run. > > > > > > I guess moving the structure there is fine, but we still want all > > > the version functions to be shared with userspace, which then makes > > > for an interesting set of dependencies. Any other ideas? > > > > Are they really worth the sharing? If they are worth it we'll > > need somethign that can expect a xfs_sb/xfs_mount to be defined. > > I suppose we could stop sharing them - they change rarely enough > and it's only a few lines of code for each new feature that would > then need to be duplicated. Not a huge burden... Just a further thought on this - I might keep the per-cpu counters in the struct mount. That way the to/from disk code only needs to sum/set the per-cpu counter values to/from the m_sb as they currently do and so the xfs_sb can remain unchanged for the moment. That might be a cleaner way to start this patchset, especially as we already have the per-cpu counter hooks in all the places we need them. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jamesgmotley56@gmail.com Tue Feb 3 17:58:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 4D2B48018 for ; Tue, 3 Feb 2015 17:58:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D53B8F807A for ; Tue, 3 Feb 2015 15:58:21 -0800 (PST) X-ASG-Debug-ID: 1423007899-04bdf01eefa04b90001-NocioJ Received: from mail-yk0-f170.google.com (mail-yk0-f170.google.com [209.85.160.170]) by cuda.sgi.com with ESMTP id pxWJe2sPNbwy5frp (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 03 Feb 2015 15:58:19 -0800 (PST) X-Barracuda-Envelope-From: jamesgmotley56@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.170] Received: by mail-yk0-f170.google.com with SMTP id q9so25842162ykb.1 for ; Tue, 03 Feb 2015 15:58:19 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=vksLPKZNqr/TQn9Y+SC8BSRAZ29UqyQttoQiQ0ryQFU=; b=J4J91C965kwSiyfkR16KpGxghaYNZ6Ik/AnsJgj2CzNBHD41LDbddmPCLTwis5Y4ze DT1hxfH3d5Aimy8AJFt+BlSTmakwpy9O9r3RO7Sv79whngRWA9yhhr2lPb/QzI3Rc6Qg Iqztsg2ZmWxLaHEUmhie3DVYL9aU/v4yxE5VQnbmIDXK3Abcu1gwD3gN/oVQpUVtRyOp YxIxTPTGlP3qiPnzGMXT/R5gciaZryiAE7uUik5q5F9nQPkwk1Np9Bs0ZR2exkOaT1d7 QhZ5yX2l0rV4Z7L6in6exXmn5o6GViuNZDDkLNqBEpV6ndflOuS9BVtXLd86L4wZ/UeR hk9A== MIME-Version: 1.0 X-Received: by 10.170.155.85 with SMTP id w82mr12466782ykc.16.1423007898787; Tue, 03 Feb 2015 15:58:18 -0800 (PST) Received: by 10.170.163.65 with HTTP; Tue, 3 Feb 2015 15:58:18 -0800 (PST) Date: Wed, 4 Feb 2015 07:58:18 +0800 Message-ID: Subject: Please let me know if you need to print color box, display box and labels From: Jinghao Printing - CHINA X-ASG-Orig-Subj: Please let me know if you need to print color box, display box and labels To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-yk0-f170.google.com[209.85.160.170] X-Barracuda-Start-Time: 1423007899 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14912 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, this is David Wu from Shanghai, China. Please let me know if you need color box, display box, corrugated box, label, hang tag etc. I will send you the website. Best regards, David Wu From hch@lst.de Wed Feb 4 01:58:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 213587FB9 for ; Wed, 4 Feb 2015 01:58:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 013B4304084 for ; Tue, 3 Feb 2015 23:58:00 -0800 (PST) X-ASG-Debug-ID: 1423036678-04bdf01eeea10200001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id A4vU1j2yzLeOapgS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Feb 2015 23:57:59 -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 5ACB4AAB36; Wed, 4 Feb 2015 08:57:56 +0100 (CET) Date: Wed, 4 Feb 2015 08:57:56 +0100 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "J. Bruce Fields" , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150204075756.GA763@lst.de> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150202194300.GN6282@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1423036678 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14922 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 03, 2015 at 06:43:00AM +1100, Dave Chinner wrote: > As to the pNFSD specific changes, I haven't really looked them over > in any great detail yet. My main concern is that there are no > specific regression tests for this yet, I'm not sure how we go about > verifying it actually works properly and we don't inadvertantly > break it in the future. Christoph? Any chance you could review them this week so we can get them merged in time for 3.20? In the worst case Bruce will have to pull the xfs tree into the nfsd tree so that we have all the dependencies available. From david@fromorbit.com Wed Feb 4 14:03:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E5B67F6A for ; Wed, 4 Feb 2015 14:03:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18851AC004 for ; Wed, 4 Feb 2015 12:03:44 -0800 (PST) X-ASG-Debug-ID: 1423080216-04cb6c2e69c55670001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XXe4TTZhTKecaZoo for ; Wed, 04 Feb 2015 12:03:37 -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: AnkKAOp50lR5LHOV/2dsb2JhbABagwaBK695BQaYKQQCAoEgRAEBAQEBfYQNAQU6HCMQCAMOCgklDwUlAyETiCzWbQEBCAIgGIVsiXQHhCkFmDiKOogqIoIygVAqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 06:32:35 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJ69W-00034q-94; Thu, 05 Feb 2015 07:02:22 +1100 Date: Thu, 5 Feb 2015 07:02:22 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150204200222.GN4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> <20150204075756.GA763@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150204075756.GA763@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423080216 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 04, 2015 at 08:57:56AM +0100, Christoph Hellwig wrote: > On Tue, Feb 03, 2015 at 06:43:00AM +1100, Dave Chinner wrote: > > As to the pNFSD specific changes, I haven't really looked them over > > in any great detail yet. My main concern is that there are no > > specific regression tests for this yet, I'm not sure how we go about > > verifying it actually works properly and we don't inadvertantly > > break it in the future. Christoph? > > Any chance you could review them this week so we can get them > merged in time for 3.20? In the worst case Bruce will have to pull > the xfs tree into the nfsd tree so that we have all the dependencies > available. I'm working my way through them. I'm just about to pull in the growfs transaction patch (missed it last time around), and I try to have a decent look over the other two patches later today. I'm not sure I have any bandwidth to test them yet, but perhaps if I add a one-time message "Experimental feature in use" when the code is first executed then it will be OK to merge (i.e. process similar to delayed logging and CRC introduction). Once we've got more confidence that it's all working properly, then we can remove the experimental tag from it. Does that sound like a reasonable approach to take? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed Feb 4 14:54:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 349E97F83 for ; Wed, 4 Feb 2015 14:54:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B359FAC004 for ; Wed, 4 Feb 2015 12:54:29 -0800 (PST) X-ASG-Debug-ID: 1423083265-04cb6c2e6ac56980002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kKKXAXHWmK8boXMb for ; Wed, 04 Feb 2015 12:54:27 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAMSF0lR5LHOV/2dsb2JhbABSCIMGgSuveQUGmU9EAQEBAQF9hA0BBScvMwgYMTkDGxmILNcQhgSJHoUGBYVNlAOFSYNZiCoigUUBCwEwHIFkKjGCQgEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D9-7X for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007Ea-6e for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/7] xfs: remove xfs_mod_incore_sb API Date: Thu, 5 Feb 2015 07:54:09 +1100 X-ASG-Orig-Subj: [PATCH 7/7] xfs: remove xfs_mod_incore_sb API Message-Id: <1423083249-27493-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083266 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that there are no users of the bitfield based incore superblock modification API, just remove the whole damn lot of it, including all the bitfield definitions. This finally removes a lot of cruft that has been around for a long time. Credit goes to Christoph Hellwig for providing a great patch connecting all the dots to enale us to do this. This patch is derived from that work. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_format.h | 62 --------------------- fs/xfs/xfs_fsops.c | 4 -- fs/xfs/xfs_mount.c | 136 --------------------------------------------- fs/xfs/xfs_mount.h | 3 +- 4 files changed, 1 insertion(+), 204 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 8eb7189..4daaa66 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -264,68 +264,6 @@ typedef struct xfs_dsb { /* must be padded to 64 bit alignment */ } xfs_dsb_t; -/* - * Sequence number values for the fields. - */ -typedef enum { - XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS, - XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO, - XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS, - XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS, - XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE, - XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG, - XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG, - XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT, - XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO, - XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, - XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, - XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, - XFS_SBS_PQUOTINO, XFS_SBS_LSN, - XFS_SBS_FIELDCOUNT -} xfs_sb_field_t; - -/* - * Mask values, defined based on the xfs_sb_field_t values. - * Only define the ones we're using. - */ -#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) -#define XFS_SB_UUID XFS_SB_MVAL(UUID) -#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) -#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) -#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) -#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) -#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) -#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) -#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) -#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) -#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) -#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) -#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) -#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) -#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) -#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) -#define XFS_SB_FEATURES2 (XFS_SB_MVAL(FEATURES2) | \ - XFS_SB_MVAL(BAD_FEATURES2)) -#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) -#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) -#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) -#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) -#define XFS_SB_CRC XFS_SB_MVAL(CRC) -#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) -#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) -#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) -#define XFS_SB_MOD_BITS \ - (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ - XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ - XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_FEATURES_COMPAT | XFS_SB_FEATURES_RO_COMPAT | \ - XFS_SB_FEATURES_INCOMPAT | XFS_SB_FEATURES_LOG_INCOMPAT | \ - XFS_SB_PQUOTINO) - /* * Misc. Flags - warning - these will be cleared by xfs_repair unless diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index a45c82b4..6c248bf 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -686,10 +686,6 @@ xfs_reserve_blocks( * what to do. This means that the amount of free space can * change while we do this, so we need to retry if we end up * trying to reserve more space than is available. - * - * We also use the xfs_mod_incore_sb() interface so that we - * don't have to care about whether per cpu counter are - * enabled, disabled or even compiled in.... */ retry: spin_lock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 9499e88..6e6bc40 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1218,142 +1218,6 @@ xfs_mod_frextents( } /* - * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply - * a delta to a specified field in the in-core superblock. Simply - * switch on the field indicated and apply the delta to that field. - * Fields are not allowed to dip below zero, so if the delta would - * do this do not apply it and return EINVAL. - * - * The m_sb_lock must be held when this routine is called. - */ -STATIC int -xfs_mod_incore_sb_unlocked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - int scounter; /* short counter for 32 bit fields */ - long long lcounter; /* long counter for 64 bit fields */ - - /* - * With the in-core superblock spin lock held, switch - * on the indicated field. Apply the delta to the - * proper field. If the fields value would dip below - * 0, then do not apply the delta and return EINVAL. - */ - switch (field) { - case XFS_SBS_ICOUNT: - case XFS_SBS_IFREE: - case XFS_SBS_FDBLOCKS: - case XFS_SBS_FREXTENTS: - ASSERT(0); - return -EINVAL; - case XFS_SBS_DBLOCKS: - lcounter = (long long)mp->m_sb.sb_dblocks; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_dblocks = lcounter; - return 0; - case XFS_SBS_AGCOUNT: - scounter = mp->m_sb.sb_agcount; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_agcount = scounter; - return 0; - case XFS_SBS_IMAX_PCT: - scounter = mp->m_sb.sb_imax_pct; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_imax_pct = scounter; - return 0; - case XFS_SBS_REXTSIZE: - scounter = mp->m_sb.sb_rextsize; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextsize = scounter; - return 0; - case XFS_SBS_RBMBLOCKS: - scounter = mp->m_sb.sb_rbmblocks; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rbmblocks = scounter; - return 0; - case XFS_SBS_RBLOCKS: - lcounter = (long long)mp->m_sb.sb_rblocks; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rblocks = lcounter; - return 0; - case XFS_SBS_REXTENTS: - lcounter = (long long)mp->m_sb.sb_rextents; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextents = lcounter; - return 0; - case XFS_SBS_REXTSLOG: - scounter = mp->m_sb.sb_rextslog; - scounter += delta; - if (scounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_rextslog = scounter; - return 0; - default: - ASSERT(0); - return -EINVAL; - } -} - -/* - * xfs_mod_incore_sb() is used to change a field in the in-core - * superblock structure by the specified delta. This modification - * is protected by the m_sb_lock. Just use the xfs_mod_incore_sb_unlocked() - * routine to do the work. - */ -int -xfs_mod_incore_sb( - struct xfs_mount *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - int status; - -#ifdef HAVE_PERCPU_SB - ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); -#endif - - spin_lock(&mp->m_sb_lock); - status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - spin_unlock(&mp->m_sb_lock); - - return status; -} - -/* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. * The buffer should be released with a call to xfs_brelse(). diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 66f28c1..616e1ba 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -302,9 +302,8 @@ extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, xfs_agnumber_t *maxagi); - extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); + extern int xfs_mod_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, -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1E1997F84 for ; Wed, 4 Feb 2015 14:54:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D4D48F8066 for ; Wed, 4 Feb 2015 12:54:27 -0800 (PST) X-ASG-Debug-ID: 1423083265-04cb6c2e6ac56980001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id z3V0Qhzp8JybA8uE for ; Wed, 04 Feb 2015 12:54:26 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoUJAMSF0lR5LHOV/2dsb2JhbABagwZSWa9gAgEJDQUGdpFIhxFEAQEBAQF9hGk7gQIDU4gNDrBRpjGGBIdngiqEEwWFTY0ThnCFSYwDIoFFAQsBgjAqMQGCQQEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D2-4n for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007E3-3j for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb Date: Thu, 5 Feb 2015 07:54:02 +1100 X-ASG-Orig-Subj: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb Message-Id: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083265 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi folks, This is the second version of the generic per-cpu counter rework patch series. The first version can be found here: http://oss.sgi.com/archives/xfs/2015-02/msg00000.html New in V2: - drop the moving of the struct xfs_sb to xfs_super.h - fixed all the little things that Christoph and Brian noted. - keep the per-cpu counters in the struct xfs_mount and keep the functions to sync them with the struct xfs_sb values when read from disk or written to disk. - integrated Christoph Hellwig's additional cleanup patch. This was done by: - intergating xfs_mod_XXX factoring into the relevant percpu counter conversion patch - separating out xfs_mod_frextents into it's won patch - separating out the replacement of xfs_mod_incore_sb_batched - doing all the now unused API removal in a separate patch The series passes xfstests without regressions, and no scalability issues have been seen in my performance tests on a 16p VM. SGI - you still need to test this, though. :) Thoughts, comments? -Dave. PS: diffstat of the series is now: fs/xfs/libxfs/xfs_bmap.c | 40 +-- fs/xfs/libxfs/xfs_format.h | 62 ---- fs/xfs/libxfs/xfs_ialloc.c | 6 +- fs/xfs/libxfs/xfs_sb.c | 12 +- fs/xfs/xfs_fsops.c | 20 +- fs/xfs/xfs_iomap.c | 3 +- fs/xfs/xfs_linux.h | 9 - fs/xfs/xfs_log_recover.c | 4 +- fs/xfs/xfs_mount.c | 919 ++++++----------------------------------------- fs/xfs/xfs_mount.h | 95 +---- fs/xfs/xfs_super.c | 103 ++++-- fs/xfs/xfs_super.h | 2 + fs/xfs/xfs_trans.c | 234 +++++++----- 13 files changed, 381 insertions(+), 1128 deletions(-) So we have a net reduction of roughly 750 lines of code. When combined with the changes to the superblock logging that has already been committed, we have reduced the superblock modification code by close to 1000 lines compared to 3.19... From dave@fromorbit.com Wed Feb 4 14:54:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 780437F87 for ; Wed, 4 Feb 2015 14:54:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6326D30406A for ; Wed, 4 Feb 2015 12:54:31 -0800 (PST) X-ASG-Debug-ID: 1423083265-04cb6c2e6ac56980003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id UAiEn7ND0scMYepX for ; Wed, 04 Feb 2015 12:54:29 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAMSF0lR5LHOV/2dsb2JhbABagwaBK695BQaZT0QBAQEBAX2EDQEFDhkvDyQISTkDGxmILNcQhgSOJAWFTZQDhUmFSYY6IoFFAQsBMByBZCoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D3-5C for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007E6-4M for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/7] xfs: use generic percpu counters for inode counter Date: Thu, 5 Feb 2015 07:54:03 +1100 X-ASG-Orig-Subj: [PATCH 1/7] xfs: use generic percpu counters for inode counter Message-Id: <1423083249-27493-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083268 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. There are some warts around the use of them for the inode counter as the hand rolled counter is designed to be accurate at zero, but has no specific accurracy at any other value. This design causes problems for the maximum inode count threshold enforcement, as there is no trigger that balances the counters as they get close tothe maximum threshold. Instead of designing new triggers for balancing, just replace the handrolled per-cpu counter with a generic counter. This enables us to update the counter through the normal superblock modification funtions, but rather than do that we add a xfs_mod_icount() helper function (from Christoph Hellwig) and keep the percpu counter outside the superblock in the struct xfs_mount. This means we still need to initialise the per-cpu counter specifically when we read the superblock, and vice versa when we log/write it, but it does mean that we don't need to change any other code. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_ialloc.c | 6 ++-- fs/xfs/libxfs/xfs_sb.c | 2 ++ fs/xfs/xfs_fsops.c | 3 +- fs/xfs/xfs_mount.c | 76 +++++++++++++++++++++------------------------- fs/xfs/xfs_mount.h | 7 +++-- fs/xfs/xfs_super.c | 7 +++-- fs/xfs/xfs_trans.c | 5 ++- 7 files changed, 54 insertions(+), 52 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..5b4ba9f 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -376,7 +376,8 @@ xfs_ialloc_ag_alloc( */ newlen = args.mp->m_ialloc_inos; if (args.mp->m_maxicount && - args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) + percpu_counter_read(&args.mp->m_icount) + newlen > + args.mp->m_maxicount) return -ENOSPC; args.minlen = args.maxlen = args.mp->m_ialloc_blks; /* @@ -1340,7 +1341,8 @@ xfs_dialloc( * inode. */ if (mp->m_maxicount && - mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { + percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos > + mp->m_maxicount) { noroom = 1; okalloc = 0; } diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe9..017cb2f 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -771,6 +771,8 @@ xfs_log_sb( struct xfs_mount *mp = tp->t_mountp; struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); + mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb)); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index f711452..e1470f2 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -631,11 +631,12 @@ xfs_fs_counts( xfs_fsop_counts_t *cnt) { xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + cnt->allocino = percpu_counter_read_positive(&mp->m_icount); + spin_lock(&mp->m_sb_lock); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; cnt->freeino = mp->m_sb.sb_ifree; - cnt->allocino = mp->m_sb.sb_icount; spin_unlock(&mp->m_sb_lock); return 0; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4fa80e6..702ea6a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1099,6 +1099,21 @@ xfs_log_sbcount(xfs_mount_t *mp) return xfs_sync_sb(mp, true); } +int +xfs_mod_icount( + struct xfs_mount *mp, + int64_t delta) +{ + /* deltas are +/-64, hence the large batch size of 128. */ + __percpu_counter_add(&mp->m_icount, delta, 128); + if (percpu_counter_compare(&mp->m_icount, 0) < 0) { + ASSERT(0); + percpu_counter_add(&mp->m_icount, -delta); + return -EINVAL; + } + return 0; +} + /* * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply * a delta to a specified field in the in-core superblock. Simply @@ -1127,14 +1142,8 @@ xfs_mod_incore_sb_unlocked( */ switch (field) { case XFS_SBS_ICOUNT: - lcounter = (long long)mp->m_sb.sb_icount; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_icount = lcounter; - return 0; + ASSERT(0); + return -ENOSPC; case XFS_SBS_IFREE: lcounter = (long long)mp->m_sb.sb_ifree; lcounter += delta; @@ -1288,8 +1297,9 @@ xfs_mod_incore_sb( int status; #ifdef HAVE_PERCPU_SB - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); + ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); #endif + spin_lock(&mp->m_sb_lock); status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); spin_unlock(&mp->m_sb_lock); @@ -1492,7 +1502,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); @@ -1504,17 +1513,14 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - mp->m_sb.sb_icount += cntp->icsb_icount; mp->m_sb.sb_ifree += cntp->icsb_ifree; mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); @@ -1531,11 +1537,18 @@ xfs_icsb_init_counters( xfs_mount_t *mp) { xfs_icsb_cnts_t *cntp; + int error; int i; + error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); + if (error) + return error; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (mp->m_sb_cnts == NULL) + if (!mp->m_sb_cnts) { + percpu_counter_destroy(&mp->m_icount); return -ENOMEM; + } for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); @@ -1563,13 +1576,14 @@ void xfs_icsb_reinit_counters( xfs_mount_t *mp) { + percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount); + xfs_icsb_lock(mp); /* * start with all counters disabled so that the * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); @@ -1583,6 +1597,9 @@ xfs_icsb_destroy_counters( unregister_hotcpu_notifier(&mp->m_icsb_notifier); free_percpu(mp->m_sb_cnts); } + + percpu_counter_destroy(&mp->m_icount); + mutex_destroy(&mp->m_icsb_mutex); } @@ -1645,7 +1662,6 @@ xfs_icsb_count( for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_icount += cntp->icsb_icount; cnt->icsb_ifree += cntp->icsb_ifree; cnt->icsb_fdblocks += cntp->icsb_fdblocks; } @@ -1659,7 +1675,7 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); return test_bit(field, &mp->m_icsb_counters); } @@ -1670,7 +1686,7 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); /* * If we are already disabled, then there is nothing to do @@ -1689,9 +1705,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_ICOUNT: - mp->m_sb.sb_icount = cnt.icsb_icount; - break; case XFS_SBS_IFREE: mp->m_sb.sb_ifree = cnt.icsb_ifree; break; @@ -1716,15 +1729,12 @@ xfs_icsb_enable_counter( xfs_icsb_cnts_t *cntp; int i; - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_ICOUNT: - cntp->icsb_icount = count + resid; - break; case XFS_SBS_IFREE: cntp->icsb_ifree = count + resid; break; @@ -1750,8 +1760,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_count(mp, &cnt, flags); - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_ICOUNT)) - mp->m_sb.sb_icount = cnt.icsb_icount; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) mp->m_sb.sb_ifree = cnt.icsb_ifree; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) @@ -1805,12 +1813,6 @@ xfs_icsb_balance_counter_locked( /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_ICOUNT: - count = mp->m_sb.sb_icount; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; case XFS_SBS_IFREE: count = mp->m_sb.sb_ifree; resid = do_div(count, weight); @@ -1871,14 +1873,6 @@ again: } switch (field) { - case XFS_SBS_ICOUNT: - lcounter = icsbp->icsb_icount; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_icount = lcounter; - break; - case XFS_SBS_IFREE: lcounter = icsbp->icsb_ifree; lcounter += delta; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a5b2ff8..457c6e3 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -41,7 +41,6 @@ struct xfs_da_geometry; typedef struct xfs_icsb_cnts { uint64_t icsb_fdblocks; uint64_t icsb_ifree; - uint64_t icsb_icount; unsigned long icsb_flags; } xfs_icsb_cnts_t; @@ -81,8 +80,11 @@ typedef struct xfs_mount { struct super_block *m_super; xfs_tid_t m_tid; /* next unused tid for fs */ struct xfs_ail *m_ail; /* fs active log item list */ - xfs_sb_t m_sb; /* copy of fs superblock */ + + struct xfs_sb m_sb; /* copy of fs superblock */ spinlock_t m_sb_lock; /* sb counter lock */ + struct percpu_counter m_icount; /* allocated inodes counter */ + struct xfs_buf *m_sb_bp; /* buffer for superblock */ char *m_fsname; /* filesystem name */ int m_fsname_len; /* strlen of fs name */ @@ -377,6 +379,7 @@ extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); +extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); extern int xfs_mount_log_sb(xfs_mount_t *); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 40d2ac5..87e169f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1087,6 +1087,7 @@ xfs_fs_statfs( xfs_sb_t *sbp = &mp->m_sb; struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; + __uint64_t icount; xfs_extlen_t lsize; __int64_t ffree; @@ -1098,6 +1099,7 @@ xfs_fs_statfs( statp->f_fsid.val[1] = (u32)(id >> 32); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); + icount = percpu_counter_sum(&mp->m_icount); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; @@ -1106,15 +1108,14 @@ xfs_fs_statfs( statp->f_bfree = statp->f_bavail = sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); fakeinos = statp->f_bfree << sbp->sb_inopblog; - statp->f_files = - MIN(sbp->sb_icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); + statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); if (mp->m_maxicount) statp->f_files = min_t(typeof(statp->f_files), statp->f_files, mp->m_maxicount); /* make sure statp->f_ffree does not underflow */ - ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); + ffree = statp->f_files - (icount - sbp->sb_ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index eb90cd5..9bc742b 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -554,8 +554,7 @@ xfs_trans_unreserve_and_mod_sb( } if (idelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, - idelta, rsvd); + error = xfs_mod_icount(mp, idelta); if (error) goto out_undo_fdblocks; } @@ -634,7 +633,7 @@ out_undo_ifreecount: xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); out_undo_icount: if (idelta) - xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd); + xfs_mod_icount(mp, -idelta); out_undo_fdblocks: if (blkdelta) xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 523527F86 for ; Wed, 4 Feb 2015 14:54:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4D5CAC004 for ; Wed, 4 Feb 2015 12:54:30 -0800 (PST) X-ASG-Debug-ID: 1423083266-04cbb04168c280f0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id o7Gj6vhFOswfoli0 for ; Wed, 04 Feb 2015 12:54:28 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAMSF0lR5LHOV/2dsb2JhbABagwaBK695BQaZT0QBAQEBAX2EDQEFJy8zCBgxOQMbGYgs1xCGBI4kBaJyiCoigUUBCzEcgWQqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D7-6g for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007EQ-5q for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/7] xfs: introduce xfs_mod_frextents Date: Thu, 5 Feb 2015 07:54:07 +1100 X-ASG-Orig-Subj: [PATCH 5/7] xfs: introduce xfs_mod_frextents Message-Id: <1423083249-27493-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083268 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add a new helper to modify the incore counter of free realtime extents. This matches the helpers used for inode and data block counters, and removes a significant users of the xfs_mod_incore_sb() interface. Based on a patch originally from Christoph Hellwig. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 8 +++----- fs/xfs/xfs_mount.c | 27 +++++++++++++++++++-------- fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_trans.c | 18 ++++++++++-------- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index e39c9e8..b8e97fd0 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4158,8 +4158,7 @@ xfs_bmapi_reserve_delalloc( ASSERT(indlen > 0); if (rt) { - error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - -((int64_t)extsz), 0); + error = xfs_mod_frextents(mp, -((int64_t)extsz)); } else { error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); } @@ -4194,7 +4193,7 @@ xfs_bmapi_reserve_delalloc( out_unreserve_blocks: if (rt) - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); + xfs_mod_frextents(mp, extsz); else xfs_mod_fdblocks(mp, alen, false); out_unreserve_quota: @@ -5278,8 +5277,7 @@ xfs_bunmapi( rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); do_div(rtexts, mp->m_sb.sb_rextsize); - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, 0); + xfs_mod_frextents(mp, (int64_t)rtexts); (void)xfs_trans_reserve_quota_nblks(NULL, ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 1d26200..284f528 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1199,6 +1199,24 @@ fdblocks_enospc: return -ENOSPC; } +int +xfs_mod_frextents( + struct xfs_mount *mp, + int64_t delta) +{ + int64_t lcounter; + int ret = 0; + + spin_lock(&mp->m_sb_lock); + lcounter = mp->m_sb.sb_frextents + delta; + if (lcounter < 0) + ret = -ENOSPC; + else + mp->m_sb.sb_frextents = lcounter; + spin_unlock(&mp->m_sb_lock); + return ret; +} + /* * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply * a delta to a specified field in the in-core superblock. Simply @@ -1228,16 +1246,9 @@ xfs_mod_incore_sb_unlocked( case XFS_SBS_ICOUNT: case XFS_SBS_IFREE: case XFS_SBS_FDBLOCKS: + case XFS_SBS_FREXTENTS: ASSERT(0); return -EINVAL; - case XFS_SBS_FREXTENTS: - lcounter = (long long)mp->m_sb.sb_frextents; - lcounter += delta; - if (lcounter < 0) { - return -ENOSPC; - } - mp->m_sb.sb_frextents = lcounter; - return 0; case XFS_SBS_DBLOCKS: lcounter = (long long)mp->m_sb.sb_dblocks; lcounter += delta; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index ff1d1d5..8970489 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -320,6 +320,8 @@ 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); +extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); + extern int xfs_mount_log_sb(xfs_mount_t *); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index e99f5e5..4e4bc5a 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -235,8 +235,7 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (rtextents > 0) { - error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, - -((int64_t)rtextents), rsvd); + error = xfs_mod_frextents(tp->t_mountp, -((int64_t)rtextents)); if (error) { error = -ENOSPC; goto undo_log; @@ -562,10 +561,10 @@ xfs_trans_unreserve_and_mod_sb( } /* apply remaining deltas */ - if (rtxdelta != 0) { - msbp->msb_field = XFS_SBS_FREXTENTS; - msbp->msb_delta = rtxdelta; - msbp++; + if (rtxdelta) { + error = xfs_mod_frextents(mp, rtxdelta); + if (error) + goto out_undo_ifree; } if (tp->t_flags & XFS_TRANS_SB_DIRTY) { @@ -618,12 +617,15 @@ xfs_trans_unreserve_and_mod_sb( error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, (uint)(msbp - msb), rsvd); if (error) - goto out_undo_ifreecount; + goto out_undo_frextents; } return; -out_undo_ifreecount: +out_undo_frextents: + if (rtxdelta) + xfs_mod_frextents(mp, -rtxdelta); +out_undo_ifree: if (ifreedelta) xfs_mod_ifree(mp, -ifreedelta); out_undo_icount: -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E5767F58 for ; Wed, 4 Feb 2015 14:54:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9DF07AC002 for ; Wed, 4 Feb 2015 12:54:29 -0800 (PST) X-ASG-Debug-ID: 1423083266-04cbb04168c280f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id De4OUvS9y4irDRFl for ; Wed, 04 Feb 2015 12:54:27 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq8HAMSF0lR5LHOV/2dsb2JhbABagwaBK695BQaYL4EgRAEBAQEBfYQNAQUOGS8PJAgYMTkDGxmILNcQhgSJHUyEOwWFTZQDixKGOiKBRQELATAcgWQqMYEDgT8BAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D4-5W for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007EB-4j for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/7] xfs: use generic percpu counters for free inode counter Date: Thu, 5 Feb 2015 07:54:04 +1100 X-ASG-Orig-Subj: [PATCH 2/7] xfs: use generic percpu counters for free inode counter Message-Id: <1423083249-27493-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083266 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Dave Chinner XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. The free inode counter is not used for any limit enforcement - the per-AG free inode counters are used during allocation to determine if there are inode available for allocation. Hence we don't need any of the complexity of the hand-rolled counters and we can simply replace them with generic per-cpu counters similar to the inode counter. This version introduces a xfs_mod_ifree() helper function from Christoph Hellwig. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_sb.c | 1 + fs/xfs/xfs_fsops.c | 2 +- fs/xfs/xfs_mount.c | 76 ++++++++++++++++++++++---------------------------- fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_super.c | 4 ++- fs/xfs/xfs_trans.c | 5 ++-- 6 files changed, 42 insertions(+), 48 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 017cb2f..b66aeab 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -772,6 +772,7 @@ xfs_log_sb( struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); + mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index e1470f2..fa74d03 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -632,11 +632,11 @@ xfs_fs_counts( { xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); cnt->allocino = percpu_counter_read_positive(&mp->m_icount); + cnt->freeino = percpu_counter_read_positive(&mp->m_ifree); spin_lock(&mp->m_sb_lock); cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; - cnt->freeino = mp->m_sb.sb_ifree; spin_unlock(&mp->m_sb_lock); return 0; } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 702ea6a..650e8f1 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1114,6 +1114,20 @@ xfs_mod_icount( return 0; } + +int +xfs_mod_ifree( + struct xfs_mount *mp, + int64_t delta) +{ + percpu_counter_add(&mp->m_ifree, delta); + if (percpu_counter_compare(&mp->m_ifree, 0) < 0) { + ASSERT(0); + percpu_counter_add(&mp->m_ifree, -delta); + return -EINVAL; + } + return 0; +} /* * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply * a delta to a specified field in the in-core superblock. Simply @@ -1142,17 +1156,9 @@ xfs_mod_incore_sb_unlocked( */ switch (field) { case XFS_SBS_ICOUNT: - ASSERT(0); - return -ENOSPC; case XFS_SBS_IFREE: - lcounter = (long long)mp->m_sb.sb_ifree; - lcounter += delta; - if (lcounter < 0) { - ASSERT(0); - return -EINVAL; - } - mp->m_sb.sb_ifree = lcounter; - return 0; + ASSERT(0); + return -EINVAL; case XFS_SBS_FDBLOCKS: lcounter = (long long) mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); @@ -1502,7 +1508,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); break; @@ -1513,15 +1518,12 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - mp->m_sb.sb_ifree += cntp->icsb_ifree; mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); xfs_icsb_unlock(mp); @@ -1544,10 +1546,14 @@ xfs_icsb_init_counters( if (error) return error; + error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); + if (error) + goto free_icount; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); if (!mp->m_sb_cnts) { - percpu_counter_destroy(&mp->m_icount); - return -ENOMEM; + error = -ENOMEM; + goto free_ifree; } for_each_online_cpu(i) { @@ -1570,6 +1576,12 @@ xfs_icsb_init_counters( #endif /* CONFIG_HOTPLUG_CPU */ return 0; + +free_ifree: + percpu_counter_destroy(&mp->m_ifree); +free_icount: + percpu_counter_destroy(&mp->m_icount); + return error; } void @@ -1577,6 +1589,7 @@ xfs_icsb_reinit_counters( xfs_mount_t *mp) { percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount); + percpu_counter_set(&mp->m_ifree, mp->m_sb.sb_ifree); xfs_icsb_lock(mp); /* @@ -1584,7 +1597,6 @@ xfs_icsb_reinit_counters( * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); } @@ -1599,6 +1611,7 @@ xfs_icsb_destroy_counters( } percpu_counter_destroy(&mp->m_icount); + percpu_counter_destroy(&mp->m_ifree); mutex_destroy(&mp->m_icsb_mutex); } @@ -1662,7 +1675,6 @@ xfs_icsb_count( for_each_online_cpu(i) { cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_ifree += cntp->icsb_ifree; cnt->icsb_fdblocks += cntp->icsb_fdblocks; } @@ -1675,7 +1687,7 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); return test_bit(field, &mp->m_icsb_counters); } @@ -1686,7 +1698,7 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); /* * If we are already disabled, then there is nothing to do @@ -1705,9 +1717,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_IFREE: - mp->m_sb.sb_ifree = cnt.icsb_ifree; - break; case XFS_SBS_FDBLOCKS: mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; break; @@ -1729,15 +1738,12 @@ xfs_icsb_enable_counter( xfs_icsb_cnts_t *cntp; int i; - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); + ASSERT(field == XFS_SBS_FDBLOCKS); xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_IFREE: - cntp->icsb_ifree = count + resid; - break; case XFS_SBS_FDBLOCKS: cntp->icsb_fdblocks = count + resid; break; @@ -1760,8 +1766,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_count(mp, &cnt, flags); - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) - mp->m_sb.sb_ifree = cnt.icsb_ifree; if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; } @@ -1813,12 +1817,6 @@ xfs_icsb_balance_counter_locked( /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_IFREE: - count = mp->m_sb.sb_ifree; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) - return; - break; case XFS_SBS_FDBLOCKS: count = mp->m_sb.sb_fdblocks; resid = do_div(count, weight); @@ -1873,14 +1871,6 @@ again: } switch (field) { - case XFS_SBS_IFREE: - lcounter = icsbp->icsb_ifree; - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_ifree = lcounter; - break; - case XFS_SBS_FDBLOCKS: BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 457c6e3..0cb32ce 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -84,6 +84,7 @@ typedef struct xfs_mount { struct xfs_sb m_sb; /* copy of fs superblock */ spinlock_t m_sb_lock; /* sb counter lock */ struct percpu_counter m_icount; /* allocated inodes counter */ + struct percpu_counter m_ifree; /* free inodes counter */ struct xfs_buf *m_sb_bp; /* buffer for superblock */ char *m_fsname; /* filesystem name */ @@ -380,6 +381,7 @@ extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); +extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); extern int xfs_mount_log_sb(xfs_mount_t *); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 87e169f..e06aa6b 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1088,6 +1088,7 @@ xfs_fs_statfs( struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; __uint64_t icount; + __uint64_t ifree; xfs_extlen_t lsize; __int64_t ffree; @@ -1100,6 +1101,7 @@ xfs_fs_statfs( xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); icount = percpu_counter_sum(&mp->m_icount); + ifree = percpu_counter_sum(&mp->m_ifree); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; @@ -1115,7 +1117,7 @@ xfs_fs_statfs( mp->m_maxicount); /* make sure statp->f_ffree does not underflow */ - ffree = statp->f_files - (icount - sbp->sb_ifree); + ffree = statp->f_files - (icount - ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); spin_unlock(&mp->m_sb_lock); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 9bc742b..68680ce 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -560,8 +560,7 @@ xfs_trans_unreserve_and_mod_sb( } if (ifreedelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, - ifreedelta, rsvd); + error = xfs_mod_ifree(mp, ifreedelta); if (error) goto out_undo_icount; } @@ -630,7 +629,7 @@ xfs_trans_unreserve_and_mod_sb( out_undo_ifreecount: if (ifreedelta) - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); + xfs_mod_ifree(mp, -ifreedelta); out_undo_icount: if (idelta) xfs_mod_icount(mp, -idelta); -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 496F17F87 for ; Wed, 4 Feb 2015 14:54:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 329168F8078 for ; Wed, 4 Feb 2015 12:54:33 -0800 (PST) X-ASG-Debug-ID: 1423083266-04cbb04168c280f0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NGQMG0iRJDTefTDR for ; Wed, 04 Feb 2015 12:54:30 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAMSF0lR5LHOV/2dsb2JhbABagwaBK695BQaZT0QBAQEBAX2EDQEFDhkvDyQISTkDGxmILNcQhgSJJ4R9BYVNlAOLEoY6IoFFAQsBMByBZCoxgQOBPwEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D5-5s for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007EG-56 for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/7] xfs: use generic percpu counters for free block counter Date: Thu, 5 Feb 2015 07:54:05 +1100 X-ASG-Orig-Subj: [PATCH 3/7] xfs: use generic percpu counters for free block counter Message-Id: <1423083249-27493-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083270 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words XFS has hand-rolled per-cpu counters for the superblock since before there was any generic implementation. The free block counter is special in that it is used for ENOSPC detection outside transaction contexts for for delayed allocation. This means that the counter needs to be accurate at zero. The current per-cpu counter code jumps through lots of hoops to ensure we never run past zero, but we don't need to make all those jumps with the generic counter implementation. The generic counter implementation allows us to pass a "batch" threshold at which the addition/subtraction to the counter value will be folded back into global value under lock. We can use this feature to reduce the batch size as we approach 0 in a very similar manner to the existing counters and their rebalance algorithm. If we use a batch size of 1 as we approach 0, then every addition and subtraction will be done against the global value and hence allow accurate detection of zero threshold crossing. Hence we can replace the handrolled, accurate-at-zero counters with generic percpu counters. Note: this removes just enough of the icsb infrastructure to compile without warnings. The rest will go in subsequent commits. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 32 ++++---- fs/xfs/libxfs/xfs_sb.c | 1 + fs/xfs/xfs_fsops.c | 9 ++- fs/xfs/xfs_iomap.c | 2 +- fs/xfs/xfs_mount.c | 193 ++++++++++++++++++++++++----------------------- fs/xfs/xfs_mount.h | 3 + fs/xfs/xfs_super.c | 10 ++- fs/xfs/xfs_trans.c | 16 ++-- 8 files changed, 135 insertions(+), 131 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015..e39c9e8 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2212,9 +2212,8 @@ xfs_bmap_add_extent_delay_real( diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - (bma->cur ? bma->cur->bc_private.b.allocated : 0)); if (diff > 0) { - error = xfs_icsb_modify_counters(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - -((int64_t)diff), 0); + error = xfs_mod_fdblocks(bma->ip->i_mount, + -((int64_t)diff), false); ASSERT(!error); if (error) goto done; @@ -2265,9 +2264,8 @@ xfs_bmap_add_extent_delay_real( temp += bma->cur->bc_private.b.allocated; ASSERT(temp <= da_old); if (temp < da_old) - xfs_icsb_modify_counters(bma->ip->i_mount, - XFS_SBS_FDBLOCKS, - (int64_t)(da_old - temp), 0); + xfs_mod_fdblocks(bma->ip->i_mount, + (int64_t)(da_old - temp), false); } /* clear out the allocated field, done with it now in any case. */ @@ -2944,8 +2942,8 @@ xfs_bmap_add_extent_hole_delay( } if (oldlen != newlen) { ASSERT(oldlen > newlen); - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, - (int64_t)(oldlen - newlen), 0); + xfs_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), + false); /* * Nothing to do for disk quota accounting here. */ @@ -4163,15 +4161,13 @@ xfs_bmapi_reserve_delalloc( error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, -((int64_t)extsz), 0); } else { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - -((int64_t)alen), 0); + error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); } if (error) goto out_unreserve_quota; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - -((int64_t)indlen), 0); + error = xfs_mod_fdblocks(mp, -((int64_t)indlen), false); if (error) goto out_unreserve_blocks; @@ -4200,7 +4196,7 @@ out_unreserve_blocks: if (rt) xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); else - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); + xfs_mod_fdblocks(mp, alen, false); out_unreserve_quota: if (XFS_IS_QUOTA_ON(mp)) xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? @@ -5012,10 +5008,8 @@ xfs_bmap_del_extent( * Nothing to do for disk quota accounting here. */ ASSERT(da_old >= da_new); - if (da_old > da_new) { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)(da_old - da_new), 0); - } + if (da_old > da_new) + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); done: *logflagsp = flags; return error; @@ -5290,8 +5284,8 @@ xfs_bunmapi( ip, -((long)del.br_blockcount), 0, XFS_QMOPT_RES_RTBLKS); } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, 0); + 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); diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b66aeab..31a3e97 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -773,6 +773,7 @@ xfs_log_sb( mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); + mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks); xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fa74d03..fed97a9 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -633,9 +633,10 @@ xfs_fs_counts( xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); 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); spin_lock(&mp->m_sb_lock); - cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); cnt->freertx = mp->m_sb.sb_frextents; spin_unlock(&mp->m_sb_lock); return 0; @@ -710,7 +711,8 @@ retry: } else { __int64_t free; - free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + free = percpu_counter_sum(&mp->m_fdblocks) - + XFS_ALLOC_SET_ASIDE(mp); if (!free) goto out; /* ENOSPC and fdblks_delta = 0 */ @@ -749,8 +751,7 @@ out: * the extra reserve blocks from the reserve..... */ int error; - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - fdblks_delta, 0); + error = xfs_mod_fdblocks(mp, fdblks_delta, 0); if (error == -ENOSPC) goto retry; } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index ccb1dd0..205b948 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -461,7 +461,7 @@ xfs_iomap_prealloc_size( alloc_blocks); xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); - freesp = mp->m_sb.sb_fdblocks; + freesp = percpu_counter_read_positive(&mp->m_fdblocks); if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { shift = 2; if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 650e8f1..9e433b2 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1114,7 +1114,6 @@ xfs_mod_icount( return 0; } - int xfs_mod_ifree( struct xfs_mount *mp, @@ -1128,6 +1127,93 @@ xfs_mod_ifree( } return 0; } + +int +xfs_mod_fdblocks( + struct xfs_mount *mp, + int64_t delta, + bool rsvd) +{ + int64_t lcounter; + long long res_used; + s32 batch; + + if (delta > 0) { + /* + * If the reserve pool is depleted, put blocks back into it + * first. Most of the time the pool is full. + */ + if (likely(mp->m_resblks == mp->m_resblks_avail)) { + percpu_counter_add(&mp->m_fdblocks, delta); + return 0; + } + + 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; + } else { + delta -= res_used; + mp->m_resblks_avail = mp->m_resblks; + percpu_counter_add(&mp->m_fdblocks, delta); + } + spin_unlock(&mp->m_sb_lock); + return 0; + } + + /* + * Taking blocks away, need to be more accurate the closer we + * are to zero. + * + * batch size is set to a maximum of 1024 blocks - if we are + * allocating of freeing extents larger than this then we aren't + * going to be hammering the counter lock so a lock per update + * is not a problem. + * + * If the counter has a value of less than 2 * max batch size, + * then make everything serialise as we are real close to + * ENOSPC. + */ +#define __BATCH 1024 + if (percpu_counter_compare(&mp->m_fdblocks, 2 * __BATCH) < 0) + batch = 1; + else + batch = __BATCH; +#undef __BATCH + + __percpu_counter_add(&mp->m_fdblocks, delta, batch); + if (percpu_counter_compare(&mp->m_fdblocks, + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { + /* we had space! */ + return 0; + } + + /* + * lock up the sb for dipping into reserves before releasing the space + * that took us to ENOSPC. + */ + spin_lock(&mp->m_sb_lock); + percpu_counter_add(&mp->m_fdblocks, -delta); + if (!rsvd) + goto fdblocks_enospc; + + lcounter = (long long)mp->m_resblks_avail + delta; + if (lcounter >= 0) { + mp->m_resblks_avail = lcounter; + spin_unlock(&mp->m_sb_lock); + return 0; + } + printk_once(KERN_WARNING + "Filesystem \"%s\": reserve blocks depleted! " + "Consider increasing reserve pool size.", + mp->m_fsname); +fdblocks_enospc: + spin_unlock(&mp->m_sb_lock); + return -ENOSPC; +} + /* * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply * a delta to a specified field in the in-core superblock. Simply @@ -1146,7 +1232,6 @@ xfs_mod_incore_sb_unlocked( { int scounter; /* short counter for 32 bit fields */ long long lcounter; /* long counter for 64 bit fields */ - long long res_used, rem; /* * With the in-core superblock spin lock held, switch @@ -1157,50 +1242,9 @@ xfs_mod_incore_sb_unlocked( switch (field) { case XFS_SBS_ICOUNT: case XFS_SBS_IFREE: + case XFS_SBS_FDBLOCKS: ASSERT(0); return -EINVAL; - case XFS_SBS_FDBLOCKS: - lcounter = (long long) - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); - - if (delta > 0) { /* Putting blocks back */ - if (res_used > delta) { - mp->m_resblks_avail += delta; - } else { - rem = delta - res_used; - mp->m_resblks_avail = mp->m_resblks; - lcounter += rem; - } - } else { /* Taking blocks away */ - lcounter += delta; - if (lcounter >= 0) { - mp->m_sb.sb_fdblocks = lcounter + - XFS_ALLOC_SET_ASIDE(mp); - return 0; - } - - /* - * We are out of blocks, use any available reserved - * blocks if were allowed to. - */ - if (!rsvd) - return -ENOSPC; - - lcounter = (long long)mp->m_resblks_avail + delta; - if (lcounter >= 0) { - mp->m_resblks_avail = lcounter; - return 0; - } - printk_once(KERN_WARNING - "Filesystem \"%s\": reserve blocks depleted! " - "Consider increasing reserve pool size.", - mp->m_fsname); - return -ENOSPC; - } - - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - return 0; case XFS_SBS_FREXTENTS: lcounter = (long long)mp->m_sb.sb_frextents; lcounter += delta; @@ -1323,7 +1367,7 @@ xfs_mod_incore_sb( * * Note that this function may not be used for the superblock values that * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_icsb_modify_counters is required for these. + * xfs_mod_incore_sb is required for these. */ int xfs_mod_incore_sb_batch( @@ -1508,7 +1552,6 @@ xfs_icsb_cpu_notify( case CPU_ONLINE: case CPU_ONLINE_FROZEN: xfs_icsb_lock(mp); - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); break; case CPU_DEAD: @@ -1518,13 +1561,9 @@ xfs_icsb_cpu_notify( * re-enable the counters. */ xfs_icsb_lock(mp); spin_lock(&mp->m_sb_lock); - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); - - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); spin_unlock(&mp->m_sb_lock); xfs_icsb_unlock(mp); break; @@ -1550,10 +1589,14 @@ xfs_icsb_init_counters( if (error) goto free_icount; + error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); + if (error) + goto free_ifree; + mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); if (!mp->m_sb_cnts) { error = -ENOMEM; - goto free_ifree; + goto free_fdblocks; } for_each_online_cpu(i) { @@ -1577,6 +1620,8 @@ xfs_icsb_init_counters( return 0; +free_fdblocks: + percpu_counter_destroy(&mp->m_fdblocks); free_ifree: percpu_counter_destroy(&mp->m_ifree); free_icount: @@ -1590,6 +1635,7 @@ xfs_icsb_reinit_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); xfs_icsb_lock(mp); /* @@ -1597,7 +1643,6 @@ xfs_icsb_reinit_counters( * initial balance kicks us off correctly */ mp->m_icsb_counters = -1; - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); xfs_icsb_unlock(mp); } @@ -1612,6 +1657,7 @@ xfs_icsb_destroy_counters( percpu_counter_destroy(&mp->m_icount); percpu_counter_destroy(&mp->m_ifree); + percpu_counter_destroy(&mp->m_fdblocks); mutex_destroy(&mp->m_icsb_mutex); } @@ -1665,18 +1711,11 @@ xfs_icsb_count( xfs_icsb_cnts_t *cnt, int flags) { - xfs_icsb_cnts_t *cntp; - int i; - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); if (!(flags & XFS_ICSB_LAZY_COUNT)) xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - cnt->icsb_fdblocks += cntp->icsb_fdblocks; - } if (!(flags & XFS_ICSB_LAZY_COUNT)) xfs_icsb_unlock_all_counters(mp); @@ -1687,7 +1726,6 @@ xfs_icsb_counter_disabled( xfs_mount_t *mp, xfs_sb_field_t field) { - ASSERT(field == XFS_SBS_FDBLOCKS); return test_bit(field, &mp->m_icsb_counters); } @@ -1698,8 +1736,6 @@ xfs_icsb_disable_counter( { xfs_icsb_cnts_t cnt; - ASSERT(field == XFS_SBS_FDBLOCKS); - /* * If we are already disabled, then there is nothing to do * here. We check before locking all the counters to avoid @@ -1717,9 +1753,6 @@ xfs_icsb_disable_counter( xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); switch(field) { - case XFS_SBS_FDBLOCKS: - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; - break; default: BUG(); } @@ -1735,18 +1768,11 @@ xfs_icsb_enable_counter( uint64_t count, uint64_t resid) { - xfs_icsb_cnts_t *cntp; int i; - ASSERT(field == XFS_SBS_FDBLOCKS); - xfs_icsb_lock_all_counters(mp); for_each_online_cpu(i) { - cntp = per_cpu_ptr(mp->m_sb_cnts, i); switch (field) { - case XFS_SBS_FDBLOCKS: - cntp->icsb_fdblocks = count + resid; - break; default: BUG(); break; @@ -1765,9 +1791,6 @@ xfs_icsb_sync_counters_locked( xfs_icsb_cnts_t cnt; xfs_icsb_count(mp, &cnt, flags); - - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; } /* @@ -1809,20 +1832,12 @@ xfs_icsb_balance_counter_locked( int min_per_cpu) { uint64_t count, resid; - int weight = num_online_cpus(); - uint64_t min = (uint64_t)min_per_cpu; /* disable counter and sync counter */ xfs_icsb_disable_counter(mp, field); /* update counters - first CPU gets residual*/ switch (field) { - case XFS_SBS_FDBLOCKS: - count = mp->m_sb.sb_fdblocks; - resid = do_div(count, weight); - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) - return; - break; default: BUG(); count = resid = 0; /* quiet, gcc */ @@ -1851,7 +1866,6 @@ xfs_icsb_modify_counters( int rsvd) { xfs_icsb_cnts_t *icsbp; - long long lcounter; /* long counter for 64 bit fields */ int ret = 0; might_sleep(); @@ -1871,18 +1885,9 @@ again: } switch (field) { - case XFS_SBS_FDBLOCKS: - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); - - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); - lcounter += delta; - if (unlikely(lcounter < 0)) - goto balance_counter; - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); - break; default: BUG(); - break; + goto balance_counter; /* be still, gcc */ } xfs_icsb_unlock_cntr(icsbp); preempt_enable(); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 0cb32ce..76f5d25 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -85,6 +85,7 @@ typedef struct xfs_mount { spinlock_t m_sb_lock; /* sb counter lock */ struct percpu_counter m_icount; /* allocated inodes counter */ struct percpu_counter m_ifree; /* free inodes counter */ + struct percpu_counter m_fdblocks; /* free block counter */ struct xfs_buf *m_sb_bp; /* buffer for superblock */ char *m_fsname; /* filesystem name */ @@ -382,6 +383,8 @@ extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, uint, int); 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); extern int xfs_mount_log_sb(xfs_mount_t *); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index e06aa6b..4c6af31 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1089,6 +1089,7 @@ xfs_fs_statfs( __uint64_t fakeinos, id; __uint64_t icount; __uint64_t ifree; + __uint64_t fdblocks; xfs_extlen_t lsize; __int64_t ffree; @@ -1102,13 +1103,17 @@ xfs_fs_statfs( xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); icount = percpu_counter_sum(&mp->m_icount); ifree = percpu_counter_sum(&mp->m_ifree); + fdblocks = percpu_counter_sum(&mp->m_fdblocks); spin_lock(&mp->m_sb_lock); statp->f_bsize = sbp->sb_blocksize; lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; statp->f_blocks = sbp->sb_dblocks - lsize; - statp->f_bfree = statp->f_bavail = - sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + spin_unlock(&mp->m_sb_lock); + + statp->f_bfree = fdblocks - XFS_ALLOC_SET_ASIDE(mp); + statp->f_bavail = statp->f_bfree; + fakeinos = statp->f_bfree << sbp->sb_inopblog; statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); if (mp->m_maxicount) @@ -1120,7 +1125,6 @@ xfs_fs_statfs( ffree = statp->f_files - (icount - ifree); statp->f_ffree = max_t(__int64_t, ffree, 0); - spin_unlock(&mp->m_sb_lock); if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) == diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 68680ce..e99f5e5 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -173,7 +173,7 @@ xfs_trans_reserve( uint rtextents) { int error = 0; - int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; /* Mark this thread as being in a transaction */ current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); @@ -184,8 +184,7 @@ xfs_trans_reserve( * fail if the count would go below zero. */ if (blocks > 0) { - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, - -((int64_t)blocks), rsvd); + error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); if (error != 0) { current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); return -ENOSPC; @@ -268,8 +267,7 @@ undo_log: undo_blocks: if (blocks > 0) { - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, - (int64_t)blocks, rsvd); + xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); tp->t_blk_res = 0; } @@ -516,14 +514,13 @@ xfs_trans_unreserve_and_mod_sb( xfs_mount_t *mp = tp->t_mountp; /* REFERENCED */ int error; - int rsvd; + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; int64_t blkdelta = 0; int64_t rtxdelta = 0; int64_t idelta = 0; int64_t ifreedelta = 0; msbp = msb; - rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; /* calculate deltas */ if (tp->t_blk_res > 0) @@ -547,8 +544,7 @@ xfs_trans_unreserve_and_mod_sb( /* apply the per-cpu counters */ if (blkdelta) { - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - blkdelta, rsvd); + error = xfs_mod_fdblocks(mp, blkdelta, rsvd); if (error) goto out; } @@ -635,7 +631,7 @@ out_undo_icount: xfs_mod_icount(mp, -idelta); out_undo_fdblocks: if (blkdelta) - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); + xfs_mod_fdblocks(mp, -blkdelta, rsvd); out: ASSERT(error == 0); return; -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28BB97F58 for ; Wed, 4 Feb 2015 14:54:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 090FA8F8066 for ; Wed, 4 Feb 2015 12:54:33 -0800 (PST) X-ASG-Debug-ID: 1423083265-04cb6c2e6ac56980004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NE5kbrWl4H2CEfI4 for ; Wed, 04 Feb 2015 12:54:30 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq8HAMSF0lR5LHOV/2dsb2JhbABQCoMGgSuveQUGmC+BIEQBAQEBAX2EDQEFDgwNLw8kCBgxOQMbGYgs1xCGBIkYBUyEOwWFTY8hhGKFSYQAgUmGOiKBRQELATAcgWQqMYEDgT8BAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D6-6F for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007EL-5U for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/7] xfs: Remove icsb infrastructure Date: Thu, 5 Feb 2015 07:54:06 +1100 X-ASG-Orig-Subj: [PATCH 4/7] xfs: Remove icsb infrastructure Message-Id: <1423083249-27493-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083270 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that the in-core superblock infrastructure has been replaced with generic per-cpu counters, we don't need it anymore. Nuke it from orbit so we are sure that it won't haunt us again... Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_sb.c | 8 +- fs/xfs/xfs_fsops.c | 2 - fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_linux.h | 9 - fs/xfs/xfs_log_recover.c | 4 +- fs/xfs/xfs_mount.c | 516 +---------------------------------------------- fs/xfs/xfs_mount.h | 67 ------ fs/xfs/xfs_super.c | 84 ++++++-- fs/xfs/xfs_super.h | 2 + 9 files changed, 72 insertions(+), 621 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 31a3e97..a270095 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -743,17 +743,15 @@ xfs_initialize_perag_data( btree += pag->pagf_btreeblks; xfs_perag_put(pag); } - /* - * Overwrite incore superblock counters with just-read data - */ + + /* Overwrite incore superblock counters with just-read data */ spin_lock(&mp->m_sb_lock); sbp->sb_ifree = ifree; sbp->sb_icount = ialloc; sbp->sb_fdblocks = bfree + bfreelst + btree; spin_unlock(&mp->m_sb_lock); - /* Fixup the per-cpu counters as well. */ - xfs_icsb_reinit_counters(mp); + xfs_reinit_percpu_counters(mp); return 0; } diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fed97a9..a45c82b4 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -630,7 +630,6 @@ xfs_fs_counts( xfs_mount_t *mp, xfs_fsop_counts_t *cnt) { - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); 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) - @@ -694,7 +693,6 @@ xfs_reserve_blocks( */ retry: spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, 0); /* * If our previous reservation was larger than the current value, diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 205b948..38e633b 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -460,7 +460,6 @@ xfs_iomap_prealloc_size( alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), alloc_blocks); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); freesp = percpu_counter_read_positive(&mp->m_fdblocks); if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { shift = 2; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index c31d2c2..7c7842c 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -116,15 +116,6 @@ typedef __uint64_t __psunsigned_t; #undef XFS_NATIVE_HOST #endif -/* - * Feature macros (disable/enable) - */ -#ifdef CONFIG_SMP -#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#else -#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ -#endif - #define irix_sgid_inherit xfs_params.sgid_inherit.val #define irix_symlink_mode xfs_params.symlink_mode.val #define xfs_panic_mask xfs_params.panic_mask.val diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a5a945f..4f5784f 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4463,10 +4463,10 @@ xlog_do_recover( 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); - /* We've re-read the superblock so re-initialize per-cpu counters */ - xfs_icsb_reinit_counters(log->l_mp); xlog_recover_check_summary(log); diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 9e433b2..1d26200 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -43,18 +43,6 @@ #include "xfs_sysfs.h" -#ifdef HAVE_PERCPU_SB -STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_balance_counter_locked(xfs_mount_t *, xfs_sb_field_t, - int); -STATIC void xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); -#else - -#define xfs_icsb_balance_counter(mp, a, b) do { } while (0) -#define xfs_icsb_balance_counter_locked(mp, a, b) do { } while (0) -#endif - static DEFINE_MUTEX(xfs_uuid_table_mutex); static int xfs_uuid_table_size; static uuid_t *xfs_uuid_table; @@ -347,8 +335,7 @@ reread: goto reread; } - /* Initialize per-cpu counters */ - xfs_icsb_reinit_counters(mp); + xfs_reinit_percpu_counters(mp); /* no need to be quiet anymore, so reset the buf ops */ bp->b_ops = &xfs_sb_buf_ops; @@ -1087,8 +1074,6 @@ xfs_log_sbcount(xfs_mount_t *mp) if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) return 0; - xfs_icsb_sync_counters(mp, 0); - /* * we don't need to do this if we are updating the superblock * counters on every modification. @@ -1467,502 +1452,3 @@ xfs_dev_is_read_only( } return 0; } - -#ifdef HAVE_PERCPU_SB -/* - * Per-cpu incore superblock counters - * - * Simple concept, difficult implementation - * - * Basically, replace the incore superblock counters with a distributed per cpu - * counter for contended fields (e.g. free block count). - * - * Difficulties arise in that the incore sb is used for ENOSPC checking, and - * hence needs to be accurately read when we are running low on space. Hence - * there is a method to enable and disable the per-cpu counters based on how - * much "stuff" is available in them. - * - * Basically, a counter is enabled if there is enough free resource to justify - * running a per-cpu fast-path. If the per-cpu counter runs out (i.e. a local - * ENOSPC), then we disable the counters to synchronise all callers and - * re-distribute the available resources. - * - * If, once we redistributed the available resources, we still get a failure, - * we disable the per-cpu counter and go through the slow path. - * - * The slow path is the current xfs_mod_incore_sb() function. This means that - * when we disable a per-cpu counter, we need to drain its resources back to - * the global superblock. We do this after disabling the counter to prevent - * more threads from queueing up on the counter. - * - * Essentially, this means that we still need a lock in the fast path to enable - * synchronisation between the global counters and the per-cpu counters. This - * is not a problem because the lock will be local to a CPU almost all the time - * and have little contention except when we get to ENOSPC conditions. - * - * Basically, this lock becomes a barrier that enables us to lock out the fast - * path while we do things like enabling and disabling counters and - * synchronising the counters. - * - * Locking rules: - * - * 1. m_sb_lock before picking up per-cpu locks - * 2. per-cpu locks always picked up via for_each_online_cpu() order - * 3. accurate counter sync requires m_sb_lock + per cpu locks - * 4. modifying per-cpu counters requires holding per-cpu lock - * 5. modifying global counters requires holding m_sb_lock - * 6. enabling or disabling a counter requires holding the m_sb_lock - * and _none_ of the per-cpu locks. - * - * Disabled counters are only ever re-enabled by a balance operation - * that results in more free resources per CPU than a given threshold. - * To ensure counters don't remain disabled, they are rebalanced when - * the global resource goes above a higher threshold (i.e. some hysteresis - * is present to prevent thrashing). - */ - -#ifdef CONFIG_HOTPLUG_CPU -/* - * hot-plug CPU notifier support. - * - * We need a notifier per filesystem as we need to be able to identify - * the filesystem to balance the counters out. This is achieved by - * having a notifier block embedded in the xfs_mount_t and doing pointer - * magic to get the mount pointer from the notifier block address. - */ -STATIC int -xfs_icsb_cpu_notify( - struct notifier_block *nfb, - unsigned long action, - void *hcpu) -{ - xfs_icsb_cnts_t *cntp; - xfs_mount_t *mp; - - mp = (xfs_mount_t *)container_of(nfb, xfs_mount_t, m_icsb_notifier); - cntp = (xfs_icsb_cnts_t *) - per_cpu_ptr(mp->m_sb_cnts, (unsigned long)hcpu); - switch (action) { - case CPU_UP_PREPARE: - case CPU_UP_PREPARE_FROZEN: - /* Easy Case - initialize the area and locks, and - * then rebalance when online does everything else for us. */ - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - break; - case CPU_ONLINE: - case CPU_ONLINE_FROZEN: - xfs_icsb_lock(mp); - xfs_icsb_unlock(mp); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - /* Disable all the counters, then fold the dead cpu's - * count into the total on the global superblock and - * re-enable the counters. */ - xfs_icsb_lock(mp); - spin_lock(&mp->m_sb_lock); - - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - - spin_unlock(&mp->m_sb_lock); - xfs_icsb_unlock(mp); - break; - } - - return NOTIFY_OK; -} -#endif /* CONFIG_HOTPLUG_CPU */ - -int -xfs_icsb_init_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int error; - int i; - - error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); - if (error) - return error; - - error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); - if (error) - goto free_icount; - - error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); - if (error) - goto free_ifree; - - mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); - if (!mp->m_sb_cnts) { - error = -ENOMEM; - goto free_fdblocks; - } - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); - } - - mutex_init(&mp->m_icsb_mutex); - - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - -#ifdef CONFIG_HOTPLUG_CPU - mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; - mp->m_icsb_notifier.priority = 0; - register_hotcpu_notifier(&mp->m_icsb_notifier); -#endif /* CONFIG_HOTPLUG_CPU */ - - return 0; - -free_fdblocks: - percpu_counter_destroy(&mp->m_fdblocks); -free_ifree: - percpu_counter_destroy(&mp->m_ifree); -free_icount: - percpu_counter_destroy(&mp->m_icount); - return error; -} - -void -xfs_icsb_reinit_counters( - xfs_mount_t *mp) -{ - 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); - - xfs_icsb_lock(mp); - /* - * start with all counters disabled so that the - * initial balance kicks us off correctly - */ - mp->m_icsb_counters = -1; - xfs_icsb_unlock(mp); -} - -void -xfs_icsb_destroy_counters( - xfs_mount_t *mp) -{ - if (mp->m_sb_cnts) { - unregister_hotcpu_notifier(&mp->m_icsb_notifier); - free_percpu(mp->m_sb_cnts); - } - - percpu_counter_destroy(&mp->m_icount); - percpu_counter_destroy(&mp->m_ifree); - percpu_counter_destroy(&mp->m_fdblocks); - - mutex_destroy(&mp->m_icsb_mutex); -} - -STATIC void -xfs_icsb_lock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - while (test_and_set_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags)) { - ndelay(1000); - } -} - -STATIC void -xfs_icsb_unlock_cntr( - xfs_icsb_cnts_t *icsbp) -{ - clear_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags); -} - - -STATIC void -xfs_icsb_lock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_lock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_unlock_all_counters( - xfs_mount_t *mp) -{ - xfs_icsb_cnts_t *cntp; - int i; - - for_each_online_cpu(i) { - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); - xfs_icsb_unlock_cntr(cntp); - } -} - -STATIC void -xfs_icsb_count( - xfs_mount_t *mp, - xfs_icsb_cnts_t *cnt, - int flags) -{ - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_lock_all_counters(mp); - - - if (!(flags & XFS_ICSB_LAZY_COUNT)) - xfs_icsb_unlock_all_counters(mp); -} - -STATIC int -xfs_icsb_counter_disabled( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - return test_bit(field, &mp->m_icsb_counters); -} - -STATIC void -xfs_icsb_disable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field) -{ - xfs_icsb_cnts_t cnt; - - /* - * If we are already disabled, then there is nothing to do - * here. We check before locking all the counters to avoid - * the expensive lock operation when being called in the - * slow path and the counter is already disabled. This is - * safe because the only time we set or clear this state is under - * the m_icsb_mutex. - */ - if (xfs_icsb_counter_disabled(mp, field)) - return; - - xfs_icsb_lock_all_counters(mp); - if (!test_and_set_bit(field, &mp->m_icsb_counters)) { - /* drain back to superblock */ - - xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); - switch(field) { - default: - BUG(); - } - } - - xfs_icsb_unlock_all_counters(mp); -} - -STATIC void -xfs_icsb_enable_counter( - xfs_mount_t *mp, - xfs_sb_field_t field, - uint64_t count, - uint64_t resid) -{ - int i; - - xfs_icsb_lock_all_counters(mp); - for_each_online_cpu(i) { - switch (field) { - default: - BUG(); - break; - } - resid = 0; - } - clear_bit(field, &mp->m_icsb_counters); - xfs_icsb_unlock_all_counters(mp); -} - -void -xfs_icsb_sync_counters_locked( - xfs_mount_t *mp, - int flags) -{ - xfs_icsb_cnts_t cnt; - - xfs_icsb_count(mp, &cnt, flags); -} - -/* - * Accurate update of per-cpu counters to incore superblock - */ -void -xfs_icsb_sync_counters( - xfs_mount_t *mp, - int flags) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_sync_counters_locked(mp, flags); - spin_unlock(&mp->m_sb_lock); -} - -/* - * Balance and enable/disable counters as necessary. - * - * Thresholds for re-enabling counters are somewhat magic. inode counts are - * chosen to be the same number as single on disk allocation chunk per CPU, and - * free blocks is something far enough zero that we aren't going thrash when we - * get near ENOSPC. We also need to supply a minimum we require per cpu to - * prevent looping endlessly when xfs_alloc_space asks for more than will - * be distributed to a single CPU but each CPU has enough blocks to be - * reenabled. - * - * Note that we can be called when counters are already disabled. - * xfs_icsb_disable_counter() optimises the counter locking in this case to - * prevent locking every per-cpu counter needlessly. - */ - -#define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 -#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ - (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) -STATIC void -xfs_icsb_balance_counter_locked( - xfs_mount_t *mp, - xfs_sb_field_t field, - int min_per_cpu) -{ - uint64_t count, resid; - - /* disable counter and sync counter */ - xfs_icsb_disable_counter(mp, field); - - /* update counters - first CPU gets residual*/ - switch (field) { - default: - BUG(); - count = resid = 0; /* quiet, gcc */ - break; - } - - xfs_icsb_enable_counter(mp, field, count, resid); -} - -STATIC void -xfs_icsb_balance_counter( - xfs_mount_t *mp, - xfs_sb_field_t fields, - int min_per_cpu) -{ - spin_lock(&mp->m_sb_lock); - xfs_icsb_balance_counter_locked(mp, fields, min_per_cpu); - spin_unlock(&mp->m_sb_lock); -} - -int -xfs_icsb_modify_counters( - xfs_mount_t *mp, - xfs_sb_field_t field, - int64_t delta, - int rsvd) -{ - xfs_icsb_cnts_t *icsbp; - int ret = 0; - - might_sleep(); -again: - preempt_disable(); - icsbp = this_cpu_ptr(mp->m_sb_cnts); - - /* - * if the counter is disabled, go to slow path - */ - if (unlikely(xfs_icsb_counter_disabled(mp, field))) - goto slow_path; - xfs_icsb_lock_cntr(icsbp); - if (unlikely(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock_cntr(icsbp); - goto slow_path; - } - - switch (field) { - default: - BUG(); - goto balance_counter; /* be still, gcc */ - } - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - return 0; - -slow_path: - preempt_enable(); - - /* - * serialise with a mutex so we don't burn lots of cpu on - * the superblock lock. We still need to hold the superblock - * lock, however, when we modify the global structures. - */ - xfs_icsb_lock(mp); - - /* - * Now running atomically. - * - * If the counter is enabled, someone has beaten us to rebalancing. - * Drop the lock and try again in the fast path.... - */ - if (!(xfs_icsb_counter_disabled(mp, field))) { - xfs_icsb_unlock(mp); - goto again; - } - - /* - * The counter is currently disabled. Because we are - * running atomically here, we know a rebalance cannot - * be in progress. Hence we can go straight to operating - * on the global superblock. We do not call xfs_mod_incore_sb() - * here even though we need to get the m_sb_lock. Doing so - * will cause us to re-enter this function and deadlock. - * Hence we get the m_sb_lock ourselves and then call - * xfs_mod_incore_sb_unlocked() as the unlocked path operates - * directly on the global counters. - */ - spin_lock(&mp->m_sb_lock); - ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); - spin_unlock(&mp->m_sb_lock); - - /* - * Now that we've modified the global superblock, we - * may be able to re-enable the distributed counters - * (e.g. lots of space just got freed). After that - * we are done. - */ - if (ret != -ENOSPC) - xfs_icsb_balance_counter(mp, field, 0); - xfs_icsb_unlock(mp); - return ret; - -balance_counter: - xfs_icsb_unlock_cntr(icsbp); - preempt_enable(); - - /* - * We may have multiple threads here if multiple per-cpu - * counters run dry at the same time. This will mean we can - * do more balances than strictly necessary but it is not - * the common slowpath case. - */ - xfs_icsb_lock(mp); - - /* - * running atomically. - * - * This will leave the counter in the correct state for future - * accesses. After the rebalance, we simply try again and our retry - * will either succeed through the fast path or slow path without - * another balance operation being required. - */ - xfs_icsb_balance_counter(mp, field, delta); - xfs_icsb_unlock(mp); - goto again; -} - -#endif diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 76f5d25..ff1d1d5 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -18,8 +18,6 @@ #ifndef __XFS_MOUNT_H__ #define __XFS_MOUNT_H__ -#ifdef __KERNEL__ - struct xlog; struct xfs_inode; struct xfs_mru_cache; @@ -29,43 +27,6 @@ struct xfs_quotainfo; struct xfs_dir_ops; struct xfs_da_geometry; -#ifdef HAVE_PERCPU_SB - -/* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. - */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ - -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - /* dynamic preallocation free space thresholds, 5% down to 1% */ enum { XFS_LOWSP_1_PCNT = 0, @@ -156,12 +117,6 @@ typedef struct xfs_mount { const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ uint m_chsize; /* size of next field */ atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_reclaim_work; /* background inode reclaim */ struct delayed_work m_eofblocks_work; /* background eof blocks @@ -294,26 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* * This structure is for use by the xfs_mod_incore_sb_batch() routine. * xfs_growfs can specify a few fields which are more than int limit */ @@ -396,6 +331,4 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); extern void xfs_set_low_space_thresholds(struct xfs_mount *); -#endif /* __KERNEL__ */ - #endif /* __XFS_MOUNT_H__ */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 4c6af31..af6d268 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1035,23 +1035,6 @@ xfs_free_fsname( kfree(mp->m_logname); } -STATIC void -xfs_fs_put_super( - struct super_block *sb) -{ - struct xfs_mount *mp = XFS_M(sb); - - xfs_filestream_unmount(mp); - xfs_unmountfs(mp); - - xfs_freesb(mp); - xfs_icsb_destroy_counters(mp); - xfs_destroy_mount_workqueues(mp); - xfs_close_devices(mp); - xfs_free_fsname(mp); - kfree(mp); -} - STATIC int xfs_fs_sync_fs( struct super_block *sb, @@ -1100,7 +1083,6 @@ xfs_fs_statfs( statp->f_fsid.val[0] = (u32)id; statp->f_fsid.val[1] = (u32)(id >> 32); - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); icount = percpu_counter_sum(&mp->m_icount); ifree = percpu_counter_sum(&mp->m_ifree); fdblocks = percpu_counter_sum(&mp->m_fdblocks); @@ -1405,6 +1387,51 @@ xfs_finish_flags( return 0; } +static int +xfs_init_percpu_counters( + struct xfs_mount *mp) +{ + int error; + + error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); + if (error) + return ENOMEM; + + error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); + if (error) + goto free_icount; + + error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); + if (error) + goto free_ifree; + + return 0; + +free_ifree: + percpu_counter_destroy(&mp->m_ifree); +free_icount: + percpu_counter_destroy(&mp->m_icount); + return -ENOMEM; +} + +void +xfs_reinit_percpu_counters( + struct xfs_mount *mp) +{ + 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); +} + +static void +xfs_destroy_percpu_counters( + struct xfs_mount *mp) +{ + percpu_counter_destroy(&mp->m_icount); + percpu_counter_destroy(&mp->m_ifree); + percpu_counter_destroy(&mp->m_fdblocks); +} + STATIC int xfs_fs_fill_super( struct super_block *sb, @@ -1453,7 +1480,7 @@ xfs_fs_fill_super( if (error) goto out_close_devices; - error = xfs_icsb_init_counters(mp); + error = xfs_init_percpu_counters(mp); if (error) goto out_destroy_workqueues; @@ -1511,7 +1538,7 @@ xfs_fs_fill_super( out_free_sb: xfs_freesb(mp); out_destroy_counters: - xfs_icsb_destroy_counters(mp); + xfs_destroy_percpu_counters(mp); out_destroy_workqueues: xfs_destroy_mount_workqueues(mp); out_close_devices: @@ -1528,6 +1555,23 @@ out_destroy_workqueues: goto out_free_sb; } +STATIC void +xfs_fs_put_super( + struct super_block *sb) +{ + struct xfs_mount *mp = XFS_M(sb); + + xfs_filestream_unmount(mp); + xfs_unmountfs(mp); + + xfs_freesb(mp); + xfs_destroy_percpu_counters(mp); + xfs_destroy_mount_workqueues(mp); + xfs_close_devices(mp); + xfs_free_fsname(mp); + kfree(mp); +} + STATIC struct dentry * xfs_fs_mount( struct file_system_type *fs_type, diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 2b830c2..499058f 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -72,6 +72,8 @@ extern const struct export_operations xfs_export_operations; extern const struct xattr_handler *xfs_xattr_handlers[]; extern const struct quotactl_ops xfs_quotactl_operations; +extern void xfs_reinit_percpu_counters(struct xfs_mount *mp); + #define XFS_M(sb) ((struct xfs_mount *)((sb)->s_fs_info)) #endif /* __XFS_SUPER_H__ */ -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:54:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DBB837F86 for ; Wed, 4 Feb 2015 14:54:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71111AC004 for ; Wed, 4 Feb 2015 12:54:34 -0800 (PST) X-ASG-Debug-ID: 1423083269-04bdf01eeca24130001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id FRguyEGeA9nmd9Ul for ; Wed, 04 Feb 2015 12:54:29 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAMSF0lR5LHOV/2dsb2JhbABSCIMGgSuveQUGmU9EAQEBAQF9hA0BBScvMwgYMTkDGxmILNcQhgSJHQGFBgWFTZQDhUmDWYgqIoFFAQsBMByBZCoxgQOBPwEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:24:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ6xg-0003D8-74 for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ6xg-0007EV-6D for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:54:12 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched Date: Thu, 5 Feb 2015 07:54:08 +1100 X-ASG-Orig-Subj: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched Message-Id: <1423083249-27493-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> References: <1423083249-27493-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083269 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Introduce helper functions for modifying fields in the superblock into xfs_trans.c, the only caller of xfs_mod_incore_sb_batch(). We can then use these directly in xfs_trans_unreserve_and_mod_sb() and so remove another user of the xfs_mode_incore_sb() API without losing any functionality or scalability of the transaction commit code.. Based on a patch from Christoph Hellwig. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 51 -------------- fs/xfs/xfs_mount.h | 11 --- fs/xfs/xfs_trans.c | 198 ++++++++++++++++++++++++++++++++++------------------- 3 files changed, 126 insertions(+), 134 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 284f528..9499e88 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1354,57 +1354,6 @@ xfs_mod_incore_sb( } /* - * Change more than one field in the in-core superblock structure at a time. - * - * The fields and changes to those fields are specified in the array of - * xfs_mod_sb structures passed in. Either all of the specified deltas - * will be applied or none of them will. If any modified field dips below 0, - * then all modifications will be backed out and EINVAL will be returned. - * - * Note that this function may not be used for the superblock values that - * are tracked with the in-memory per-cpu counters - a direct call to - * xfs_mod_incore_sb is required for these. - */ -int -xfs_mod_incore_sb_batch( - struct xfs_mount *mp, - xfs_mod_sb_t *msb, - uint nmsb, - int rsvd) -{ - xfs_mod_sb_t *msbp; - int error = 0; - - /* - * Loop through the array of mod structures and apply each individually. - * If any fail, then back out all those which have already been applied. - * Do all of this within the scope of the m_sb_lock so that all of the - * changes will be atomic. - */ - spin_lock(&mp->m_sb_lock); - for (msbp = msb; msbp < (msb + nmsb); msbp++) { - ASSERT(msbp->msb_field < XFS_SBS_ICOUNT || - msbp->msb_field > XFS_SBS_FDBLOCKS); - - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, - msbp->msb_delta, rsvd); - if (error) - goto unwind; - } - spin_unlock(&mp->m_sb_lock); - return 0; - -unwind: - while (--msbp >= msb) { - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, - -msbp->msb_delta, rsvd); - ASSERT(error == 0); - } - spin_unlock(&mp->m_sb_lock); - return error; -} - -/* * xfs_getsb() is called to obtain the buffer for the superblock. * The buffer is returned locked and read in from disk. * The buffer should be released with a call to xfs_brelse(). diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 8970489..66f28c1 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -249,15 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) } /* - * This structure is for use by the xfs_mod_incore_sb_batch() routine. - * xfs_growfs can specify a few fields which are more than int limit - */ -typedef struct xfs_mod_sb { - xfs_sb_field_t msb_field; /* Field to modify, see below */ - int64_t msb_delta; /* Change to make to specified field */ -} xfs_mod_sb_t; - -/* * Per-ag incore structure, copies of information in agf and agi, to improve the * performance of allocation group selection. */ @@ -314,8 +305,6 @@ extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, extern void xfs_unmountfs(xfs_mount_t *); extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, - uint, int); extern int xfs_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, diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 4e4bc5a..220ef2c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -485,6 +485,54 @@ xfs_trans_apply_sb_deltas( sizeof(sbp->sb_frextents) - 1); } +STATIC int +xfs_sb_mod8( + uint8_t *field, + int8_t delta) +{ + int8_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + +STATIC int +xfs_sb_mod32( + uint32_t *field, + int32_t delta) +{ + int32_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + +STATIC int +xfs_sb_mod64( + uint64_t *field, + int64_t delta) +{ + int64_t counter = *field; + + counter += delta; + if (counter < 0) { + ASSERT(0); + return -EINVAL; + } + *field = counter; + return 0; +} + /* * xfs_trans_unreserve_and_mod_sb() is called to release unused reservations * and apply superblock counter changes to the in-core superblock. The @@ -492,13 +540,6 @@ xfs_trans_apply_sb_deltas( * applied to the in-core superblock. The idea is that that has already been * done. * - * This is done efficiently with a single call to xfs_mod_incore_sb_batch(). - * However, we have to ensure that we only modify each superblock field only - * once because the application of the delta values may not be atomic. That can - * lead to ENOSPC races occurring if we have two separate modifcations of the - * free space counter to put back the entire reservation and then take away - * what we used. - * * If we are not logging superblock counters, then the inode allocated/free and * used block counts are not updated in the on disk superblock. In this case, * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we @@ -506,20 +547,15 @@ xfs_trans_apply_sb_deltas( */ void xfs_trans_unreserve_and_mod_sb( - xfs_trans_t *tp) + struct xfs_trans *tp) { - xfs_mod_sb_t msb[9]; /* If you add cases, add entries */ - xfs_mod_sb_t *msbp; - xfs_mount_t *mp = tp->t_mountp; - /* REFERENCED */ - int error; - bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; - int64_t blkdelta = 0; - int64_t rtxdelta = 0; - int64_t idelta = 0; - int64_t ifreedelta = 0; - - msbp = msb; + struct xfs_mount *mp = tp->t_mountp; + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; + int64_t blkdelta = 0; + int64_t rtxdelta = 0; + int64_t idelta = 0; + int64_t ifreedelta = 0; + int error; /* calculate deltas */ if (tp->t_blk_res > 0) @@ -560,72 +596,90 @@ xfs_trans_unreserve_and_mod_sb( goto out_undo_icount; } + if (rtxdelta == 0 && !(tp->t_flags & XFS_TRANS_SB_DIRTY)) + return; + /* apply remaining deltas */ + spin_lock(&mp->m_sb_lock); if (rtxdelta) { - error = xfs_mod_frextents(mp, rtxdelta); + error = xfs_sb_mod64(&mp->m_sb.sb_frextents, rtxdelta); if (error) goto out_undo_ifree; } - if (tp->t_flags & XFS_TRANS_SB_DIRTY) { - if (tp->t_dblocks_delta != 0) { - msbp->msb_field = XFS_SBS_DBLOCKS; - msbp->msb_delta = tp->t_dblocks_delta; - msbp++; - } - if (tp->t_agcount_delta != 0) { - msbp->msb_field = XFS_SBS_AGCOUNT; - msbp->msb_delta = tp->t_agcount_delta; - msbp++; - } - if (tp->t_imaxpct_delta != 0) { - msbp->msb_field = XFS_SBS_IMAX_PCT; - msbp->msb_delta = tp->t_imaxpct_delta; - msbp++; - } - if (tp->t_rextsize_delta != 0) { - msbp->msb_field = XFS_SBS_REXTSIZE; - msbp->msb_delta = tp->t_rextsize_delta; - msbp++; - } - if (tp->t_rbmblocks_delta != 0) { - msbp->msb_field = XFS_SBS_RBMBLOCKS; - msbp->msb_delta = tp->t_rbmblocks_delta; - msbp++; - } - if (tp->t_rblocks_delta != 0) { - msbp->msb_field = XFS_SBS_RBLOCKS; - msbp->msb_delta = tp->t_rblocks_delta; - msbp++; - } - if (tp->t_rextents_delta != 0) { - msbp->msb_field = XFS_SBS_REXTENTS; - msbp->msb_delta = tp->t_rextents_delta; - msbp++; - } - if (tp->t_rextslog_delta != 0) { - msbp->msb_field = XFS_SBS_REXTSLOG; - msbp->msb_delta = tp->t_rextslog_delta; - msbp++; - } - } - - /* - * If we need to change anything, do it. - */ - if (msbp > msb) { - error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, - (uint)(msbp - msb), rsvd); + if (tp->t_dblocks_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_dblocks, tp->t_dblocks_delta); if (error) goto out_undo_frextents; } - + if (tp->t_agcount_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_agcount, tp->t_agcount_delta); + if (error) + goto out_undo_dblocks; + } + if (tp->t_imaxpct_delta != 0) { + error = xfs_sb_mod8(&mp->m_sb.sb_imax_pct, tp->t_imaxpct_delta); + if (error) + goto out_undo_agcount; + } + if (tp->t_rextsize_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_rextsize, + tp->t_rextsize_delta); + if (error) + goto out_undo_imaxpct; + } + if (tp->t_rbmblocks_delta != 0) { + error = xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, + tp->t_rbmblocks_delta); + if (error) + goto out_undo_rextsize; + } + if (tp->t_rblocks_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_rblocks, tp->t_rblocks_delta); + if (error) + goto out_undo_rbmblocks; + } + if (tp->t_rextents_delta != 0) { + error = xfs_sb_mod64(&mp->m_sb.sb_rextents, + tp->t_rextents_delta); + if (error) + goto out_undo_rblocks; + } + if (tp->t_rextslog_delta != 0) { + error = xfs_sb_mod8(&mp->m_sb.sb_rextslog, + tp->t_rextslog_delta); + if (error) + goto out_undo_rextents; + } + spin_unlock(&mp->m_sb_lock); return; +out_undo_rextents: + if (tp->t_rextents_delta) + xfs_sb_mod64(&mp->m_sb.sb_rextents, -tp->t_rextents_delta); +out_undo_rblocks: + if (tp->t_rblocks_delta) + xfs_sb_mod64(&mp->m_sb.sb_rblocks, -tp->t_rblocks_delta); +out_undo_rbmblocks: + if (tp->t_rbmblocks_delta) + xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, -tp->t_rbmblocks_delta); +out_undo_rextsize: + if (tp->t_rextsize_delta) + xfs_sb_mod32(&mp->m_sb.sb_rextsize, -tp->t_rextsize_delta); +out_undo_imaxpct: + if (tp->t_rextsize_delta) + xfs_sb_mod8(&mp->m_sb.sb_imax_pct, -tp->t_imaxpct_delta); +out_undo_agcount: + if (tp->t_agcount_delta) + xfs_sb_mod32(&mp->m_sb.sb_agcount, -tp->t_agcount_delta); +out_undo_dblocks: + if (tp->t_dblocks_delta) + xfs_sb_mod64(&mp->m_sb.sb_dblocks, -tp->t_dblocks_delta); out_undo_frextents: if (rtxdelta) - xfs_mod_frextents(mp, -rtxdelta); + xfs_sb_mod64(&mp->m_sb.sb_frextents, -rtxdelta); out_undo_ifree: + spin_unlock(&mp->m_sb_lock); if (ifreedelta) xfs_mod_ifree(mp, -ifreedelta); out_undo_icount: -- 2.0.0 From dave@fromorbit.com Wed Feb 4 14:57:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 601077F86 for ; Wed, 4 Feb 2015 14:57:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D306304053 for ; Wed, 4 Feb 2015 12:57:09 -0800 (PST) X-ASG-Debug-ID: 1423083422-04cb6c2e6bc56a40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8lHg2duvnRB4nMLL for ; Wed, 04 Feb 2015 12:57:03 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq4HAPGG0lR5LHOV/2dsb2JhbABSCIMGgSuveQUGmC+BIEQBAQEBAX2EOi87GGoDNIgssFimMIYEiR5LhDsFhU2HUJJFizoigUUBCwEwHIFkKjGBAgSBPAEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:27:02 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ70D-0003Dq-7A for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:56:49 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ70D-0007O4-5L for xfs@oss.sgi.com; Thu, 05 Feb 2015 07:56:49 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: inodes are new until the dentry cache is set up Date: Thu, 5 Feb 2015 07:56:49 +1100 X-ASG-Orig-Subj: [PATCH] xfs: inodes are new until the dentry cache is set up Message-Id: <1423083409-28362-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083422 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Al Viro noticed a generic set of issues to do with filehandle lookup racing with dentry cache setup. They involve a filehandle lookup occurring while an inode is being created and the filehandle lookup racing with the dentry creation for the real file. This can lead to multiple dentries for the one path being instantiated. There are a host of other issues around this same set of paths. The underlying cause is that file handle lookup only waits on inode cache instantiation rather than full dentry cache instantiation. XFS is mostly immune to the problems discovered due to it's own internal inode cache, but there are a couple of corner cases where races can happen. We currently clear the XFS_INEW flag when the inode is fully set up after insertion into the cache. Newly allocated inodes are inserted locked and so aren't usable until the allocation transaction commits. This, however, occurs before the dentry and security information is fully initialised and hence the inode is unlocked and available for lookups to find too early. To solve the problem, only clear the XFS_INEW flag for newly created inodes once the dentry is fully instantiated. This means lookups will retry until the XFS_INEW flag is removed from the inode and hence avoids the race conditions in questions. THis also means that xfs_create(), xfs_create_tmpfile() and xfs_symlink() need to finish the setup of the inode in their error paths if we had allocated the inode but failed later in the creation process. xfs_symlink(), in particular, needed a lot of help to make it's error handling match that of xfs_create(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 4 ++-- fs/xfs/xfs_inode.c | 22 ++++++++++++-------- fs/xfs/xfs_inode.h | 22 ++++++++++++++++++++ fs/xfs/xfs_iops.c | 24 +++++++++------------- fs/xfs/xfs_iops.h | 2 -- fs/xfs/xfs_qm.c | 13 ++++++++---- fs/xfs/xfs_symlink.c | 58 ++++++++++++++++++++++++++++++---------------------- 7 files changed, 90 insertions(+), 55 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 9771b7e..76a9f27 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -439,11 +439,11 @@ again: *ipp = ip; /* - * If we have a real type for an on-disk inode, we can set ops(&unlock) + * If we have a real type for an on-disk inode, we can setup the inode * now. If it's a new inode being created, xfs_ialloc will handle it. */ if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) - xfs_setup_inode(ip); + xfs_setup_existing_inode(ip); return 0; out_error_or_again: diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index daafa1f..d0414f3 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -818,7 +818,7 @@ xfs_ialloc( xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, flags); - /* now that we have an i_mode we can setup inode ops and unlock */ + /* now that we have an i_mode we can setup the inode structure */ xfs_setup_inode(ip); *ipp = ip; @@ -1235,12 +1235,14 @@ xfs_create( xfs_trans_cancel(tp, cancel_flags); out_release_inode: /* - * Wait until after the current transaction is aborted to - * release the inode. This prevents recursive transactions - * and deadlocks from xfs_inactive. + * Wait until after the current transaction is aborted to finish the + * setup of the inode and release the inode. This prevents recursive + * transactions and deadlocks from xfs_inactive. */ - if (ip) + if (ip) { + xfs_finish_inode_setup(ip); IRELE(ip); + } xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); @@ -1345,12 +1347,14 @@ xfs_create_tmpfile( xfs_trans_cancel(tp, cancel_flags); out_release_inode: /* - * Wait until after the current transaction is aborted to - * release the inode. This prevents recursive transactions - * and deadlocks from xfs_inactive. + * Wait until after the current transaction is aborted to finish the + * setup of the inode and release the inode. This prevents recursive + * transactions and deadlocks from xfs_inactive. */ - if (ip) + if (ip) { + xfs_finish_inode_setup(ip); IRELE(ip); + } xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 86cd6b3..8e82b41 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -390,6 +390,28 @@ int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); int xfs_iozero(struct xfs_inode *, loff_t, size_t); +/* from xfs_iops.c */ +/* + * When setting up a newly allocated inode, we need to call + * xfs_finish_inode_setup() once the inode is fully instantiated at + * the VFS level to prevent the rest of the world seeing the inode + * 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); + barrier(); + unlock_new_inode(VFS_I(ip)); +} + +static inline void xfs_setup_existing_inode(struct xfs_inode *ip) +{ + xfs_setup_inode(ip); + xfs_finish_inode_setup(ip); +} + #define IHOLD(ip) \ do { \ ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ce80eeb..8be5bb5 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -186,6 +186,8 @@ xfs_generic_create( else d_instantiate(dentry, inode); + xfs_finish_inode_setup(ip); + out_free_acl: if (default_acl) posix_acl_release(default_acl); @@ -194,6 +196,7 @@ xfs_generic_create( return error; out_cleanup_inode: + xfs_finish_inode_setup(ip); if (!tmpfile) xfs_cleanup_inode(dir, inode, dentry); iput(inode); @@ -366,9 +369,11 @@ xfs_vn_symlink( goto out_cleanup_inode; d_instantiate(dentry, inode); + xfs_finish_inode_setup(cip); return 0; out_cleanup_inode: + xfs_finish_inode_setup(cip); xfs_cleanup_inode(dir, inode, dentry); iput(inode); out: @@ -1231,16 +1236,12 @@ xfs_diflags_to_iflags( } /* - * Initialize the Linux inode, set up the operation vectors and - * unlock the 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 inode. + * Initialize the Linux inode and set up the operation vectors. * - * We are always called with an uninitialised linux inode here. - * We need to initialise the necessary fields and take a reference - * on it. + * 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 + * inode. These callers have different criteria for clearing XFS_INEW, so leave + * it up to the caller to deal with unlocking the inode appropriately. */ void xfs_setup_inode( @@ -1327,9 +1328,4 @@ xfs_setup_inode( inode_has_no_xattr(inode); cache_no_acl(inode); } - - xfs_iflags_clear(ip, XFS_INEW); - barrier(); - - unlock_new_inode(inode); } diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h index 1c34e43..d4bcc29 100644 --- a/fs/xfs/xfs_iops.h +++ b/fs/xfs/xfs_iops.h @@ -25,8 +25,6 @@ extern const struct file_operations xfs_dir_file_operations; extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); -extern void xfs_setup_inode(struct xfs_inode *); - /* * Internal setattr interfaces. */ diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 3e81862..1f9e23c 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -719,6 +719,7 @@ xfs_qm_qino_alloc( xfs_trans_t *tp; int error; int committed; + bool need_alloc = true; *ip = NULL; /* @@ -747,6 +748,7 @@ xfs_qm_qino_alloc( return error; mp->m_sb.sb_gquotino = NULLFSINO; mp->m_sb.sb_pquotino = NULLFSINO; + need_alloc = false; } } @@ -758,7 +760,7 @@ xfs_qm_qino_alloc( return error; } - if (!*ip) { + if (need_alloc) { error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip, &committed); if (error) { @@ -794,11 +796,14 @@ xfs_qm_qino_alloc( spin_unlock(&mp->m_sb_lock); xfs_log_sb(tp); - if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); xfs_alert(mp, "%s failed (error %d)!", __func__, error); - return error; } - return 0; + if (need_alloc) + xfs_finish_inode_setup(*ip); + return error; } diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 25791df..3df411e 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -177,7 +177,7 @@ xfs_symlink( int pathlen; struct xfs_bmap_free free_list; xfs_fsblock_t first_block; - bool unlock_dp_on_error = false; + bool unlock_dp_on_error = false; uint cancel_flags; int committed; xfs_fileoff_t first_fsb; @@ -221,7 +221,7 @@ xfs_symlink( XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, &udqp, &gdqp, &pdqp); if (error) - goto std_return; + return error; tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); cancel_flags = XFS_TRANS_RELEASE_LOG_RES; @@ -241,7 +241,7 @@ xfs_symlink( } if (error) { cancel_flags = 0; - goto error_return; + goto out_trans_cancel; } xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); @@ -252,7 +252,7 @@ xfs_symlink( */ if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { error = -EPERM; - goto error_return; + goto out_trans_cancel; } /* @@ -261,7 +261,7 @@ xfs_symlink( error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, pdqp, resblks, 1, 0); if (error) - goto error_return; + goto out_trans_cancel; /* * Check for ability to enter directory entry, if no space reserved. @@ -269,7 +269,7 @@ xfs_symlink( if (!resblks) { error = xfs_dir_canenter(tp, dp, link_name); if (error) - goto error_return; + goto out_trans_cancel; } /* * Initialize the bmap freelist prior to calling either @@ -282,15 +282,14 @@ xfs_symlink( */ error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, prid, resblks > 0, &ip, NULL); - if (error) { - if (error == -ENOSPC) - goto error_return; - goto error1; - } + if (error) + goto out_trans_cancel; /* - * An error after we've joined dp to the transaction will result in the - * transaction cancel unlocking dp so don't do it explicitly in the + * Now we join the directory inode to the transaction. We do not do it + * earlier because xfs_dir_ialloc might commit the previous transaction + * (and release all the locks). An error from here on will result in + * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); @@ -330,7 +329,7 @@ xfs_symlink( XFS_BMAPI_METADATA, &first_block, resblks, mval, &nmaps, &free_list); if (error) - goto error2; + goto out_bmap_cancel; if (resblks) resblks -= fs_blocks; @@ -348,7 +347,7 @@ xfs_symlink( BTOBB(byte_cnt), 0); if (!bp) { error = -ENOMEM; - goto error2; + goto out_bmap_cancel; } bp->b_ops = &xfs_symlink_buf_ops; @@ -378,7 +377,7 @@ xfs_symlink( error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, &first_block, &free_list, resblks); if (error) - goto error2; + goto out_bmap_cancel; xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); @@ -392,10 +391,13 @@ xfs_symlink( } error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) { - goto error2; - } + if (error) + goto out_bmap_cancel; + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + goto out_release_inode; + xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); xfs_qm_dqrele(pdqp); @@ -403,20 +405,28 @@ xfs_symlink( *ipp = ip; return 0; - error2: - IRELE(ip); - error1: +out_bmap_cancel: xfs_bmap_cancel(&free_list); cancel_flags |= XFS_TRANS_ABORT; - error_return: +out_trans_cancel: xfs_trans_cancel(tp, cancel_flags); +out_release_inode: + /* + * Wait until after the current transaction is aborted to finish the + * setup of the inode and release the inode. This prevents recursive + * transactions and deadlocks from xfs_inactive. + */ + if (ip) { + xfs_finish_inode_setup(ip); + IRELE(ip); + } + xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) xfs_iunlock(dp, XFS_ILOCK_EXCL); - std_return: return error; } -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D30607FBD for ; Wed, 4 Feb 2015 15:04:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1E9D30406A for ; Wed, 4 Feb 2015 13:04:45 -0800 (PST) X-ASG-Debug-ID: 1423083883-04cbb04167c285b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SOeOqAM9oUJyzErX for ; Wed, 04 Feb 2015 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArAHAPWH0lR5LHOV/2dsb2JhbABagwaBK695BQaBSpZlgSBEAQEBAQF9hA0BBScvMwgYMTkDGxmILNZ9hgSJaSiEEwWFTaVPIoFFAQuCMSoxgQIEgTwBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003GA-9F for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007Xo-84 for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: lock out page faults from extent swap operations Date: Thu, 5 Feb 2015 08:04:19 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: lock out page faults from extent swap operations Message-Id: <1423083859-28439-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083883 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Extent swap operations are another extent manipulation operation that we need to ensure does not race against mmap page faults. The current code returns if the file is mapped prior to the swap being done, but it could potentially race against new page faults while the swap is in progress. Hence we should use the XFS_MMAPLOCK_EXCL for this operation, too. While there, fix the error path handling that can result in double unlocks of the inodes when cancelling the swapext transaction. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 22a5dcb..7efa23e 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1599,13 +1599,6 @@ xfs_swap_extent_flush( /* Verify O_DIRECT for ftmp */ if (VFS_I(ip)->i_mapping->nrpages) return -EINVAL; - - /* - * Don't try to swap extents on mmap()d files because we can't lock - * out races against page faults safely. - */ - if (mapping_mapped(VFS_I(ip)->i_mapping)) - return -EBUSY; return 0; } @@ -1633,13 +1626,14 @@ xfs_swap_extents( } /* - * Lock up the inodes against other IO and truncate to begin with. - * Then we can ensure the inodes are flushed and have no page cache - * safely. Once we have done this we can take the ilocks and do the rest - * of the checks. + * Lock the inodes against other IO, page faults and truncate to + * begin with. Then we can ensure the inodes are flushed and have no + * page cache safely. Once we have done this we can take the ilocks and + * do the rest of the checks. */ - lock_flags = XFS_IOLOCK_EXCL; + lock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); + xfs_lock_two_inodes(ip, tip, XFS_MMAPLOCK_EXCL); /* Verify that both files have the same format */ if ((ip->i_d.di_mode & S_IFMT) != (tip->i_d.di_mode & S_IFMT)) { @@ -1666,8 +1660,16 @@ xfs_swap_extents( xfs_trans_cancel(tp, 0); goto out_unlock; } + + /* + * Lock and join the inodes to the tansaction so that transaction commit + * or cancel will unlock the inodes from this point onwards. + */ xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); lock_flags |= XFS_ILOCK_EXCL; + xfs_trans_ijoin(tp, ip, lock_flags); + xfs_trans_ijoin(tp, tip, lock_flags); + /* Verify all data are being swapped */ if (sxp->sx_offset != 0 || @@ -1720,9 +1722,6 @@ xfs_swap_extents( goto out_trans_cancel; } - xfs_trans_ijoin(tp, ip, lock_flags); - xfs_trans_ijoin(tp, tip, lock_flags); - /* * Before we've swapped the forks, lets set the owners of the forks * appropriately. We have to do this as we are demand paging the btree @@ -1856,5 +1855,5 @@ out_unlock: out_trans_cancel: xfs_trans_cancel(tp, 0); - goto out_unlock; + goto out; } -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 071547FBE for ; Wed, 4 Feb 2015 15:04:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96DF9AC004 for ; Wed, 4 Feb 2015 13:04:45 -0800 (PST) X-ASG-Debug-ID: 1423083881-04bdf01eefa244d0004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id k5mprNPwcAPF9QV0 for ; Wed, 04 Feb 2015 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq8HAPWH0lR5LHOV/2dsb2JhbABSCIMGgSuveQUGmC+BIEQBAQEBAX2EDQEFJy8zCBgxOQMbGRuIEdZ9hgSECoUUS4Q7BYVNjyGEYokigXCGOiKBRQELgjEqMYJCAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G9-8T for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007Xj-7R for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: xfs_setattr_size no longer races with page faults Date: Thu, 5 Feb 2015 08:04:18 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: xfs_setattr_size no longer races with page faults Message-Id: <1423083859-28439-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083884 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that truncate locks out new page faults, we no longer need to do special writeback hacks in truncate to work around potential races between page faults, page cache truncation and file size updates to ensure we get write page faults for extending truncates on sub-page block size filesystems. Hence we can remove the code in xfs_setattr_size() that handles this and update the comments around the code tha thandles page cache truncate and size updates to reflect the new reality. Signed-off-by: Dave Chinner --- fs/xfs/xfs_iops.c | 56 ++++++++++++++----------------------------------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0362b65..6a77ea9 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -842,55 +842,27 @@ xfs_setattr_size( inode_dio_wait(inode); /* - * Do all the page cache truncate work outside the transaction context - * as the "lock" order is page lock->log space reservation. i.e. - * locking pages inside the transaction can ABBA deadlock with - * writeback. We have to do the VFS inode size update before we truncate - * the pagecache, however, to avoid racing with page faults beyond the - * new EOF they are not serialised against truncate operations except by - * page locks and size updates. + * 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 + * drop the XFS_MMAP_EXCL lock after the extent manipulations are + * complete. The truncate_setsize() call also cleans partial EOF page + * PTEs on extending truncates and hence ensures sub-page block size + * filesystems are correctly handled, too. * - * Hence we are in a situation where a truncate can fail with ENOMEM - * from xfs_trans_reserve(), but having already truncated the in-memory - * version of the file (i.e. made user visible changes). There's not - * much we can do about this, except to hope that the caller sees ENOMEM - * and retries the truncate operation. + * We have to do all the page cache truncate work outside the + * transaction context as the "lock" order is page lock->log space + * reservation as defined by extent allocation in the writeback path. + * Hence a truncate can fail with ENOMEM from xfs_trans_reserve(), but + * having already truncated the in-memory version of the file (i.e. made + * user visible changes). There's not much we can do about this, except + * to hope that the caller sees ENOMEM and retries the truncate + * operation. */ error = block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); if (error) return error; truncate_setsize(inode, newsize); - /* - * The "we can't serialise against page faults" pain gets worse. - * - * If the file is mapped then we have to clean the page at the old EOF - * when extending the file. Extending the file can expose changes the - * underlying page mapping (e.g. from beyond EOF to a hole or - * unwritten), and so on the next attempt to write to that page we need - * to remap it for write. i.e. we need .page_mkwrite() to be called. - * Hence we need to clean the page to clean the pte and so a new write - * fault will be triggered appropriately. - * - * If we do it before we change the inode size, then we can race with a - * page fault that maps the page with exactly the same problem. If we do - * it after we change the file size, then a new page fault can come in - * and allocate space before we've run the rest of the truncate - * transaction. That's kinda grotesque, but it's better than have data - * over a hole, and so that's the lesser evil that has been chosen here. - * - * The real solution, however, is to have some mechanism for locking out - * page faults while a truncate is in progress. - */ - if (newsize > oldsize && mapping_mapped(VFS_I(ip)->i_mapping)) { - error = filemap_write_and_wait_range( - VFS_I(ip)->i_mapping, - round_down(oldsize, PAGE_CACHE_SIZE), - round_up(oldsize, PAGE_CACHE_SIZE) - 1); - if (error) - return error; - } - tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); if (error) -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76CD07FBD for ; Wed, 4 Feb 2015 15:04:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 127A1AC006 for ; Wed, 4 Feb 2015 13:04:45 -0800 (PST) X-ASG-Debug-ID: 1423083882-04bdf01eeea244d0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id veVltRgz0UgWEOME for ; Wed, 04 Feb 2015 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAPWH0lR5LHOV/2dsb2JhbABSCIMGgSuveQUGmU9EAQEBAQF9hA0BBScvMwgYMTkDGxmILNZ9hgSJHAKFBgWFTY8hhGKFSYwDIoFFAQsBMByBZCoxgQKBQAEBAQ Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G5-68 for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007XP-57 for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: introduce mmap/truncate lock Date: Thu, 5 Feb 2015 08:04:14 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: introduce mmap/truncate lock Message-Id: <1423083859-28439-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083883 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Right now we cannot serialise mmap against truncate or hole punch sanely. ->page_mkwrite is not able to take locks that the read IO path normally takes (i.e. the inode iolock) because that could result in lock inversions (read - iolock - page fault - page_mkwrite - iolock) and so we cannot use an IO path lock to serialise page write faults against truncate operations. Instead, introduce a new lock that is used *only* in the ->page_mkwrite path that is the equivalent of the iolock. The lock ordering in a page fault is i_mmaplock -> page lock -> i_ilock, and so in truncate we can i_iolock -> i_mmaplock and so lock out new write faults during the process of truncation. Because i_mmap_lock is outside the page lock, we can hold it across all the same operations we hold the i_iolock for. The only difference is that we never hold the i_mmaplock in the normal IO path and so do not ever have the possibility that we can page fault inside it. Hence there are no recursion issues on the i_mmap_lock and so we can use it to serialise page fault IO against inode modification operations that affect the IO path. This patch introduces the i_mmaplock infrastructure, lockdep annotations and initialisation/destruction code. Use of the new lock will be in subsequent patches. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 128 ++++++++++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_inode.h | 29 +++++++++--- fs/xfs/xfs_super.c | 2 + 3 files changed, 121 insertions(+), 38 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d0414f3..bf2d2c7 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -117,24 +117,34 @@ xfs_ilock_attr_map_shared( } /* - * The xfs inode contains 2 locks: a multi-reader lock called the - * i_iolock and a multi-reader lock called the i_lock. This routine - * allows either or both of the locks to be obtained. + * The xfs inode contains 3 multi-reader locks: the i_iolock the i_mmap_lock and + * the i_lock. This routine allows various combinations of the locks to be + * obtained. * - * The 2 locks should always be ordered so that the IO lock is - * obtained first in order to prevent deadlock. + * The 3 locks should always be ordered so that the IO lock is obtained first, + * the mmap lock second and the ilock last in order to prevent deadlock. * - * ip -- the inode being locked - * lock_flags -- this parameter indicates the inode's locks - * to be locked. It can be: - * XFS_IOLOCK_SHARED, - * XFS_IOLOCK_EXCL, - * XFS_ILOCK_SHARED, - * XFS_ILOCK_EXCL, - * XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED, - * XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL, - * XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED, - * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL + * Basic locking order: + * + * i_iolock -> i_mmap_lock -> page_lock -> i_ilock + * + * mmap_sem locking order: + * + * i_iolock -> page lock -> mmap_sem + * mmap_sem -> i_mmap_lock -> page_lock + * + * The result of the differenced in mmap_sem locking order mean that we cannot + * hold the i_mmap_lock over syscall based read(2)/write(2) based IO. These + * IO paths can fault in pages during copy in/out (for buffered IO) or require + * the mmap_sem in get_user_pages() to map the user pages into the kernel + * address space for direct IO. Similarly the i_iolock cannot be taken inside a + * page fault because page faults already hold the mmap_sem. + * + * Hence to serialise fully against both syscall and mmap based IO, we need to + * take both the i_iolock and the i_mmap_lock. These locks should *only* be both + * taken in places where we need to invalidate the page cache in a race + * free manner (e.g. truncate, hole punch and other extent manipulation + * functions). */ void xfs_ilock( @@ -150,6 +160,8 @@ xfs_ilock( */ ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); @@ -159,6 +171,11 @@ xfs_ilock( else if (lock_flags & XFS_IOLOCK_SHARED) mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); + if (lock_flags & XFS_MMAPLOCK_EXCL) + mrupdate_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags)); + else if (lock_flags & XFS_MMAPLOCK_SHARED) + mraccess_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags)); + if (lock_flags & XFS_ILOCK_EXCL) mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); else if (lock_flags & XFS_ILOCK_SHARED) @@ -191,6 +208,8 @@ xfs_ilock_nowait( */ ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); @@ -202,21 +221,35 @@ xfs_ilock_nowait( if (!mrtryaccess(&ip->i_iolock)) goto out; } + + if (lock_flags & XFS_MMAPLOCK_EXCL) { + if (!mrtryupdate(&ip->i_mmaplock)) + goto out_undo_iolock; + } else if (lock_flags & XFS_MMAPLOCK_SHARED) { + if (!mrtryaccess(&ip->i_mmaplock)) + goto out_undo_iolock; + } + if (lock_flags & XFS_ILOCK_EXCL) { if (!mrtryupdate(&ip->i_lock)) - goto out_undo_iolock; + goto out_undo_mmaplock; } else if (lock_flags & XFS_ILOCK_SHARED) { if (!mrtryaccess(&ip->i_lock)) - goto out_undo_iolock; + goto out_undo_mmaplock; } return 1; - out_undo_iolock: +out_undo_mmaplock: + if (lock_flags & XFS_MMAPLOCK_EXCL) + mrunlock_excl(&ip->i_mmaplock); + else if (lock_flags & XFS_MMAPLOCK_SHARED) + mrunlock_shared(&ip->i_mmaplock); +out_undo_iolock: if (lock_flags & XFS_IOLOCK_EXCL) mrunlock_excl(&ip->i_iolock); else if (lock_flags & XFS_IOLOCK_SHARED) mrunlock_shared(&ip->i_iolock); - out: +out: return 0; } @@ -244,6 +277,8 @@ xfs_iunlock( */ ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); @@ -254,6 +289,11 @@ xfs_iunlock( else if (lock_flags & XFS_IOLOCK_SHARED) mrunlock_shared(&ip->i_iolock); + if (lock_flags & XFS_MMAPLOCK_EXCL) + mrunlock_excl(&ip->i_mmaplock); + else if (lock_flags & XFS_MMAPLOCK_SHARED) + mrunlock_shared(&ip->i_mmaplock); + if (lock_flags & XFS_ILOCK_EXCL) mrunlock_excl(&ip->i_lock); else if (lock_flags & XFS_ILOCK_SHARED) @@ -271,11 +311,14 @@ xfs_ilock_demote( xfs_inode_t *ip, uint lock_flags) { - ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); + ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)); + ASSERT((lock_flags & + ~(XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); if (lock_flags & XFS_ILOCK_EXCL) mrdemote(&ip->i_lock); + if (lock_flags & XFS_MMAPLOCK_EXCL) + mrdemote(&ip->i_mmaplock); if (lock_flags & XFS_IOLOCK_EXCL) mrdemote(&ip->i_iolock); @@ -294,6 +337,12 @@ xfs_isilocked( return rwsem_is_locked(&ip->i_lock.mr_lock); } + if (lock_flags & (XFS_MMAPLOCK_EXCL|XFS_MMAPLOCK_SHARED)) { + if (!(lock_flags & XFS_MMAPLOCK_SHARED)) + return !!ip->i_mmaplock.mr_writer; + return rwsem_is_locked(&ip->i_mmaplock.mr_lock); + } + if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { if (!(lock_flags & XFS_IOLOCK_SHARED)) return !!ip->i_iolock.mr_writer; @@ -314,14 +363,27 @@ int xfs_lock_delays; #endif /* - * Bump the subclass so xfs_lock_inodes() acquires each lock with - * a different value + * Bump the subclass so xfs_lock_inodes() acquires each lock with a different + * value. This shouldn't be called for page fault locking, but we also need to + * ensure we don't overrun the number of lockdep subclasses for the iolock or + * mmaplock as that is limited to 12 by the mmap lock lockdep annotations. */ static inline int xfs_lock_inumorder(int lock_mode, int subclass) { - if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { + ASSERT(subclass + XFS_LOCK_INUMORDER < + (1 << (XFS_MMAPLOCK_SHIFT - XFS_IOLOCK_SHIFT))); lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT; + } + + if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) { + ASSERT(subclass + XFS_LOCK_INUMORDER < + (1 << (XFS_ILOCK_SHIFT - XFS_MMAPLOCK_SHIFT))); + lock_mode |= (subclass + XFS_LOCK_INUMORDER) << + XFS_MMAPLOCK_SHIFT; + } + if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT; @@ -440,10 +502,10 @@ again: } /* - * xfs_lock_two_inodes() can only be used to lock one type of lock - * at a time - the iolock or the ilock, but not both at once. If - * we lock both at once, lockdep will report false positives saying - * we have violated locking orders. + * xfs_lock_two_inodes() can only be used to lock one type of lock at a time - + * the iolock, the mmaplock or the ilock, but not more than one at a time. If we + * lock more than one at a time, lockdep will report false positives saying we + * have violated locking orders. */ void xfs_lock_two_inodes( @@ -455,8 +517,12 @@ xfs_lock_two_inodes( int attempts = 0; xfs_log_item_t *lp; - if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) - ASSERT((lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) == 0); + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { + ASSERT(!(lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL))); + ASSERT(!(lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))); + } else if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) + ASSERT(!(lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))); + ASSERT(ip0->i_ino != ip1->i_ino); if (ip0->i_ino > ip1->i_ino) { diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 8e82b41..56967dd 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -56,6 +56,7 @@ typedef struct xfs_inode { struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ mrlock_t i_iolock; /* inode IO lock */ + mrlock_t i_mmaplock; /* inode mmap IO lock */ atomic_t i_pincount; /* inode pin count */ spinlock_t i_flags_lock; /* inode i_flags lock */ /* Miscellaneous state. */ @@ -263,15 +264,20 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) #define XFS_IOLOCK_SHARED (1<<1) #define XFS_ILOCK_EXCL (1<<2) #define XFS_ILOCK_SHARED (1<<3) +#define XFS_MMAPLOCK_EXCL (1<<4) +#define XFS_MMAPLOCK_SHARED (1<<5) #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ - | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) + | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \ + | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED) #define XFS_LOCK_FLAGS \ { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ - { XFS_ILOCK_SHARED, "ILOCK_SHARED" } + { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ + { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \ + { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" } /* @@ -302,17 +308,26 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) #define XFS_IOLOCK_SHIFT 16 #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) +#define XFS_MMAPLOCK_SHIFT 20 + #define XFS_ILOCK_SHIFT 24 #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) #define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) #define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) -#define XFS_IOLOCK_DEP_MASK 0x00ff0000 +#define XFS_IOLOCK_DEP_MASK 0x000f0000 +#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 #define XFS_ILOCK_DEP_MASK 0xff000000 -#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK) - -#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) -#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) +#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | \ + XFS_MMAPLOCK_DEP_MASK | \ + XFS_ILOCK_DEP_MASK) + +#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) \ + >> XFS_IOLOCK_SHIFT) +#define XFS_MMAPLOCK_DEP(flags) (((flags) & XFS_MMAPLOCK_DEP_MASK) \ + >> XFS_MMAPLOCK_SHIFT) +#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \ + >> XFS_ILOCK_SHIFT) /* * For multiple groups support: if S_ISGID bit is set in the parent diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index afd6bae..40d2ac5 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -986,6 +986,8 @@ xfs_fs_inode_init_once( atomic_set(&ip->i_pincount, 0); spin_lock_init(&ip->i_flags_lock); + mrlock_init(&ip->i_mmaplock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, + "xfsino", ip->i_ino); mrlock_init(&ip->i_lock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, "xfsino", ip->i_ino); } -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 429837FBD for ; Wed, 4 Feb 2015 15:04:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D42A6AC002 for ; Wed, 4 Feb 2015 13:04:43 -0800 (PST) X-ASG-Debug-ID: 1423083881-04bdf01eefa244d0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vSEubN06ATX9JSnn for ; Wed, 04 Feb 2015 13:04:42 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq4HAPWH0lR5LHOV/2dsb2JhbABagwaBK695BQaYL4EgRAEBAQEBfYQNAQUnLzMIGDE5AxsZiCzWfYYEiRBZKIQTBZRuhGKFSYNZiCoigUUBC4IxKjGBAoFAAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G6-6s for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007XU-5b for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: use i_mmaplock on read faults Date: Thu, 5 Feb 2015 08:04:15 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: use i_mmaplock on read faults Message-Id: <1423083859-28439-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083882 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Take the i_mmaplock over read page faults. These come through the ->fault callout, so we need to wrap the generic implementation with the i_mmaplock. While there, add tracepoints for the read fault as it passes through XFS. This gives us a lock order of mmap_sem -> i_mmaplock -> page_lock -> i_lock. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 28 +++++++++++++++++++++++++++- fs/xfs/xfs_trace.h | 2 ++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 712d312..6cc1b7d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1369,6 +1369,32 @@ xfs_file_llseek( } } +/* + * Locking for serialisation of IO during page faults. This results in a lock + * ordering of: + * + * mmap_sem (MM) + * i_mmap_lock (XFS - truncate serialisation) + * page_lock (MM) + * i_lock (XFS - extent map serialisation) + */ +STATIC int +xfs_filemap_fault( + struct vm_area_struct *vma, + struct vm_fault *vmf) +{ + struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host); + int error; + + trace_xfs_filemap_fault(ip); + + xfs_ilock(ip, XFS_MMAPLOCK_SHARED); + error = filemap_fault(vma, vmf); + xfs_iunlock(ip, XFS_MMAPLOCK_SHARED); + + return error; +} + const struct file_operations xfs_file_operations = { .llseek = xfs_file_llseek, .read = new_sync_read, @@ -1401,7 +1427,7 @@ const struct file_operations xfs_dir_file_operations = { }; static const struct vm_operations_struct xfs_file_vm_ops = { - .fault = filemap_fault, + .fault = xfs_filemap_fault, .map_pages = filemap_map_pages, .page_mkwrite = xfs_vm_page_mkwrite, .remap_pages = generic_file_remap_pages, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..c496153 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -685,6 +685,8 @@ DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); +DEFINE_INODE_EVENT(xfs_filemap_fault); + DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), TP_ARGS(ip, caller_ip), -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CB5A77FC9 for ; Wed, 4 Feb 2015 15:04:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BDD6304053 for ; Wed, 4 Feb 2015 13:04:44 -0800 (PST) X-ASG-Debug-ID: 1423083882-04bdf01eeea244d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id r6wloOfud1XCKIEB for ; Wed, 04 Feb 2015 13:04:42 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0HAPWH0lR5LHOV/2dsb2JhbABagwaBK695BQaZT0QBAQEBAX2EDQEFJy8zCBgxOQMbGYgs1n2GBIoRhBMFlG6OBIgqIoFFAQuCMSoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G8-7w for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007Xe-72 for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: take i_mmap_lock on extent manipulation operations Date: Thu, 5 Feb 2015 08:04:17 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: take i_mmap_lock on extent manipulation operations Message-Id: <1423083859-28439-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083882 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we have the i_mmap_lock being held across the page fault IO path, we now add extent manipulation operation exclusion by adding the lock to the paths that directly modify extent maps. This includes truncate, hole punching and other fallocate based operations. The operations will now take both the i_iolock and the i_mmaplock in exclusive mode, thereby ensuring that all IO and page faults block without holding any page locks while the extent manipulation is in progress. This gives us the lock order during truncate of i_iolock -> i_mmaplock -> page_lock -> i_lock, hence providing the same lock order as the iolock provides the normal IO path without involving the mmap_sem. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 4 ++-- fs/xfs/xfs_ioctl.c | 4 ++-- fs/xfs/xfs_iops.c | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 2bb25fd..76bf14a 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -830,7 +830,7 @@ xfs_file_fallocate( FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) return -EOPNOTSUPP; - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); if (mode & FALLOC_FL_PUNCH_HOLE) { error = xfs_free_file_space(ip, offset, len); if (error) @@ -894,7 +894,7 @@ xfs_file_fallocate( } out_unlock: - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); return error; } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index b88ab92..972fa13 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -636,7 +636,7 @@ xfs_ioc_space( if (error) return error; - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); switch (bf->l_whence) { case 0: /*SEEK_SET*/ @@ -725,7 +725,7 @@ xfs_ioc_space( error = xfs_update_prealloc_flags(ip, flags); out_unlock: - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); mnt_drop_write_file(filp); return error; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 8be5bb5..0362b65 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -769,6 +769,7 @@ xfs_setattr_size( return error; ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL)); ASSERT(S_ISREG(ip->i_d.di_mode)); ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0); @@ -984,9 +985,9 @@ xfs_vn_setattr( int error; if (iattr->ia_valid & ATTR_SIZE) { - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); error = xfs_setattr_size(ip, iattr); - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); } else { error = xfs_setattr_nonsize(ip, iattr, 0); } -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0B7AF7FBD for ; Wed, 4 Feb 2015 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFAAF8F8054 for ; Wed, 4 Feb 2015 13:04:44 -0800 (PST) X-ASG-Debug-ID: 1423083881-04bdf01eefa244d0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Bm6Mgs9vXUD1o33E for ; Wed, 04 Feb 2015 13:04:43 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq4HAPWH0lR5LHOV/2dsb2JhbABagwaBK695BQaYL4EgRAEBAQEBfYQNAQUnLzMIGDE5AxsZiCzWfYYEiWkohBMFhU2PIYRihUmDWYgqIoFFAQuCMSoxgkIBAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G7-7V for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007XZ-6R for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: use i_mmaplock on write faults Date: Thu, 5 Feb 2015 08:04:16 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: use i_mmaplock on write faults Message-Id: <1423083859-28439-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1423083859-28439-1-git-send-email-david@fromorbit.com> References: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083883 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Take the i_mmaplock over write page faults. These come through the ->page_mkwrite callout, so we need to wrap that calls with the i_mmaplock. This gives us a lock order of mmap_sem -> i_mmaplock -> page_lock -> i_lock. Also, move the page_mkwrite wrapper to the same region of xfs_file.c as the read fault wrappers and add a tracepoint. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 39 ++++++++++++++++++++++++--------------- fs/xfs/xfs_trace.h | 1 + 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 6cc1b7d..2bb25fd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -981,20 +981,6 @@ xfs_file_mmap( } /* - * mmap()d file has taken write protection fault and is being made - * writable. We can set the page state up correctly for a writable - * page, which means we can do correct delalloc accounting (ENOSPC - * checking!) and unwritten extent mapping. - */ -STATIC int -xfs_vm_page_mkwrite( - struct vm_area_struct *vma, - struct vm_fault *vmf) -{ - return block_page_mkwrite(vma, vmf, xfs_get_blocks); -} - -/* * This type is designed to indicate the type of offset we would like * to search from page cache for xfs_seek_hole_data(). */ @@ -1395,6 +1381,29 @@ xfs_filemap_fault( return error; } +/* + * mmap()d file has taken write protection fault and is being made writable. We + * can set the page state up correctly for a writable page, which means we can + * do correct delalloc accounting (ENOSPC checking!) and unwritten extent + * mapping. + */ +STATIC int +xfs_filemap_page_mkwrite( + struct vm_area_struct *vma, + struct vm_fault *vmf) +{ + struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host); + int error; + + trace_xfs_filemap_page_mkwrite(ip); + + xfs_ilock(ip, XFS_MMAPLOCK_SHARED); + error = block_page_mkwrite(vma, vmf, xfs_get_blocks); + xfs_iunlock(ip, XFS_MMAPLOCK_SHARED); + + return error; +} + const struct file_operations xfs_file_operations = { .llseek = xfs_file_llseek, .read = new_sync_read, @@ -1429,6 +1438,6 @@ const struct file_operations xfs_dir_file_operations = { static const struct vm_operations_struct xfs_file_vm_ops = { .fault = xfs_filemap_fault, .map_pages = filemap_map_pages, - .page_mkwrite = xfs_vm_page_mkwrite, + .page_mkwrite = xfs_filemap_page_mkwrite, .remap_pages = generic_file_remap_pages, }; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index c496153..b1e059b 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -686,6 +686,7 @@ DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); DEFINE_INODE_EVENT(xfs_filemap_fault); +DEFINE_INODE_EVENT(xfs_filemap_page_mkwrite); DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), -- 2.0.0 From dave@fromorbit.com Wed Feb 4 15:04:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 947A77FBD for ; Wed, 4 Feb 2015 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 377C3AC002 for ; Wed, 4 Feb 2015 13:04:48 -0800 (PST) X-ASG-Debug-ID: 1423083881-04bdf01eefa244d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id DxEWIceWHCbWz2m3 for ; Wed, 04 Feb 2015 13:04:41 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoQJAPWH0lR5LHOV/2dsb2JhbABagwZSWa9gAgEJDQUGdpFIhxFEAQEBAQF9hGk7gQIDiGAOsECmL4YEh2eBNXWEEwWSYJg8IoFFAQEBBwEBAQGCLyoxAYEBgUABAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 07:34:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJ77c-0003G4-5X for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJ77c-0007XM-4L for xfs@oss.sgi.com; Thu, 05 Feb 2015 08:04:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6 V2] xfs: introduce mmap/truncate lock Date: Thu, 5 Feb 2015 08:04:13 +1100 X-ASG-Orig-Subj: [PATCH 0/6 V2] xfs: introduce mmap/truncate lock Message-Id: <1423083859-28439-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423083881 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is the second version of the mmap/truncate lock patchset I first posted here: http://oss.sgi.com/archives/xfs/2015-01/msg00129.html The concensus was that this problem should initially be fixed in the filesystem rather than the VFS due to the limited support of hole punching in filesystems, so the patch is mostly unchanged from the first version. The only changes have been to address the issues that Brain pointed out during review. The patchset has been used in all my testing since the first version was posted, and most of that has been with lockdep enabled. I have not had lockdep trip over anything other than already known issues in xfstests and various stress loads that I've run, so I think this is good to go. Comments, thoughts? -Dave. From j_woolliscroft@hotmail.com Wed Feb 4 18:24:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 C1B8C7F80 for ; Wed, 4 Feb 2015 18:24:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 92AD58F804C for ; Wed, 4 Feb 2015 16:24:01 -0800 (PST) X-ASG-Debug-ID: 1423095839-04bdf01eeca29550001-NocioJ Received: from BLU004-OMC4S18.hotmail.com (blu004-omc4s18.hotmail.com [65.55.111.157]) by cuda.sgi.com with ESMTP id VvDxJgYFoszmIW8F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 04 Feb 2015 16:24:00 -0800 (PST) X-Barracuda-Envelope-From: j_woolliscroft@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.157 Received: from BLU436-SMTP154 ([65.55.111.135]) by BLU004-OMC4S18.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Wed, 4 Feb 2015 16:23:59 -0800 X-TMN: [up7ImF/jmOpNKkWY+fdqNi4F4WvvQxwc] X-Originating-Email: [j_woolliscroft@hotmail.com] Message-ID: Return-Receipt-To: "James Woolliscroft" From: James Woolliscroft To: Subject: Using XFS on Raid Date: Thu, 5 Feb 2015 00:23:53 +0000 X-ASG-Orig-Subj: Using XFS on Raid MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_02DA_01D040DA.06DDC5F0" X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdBA2gWAlkRu/hnyQNSNZIAoENpVQw== Content-Language: en-gb Disposition-Notification-To: "James Woolliscroft" X-OriginalArrivalTime: 05 Feb 2015 00:23:56.0820 (UTC) FILETIME=[07981540:01D040DA] X-Barracuda-Connect: blu004-omc4s18.hotmail.com[65.55.111.157] X-Barracuda-Start-Time: 1423095839 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 HTML_MESSAGE BODY: HTML included in message ------=_NextPart_000_02DA_01D040DA.06DDC5F0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, I am new to XFS, I have spent a significant time searching for information and have not found any documentation relating to the use of XFS over RAID with N Drives where the Stripe Unit >256K. To be clear, using (for example) 3 Disks with RAID 5 with a Stripe Unit of 1MB and Stripe Width of 2 would give 2MB Data and 1M Parity. I have found through extensive testing of RAW RAID volumes with various chunk sizes that larger chunks tend to produce the best performance in most cases whether Sequential, Random, Read or Write, or in combinations. I am keen therefor to perform similar tests with XFS to determine the best performance and would like to test the widest range of larger chunks/Stripe Units possible, including those larger than XFS apparently permits. I am aware that XFS performance will not necessarily mirror that of performance tests of RAW RAID volumes but this needs to be verified by testing. It appears that XFS on RHEL7 and clones is limited to a maximum Stripe Unit of 256KB. Since it is not possible to specify the correct parameters (SU=1024K, SW=2), Is it possible and valid to specify an adjusted value where SU is reduced and SW is increased by the same factor. So using SU=256K, SW=8 would be the same as SU=1024K, SW=2 and give a total of 2MB Data. Is this valid? Are there any performance or other consequences of using different dimensions? Is there any issue with using other permutations e.g. SU=32K, SW=64? While I understand that XFS is intended to select optimum defaults, I am concerned and less than enthusiastic about the default settings particularly with larger RAID chunks. I also would like to find some information on how to correctly interpret the statistics output when formatting a volume with XFS, particularly as the process may use other settings which may require further investigation? If you cannot answer these questions directly, can you point me to a resource where I might find this information? Regards JW ------=_NextPart_000_02DA_01D040DA.06DDC5F0 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

I am new to = XFS, I have spent a significant time searching for information and have = not found any documentation relating to the use of XFS over RAID with N = Drives where the Stripe Unit >256K.

 

To be clear, = using (for example) 3 Disks with RAID 5 with a Stripe Unit of 1MB and = Stripe Width of 2 would give 2MB Data and 1M Parity.

 

I have found = through extensive testing of RAW RAID volumes with various chunk sizes = that larger chunks tend to produce the best performance in most cases = whether Sequential, Random, Read or Write, or in combinations. I am keen = therefor to perform similar tests with XFS to determine the best = performance and would like to test the widest range of larger = chunks/Stripe Units possible, including those larger than XFS apparently = permits. I am aware that XFS performance will not necessarily mirror = that of performance tests of RAW RAID volumes but this needs to be = verified by testing.

 

It appears = that XFS on RHEL7 and clones is limited to a maximum Stripe Unit of = 256KB.

 

Since it is not possible to specify the correct = parameters (SU=3D1024K, SW=3D2), Is it possible and valid to specify an = adjusted value where SU is reduced and SW is increased by the same = factor.

 

So using SU=3D256K, SW=3D8 would be the same as = SU=3D1024K, SW=3D2 and give a total of 2MB Data.

 

Is this = valid? Are there any performance or other consequences of using = different dimensions? Is there any issue with using other permutations = e.g. SU=3D32K, SW=3D64?

 

While I = understand that XFS is intended to select optimum defaults, I am = concerned and less than enthusiastic about the default settings = particularly with larger RAID chunks.

 

I also would = like to find some information on how to correctly interpret the = statistics output when formatting a volume with XFS, particularly as the = process may use other settings which may require further = investigation?

 

If you = cannot answer these questions directly, can you point me to a resource = where I might find this information?

 

Regards

 

JW

------=_NextPart_000_02DA_01D040DA.06DDC5F0-- From david@fromorbit.com Wed Feb 4 18:48:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E50D7FD0 for ; Wed, 4 Feb 2015 18:48:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FBCBAC005 for ; Wed, 4 Feb 2015 16:48:33 -0800 (PST) X-ASG-Debug-ID: 1423097292-04cbb0416ac2d490001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ABoZn0jeCoziDEz3 for ; Wed, 04 Feb 2015 16:48:13 -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: Ai8SAPG80lR5LHOV/2dsb2JhbABagwaBK4IyrUcBAQEBAQEGmCgCAgEBAoEiRAEBAQEBfYQMAQEBAwEnExwjBQsIAw4KCSUPBSUDIROIJQfWPAEBAQcCAR8YhWyJCBVXB4QpBZg6gRiDA45JIoICHIFkKjGBAwgXgSABAQE Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 11:18:11 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJAbu-0003dU-FJ; Thu, 05 Feb 2015 11:47:58 +1100 Date: Thu, 5 Feb 2015 11:47:58 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150205004758.GO4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1421925006-24231-20-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423097292 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 22, 2015 at 12:10:05PM +0100, Christoph Hellwig wrote: > Add operations to export pNFS block layouts from an XFS filesystem. See > the previous commit adding the operations for an explanation of them. > > Signed-off-by: Christoph Hellwig Note that I haven't applied this patch, or attempted to compile it yet.... > diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile > index d617999..df68285 100644 > --- a/fs/xfs/Makefile > +++ b/fs/xfs/Makefile > @@ -121,3 +121,4 @@ xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o > xfs-$(CONFIG_PROC_FS) += xfs_stats.o > xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o > xfs-$(CONFIG_COMPAT) += xfs_ioctl32.o > +xfs-$(CONFIG_NFSD_PNFS) += xfs_pnfs.o ... because I'll have to jump through hoops to get it to compile, I think. > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 74c6211..99465ba 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -602,6 +602,8 @@ xfs_growfs_data( > if (!mutex_trylock(&mp->m_growlock)) > return -EWOULDBLOCK; > error = xfs_growfs_data_private(mp, in); > + if (!error) > + mp->m_generation++; > mutex_unlock(&mp->m_growlock); > return error; > } Even on error I think we should bump this. Errors can come from secondary superblock updates after the filesystem has been grown, hence an error is not a reliable indication of whether the layout has changed or not. > +int > +xfs_fs_get_uuid( > + struct super_block *sb, > + u8 *buf, > + u32 *len, > + u64 *offset) > +{ > + struct xfs_mount *mp = XFS_M(sb); > + > + if (*len < sizeof(uuid_t)) > + return -EINVAL; > + > + memcpy(buf, &mp->m_sb.sb_uuid, sizeof(uuid_t)); > + *len = sizeof(uuid_t); > + *offset = offsetof(struct xfs_dsb, sb_uuid); What purpose does the offset serve here? I can't tell from the usage in the PNFS code. Can we ignore offset - as it seems entirely arbitrary - and still have this work? Either way, comment please. > +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 = -1; > + iomap->type = IOMAP_HOLE; > + } else if (imap->br_startblock == DELAYSTARTBLOCK) { > + iomap->blkno = -1; > + iomap->type = IOMAP_DELALLOC; I'd like to see a IOMAP_NULL_BLOCK define here for the -1 value, say: #define IOMAP_NULL_BLOCK -1LL > +int > +xfs_fs_map_blocks( > + struct inode *inode, > + loff_t offset, > + u64 length, > + struct iomap *iomap, > + bool write, > + u32 *device_generation) > +{ > + 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; > + loff_t limit; > + int bmapi_flags = XFS_BMAPI_ENTIRE; > + int nimaps = 1; > + uint lock_flags; > + int error = 0; > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; > + if (XFS_IS_REALTIME_INODE(ip)) > + return -ENXIO; OK, so we are not mapping realtime inodes here. Any specific reason? FWIW, that also means you can use XFS_FSB_TO_DADDR() in the iomap mapping as xfs_fsb_to_db() is only needed if we might be mapping realtime extents... > + for (i = 0; i < nr_maps; i++) { > + u64 start, length, end; > + > + start = maps[i].offset; > + if (start > size) > + continue; > + > + end = start + maps[i].length; > + if (end > size) > + end = size; > + > + length = end - start; > + if (!length) > + continue; > + ^^^^^ Stray whitespace > + tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); > + if (error) > + goto out_drop_iolock; > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > + > + xfs_setattr_time(ip, iattr); > + if (iattr->ia_valid & ATTR_SIZE) { > + if (iattr->ia_size > i_size_read(inode)) { > + i_size_write(inode, iattr->ia_size); > + ip->i_d.di_size = iattr->ia_size; > + } > + } The concern I have about this is that extending the file size can expose uninitialised blocks beyond the old EOF. That can happen if delayed allocation has previously been done on the file and we haven't trimmed the excess beyond EOF back yet. I know the pnfs server is not aimed at mixed usage, but it still makes me uncomfortable in the case where you have normal NFS and PNFS clients accessing the same files... > + xfs_trans_set_sync(tp); > + error = xfs_trans_commit(tp, 0); I just had a thought about these sync transctions - could the NFS server handle persistence of the maps via ->commit_metadata? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Feb 4 18:51:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 756707F6A for ; Wed, 4 Feb 2015 18:51:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 623E6304043 for ; Wed, 4 Feb 2015 16:51:50 -0800 (PST) X-ASG-Debug-ID: 1423097508-04cbb04168c2d640001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AB0OpDfL5VShACiL for ; Wed, 04 Feb 2015 16:51:48 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 11:21:18 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJAev-0003du-9Z; Thu, 05 Feb 2015 11:51:05 +1100 Date: Thu, 5 Feb 2015 11:51:05 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 20/20] xfs: recall pNFS layouts on conflicting access Message-ID: <20150205005105.GP4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 20/20] xfs: recall pNFS layouts on conflicting access References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-21-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1421925006-24231-21-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423097508 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 22, 2015 at 12:10:06PM +0100, Christoph Hellwig wrote: > Recall all outstanding pNFS layouts and truncates, writes and similar extent > list modifying operations. > > Signed-off-by: Christoph Hellwig This looks fine, assuming break_layout() doesn't require any other VFS inode locks to be held for serialisation. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Feb 4 19:02:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 11AC77F60 for ; Wed, 4 Feb 2015 19:02:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 94596AC002 for ; Wed, 4 Feb 2015 17:02:55 -0800 (PST) X-ASG-Debug-ID: 1423098172-04cb6c2e6bc5c290001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 0dj92PDfBD7uU3De for ; Wed, 04 Feb 2015 17:02:53 -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: AuwJANbA0lR5LHOV/2dsb2JhbABagwaBK4IyrUkBAQEBAQEGmCgEAgKBIkQBAQEBAX2EDAEBAQMBOhwjBQsIAw4KCSUPBSUDIROIJQfWNwELIBiFbIkcWAeEKQWYOoEYhUmIRoM9IoICHIFkKjGBAoFAAQEB Received: from ppp121-44-115-149.lns20.syd4.internode.on.net (HELO dastard) ([121.44.115.149]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Feb 2015 11:32:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJApp-0003gB-DR; Thu, 05 Feb 2015 12:02:21 +1100 Date: Thu, 5 Feb 2015 12:02:21 +1100 From: Dave Chinner To: James Woolliscroft Cc: xfs@oss.sgi.com Subject: Re: Using XFS on Raid Message-ID: <20150205010221.GQ4251@dastard> X-ASG-Orig-Subj: Re: Using XFS on Raid 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: 1423098172 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 05, 2015 at 12:23:53AM +0000, James Woolliscroft wrote: > Hi, > > > > I am new to XFS, I have spent a significant time searching for information > and have not found any documentation relating to the use of XFS over RAID > with N Drives where the Stripe Unit >256K. Use the defaults - they do the right thing. > It appears that XFS on RHEL7 and clones is limited to a maximum Stripe Unit > of 256KB. That's not correct. mkfs.xfs prior to v3.2.2 (i.e the latest) throw a warning about the default log stripe unit not being able to be set larger than 256k, but it then sets the lsu to a default of 32k and continues. The current version (which I think will hit RHEL7.1) omits the warning and just sets the lsu to 32k - defaults should just do the right thing and not bother users who are using defaults. Either version, however, will still result in the data stripe unit/width is still going to be 1m/2m in your case. > I also would like to find some information on how to correctly interpret the > statistics output when formatting a volume with XFS, particularly as the > process may use other settings which may require further investigation? They are a reflection of the command line parameters, or if not specified, the default CLI values. So, read the mkfs.xfs man page as it explains what everything means. Cheers, Dave. -- Dave Chinner david@fromorbit.com From hch@lst.de Thu Feb 5 01:09:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B22A97FF3 for ; Thu, 5 Feb 2015 01:09:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 826418F804B for ; Wed, 4 Feb 2015 23:09:05 -0800 (PST) X-ASG-Debug-ID: 1423120140-04bdf01eeea31270001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id Z8GqmNEHwl3Ibnqc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 04 Feb 2015 23:09:02 -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 CEE5114354; Thu, 5 Feb 2015 08:08:58 +0100 (CET) Date: Thu, 5 Feb 2015 08:08:58 +0100 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150205070858.GA593@lst.de> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205004758.GO4251@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1423120141 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 05, 2015 at 11:47:58AM +1100, Dave Chinner wrote: > > +++ b/fs/xfs/Makefile > > @@ -121,3 +121,4 @@ xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o > > xfs-$(CONFIG_PROC_FS) += xfs_stats.o > > xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o > > xfs-$(CONFIG_COMPAT) += xfs_ioctl32.o > > +xfs-$(CONFIG_NFSD_PNFS) += xfs_pnfs.o > > ... because I'll have to jump through hoops to get it to compile, I > think. Just get the whole git tree from git://git.infradead.org/users/hch/pnfs.git pnfsd-for-3.20-3 > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > > index 74c6211..99465ba 100644 > > --- a/fs/xfs/xfs_fsops.c > > +++ b/fs/xfs/xfs_fsops.c > > @@ -602,6 +602,8 @@ xfs_growfs_data( > > if (!mutex_trylock(&mp->m_growlock)) > > return -EWOULDBLOCK; > > error = xfs_growfs_data_private(mp, in); > > + if (!error) > > + mp->m_generation++; > > mutex_unlock(&mp->m_growlock); > > return error; > > } > > Even on error I think we should bump this. Errors can come from > secondary superblock updates after the filesystem has been grown, > hence an error is not a reliable indication of whether the layout > has changed or not. Ok. > > > +int > > +xfs_fs_get_uuid( > > + struct super_block *sb, > > + u8 *buf, > > + u32 *len, > > + u64 *offset) > > +{ > > + struct xfs_mount *mp = XFS_M(sb); > > + > > + if (*len < sizeof(uuid_t)) > > + return -EINVAL; > > + > > + memcpy(buf, &mp->m_sb.sb_uuid, sizeof(uuid_t)); > > + *len = sizeof(uuid_t); > > + *offset = offsetof(struct xfs_dsb, sb_uuid); > > What purpose does the offset serve here? I can't tell from the usage > in the PNFS code. Can we ignore offset - as it seems entirely > arbitrary - and still have this work? Either way, comment please. The get_uuid methods gets content and location of the uuid so that the client can find the disks. The offset simply is part of the wire protocol. > I'd like to see a IOMAP_NULL_BLOCK define here for the -1 value, > say: > > #define IOMAP_NULL_BLOCK -1LL Ok. > OK, so we are not mapping realtime inodes here. Any specific reason? The realtime device doesn't have a way for the client to find it, as it doesn't have its own superblockuuids. > FWIW, that also means you can use XFS_FSB_TO_DADDR() in the iomap > mapping as xfs_fsb_to_db() is only needed if we might be mapping > realtime extents... ok. > > + tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); > > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); > > + if (error) > > + goto out_drop_iolock; > > + > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > > + > > + xfs_setattr_time(ip, iattr); > > + if (iattr->ia_valid & ATTR_SIZE) { > > + if (iattr->ia_size > i_size_read(inode)) { > > + i_size_write(inode, iattr->ia_size); > > + ip->i_d.di_size = iattr->ia_size; > > + } > > + } > > The concern I have about this is that extending the file size can > expose uninitialised blocks beyond the old EOF. That can happen if > delayed allocation has previously been done on the file and we > haven't trimmed the excess beyond EOF back yet. I know the pnfs > server is not aimed at mixed usage, but it still makes me > uncomfortable in the case where you have normal NFS and PNFS clients > accessing the same files... The protocol only allows to commit to a size that we previously returned a layout for, which means we already have allocated space for it at same time. For robustness reasons a sanity check might make sense, though. > > + xfs_trans_set_sync(tp); > > + error = xfs_trans_commit(tp, 0); > > I just had a thought about these sync transctions - could the NFS > server handle persistence of the maps via ->commit_metadata? It probably could, but that wouldn't buy us anything over just committing the transaction synchronously. From hch@lst.de Thu Feb 5 07:58:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3E1EE7FC0 for ; Thu, 5 Feb 2015 07:58:04 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B02F5AC001 for ; Thu, 5 Feb 2015 05:58:00 -0800 (PST) X-ASG-Debug-ID: 1423144678-04cbb04168c40400001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id 0SVEXQRu7mlpacL5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 05:57:58 -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 8212014357; Thu, 5 Feb 2015 14:57:56 +0100 (CET) Date: Thu, 5 Feb 2015 14:57:56 +0100 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150205135756.GA6386@lst.de> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205070858.GA593@lst.de> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1423144678 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I've updated the patch and pushed out a new pnfsd-for-3.20-4 branch. The changes relative to the old one are below: diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 99465ba..48561a0 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -602,8 +602,12 @@ xfs_growfs_data( if (!mutex_trylock(&mp->m_growlock)) return -EWOULDBLOCK; error = xfs_growfs_data_private(mp, in); - if (!error) - mp->m_generation++; + /* + * Increment the generation unconditionally, the error could be from + * updating the secondary superblocks, in which case the new size + * is live already. + */ + mp->m_generation++; mutex_unlock(&mp->m_growlock); return error; } diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index ab5ee78..7440b40 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -15,6 +15,7 @@ #include "xfs_error.h" #include "xfs_iomap.h" #include "xfs_shared.h" +#include "xfs_bit.h" #include "xfs_pnfs.h" /* @@ -48,6 +49,10 @@ xfs_break_layouts( return error; } +/* + * Get a uniqueue ID including its location so that the client can identify + * the exported device. + */ int xfs_fs_get_uuid( struct super_block *sb, @@ -57,6 +62,10 @@ xfs_fs_get_uuid( { struct xfs_mount *mp = XFS_M(sb); + printk_once(KERN_NOTICE +"XFS (%s): using experimental pNFS feature, use at your own risk!\n", + mp->m_fsname); + if (*len < sizeof(uuid_t)) return -EINVAL; @@ -75,13 +84,14 @@ xfs_bmbt_to_iomap( struct xfs_mount *mp = ip->i_mount; if (imap->br_startblock == HOLESTARTBLOCK) { - iomap->blkno = -1; + iomap->blkno = IOMAP_NULL_BLOCK; iomap->type = IOMAP_HOLE; } else if (imap->br_startblock == DELAYSTARTBLOCK) { - iomap->blkno = -1; + iomap->blkno = IOMAP_NULL_BLOCK; iomap->type = IOMAP_DELALLOC; } else { - iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); + iomap->blkno = + XFS_FSB_TO_DADDR(ip->i_mount, imap->br_startblock); if (imap->br_state == XFS_EXT_UNWRITTEN) iomap->type = IOMAP_UNWRITTEN; else @@ -115,6 +125,12 @@ xfs_fs_map_blocks( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; + + /* + * We can't export inodes residing on the realtime device. The realtime + * device doesn't have a UUID to identify it, so the client has no way + * to find it. + */ if (XFS_IS_REALTIME_INODE(ip)) return -ENXIO; @@ -190,6 +206,32 @@ out_unlock: } /* + * Ensure the size update falls into a valid allocated block. + */ +static int +xfs_pnfs_validate_isize( + struct xfs_inode *ip, + xfs_off_t isize) +{ + struct xfs_bmbt_irec imap; + int nimaps = 1; + int error = 0; + + xfs_ilock(ip, XFS_ILOCK_SHARED); + error = xfs_bmapi_read(ip, XFS_B_TO_FSBT(ip->i_mount, isize - 1), 1, + &imap, &nimaps, 0); + xfs_iunlock(ip, XFS_ILOCK_SHARED); + if (error) + return error; + + if (imap.br_startblock == HOLESTARTBLOCK || + imap.br_startblock == DELAYSTARTBLOCK || + imap.br_state == XFS_EXT_UNWRITTEN) + return -EIO; + return 0; +} + +/* * Make sure the blocks described by maps are stable on disk. This includes * converting any unwritten extents, flushing the disk cache and updating the * time stamps. @@ -209,6 +251,7 @@ xfs_fs_commit_blocks( struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; struct xfs_trans *tp; + bool update_isize = false; int error, i; loff_t size; @@ -217,8 +260,10 @@ xfs_fs_commit_blocks( xfs_ilock(ip, XFS_IOLOCK_EXCL); size = i_size_read(inode); - if ((iattr->ia_valid & ATTR_SIZE) && iattr->ia_size > size) + if ((iattr->ia_valid & ATTR_SIZE) && iattr->ia_size > size) { + update_isize = true; size = iattr->ia_size; + } for (i = 0; i < nr_maps; i++) { u64 start, length, end; @@ -248,6 +293,12 @@ xfs_fs_commit_blocks( goto out_drop_iolock; } + if (update_isize) { + error = xfs_pnfs_validate_isize(ip, size); + if (error) + goto out_drop_iolock; + } + tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); if (error) @@ -258,11 +309,9 @@ xfs_fs_commit_blocks( xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_setattr_time(ip, iattr); - if (iattr->ia_valid & ATTR_SIZE) { - if (iattr->ia_size > i_size_read(inode)) { - i_size_write(inode, iattr->ia_size); - ip->i_d.di_size = iattr->ia_size; - } + if (update_isize) { + i_size_write(inode, iattr->ia_size); + ip->i_d.di_size = iattr->ia_size; } xfs_trans_set_sync(tp); diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index ff46bf7..fa05e04 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h @@ -187,6 +187,8 @@ struct fid { #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 */ From bfoster@redhat.com Thu Feb 5 08:08:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD81A7FFC for ; Thu, 5 Feb 2015 08:08:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ACB1D8F8040 for ; Thu, 5 Feb 2015 06:08:38 -0800 (PST) X-ASG-Debug-ID: 1423145314-04bdf01eeea3c030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UcFBBGdOgcvgcvzB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:08:34 -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 (8.14.4/8.14.4) with ESMTP id t15E8X8a006619 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 09:08:34 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15E8UAn026274 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:08:32 -0500 Date: Thu, 5 Feb 2015 09:08:29 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: fix panic_mask documentation Message-ID: <20150205140829.GA31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix panic_mask documentation References: <54D0F858.5010804@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54D0F858.5010804@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145314 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Feb 03, 2015 at 10:33:28AM -0600, Eric Sandeen wrote: > This bit of the docs didn't quite reflect reality. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt > index 5be51fd..157d440 100644 > --- a/Documentation/filesystems/xfs.txt > +++ b/Documentation/filesystems/xfs.txt > @@ -287,7 +287,7 @@ The following sysctls are available for the XFS filesystem: > XFS_ERRLEVEL_LOW: 1 > XFS_ERRLEVEL_HIGH: 5 > > - fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127) > + fs.xfs.panic_mask (Min: 0 Default: 0 Max: 255) > Causes certain error conditions to call BUG(). Value is a bitmask; > AND together the tags which represent errors which should cause panics: Looks good, though shouldn't the above say "OR together the tags ..?" Brian > > @@ -299,6 +299,7 @@ The following sysctls are available for the XFS filesystem: > XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010 > XFS_PTAG_SHUTDOWN_IOERROR 0x00000020 > XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 > + XFS_PTAG_FSBLOCK_ZERO 0x00000080 > > This option is intended for debugging only. > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:08:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C6B948004 for ; Thu, 5 Feb 2015 08:08:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B540A8F8054 for ; Thu, 5 Feb 2015 06:08:48 -0800 (PST) X-ASG-Debug-ID: 1423145326-04cbb04168c408e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TWADyBli6W6BxZfA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:08:47 -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 (8.14.4/8.14.4) with ESMTP id t15E8iO8024728 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:08:44 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15E8eME027567 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:08:43 -0500 Date: Thu, 5 Feb 2015 09:08:40 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb Message-ID: <20150205140840.GB31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb References: <1423083249-27493-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145327 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:02AM +1100, Dave Chinner wrote: > Hi folks, > > This is the second version of the generic per-cpu counter rework > patch series. The first version can be found here: > > http://oss.sgi.com/archives/xfs/2015-02/msg00000.html > > New in V2: > > - drop the moving of the struct xfs_sb to xfs_super.h > - fixed all the little things that Christoph and Brian noted. > - keep the per-cpu counters in the struct xfs_mount and keep the > functions to sync them with the struct xfs_sb values when read > from disk or written to disk. > - integrated Christoph Hellwig's additional cleanup patch. This was > done by: > - intergating xfs_mod_XXX factoring into the relevant percpu > counter conversion patch > - separating out xfs_mod_frextents into it's won patch > - separating out the replacement of > xfs_mod_incore_sb_batched > - doing all the now unused API removal in a separate patch > > The series passes xfstests without regressions, and no scalability > issues have been seen in my performance tests on a 16p VM. SGI - you > still need to test this, though. :) > > Thoughts, comments? > All in all this looks pretty good to me save a couple notes pointed out in the patches. In a quick test, this handles the imaxct overshoot problem Eric noted much better than the current implementation. That said, it's still not precise. My understanding is that's fine, but I wonder if we want to tack on a variant of Eric's original patch as well so when we still do overshoot imaxpct (albeit by much less than before: I reproduce an overshoot of <100 inodes vs several thousand) we at least report an accurate inode count. Thoughts? Brian > -Dave. > > PS: diffstat of the series is now: > > fs/xfs/libxfs/xfs_bmap.c | 40 +-- > fs/xfs/libxfs/xfs_format.h | 62 ---- > fs/xfs/libxfs/xfs_ialloc.c | 6 +- > fs/xfs/libxfs/xfs_sb.c | 12 +- > fs/xfs/xfs_fsops.c | 20 +- > fs/xfs/xfs_iomap.c | 3 +- > fs/xfs/xfs_linux.h | 9 - > fs/xfs/xfs_log_recover.c | 4 +- > fs/xfs/xfs_mount.c | 919 ++++++----------------------------------------- > fs/xfs/xfs_mount.h | 95 +---- > fs/xfs/xfs_super.c | 103 ++++-- > fs/xfs/xfs_super.h | 2 + > fs/xfs/xfs_trans.c | 234 +++++++----- > 13 files changed, 381 insertions(+), 1128 deletions(-) > > So we have a net reduction of roughly 750 lines of code. When > combined with the changes to the superblock logging that has already > been committed, we have reduced the superblock modification code by > close to 1000 lines compared to 3.19... > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:09:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B38AA7FFC for ; Thu, 5 Feb 2015 08:09:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22B68AC001 for ; Thu, 5 Feb 2015 06:09:43 -0800 (PST) X-ASG-Debug-ID: 1423145380-04cbb0416ac40960001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lNJUfGqfjH3I5kvF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:09:41 -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 (8.14.4/8.14.4) with ESMTP id t15E9cBa008402 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:09:39 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15E9XZ4010108 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:09:36 -0500 Date: Thu, 5 Feb 2015 09:09:33 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: use generic percpu counters for inode counter Message-ID: <20150205140933.GC31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: use generic percpu counters for inode counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145381 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:03AM +1100, Dave Chinner wrote: > XFS has hand-rolled per-cpu counters for the superblock since before > there was any generic implementation. There are some warts around > the use of them for the inode counter as the hand rolled counter is > designed to be accurate at zero, but has no specific accurracy at > any other value. This design causes problems for the maximum inode > count threshold enforcement, as there is no trigger that balances > the counters as they get close tothe maximum threshold. > > Instead of designing new triggers for balancing, just replace the > handrolled per-cpu counter with a generic counter. This enables us > to update the counter through the normal superblock modification > funtions, but rather than do that we add a xfs_mod_icount() helper > function (from Christoph Hellwig) and keep the percpu counter > outside the superblock in the struct xfs_mount. > > This means we still need to initialise the per-cpu counter > specifically when we read the superblock, and vice versa when we > log/write it, but it does mean that we don't need to change any > other code. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_ialloc.c | 6 ++-- > fs/xfs/libxfs/xfs_sb.c | 2 ++ > fs/xfs/xfs_fsops.c | 3 +- > fs/xfs/xfs_mount.c | 76 +++++++++++++++++++++------------------------- > fs/xfs/xfs_mount.h | 7 +++-- > fs/xfs/xfs_super.c | 7 +++-- > fs/xfs/xfs_trans.c | 5 ++- > 7 files changed, 54 insertions(+), 52 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 116ef1d..5b4ba9f 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -376,7 +376,8 @@ xfs_ialloc_ag_alloc( > */ > newlen = args.mp->m_ialloc_inos; > if (args.mp->m_maxicount && > - args.mp->m_sb.sb_icount + newlen > args.mp->m_maxicount) > + percpu_counter_read(&args.mp->m_icount) + newlen > > + args.mp->m_maxicount) > return -ENOSPC; > args.minlen = args.maxlen = args.mp->m_ialloc_blks; > /* > @@ -1340,7 +1341,8 @@ xfs_dialloc( > * inode. > */ > if (mp->m_maxicount && > - mp->m_sb.sb_icount + mp->m_ialloc_inos > mp->m_maxicount) { > + percpu_counter_read(&mp->m_icount) + mp->m_ialloc_inos > > + mp->m_maxicount) { > noroom = 1; > okalloc = 0; > } > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index b0a5fe9..017cb2f 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -771,6 +771,8 @@ xfs_log_sb( > struct xfs_mount *mp = tp->t_mountp; > struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); > > + mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); > + > xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb)); > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index f711452..e1470f2 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -631,11 +631,12 @@ xfs_fs_counts( > xfs_fsop_counts_t *cnt) > { > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > + cnt->allocino = percpu_counter_read_positive(&mp->m_icount); > + > spin_lock(&mp->m_sb_lock); > cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > cnt->freertx = mp->m_sb.sb_frextents; > cnt->freeino = mp->m_sb.sb_ifree; > - cnt->allocino = mp->m_sb.sb_icount; > spin_unlock(&mp->m_sb_lock); > return 0; > } > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 4fa80e6..702ea6a 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1099,6 +1099,21 @@ xfs_log_sbcount(xfs_mount_t *mp) > return xfs_sync_sb(mp, true); > } > > +int > +xfs_mod_icount( > + struct xfs_mount *mp, > + int64_t delta) > +{ > + /* deltas are +/-64, hence the large batch size of 128. */ > + __percpu_counter_add(&mp->m_icount, delta, 128); > + if (percpu_counter_compare(&mp->m_icount, 0) < 0) { > + ASSERT(0); > + percpu_counter_add(&mp->m_icount, -delta); > + return -EINVAL; > + } > + return 0; > +} > + > /* > * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > * a delta to a specified field in the in-core superblock. Simply > @@ -1127,14 +1142,8 @@ xfs_mod_incore_sb_unlocked( > */ > switch (field) { > case XFS_SBS_ICOUNT: > - lcounter = (long long)mp->m_sb.sb_icount; > - lcounter += delta; > - if (lcounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_icount = lcounter; > - return 0; > + ASSERT(0); > + return -ENOSPC; > case XFS_SBS_IFREE: > lcounter = (long long)mp->m_sb.sb_ifree; > lcounter += delta; > @@ -1288,8 +1297,9 @@ xfs_mod_incore_sb( > int status; > > #ifdef HAVE_PERCPU_SB > - ASSERT(field < XFS_SBS_ICOUNT || field > XFS_SBS_FDBLOCKS); > + ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); > #endif Not really sure why the above changes, since XFS_SBS_IFREE > XFS_SBS_ICOUNT. This goes away, so it doesn't matter. :) Reviewed-by: Brian Foster > + > spin_lock(&mp->m_sb_lock); > status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > spin_unlock(&mp->m_sb_lock); > @@ -1492,7 +1502,6 @@ xfs_icsb_cpu_notify( > case CPU_ONLINE: > case CPU_ONLINE_FROZEN: > xfs_icsb_lock(mp); > - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > @@ -1504,17 +1513,14 @@ xfs_icsb_cpu_notify( > * re-enable the counters. */ > xfs_icsb_lock(mp); > spin_lock(&mp->m_sb_lock); > - xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); > xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); > xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > > - mp->m_sb.sb_icount += cntp->icsb_icount; > mp->m_sb.sb_ifree += cntp->icsb_ifree; > mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_ICOUNT, 0); > xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > spin_unlock(&mp->m_sb_lock); > @@ -1531,11 +1537,18 @@ xfs_icsb_init_counters( > xfs_mount_t *mp) > { > xfs_icsb_cnts_t *cntp; > + int error; > int i; > > + error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); > + if (error) > + return error; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > - if (mp->m_sb_cnts == NULL) > + if (!mp->m_sb_cnts) { > + percpu_counter_destroy(&mp->m_icount); > return -ENOMEM; > + } > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > @@ -1563,13 +1576,14 @@ void > xfs_icsb_reinit_counters( > xfs_mount_t *mp) > { > + percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount); > + > xfs_icsb_lock(mp); > /* > * start with all counters disabled so that the > * initial balance kicks us off correctly > */ > mp->m_icsb_counters = -1; > - xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > @@ -1583,6 +1597,9 @@ xfs_icsb_destroy_counters( > unregister_hotcpu_notifier(&mp->m_icsb_notifier); > free_percpu(mp->m_sb_cnts); > } > + > + percpu_counter_destroy(&mp->m_icount); > + > mutex_destroy(&mp->m_icsb_mutex); > } > > @@ -1645,7 +1662,6 @@ xfs_icsb_count( > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - cnt->icsb_icount += cntp->icsb_icount; > cnt->icsb_ifree += cntp->icsb_ifree; > cnt->icsb_fdblocks += cntp->icsb_fdblocks; > } > @@ -1659,7 +1675,7 @@ xfs_icsb_counter_disabled( > xfs_mount_t *mp, > xfs_sb_field_t field) > { > - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > return test_bit(field, &mp->m_icsb_counters); > } > > @@ -1670,7 +1686,7 @@ xfs_icsb_disable_counter( > { > xfs_icsb_cnts_t cnt; > > - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > > /* > * If we are already disabled, then there is nothing to do > @@ -1689,9 +1705,6 @@ xfs_icsb_disable_counter( > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > switch(field) { > - case XFS_SBS_ICOUNT: > - mp->m_sb.sb_icount = cnt.icsb_icount; > - break; > case XFS_SBS_IFREE: > mp->m_sb.sb_ifree = cnt.icsb_ifree; > break; > @@ -1716,15 +1729,12 @@ xfs_icsb_enable_counter( > xfs_icsb_cnts_t *cntp; > int i; > > - ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > > xfs_icsb_lock_all_counters(mp); > for_each_online_cpu(i) { > cntp = per_cpu_ptr(mp->m_sb_cnts, i); > switch (field) { > - case XFS_SBS_ICOUNT: > - cntp->icsb_icount = count + resid; > - break; > case XFS_SBS_IFREE: > cntp->icsb_ifree = count + resid; > break; > @@ -1750,8 +1760,6 @@ xfs_icsb_sync_counters_locked( > > xfs_icsb_count(mp, &cnt, flags); > > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_ICOUNT)) > - mp->m_sb.sb_icount = cnt.icsb_icount; > if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) > mp->m_sb.sb_ifree = cnt.icsb_ifree; > if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > @@ -1805,12 +1813,6 @@ xfs_icsb_balance_counter_locked( > > /* update counters - first CPU gets residual*/ > switch (field) { > - case XFS_SBS_ICOUNT: > - count = mp->m_sb.sb_icount; > - resid = do_div(count, weight); > - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) > - return; > - break; > case XFS_SBS_IFREE: > count = mp->m_sb.sb_ifree; > resid = do_div(count, weight); > @@ -1871,14 +1873,6 @@ again: > } > > switch (field) { > - case XFS_SBS_ICOUNT: > - lcounter = icsbp->icsb_icount; > - lcounter += delta; > - if (unlikely(lcounter < 0)) > - goto balance_counter; > - icsbp->icsb_icount = lcounter; > - break; > - > case XFS_SBS_IFREE: > lcounter = icsbp->icsb_ifree; > lcounter += delta; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index a5b2ff8..457c6e3 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -41,7 +41,6 @@ struct xfs_da_geometry; > typedef struct xfs_icsb_cnts { > uint64_t icsb_fdblocks; > uint64_t icsb_ifree; > - uint64_t icsb_icount; > unsigned long icsb_flags; > } xfs_icsb_cnts_t; > > @@ -81,8 +80,11 @@ typedef struct xfs_mount { > struct super_block *m_super; > xfs_tid_t m_tid; /* next unused tid for fs */ > struct xfs_ail *m_ail; /* fs active log item list */ > - xfs_sb_t m_sb; /* copy of fs superblock */ > + > + struct xfs_sb m_sb; /* copy of fs superblock */ > spinlock_t m_sb_lock; /* sb counter lock */ > + struct percpu_counter m_icount; /* allocated inodes counter */ > + > struct xfs_buf *m_sb_bp; /* buffer for superblock */ > char *m_fsname; /* filesystem name */ > int m_fsname_len; /* strlen of fs name */ > @@ -377,6 +379,7 @@ extern void xfs_unmountfs(xfs_mount_t *); > extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); > extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > uint, int); > +extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); > extern int xfs_mount_log_sb(xfs_mount_t *); > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > extern int xfs_readsb(xfs_mount_t *, int); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 40d2ac5..87e169f 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1087,6 +1087,7 @@ xfs_fs_statfs( > xfs_sb_t *sbp = &mp->m_sb; > struct xfs_inode *ip = XFS_I(dentry->d_inode); > __uint64_t fakeinos, id; > + __uint64_t icount; > xfs_extlen_t lsize; > __int64_t ffree; > > @@ -1098,6 +1099,7 @@ xfs_fs_statfs( > statp->f_fsid.val[1] = (u32)(id >> 32); > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > + icount = percpu_counter_sum(&mp->m_icount); > > spin_lock(&mp->m_sb_lock); > statp->f_bsize = sbp->sb_blocksize; > @@ -1106,15 +1108,14 @@ xfs_fs_statfs( > statp->f_bfree = statp->f_bavail = > sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > fakeinos = statp->f_bfree << sbp->sb_inopblog; > - statp->f_files = > - MIN(sbp->sb_icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); > + statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); > if (mp->m_maxicount) > statp->f_files = min_t(typeof(statp->f_files), > statp->f_files, > mp->m_maxicount); > > /* make sure statp->f_ffree does not underflow */ > - ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); > + ffree = statp->f_files - (icount - sbp->sb_ifree); > statp->f_ffree = max_t(__int64_t, ffree, 0); > > spin_unlock(&mp->m_sb_lock); > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index eb90cd5..9bc742b 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -554,8 +554,7 @@ xfs_trans_unreserve_and_mod_sb( > } > > if (idelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, > - idelta, rsvd); > + error = xfs_mod_icount(mp, idelta); > if (error) > goto out_undo_fdblocks; > } > @@ -634,7 +633,7 @@ out_undo_ifreecount: > xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); > out_undo_icount: > if (idelta) > - xfs_icsb_modify_counters(mp, XFS_SBS_ICOUNT, -idelta, rsvd); > + xfs_mod_icount(mp, -idelta); > out_undo_fdblocks: > if (blkdelta) > xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:10:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 025637FFC for ; Thu, 5 Feb 2015 08:10:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E524E8F804C for ; Thu, 5 Feb 2015 06:10:13 -0800 (PST) X-ASG-Debug-ID: 1423145412-04cbb04168c40990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rdPaZPy9Upba6673 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10:12 -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 (8.14.4/8.14.4) with ESMTP id t15EA9v1024902 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:10:10 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EA5Nx027315 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:10:08 -0500 Date: Thu, 5 Feb 2015 09:10:05 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] xfs: use generic percpu counters for free inode counter Message-ID: <20150205141005.GD31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: use generic percpu counters for free inode counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145412 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:04AM +1100, Dave Chinner wrote: > From: Dave Chinner > > XFS has hand-rolled per-cpu counters for the superblock since before > there was any generic implementation. The free inode counter is not > used for any limit enforcement - the per-AG free inode counters are > used during allocation to determine if there are inode available for > allocation. > > Hence we don't need any of the complexity of the hand-rolled > counters and we can simply replace them with generic per-cpu > counters similar to the inode counter. > > This version introduces a xfs_mod_ifree() helper function from > Christoph Hellwig. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_sb.c | 1 + > fs/xfs/xfs_fsops.c | 2 +- > fs/xfs/xfs_mount.c | 76 ++++++++++++++++++++++---------------------------- > fs/xfs/xfs_mount.h | 2 ++ > fs/xfs/xfs_super.c | 4 ++- > fs/xfs/xfs_trans.c | 5 ++-- > 6 files changed, 42 insertions(+), 48 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 017cb2f..b66aeab 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -772,6 +772,7 @@ xfs_log_sb( > struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); > > mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); > + mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); > > xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index e1470f2..fa74d03 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -632,11 +632,11 @@ xfs_fs_counts( > { > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > cnt->allocino = percpu_counter_read_positive(&mp->m_icount); > + cnt->freeino = percpu_counter_read_positive(&mp->m_ifree); > > spin_lock(&mp->m_sb_lock); > cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > cnt->freertx = mp->m_sb.sb_frextents; > - cnt->freeino = mp->m_sb.sb_ifree; > spin_unlock(&mp->m_sb_lock); > return 0; > } > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 702ea6a..650e8f1 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1114,6 +1114,20 @@ xfs_mod_icount( > return 0; > } > > + > +int > +xfs_mod_ifree( > + struct xfs_mount *mp, > + int64_t delta) > +{ > + percpu_counter_add(&mp->m_ifree, delta); > + if (percpu_counter_compare(&mp->m_ifree, 0) < 0) { > + ASSERT(0); > + percpu_counter_add(&mp->m_ifree, -delta); > + return -EINVAL; > + } > + return 0; > +} > /* > * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > * a delta to a specified field in the in-core superblock. Simply > @@ -1142,17 +1156,9 @@ xfs_mod_incore_sb_unlocked( > */ > switch (field) { > case XFS_SBS_ICOUNT: > - ASSERT(0); > - return -ENOSPC; > case XFS_SBS_IFREE: > - lcounter = (long long)mp->m_sb.sb_ifree; > - lcounter += delta; > - if (lcounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_ifree = lcounter; > - return 0; > + ASSERT(0); > + return -EINVAL; > case XFS_SBS_FDBLOCKS: > lcounter = (long long) > mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > @@ -1502,7 +1508,6 @@ xfs_icsb_cpu_notify( > case CPU_ONLINE: > case CPU_ONLINE_FROZEN: > xfs_icsb_lock(mp); > - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > break; > @@ -1513,15 +1518,12 @@ xfs_icsb_cpu_notify( > * re-enable the counters. */ > xfs_icsb_lock(mp); > spin_lock(&mp->m_sb_lock); > - xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); > xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > > - mp->m_sb.sb_ifree += cntp->icsb_ifree; > mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > spin_unlock(&mp->m_sb_lock); > xfs_icsb_unlock(mp); > @@ -1544,10 +1546,14 @@ xfs_icsb_init_counters( > if (error) > return error; > > + error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); > + if (error) > + goto free_icount; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > if (!mp->m_sb_cnts) { > - percpu_counter_destroy(&mp->m_icount); > - return -ENOMEM; > + error = -ENOMEM; > + goto free_ifree; > } > > for_each_online_cpu(i) { > @@ -1570,6 +1576,12 @@ xfs_icsb_init_counters( > #endif /* CONFIG_HOTPLUG_CPU */ > > return 0; > + > +free_ifree: > + percpu_counter_destroy(&mp->m_ifree); > +free_icount: > + percpu_counter_destroy(&mp->m_icount); > + return error; > } > > void > @@ -1577,6 +1589,7 @@ xfs_icsb_reinit_counters( > xfs_mount_t *mp) > { > percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount); > + percpu_counter_set(&mp->m_ifree, mp->m_sb.sb_ifree); > > xfs_icsb_lock(mp); > /* > @@ -1584,7 +1597,6 @@ xfs_icsb_reinit_counters( > * initial balance kicks us off correctly > */ > mp->m_icsb_counters = -1; > - xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); > xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > } > @@ -1599,6 +1611,7 @@ xfs_icsb_destroy_counters( > } > > percpu_counter_destroy(&mp->m_icount); > + percpu_counter_destroy(&mp->m_ifree); > > mutex_destroy(&mp->m_icsb_mutex); > } > @@ -1662,7 +1675,6 @@ xfs_icsb_count( > > for_each_online_cpu(i) { > cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - cnt->icsb_ifree += cntp->icsb_ifree; > cnt->icsb_fdblocks += cntp->icsb_fdblocks; > } > > @@ -1675,7 +1687,7 @@ xfs_icsb_counter_disabled( > xfs_mount_t *mp, > xfs_sb_field_t field) > { > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > return test_bit(field, &mp->m_icsb_counters); > } > > @@ -1686,7 +1698,7 @@ xfs_icsb_disable_counter( > { > xfs_icsb_cnts_t cnt; > > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > > /* > * If we are already disabled, then there is nothing to do > @@ -1705,9 +1717,6 @@ xfs_icsb_disable_counter( > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > switch(field) { > - case XFS_SBS_IFREE: > - mp->m_sb.sb_ifree = cnt.icsb_ifree; > - break; > case XFS_SBS_FDBLOCKS: > mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > break; > @@ -1729,15 +1738,12 @@ xfs_icsb_enable_counter( > xfs_icsb_cnts_t *cntp; > int i; > > - ASSERT((field >= XFS_SBS_IFREE) && (field <= XFS_SBS_FDBLOCKS)); > + ASSERT(field == XFS_SBS_FDBLOCKS); > > xfs_icsb_lock_all_counters(mp); > for_each_online_cpu(i) { > cntp = per_cpu_ptr(mp->m_sb_cnts, i); > switch (field) { > - case XFS_SBS_IFREE: > - cntp->icsb_ifree = count + resid; > - break; > case XFS_SBS_FDBLOCKS: > cntp->icsb_fdblocks = count + resid; > break; > @@ -1760,8 +1766,6 @@ xfs_icsb_sync_counters_locked( > > xfs_icsb_count(mp, &cnt, flags); > > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_IFREE)) > - mp->m_sb.sb_ifree = cnt.icsb_ifree; > if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > } > @@ -1813,12 +1817,6 @@ xfs_icsb_balance_counter_locked( > > /* update counters - first CPU gets residual*/ > switch (field) { > - case XFS_SBS_IFREE: > - count = mp->m_sb.sb_ifree; > - resid = do_div(count, weight); > - if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) > - return; > - break; > case XFS_SBS_FDBLOCKS: > count = mp->m_sb.sb_fdblocks; > resid = do_div(count, weight); > @@ -1873,14 +1871,6 @@ again: > } > > switch (field) { > - case XFS_SBS_IFREE: > - lcounter = icsbp->icsb_ifree; > - lcounter += delta; > - if (unlikely(lcounter < 0)) > - goto balance_counter; > - icsbp->icsb_ifree = lcounter; > - break; > - > case XFS_SBS_FDBLOCKS: > BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 457c6e3..0cb32ce 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -84,6 +84,7 @@ typedef struct xfs_mount { > struct xfs_sb m_sb; /* copy of fs superblock */ > spinlock_t m_sb_lock; /* sb counter lock */ > struct percpu_counter m_icount; /* allocated inodes counter */ > + struct percpu_counter m_ifree; /* free inodes counter */ > > struct xfs_buf *m_sb_bp; /* buffer for superblock */ > char *m_fsname; /* filesystem name */ > @@ -380,6 +381,7 @@ extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); > extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > uint, int); > extern int xfs_mod_icount(struct xfs_mount *mp, int64_t delta); > +extern int xfs_mod_ifree(struct xfs_mount *mp, int64_t delta); > extern int xfs_mount_log_sb(xfs_mount_t *); > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > extern int xfs_readsb(xfs_mount_t *, int); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 87e169f..e06aa6b 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1088,6 +1088,7 @@ xfs_fs_statfs( > struct xfs_inode *ip = XFS_I(dentry->d_inode); > __uint64_t fakeinos, id; > __uint64_t icount; > + __uint64_t ifree; > xfs_extlen_t lsize; > __int64_t ffree; > > @@ -1100,6 +1101,7 @@ xfs_fs_statfs( > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > icount = percpu_counter_sum(&mp->m_icount); > + ifree = percpu_counter_sum(&mp->m_ifree); > > spin_lock(&mp->m_sb_lock); > statp->f_bsize = sbp->sb_blocksize; > @@ -1115,7 +1117,7 @@ xfs_fs_statfs( > mp->m_maxicount); > > /* make sure statp->f_ffree does not underflow */ > - ffree = statp->f_files - (icount - sbp->sb_ifree); > + ffree = statp->f_files - (icount - ifree); > statp->f_ffree = max_t(__int64_t, ffree, 0); > > spin_unlock(&mp->m_sb_lock); > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 9bc742b..68680ce 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -560,8 +560,7 @@ xfs_trans_unreserve_and_mod_sb( > } > > if (ifreedelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, > - ifreedelta, rsvd); > + error = xfs_mod_ifree(mp, ifreedelta); > if (error) > goto out_undo_icount; > } > @@ -630,7 +629,7 @@ xfs_trans_unreserve_and_mod_sb( > > out_undo_ifreecount: > if (ifreedelta) > - xfs_icsb_modify_counters(mp, XFS_SBS_IFREE, -ifreedelta, rsvd); > + xfs_mod_ifree(mp, -ifreedelta); > out_undo_icount: > if (idelta) > xfs_mod_icount(mp, -idelta); > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bonbons@linux-vserver.org Thu Feb 5 08:10:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 010768010 for ; Thu, 5 Feb 2015 08:10:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6444DAC002 for ; Thu, 5 Feb 2015 06:10:15 -0800 (PST) X-ASG-Debug-ID: 1423145408-04cb6c2e6bc6d460001-NocioJ Received: from smtprelay.restena.lu (smtprelay.restena.lu [158.64.1.62]) by cuda.sgi.com with ESMTP id ooYOsRCDBGCXmeaN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10:09 -0800 (PST) X-Barracuda-Envelope-From: bonbons@linux-vserver.org X-Barracuda-Apparent-Source-IP: 158.64.1.62 Received: from pluto.restena.lu (pluto.restena.lu [IPv6:2001:a18:1:8::156]) by smtprelay.restena.lu (Postfix) with ESMTPS id A2DC2411A7; Thu, 5 Feb 2015 15:10:07 +0100 (CET) Date: Thu, 5 Feb 2015 15:10:07 +0100 From: Bruno =?UTF-8?B?UHLDqW1vbnQ=?= To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150205151007.7c954c01@pluto.restena.lu> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault In-Reply-To: <20150113081742.6c3a5823@pluto.restena.lu> References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay.restena.lu[158.64.1.62] X-Barracuda-Start-Time: 1423145408 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, New crash, new trace, this time on 3.18.2. It looks like this time a NULL dereference happened prior to touched memory poison being detected. Once again it's during normal system operation (no mount/umount activity) Thanks, Bruno [1900296.667022] BUG: unable to handle kernel NULL pointer dereference at 0000000000000090 [1900296.676891] IP: [] xfs_iflush_int+0xf3/0x300 [1900296.686713] PGD 0 [1900296.688909] Oops: 0000 [#1] SMP [1900296.694730] Modules linked in: [1900296.698844] CPU: 6 PID: 627 Comm: xfsaild/sda3 Not tainted 3.18.2-x86_64 #2 [1900296.708850] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900296.718759] task: ffff880213d64ba0 ti: ffff8800dab98000 task.ti: ffff8800dab98000 [1900296.728890] RIP: 0010:[] [] xfs_iflush_int+0xf3/0x300 [1900296.740930] RSP: 0018:ffff8800dab9bc98 EFLAGS: 00010246 [1900296.748911] RAX: 0000000000009200 RBX: ffff880109bbfc00 RCX: 0000000000000000 [1900296.758972] RDX: 0000000000000000 RSI: ffff880101bded00 RDI: ffff880109bbfc00 [1900296.770792] RBP: ffff8800dab9bcd8 R08: 0000000000000064 R09: 0000000000000000 [1900296.780863] R10: ffff880101bde264 R11: ffff8802138c9030 R12: 0000000000000000 [1900296.790925] R13: ffff880101bded00 R14: ffff8802138c9030 R15: ffff8800da53d980 [1900296.800991] FS: 0000000000000000(0000) GS:ffff88021fb80000(0000) knlGS:0000000000000000 [1900296.812985] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [1900296.822809] CR2: 0000000000000090 CR3: 0000000001c15000 CR4: 00000000000007e0 [1900296.832867] Stack: [1900296.835019] 0000000000000100 0000000002db13a8 ffff8800dab9bcd8 ffff880033d45c00 [1900296.846886] ffff88021347c9d8 00000000000000a0 ffff880033d45ce4 ffff880109bbfc00 [1900296.857004] ffff8800dab9bd58 ffffffff81249463 ffff8800dab9bd58 ffff880109bbfce4 [1900296.868898] Call Trace: [1900296.872857] [] xfs_iflush_cluster+0x1f3/0x3c0 [1900296.880947] [] xfs_iflush+0x113/0x220 [1900296.888930] [] xfs_inode_item_push+0xe7/0x130 [1900296.897040] [] xfsaild+0x1e1/0x480 [1900296.905014] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [1900296.914972] [] kthread+0xc4/0xe0 [1900296.922897] [] ? kthread_create_on_node+0x170/0x170 [1900296.932865] [] ret_from_fork+0x7c/0xb0 [1900296.940858] [] ? kthread_create_on_node+0x170/0x170 [1900296.949063] Code: 66 83 bb 16 01 00 00 ff 0f 84 fa 00 00 00 31 c9 4c 89 e2 4c 89 ee 48 89 df e8 6a 70 fe ff 80 bb 4a 01 00 00 00 0f 85 c5 00 00 00 <41> 8b 84 24 90 00 00 00 4c 89 e2 4c 89 ff 41 c7 84 24 90 00 00 [1900296.977007] RIP [] xfs_iflush_int+0xf3/0x300 [1900296.985144] RSP [1900296.991019] CR2: 0000000000000090 [1900297.168094] ---[ end trace 66374290cbfacded ]--- [1900323.928915] ------------[ cut here ]------------ [1900323.934665] WARNING: CPU: 0 PID: 30642 at /data/kernel/linux-git/kernel/sched/core.c:1785 wake_up_process+0x3a/0x40() [1900323.950510] Modules linked in: [1900323.956328] CPU: 0 PID: 30642 Comm: collectd Tainted: G D 3.18.2-x86_64 #2 [1900323.966535] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900323.976465] 0000000000000009 ffff88012d68f6a8 ffffffff817a2753 000000000000009f [1900323.986617] 0000000000000000 ffff88012d68f6e8 ffffffff81088a77 ffff88012d68f6d8 [1900323.998528] ffff880213d64ba0 ffff880213626548 ffff880213626240 0000000000000016 [1900324.008572] Call Trace: [1900324.012524] [] dump_stack+0x46/0x58 [1900324.020489] [] warn_slowpath_common+0x77/0xa0 [1900324.028603] [] warn_slowpath_null+0x15/0x20 [1900324.038478] [] wake_up_process+0x3a/0x40 [1900324.046479] [] xfs_ail_push+0x51/0x60 [1900324.054471] [] xfs_ail_push_all+0x3d/0x50 [1900324.062520] [] xfs_reclaim_inodes_nr+0x1d/0x40 [1900324.072397] [] xfs_fs_free_cached_objects+0x10/0x20 [1900324.080635] [] super_cache_scan+0x161/0x170 [1900324.090435] [] shrink_slab_node+0x112/0x1b0 [1900324.098535] [] shrink_slab+0x78/0x110 [1900324.106503] [] do_try_to_free_pages+0x30e/0x450 [1900324.114636] [] ? default_wake_function+0xd/0x10 [1900324.124551] [] try_to_free_pages+0x87/0xa0 [1900324.132637] [] __alloc_pages_nodemask+0x422/0x940 [1900324.142540] [] alloc_kmem_pages+0x12/0x20 [1900324.150590] [] kmalloc_order+0x13/0x50 [1900324.158646] [] __kmalloc_track_caller+0xd1/0xe0 [1900324.168498] [] __kmalloc_reserve.isra.33+0x2c/0x80 [1900324.176678] [] __alloc_skb+0x73/0x1b0 [1900324.184663] [] ? kmem_cache_free+0xef/0x120 [1900324.194522] [] netlink_dump+0x219/0x290 [1900324.202525] [] netlink_recvmsg+0x207/0x380 [1900324.210586] [] sock_recvmsg+0x6e/0x90 [1900324.218575] [] ? verify_iovec+0x42/0xd0 [1900324.226628] [] ___sys_recvmsg+0x10d/0x2b0 [1900324.234642] [] ? __fget_light+0x20/0x70 [1900324.242663] [] ? __fdget+0xe/0x10 [1900324.250604] [] ? sockfd_lookup_light+0x12/0x70 [1900324.258913] [] __sys_recvmsg+0x3d/0x80 [1900324.266830] [] SyS_recvmsg+0xd/0x20 [1900324.275712] [] system_call_fastpath+0x16/0x1b [1900324.285568] ---[ end trace 66374290cbfacdee ]--- [1900324.291698] general protection fault: 0000 [#2] SMP [1900324.299630] Modules linked in: [1900324.303688] CPU: 0 PID: 30642 Comm: collectd Tainted: G D W 3.18.2-x86_64 #2 [1900324.315624] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900324.325553] task: ffff8802146f4410 ti: ffff88012d68c000 task.ti: ffff88012d68c000 [1900324.335697] RIP: 0010:[] [] try_to_wake_up+0x59/0x2b0 [1900324.347702] RSP: 0018:ffff88012d68f6b8 EFLAGS: 00010002 [1900324.355687] RAX: 6b6b6b6b6b6b6b6b RBX: ffff880213d64ba0 RCX: 0000000000010980 [1900324.365755] RDX: 0000000000010980 RSI: 0000000000000003 RDI: ffff880213d651b2 [1900324.377582] RBP: ffff88012d68f6f8 R08: 0000000000000001 R09: 0000000000000000 [1900324.387646] R10: 00000000000053f3 R11: 000000000002428e R12: ffff880213d651b2 [1900324.397710] R13: 0000000000000246 R14: 0000000000000000 R15: 0000000000010980 [1900324.407785] FS: 00007fc56de83700(0000) GS:ffff88021fa00000(0000) knlGS:0000000000000000 [1900324.419765] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [1900324.429582] CR2: ffffffffff600400 CR3: 00000001cdf91000 CR4: 00000000000007f0 [1900324.439669] Stack: [1900324.441797] 0000000000010980 ffff880200000003 ffff880213626548 ffff880213d64ba0 [1900324.453678] ffff880213626548 ffff880213626240 0000000000000016 00000000000000b5 [1900324.463803] ffff88012d68f718 ffffffff810a8932 ffff88012d68f768 ffff8800022045f0 [1900324.475675] Call Trace: [1900324.479623] [] wake_up_process+0x22/0x40 [1900324.487671] [] xfs_ail_push+0x51/0x60 [1900324.495654] [] xfs_ail_push_all+0x3d/0x50 [1900324.503701] [] xfs_reclaim_inodes_nr+0x1d/0x40 [1900324.511820] [] xfs_fs_free_cached_objects+0x10/0x20 [1900324.521782] [] super_cache_scan+0x161/0x170 [1900324.529862] [] shrink_slab_node+0x112/0x1b0 [1900324.539701] [] shrink_slab+0x78/0x110 [1900324.547684] [] do_try_to_free_pages+0x30e/0x450 [1900324.555862] [] ? default_wake_function+0xd/0x10 [1900324.565725] [] try_to_free_pages+0x87/0xa0 [1900324.573795] [] __alloc_pages_nodemask+0x422/0x940 [1900324.583737] [] alloc_kmem_pages+0x12/0x20 [1900324.591778] [] kmalloc_order+0x13/0x50 [1900324.599784] [] __kmalloc_track_caller+0xd1/0xe0 [1900324.609676] [] __kmalloc_reserve.isra.33+0x2c/0x80 [1900324.617895] [] __alloc_skb+0x73/0x1b0 [1900324.625853] [] ? kmem_cache_free+0xef/0x120 [1900324.635701] [] netlink_dump+0x219/0x290 [1900324.643707] [] netlink_recvmsg+0x207/0x380 [1900324.651798] [] sock_recvmsg+0x6e/0x90 [1900324.659764] [] ? verify_iovec+0x42/0xd0 [1900324.667797] [] ___sys_recvmsg+0x10d/0x2b0 [1900324.675828] [] ? __fget_light+0x20/0x70 [1900324.683882] [] ? __fdget+0xe/0x10 [1900324.691780] [] ? sockfd_lookup_light+0x12/0x70 [1900324.699923] [] __sys_recvmsg+0x3d/0x80 [1900324.707911] [] SyS_recvmsg+0xd/0x20 [1900324.715901] [] system_call_fastpath+0x16/0x1b [1900324.725769] Code: c8 49 89 c5 48 8b 03 85 c6 0f 84 88 01 00 00 8b 4b 4c 49 c7 c7 80 09 01 00 85 c9 74 77 4c 89 fa 48 8b 43 08 48 89 d1 48 89 55 c0 <8b> 40 18 48 03 0c c5 40 df c8 81 48 89 cf 48 89 4d c8 e8 10 27 [1900324.751937] RIP [] try_to_wake_up+0x59/0x2b0 [1900324.761773] RSP [1900324.765946] ---[ end trace 66374290cbfacdef ]--- [1900376.463556] ------------[ cut here ]------------ [1900376.469656] WARNING: CPU: 2 PID: 80 at /data/kernel/linux-git/kernel/sched/core.c:1785 wake_up_process+0x3a/0x40() [1900376.485532] Modules linked in: [1900376.489582] CPU: 2 PID: 80 Comm: kswapd0 Tainted: G D W 3.18.2-x86_64 #2 [1900376.489583] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900376.489585] 0000000000000009 ffff8800da0b7b98 ffffffff817a2753 0000000000005454 [1900376.489587] 0000000000000000 ffff8800da0b7bd8 ffffffff81088a77 ffff8800da0b7bc8 [1900376.489591] ffff880213d64ba0 ffff880213626548 ffff880213626240 0000000000000016 [1900376.489591] Call Trace: [1900376.489596] [] dump_stack+0x46/0x58 [1900376.489599] [] warn_slowpath_common+0x77/0xa0 [1900376.489601] [] warn_slowpath_null+0x15/0x20 [1900376.489604] [] wake_up_process+0x3a/0x40 [1900376.489608] [] xfs_ail_push+0x51/0x60 [1900376.489610] [] xfs_ail_push_all+0x3d/0x50 [1900376.489613] [] xfs_reclaim_inodes_nr+0x1d/0x40 [1900376.489616] [] xfs_fs_free_cached_objects+0x10/0x20 [1900376.489620] [] super_cache_scan+0x161/0x170 [1900376.489624] [] shrink_slab_node+0x112/0x1b0 [1900376.489627] [] shrink_slab+0x78/0x110 [1900376.489629] [] kswapd_shrink_zone+0x104/0x1a0 [1900376.489633] [] kswapd+0x40a/0x750 [1900376.489635] [] ? mem_cgroup_shrink_node_zone+0xa0/0xa0 [1900376.489639] [] kthread+0xc4/0xe0 [1900376.489641] [] ? kthread_create_on_node+0x170/0x170 [1900376.489643] [] ret_from_fork+0x7c/0xb0 [1900376.489645] [] ? kthread_create_on_node+0x170/0x170 [1900376.489647] ---[ end trace 66374290cbfacdf0 ]--- [1900390.261491] ============================================================================= [1900390.272989] BUG task_struct (Tainted: G D W ): Poison overwritten [1900390.283021] ----------------------------------------------------------------------------- [1900390.283021] [1900390.297056] INFO: 0xffff880213d651b3-0xffff880213d651b3. First byte 0x6d instead of 0x6b [1900390.309044] INFO: Slab 0xffffea00084f5800 objects=16 used=16 fp=0x (null) flags=0x8000000000004080 [1900390.323087] INFO: Object 0xffff880213d64ba0 @offset=19360 fp=0xffff880213d61e40 [1900390.323087] [1900390.336988] Bytes b4 ffff880213d64b90: 60 2d d6 13 02 88 ff ff 5a 5a 5a 5a 5a 5a 5a 5a `-......ZZZZZZZZ [1900390.350988] Object ffff880213d64ba0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.364943] Object ffff880213d64bb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.377153] Object ffff880213d64bc0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.391099] Object ffff880213d64bd0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.405066] Object ffff880213d64be0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.419044] Object ffff880213d64bf0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.432991] Object ffff880213d64c00: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.445210] Object ffff880213d64c10: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.459163] Object ffff880213d64c20: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.473123] Object ffff880213d64c30: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.487075] Object ffff880213d64c40: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.501042] Object ffff880213d64c50: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.513244] Object ffff880213d64c60: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.527206] Object ffff880213d64c70: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.541176] Object ffff880213d64c80: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.555144] Object ffff880213d64c90: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.569103] Object ffff880213d64ca0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.583052] Object ffff880213d64cb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.595260] Object ffff880213d64cc0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.609255] Object ffff880213d64cd0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.623179] Object ffff880213d64ce0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.637146] Object ffff880213d64cf0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.651113] Object ffff880213d64d00: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.663312] Object ffff880213d64d10: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.677284] Object ffff880213d64d20: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.691232] Object ffff880213d64d30: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.705203] Object ffff880213d64d40: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.719156] Object ffff880213d64d50: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.731391] Object ffff880213d64d60: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.745324] Object ffff880213d64d70: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.759288] Object ffff880213d64d80: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.773262] Object ffff880213d64d90: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.787213] Object ffff880213d64da0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.801170] Object ffff880213d64db0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.813385] Object ffff880213d64dc0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.827346] Object ffff880213d64dd0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.841301] Object ffff880213d64de0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.855267] Object ffff880213d64df0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.869232] Object ffff880213d64e00: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.881428] Object ffff880213d64e10: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.895400] Object ffff880213d64e20: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.909360] Object ffff880213d64e30: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.923345] Object ffff880213d64e40: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.937309] Object ffff880213d64e50: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.950489] Object ffff880213d64e60: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.964445] Object ffff880213d64e70: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.978414] Object ffff880213d64e80: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900390.992362] Object ffff880213d64e90: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.006345] Object ffff880213d64ea0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.020279] Object ffff880213d64eb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.032508] Object ffff880213d64ec0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.046461] Object ffff880213d64ed0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.060418] Object ffff880213d64ee0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.074388] Object ffff880213d64ef0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.088338] Object ffff880213d64f00: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.100547] Object ffff880213d64f10: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.114503] Object ffff880213d64f20: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.128485] Object ffff880213d64f30: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.142435] Object ffff880213d64f40: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.156394] Object ffff880213d64f50: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.168595] Object ffff880213d64f60: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.182573] Object ffff880213d64f70: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.196528] Object ffff880213d64f80: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.210479] Object ffff880213d64f90: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.224449] Object ffff880213d64fa0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.238443] Object ffff880213d64fb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.250607] Object ffff880213d64fc0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.264572] Object ffff880213d64fd0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.278542] Object ffff880213d64fe0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.292539] Object ffff880213d64ff0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.306447] Object ffff880213d65000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.318685] Object ffff880213d65010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.332656] Object ffff880213d65020: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.346616] Object ffff880213d65030: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.360545] Object ffff880213d65040: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.374511] Object ffff880213d65050: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.386800] Object ffff880213d65060: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.400664] Object ffff880213d65070: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.414654] Object ffff880213d65080: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.428603] Object ffff880213d65090: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.442558] Object ffff880213d650a0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.456527] Object ffff880213d650b0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.468720] Object ffff880213d650c0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.482704] Object ffff880213d650d0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.496649] Object ffff880213d650e0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.510629] Object ffff880213d650f0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.524581] Object ffff880213d65100: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.536786] Object ffff880213d65110: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.550750] Object ffff880213d65120: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.564698] Object ffff880213d65130: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.578678] Object ffff880213d65140: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.592624] Object ffff880213d65150: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.604837] Object ffff880213d65160: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.618795] Object ffff880213d65170: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.632754] Object ffff880213d65180: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.646733] Object ffff880213d65190: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.660674] Object ffff880213d651a0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.674636] Object ffff880213d651b0: 6b 6b 6b 6d 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkmkkkkkkkkkkkk [1900391.686848] Object ffff880213d651c0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.700807] Object ffff880213d651d0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.714769] Object ffff880213d651e0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.728730] Object ffff880213d651f0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.742705] Object ffff880213d65200: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.754900] Object ffff880213d65210: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.768859] Object ffff880213d65220: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.782824] Object ffff880213d65230: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.796782] Object ffff880213d65240: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.810754] Object ffff880213d65250: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.822948] Object ffff880213d65260: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.836917] Object ffff880213d65270: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.850870] Object ffff880213d65280: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.864832] Object ffff880213d65290: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.878800] Object ffff880213d652a0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.892752] Object ffff880213d652b0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.905128] Object ffff880213d652c0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.918925] Object ffff880213d652d0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.932889] Object ffff880213d652e0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.946849] Object ffff880213d652f0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.960806] Object ffff880213d65300: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1900391.973020] Object ffff880213d65310: 6b 6b 6b 6b 6b 6b 6b a5 kkkkkkk. [1900391.986850] Redzone ffff880213d65318: bb bb bb bb bb bb bb bb ........ [1900391.998959] Padding ffff880213d65328: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ [1900392.011054] CPU: 1 PID: 340 Comm: httpd2-prefork Tainted: G B D W 3.18.2-x86_64 #2 [1900392.024818] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900392.033005] ffff880213d64ba0 ffff88000ba37bf0 ffffffff817a2753 0000000000000000 [1900392.044871] ffff88021685fc00 ffff88000ba37c30 ffffffff8113a248 0000000000000008 [1900392.055002] ffff880200000001 ffff880213d651b4 ffff88021685fc00 000000000000006b [1900392.066845] Call Trace: [1900392.069074] [] dump_stack+0x46/0x58 [1900392.077023] [] print_trailer+0x148/0x200 [1900392.085059] [] check_bytes_and_report+0xcf/0x110 [1900392.094981] [] check_object+0x1d7/0x250 [1900392.103001] [] ? copy_process.part.52+0xc5/0x1600 [1900392.112932] [] alloc_debug_processing+0x71/0x113 [1900392.121074] [] __slab_alloc.constprop.69+0x46f/0x4c9 [1900392.131065] [] ? copy_process.part.52+0xc5/0x1600 [1900392.140982] [] ? get_empty_filp+0x53/0x170 [1900392.149052] [] kmem_cache_alloc+0x78/0xa0 [1900392.157106] [] copy_process.part.52+0xc5/0x1600 [1900392.167003] [] ? kmem_cache_alloc+0x97/0xa0 [1900392.175087] [] ? __alloc_fd+0x7d/0x120 [1900392.183099] [] do_fork+0xcb/0x2b0 [1900392.191026] [] ? get_unused_fd_flags+0x2b/0x30 [1900392.199143] [] ? __do_pipe_flags+0x65/0xb0 [1900392.209001] [] ? __fd_install+0x1f/0x60 [1900392.216983] [] SyS_clone+0x11/0x20 [1900392.223163] [] stub_clone+0x69/0x90 [1900392.231126] [] ? system_call_fastpath+0x16/0x1b [1900392.241021] FIX task_struct: Restoring 0xffff880213d651b3-0xffff880213d651b3=0x6b [1900392.241021] [1900392.254988] FIX task_struct: Marking all objects used [1900463.350910] INFO: rcu_sched detected stalls on CPUs/tasks:[1900463.350938] ------------[ cut here ]------------ [1900463.350946] WARNING: CPU: 6 PID: 0 at /data/kernel/linux-git/net/sched/sch_generic.c:303 dev_watchdog+0x23f/0x250() [1900463.350946] NETDEV WATCHDOG: eth0 (bnx2): transmit queue 4 timed out [1900463.350947] Modules linked in: [1900463.350950] CPU: 6 PID: 0 Comm: swapper/6 Tainted: G B D W 3.18.2-x86_64 #2 [1900463.350951] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1900463.350951] 0000000000000009 ffff88021fb83dc8 ffffffff817a2753 0000000000003232 [1900463.350953] ffff88021fb83e18 ffff88021fb83e08 ffffffff81088a77 ffff88021fb95700 [1900463.350954] 0000000000000004 ffff8800df224000 0000000000000008 0000000000000006 [1900463.350956] Call Trace: [1900463.350957] [] dump_stack+0x46/0x58 [1900463.350960] [] warn_slowpath_common+0x77/0xa0 [1900463.350963] [] warn_slowpath_fmt+0x41/0x50 [1900463.350964] [] ? fbcon_add_cursor_timer+0xf0/0xf0 [1900463.350968] [] dev_watchdog+0x23f/0x250 [1900463.350970] [] ? dev_graft_qdisc+0x80/0x80 [1900463.350971] [] call_timer_fn.isra.36+0x18/0x80 [1900463.350974] [] run_timer_softirq+0x19a/0x230 [1900463.350976] [] __do_softirq+0xdb/0x1f0 [1900463.350978] [] irq_exit+0x9d/0xb0 [1900463.350980] [] smp_apic_timer_interrupt+0x45/0x60 [1900463.350982] [] apic_timer_interrupt+0x6a/0x70 [1900463.350985] [] ? cpuidle_enter_state+0x55/0xc0 [1900463.350987] [] ? cpuidle_enter_state+0x47/0xc0 [1900463.350988] [] cpuidle_enter+0x12/0x20 [1900463.350990] [] cpu_startup_entry+0x258/0x2e0 [1900463.350993] [] start_secondary+0x183/0x190 [1900463.350995] ---[ end trace 66374290cbfacdf1 ]--- [1900463.350998] bnx2 0000:02:00.0 eth0: <--- start FTQ dump ---> [1900463.351001] bnx2 0000:02:00.0 eth0: RV2P_PFTQ_CTL 00010000 [1900463.351003] bnx2 0000:02:00.0 eth0: RV2P_TFTQ_CTL 00020000 [1900463.351005] bnx2 0000:02:00.0 eth0: RV2P_MFTQ_CTL 00004000 [1900463.351007] bnx2 0000:02:00.0 eth0: TBDR_FTQ_CTL 00004000 [1900463.351009] bnx2 0000:02:00.0 eth0: TDMA_FTQ_CTL 00010002 [1900463.351011] bnx2 0000:02:00.0 eth0: TXP_FTQ_CTL 00010000 [1900463.351013] bnx2 0000:02:00.0 eth0: TXP_FTQ_CTL 00010000 [1900463.351015] bnx2 0000:02:00.0 eth0: TPAT_FTQ_CTL 00010000 [1900463.351017] bnx2 0000:02:00.0 eth0: RXP_CFTQ_CTL 00008000 [1900463.351019] bnx2 0000:02:00.0 eth0: RXP_FTQ_CTL 00100000 [1900463.351021] bnx2 0000:02:00.0 eth0: COM_COMXQ_FTQ_CTL 00010000 [1900463.351023] bnx2 0000:02:00.0 eth0: COM_COMTQ_FTQ_CTL 00020000 [1900463.351025] bnx2 0000:02:00.0 eth0: COM_COMQ_FTQ_CTL 00010000 [1900463.351027] bnx2 0000:02:00.0 eth0: CP_CPQ_FTQ_CTL 00004000 [1900463.351028] bnx2 0000:02:00.0 eth0: CPU states: [1900463.351035] bnx2 0000:02:00.0 eth0: 045000 mode b84c state 80001000 evt_mask 500 pc 8001294 pc 800128c instr 8e260000 [1900463.351042] bnx2 0000:02:00.0 eth0: 085000 mode b84c state 80005000 evt_mask 500 pc 8000a5c pc 8000a5c instr 38420001 [1900463.351049] bnx2 0000:02:00.0 eth0: 0c5000 mode b84c state 80001000 evt_mask 500 pc 8004c14 pc 8004c20 instr 10e00088 [1900463.351056] bnx2 0000:02:00.0 eth0: 105000 mode b8cc state 80000000 evt_mask 500 pc 8000aa0 pc 8000b2c instr 1040ffd9 [1900463.351063] bnx2 0000:02:00.0 eth0: 145000 mode b880 state 80000000 evt_mask 500 pc 800d19c pc 800aeb0 instr 3e00008 [1900463.351070] bnx2 0000:02:00.0 eth0: 185000 mode b8cc state 80000000 evt_mask 500 pc 8000c58 pc 8000c6c instr 8021 [1900463.351071] bnx2 0000:02:00.0 eth0: <--- end FTQ dump ---> [1900463.351072] bnx2 0000:02:00.0 eth0: <--- start TBDC dump ---> [1900463.351074] bnx2 0000:02:00.0 eth0: TBDC free cnt: 32 [1900463.351075] bnx2 0000:02:00.0 eth0: LINE CID BIDX CMD VALIDS [1900463.351080] bnx2 0000:02:00.0 eth0: 00 000800 8728 00 [0] [1900463.351085] bnx2 0000:02:00.0 eth0: 01 001100 4aa8 00 [0] [1900463.351090] bnx2 0000:02:00.0 eth0: 02 001200 b950 00 [0] [1900463.351094] bnx2 0000:02:00.0 eth0: 03 000800 2d50 00 [0] [1900463.351099] bnx2 0000:02:00.0 eth0: 04 000800 e338 00 [0] [1900463.351104] bnx2 0000:02:00.0 eth0: 05 1ffa80 ffb8 f7 [0] [1900463.351108] bnx2 0000:02:00.0 eth0: 06 0ddf80 53c8 fe [0] [1900463.351113] bnx2 0000:02:00.0 eth0: 07 1ee780 ffe8 7f [0] [1900463.351118] bnx2 0000:02:00.0 eth0: 08 1f7b00 9f78 fd [0] [1900463.351122] bnx2 0000:02:00.0 eth0: 09 1ffe80 7978 fd [0] [1900463.351127] bnx2 0000:02:00.0 eth0: 0a 1ffa80 dff8 fa [0] [1900463.351131] bnx2 0000:02:00.0 eth0: 0b 0cfa00 fff8 ef [0] [1900463.351136] bnx2 0000:02:00.0 eth0: 0c 17e080 f7d0 fb [0] [1900463.351140] bnx2 0000:02:00.0 eth0: 0d 0e9e00 fe98 ff [0] [1900463.351145] bnx2 0000:02:00.0 eth0: 0e 1dff80 d7f0 dd [0] [1900463.351149] bnx2 0000:02:00.0 eth0: 0f 1fe580 ffb0 7f [0] [1900463.351154] bnx2 0000:02:00.0 eth0: 10 0fef80 f718 f5 [0] [1900463.351159] bnx2 0000:02:00.0 eth0: 11 1ffa80 adf0 ff [0] [1900463.351163] bnx2 0000:02:00.0 eth0: 12 177780 fff8 ff [0] [1900463.351168] bnx2 0000:02:00.0 eth0: 13 1e7080 eeb8 fd [0] [1900463.351173] bnx2 0000:02:00.0 eth0: 14 1bf780 7bb0 7f [0] [1900463.351177] bnx2 0000:02:00.0 eth0: 15 1fbf80 bd38 fe [0] [1900463.351182] bnx2 0000:02:00.0 eth0: 16 0fec80 f568 ff [0] [1900463.351186] bnx2 0000:02:00.0 eth0: 17 0fff80 bf78 be [0] [1900463.351191] bnx2 0000:02:00.0 eth0: 18 1f7e80 dbf0 bc [0] [1900463.351196] bnx2 0000:02:00.0 eth0: 19 1fa580 7458 fd [0] [1900463.351200] bnx2 0000:02:00.0 eth0: 1a 1be780 fce8 cd [0] [1900463.351205] bnx2 0000:02:00.0 eth0: 1b 17cf80 be58 7d [0] [1900463.351209] bnx2 0000:02:00.0 eth0: 1c 177b00 6ff8 ff [0] [1900463.351214] bnx2 0000:02:00.0 eth0: 1d 1ff980 ffd8 fc [0] [1900463.351218] bnx2 0000:02:00.0 eth0: 1e 077d80 bb38 fe [0] [1900463.351223] bnx2 0000:02:00.0 eth0: 1f 1b7f80 9fb8 ff [0] [1900463.351224] bnx2 0000:02:00.0 eth0: <--- end TBDC dump ---> [1900463.351227] bnx2 0000:02:00.0 eth0: DEBUG: intr_sem[0] PCI_CMD[00100446] [1900463.351230] bnx2 0000:02:00.0 eth0: DEBUG: PCI_PM[19002008] PCI_MISC_CFG[92000088] [1900463.351233] bnx2 0000:02:00.0 eth0: DEBUG: EMAC_TX_STATUS[00000008] EMAC_RX_STATUS[00000000] [1900463.351234] bnx2 0000:02:00.0 eth0: DEBUG: RPM_MGMT_PKT_CTRL[40000088] [1900463.351236] bnx2 0000:02:00.0 eth0: DEBUG: HC_STATS_INTERRUPT_STATUS[01ee0011] [1900463.351238] bnx2 0000:02:00.0 eth0: DEBUG: PBA[00000000] [1900463.351239] bnx2 0000:02:00.0 eth0: <--- start MCP states dump ---> [1900463.351242] bnx2 0000:02:00.0 eth0: DEBUG: MCP_STATE_P0[0003610e] MCP_STATE_P1[0003600e] [1900463.351246] bnx2 0000:02:00.0 eth0: DEBUG: MCP mode[0000b880] state[80000000] evt_mask[00000500] [1900463.351250] bnx2 0000:02:00.0 eth0: DEBUG: pc[0800ad88] pc[08003d6c] instr[00021382] [1900463.351251] bnx2 0000:02:00.0 eth0: DEBUG: shmem states: [1900463.351255] bnx2 0000:02:00.0 eth0: DEBUG: drv_mb[01030003] fw_mb[00000003] link_status[0000006e] [1900463.351257] drv_pulse_mb[00007a69] [1900463.351260] bnx2 0000:02:00.0 eth0: DEBUG: dev_info_signature[44564903] reset_type[01005254] [1900463.351261] condition[0003610e] [1900463.351266] bnx2 0000:02:00.0 eth0: DEBUG: 000001c0: 01005254 42530083 0003610e 00000000 [1900463.351271] bnx2 0000:02:00.0 eth0: DEBUG: 000003cc: 44444444 44444444 44444444 00000a3c [1900463.351276] bnx2 0000:02:00.0 eth0: DEBUG: 000003dc: 0ffeffff 0000ffff ffffffff ffffffff [1900463.351281] bnx2 0000:02:00.0 eth0: DEBUG: 000003ec: 00000000 00000000 00000000 00000002 [1900463.351283] bnx2 0000:02:00.0 eth0: DEBUG: 0x3fc[0000ffff] [1900463.351284] bnx2 0000:02:00.0 eth0: <--- end MCP states dump ---> [1900464.379743] { 2} (detected by 5, t=8682 jiffies, g=55614734, c=55614733, q=43486) [1900464.379747] Task dump for CPU 2: [1900464.379748] kswapd0 R running task 0 80 2 0x00000008 [1900464.379751] ffff8800da0b7d28 ffffffff8110d3d2 ffff880212c8b8a8 0000000000000000 [1900464.379752] 0000000000000000 00000000000772da ffff8800da0b7d68 ffff8800da0b7d88 [1900464.379754] 0000000000000000 0000000000000020 0000000000183cd5 ffff880213626548 [1900464.379757] Call Trace: [1900464.379766] [] ? shrink_slab_node+0x112/0x1b0 [1900464.379768] [] shrink_slab+0x78/0x110 [1900464.379770] [] kswapd_shrink_zone+0x104/0x1a0 [1900464.379772] [] kswapd+0x40a/0x750 [1900464.379773] [] ? mem_cgroup_shrink_node_zone+0xa0/0xa0 [1900464.379777] [] kthread+0xc4/0xe0 [1900464.379779] [] ? kthread_create_on_node+0x170/0x170 [1900464.379781] [] ret_from_fork+0x7c/0xb0 [1900464.379783] [] ? kthread_create_on_node+0x170/0x170 From bfoster@redhat.com Thu Feb 5 08:10:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A7FEB7F3F for ; Thu, 5 Feb 2015 08:10:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 520208F8040 for ; Thu, 5 Feb 2015 06:10:24 -0800 (PST) X-ASG-Debug-ID: 1423145422-04bdf01eeea3c0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id reJSJz2xb8JanZqd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10:22 -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 (8.14.4/8.14.4) with ESMTP id t15EAKVK008593 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:10:20 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAF2C000753 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:10:19 -0500 Date: Thu, 5 Feb 2015 09:10:15 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter Message-ID: <20150205141015.GE31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145422 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:05AM +1100, Dave Chinner wrote: > XFS has hand-rolled per-cpu counters for the superblock since before > there was any generic implementation. The free block counter is > special in that it is used for ENOSPC detection outside transaction > contexts for for delayed allocation. This means that the counter > needs to be accurate at zero. The current per-cpu counter code jumps > through lots of hoops to ensure we never run past zero, but we don't > need to make all those jumps with the generic counter > implementation. > > The generic counter implementation allows us to pass a "batch" > threshold at which the addition/subtraction to the counter value > will be folded back into global value under lock. We can use this > feature to reduce the batch size as we approach 0 in a very similar > manner to the existing counters and their rebalance algorithm. If we > use a batch size of 1 as we approach 0, then every addition and > subtraction will be done against the global value and hence allow > accurate detection of zero threshold crossing. > > Hence we can replace the handrolled, accurate-at-zero counters with > generic percpu counters. > > Note: this removes just enough of the icsb infrastructure to compile > without warnings. The rest will go in subsequent commits. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_bmap.c | 32 ++++---- > fs/xfs/libxfs/xfs_sb.c | 1 + > fs/xfs/xfs_fsops.c | 9 ++- > fs/xfs/xfs_iomap.c | 2 +- > fs/xfs/xfs_mount.c | 193 ++++++++++++++++++++++++----------------------- > fs/xfs/xfs_mount.h | 3 + > fs/xfs/xfs_super.c | 10 ++- > fs/xfs/xfs_trans.c | 16 ++-- > 8 files changed, 135 insertions(+), 131 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 61ec015..e39c9e8 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -2212,9 +2212,8 @@ xfs_bmap_add_extent_delay_real( > diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - > (bma->cur ? bma->cur->bc_private.b.allocated : 0)); > if (diff > 0) { > - error = xfs_icsb_modify_counters(bma->ip->i_mount, > - XFS_SBS_FDBLOCKS, > - -((int64_t)diff), 0); > + error = xfs_mod_fdblocks(bma->ip->i_mount, > + -((int64_t)diff), false); > ASSERT(!error); > if (error) > goto done; > @@ -2265,9 +2264,8 @@ xfs_bmap_add_extent_delay_real( > temp += bma->cur->bc_private.b.allocated; > ASSERT(temp <= da_old); > if (temp < da_old) > - xfs_icsb_modify_counters(bma->ip->i_mount, > - XFS_SBS_FDBLOCKS, > - (int64_t)(da_old - temp), 0); > + xfs_mod_fdblocks(bma->ip->i_mount, > + (int64_t)(da_old - temp), false); > } > > /* clear out the allocated field, done with it now in any case. */ > @@ -2944,8 +2942,8 @@ xfs_bmap_add_extent_hole_delay( > } > if (oldlen != newlen) { > ASSERT(oldlen > newlen); > - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, > - (int64_t)(oldlen - newlen), 0); > + xfs_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), > + false); > /* > * Nothing to do for disk quota accounting here. > */ > @@ -4163,15 +4161,13 @@ xfs_bmapi_reserve_delalloc( > error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, > -((int64_t)extsz), 0); > } else { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - -((int64_t)alen), 0); > + error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); > } > > if (error) > goto out_unreserve_quota; > > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - -((int64_t)indlen), 0); > + error = xfs_mod_fdblocks(mp, -((int64_t)indlen), false); > if (error) > goto out_unreserve_blocks; > > @@ -4200,7 +4196,7 @@ out_unreserve_blocks: > if (rt) > xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); > else > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); > + xfs_mod_fdblocks(mp, alen, false); > out_unreserve_quota: > if (XFS_IS_QUOTA_ON(mp)) > xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? > @@ -5012,10 +5008,8 @@ xfs_bmap_del_extent( > * Nothing to do for disk quota accounting here. > */ > ASSERT(da_old >= da_new); > - if (da_old > da_new) { > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - (int64_t)(da_old - da_new), 0); > - } > + if (da_old > da_new) > + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); > done: > *logflagsp = flags; > return error; > @@ -5290,8 +5284,8 @@ xfs_bunmapi( > ip, -((long)del.br_blockcount), 0, > XFS_QMOPT_RES_RTBLKS); > } else { > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - (int64_t)del.br_blockcount, 0); > + 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); > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index b66aeab..31a3e97 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -773,6 +773,7 @@ xfs_log_sb( > > mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); > mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); > + mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks); > > xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index fa74d03..fed97a9 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -633,9 +633,10 @@ xfs_fs_counts( > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > 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); > > spin_lock(&mp->m_sb_lock); > - cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > cnt->freertx = mp->m_sb.sb_frextents; > spin_unlock(&mp->m_sb_lock); > return 0; > @@ -710,7 +711,8 @@ retry: > } else { > __int64_t free; > > - free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + free = percpu_counter_sum(&mp->m_fdblocks) - > + XFS_ALLOC_SET_ASIDE(mp); > if (!free) > goto out; /* ENOSPC and fdblks_delta = 0 */ > > @@ -749,8 +751,7 @@ out: > * the extra reserve blocks from the reserve..... > */ > int error; > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - fdblks_delta, 0); > + error = xfs_mod_fdblocks(mp, fdblks_delta, 0); > if (error == -ENOSPC) > goto retry; > } > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index ccb1dd0..205b948 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -461,7 +461,7 @@ xfs_iomap_prealloc_size( > alloc_blocks); > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > - freesp = mp->m_sb.sb_fdblocks; > + freesp = percpu_counter_read_positive(&mp->m_fdblocks); > if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > shift = 2; > if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 650e8f1..9e433b2 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1114,7 +1114,6 @@ xfs_mod_icount( > return 0; > } > > - > int > xfs_mod_ifree( > struct xfs_mount *mp, > @@ -1128,6 +1127,93 @@ xfs_mod_ifree( > } > return 0; > } > + > +int > +xfs_mod_fdblocks( > + struct xfs_mount *mp, > + int64_t delta, > + bool rsvd) > +{ > + int64_t lcounter; > + long long res_used; > + s32 batch; > + > + if (delta > 0) { > + /* > + * If the reserve pool is depleted, put blocks back into it > + * first. Most of the time the pool is full. > + */ > + if (likely(mp->m_resblks == mp->m_resblks_avail)) { > + percpu_counter_add(&mp->m_fdblocks, delta); > + return 0; > + } > + > + 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; > + } else { > + delta -= res_used; > + mp->m_resblks_avail = mp->m_resblks; Extra tab on the line above. Brian > + percpu_counter_add(&mp->m_fdblocks, delta); > + } > + spin_unlock(&mp->m_sb_lock); > + return 0; > + } > + > + /* > + * Taking blocks away, need to be more accurate the closer we > + * are to zero. > + * > + * batch size is set to a maximum of 1024 blocks - if we are > + * allocating of freeing extents larger than this then we aren't > + * going to be hammering the counter lock so a lock per update > + * is not a problem. > + * > + * If the counter has a value of less than 2 * max batch size, > + * then make everything serialise as we are real close to > + * ENOSPC. > + */ > +#define __BATCH 1024 > + if (percpu_counter_compare(&mp->m_fdblocks, 2 * __BATCH) < 0) > + batch = 1; > + else > + batch = __BATCH; > +#undef __BATCH > + > + __percpu_counter_add(&mp->m_fdblocks, delta, batch); > + if (percpu_counter_compare(&mp->m_fdblocks, > + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { > + /* we had space! */ > + return 0; > + } > + > + /* > + * lock up the sb for dipping into reserves before releasing the space > + * that took us to ENOSPC. > + */ > + spin_lock(&mp->m_sb_lock); > + percpu_counter_add(&mp->m_fdblocks, -delta); > + if (!rsvd) > + goto fdblocks_enospc; > + > + lcounter = (long long)mp->m_resblks_avail + delta; > + if (lcounter >= 0) { > + mp->m_resblks_avail = lcounter; > + spin_unlock(&mp->m_sb_lock); > + return 0; > + } > + printk_once(KERN_WARNING > + "Filesystem \"%s\": reserve blocks depleted! " > + "Consider increasing reserve pool size.", > + mp->m_fsname); > +fdblocks_enospc: > + spin_unlock(&mp->m_sb_lock); > + return -ENOSPC; > +} > + > /* > * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > * a delta to a specified field in the in-core superblock. Simply > @@ -1146,7 +1232,6 @@ xfs_mod_incore_sb_unlocked( > { > int scounter; /* short counter for 32 bit fields */ > long long lcounter; /* long counter for 64 bit fields */ > - long long res_used, rem; > > /* > * With the in-core superblock spin lock held, switch > @@ -1157,50 +1242,9 @@ xfs_mod_incore_sb_unlocked( > switch (field) { > case XFS_SBS_ICOUNT: > case XFS_SBS_IFREE: > + case XFS_SBS_FDBLOCKS: > ASSERT(0); > return -EINVAL; > - case XFS_SBS_FDBLOCKS: > - lcounter = (long long) > - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); > - > - if (delta > 0) { /* Putting blocks back */ > - if (res_used > delta) { > - mp->m_resblks_avail += delta; > - } else { > - rem = delta - res_used; > - mp->m_resblks_avail = mp->m_resblks; > - lcounter += rem; > - } > - } else { /* Taking blocks away */ > - lcounter += delta; > - if (lcounter >= 0) { > - mp->m_sb.sb_fdblocks = lcounter + > - XFS_ALLOC_SET_ASIDE(mp); > - return 0; > - } > - > - /* > - * We are out of blocks, use any available reserved > - * blocks if were allowed to. > - */ > - if (!rsvd) > - return -ENOSPC; > - > - lcounter = (long long)mp->m_resblks_avail + delta; > - if (lcounter >= 0) { > - mp->m_resblks_avail = lcounter; > - return 0; > - } > - printk_once(KERN_WARNING > - "Filesystem \"%s\": reserve blocks depleted! " > - "Consider increasing reserve pool size.", > - mp->m_fsname); > - return -ENOSPC; > - } > - > - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > - return 0; > case XFS_SBS_FREXTENTS: > lcounter = (long long)mp->m_sb.sb_frextents; > lcounter += delta; > @@ -1323,7 +1367,7 @@ xfs_mod_incore_sb( > * > * Note that this function may not be used for the superblock values that > * are tracked with the in-memory per-cpu counters - a direct call to > - * xfs_icsb_modify_counters is required for these. > + * xfs_mod_incore_sb is required for these. > */ > int > xfs_mod_incore_sb_batch( > @@ -1508,7 +1552,6 @@ xfs_icsb_cpu_notify( > case CPU_ONLINE: > case CPU_ONLINE_FROZEN: > xfs_icsb_lock(mp); > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > break; > case CPU_DEAD: > @@ -1518,13 +1561,9 @@ xfs_icsb_cpu_notify( > * re-enable the counters. */ > xfs_icsb_lock(mp); > spin_lock(&mp->m_sb_lock); > - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > - > - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > spin_unlock(&mp->m_sb_lock); > xfs_icsb_unlock(mp); > break; > @@ -1550,10 +1589,14 @@ xfs_icsb_init_counters( > if (error) > goto free_icount; > > + error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); > + if (error) > + goto free_ifree; > + > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > if (!mp->m_sb_cnts) { > error = -ENOMEM; > - goto free_ifree; > + goto free_fdblocks; > } > > for_each_online_cpu(i) { > @@ -1577,6 +1620,8 @@ xfs_icsb_init_counters( > > return 0; > > +free_fdblocks: > + percpu_counter_destroy(&mp->m_fdblocks); > free_ifree: > percpu_counter_destroy(&mp->m_ifree); > free_icount: > @@ -1590,6 +1635,7 @@ xfs_icsb_reinit_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); > > xfs_icsb_lock(mp); > /* > @@ -1597,7 +1643,6 @@ xfs_icsb_reinit_counters( > * initial balance kicks us off correctly > */ > mp->m_icsb_counters = -1; > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > xfs_icsb_unlock(mp); > } > > @@ -1612,6 +1657,7 @@ xfs_icsb_destroy_counters( > > percpu_counter_destroy(&mp->m_icount); > percpu_counter_destroy(&mp->m_ifree); > + percpu_counter_destroy(&mp->m_fdblocks); > > mutex_destroy(&mp->m_icsb_mutex); > } > @@ -1665,18 +1711,11 @@ xfs_icsb_count( > xfs_icsb_cnts_t *cnt, > int flags) > { > - xfs_icsb_cnts_t *cntp; > - int i; > - > memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > xfs_icsb_lock_all_counters(mp); > > - for_each_online_cpu(i) { > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - cnt->icsb_fdblocks += cntp->icsb_fdblocks; > - } > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > xfs_icsb_unlock_all_counters(mp); > @@ -1687,7 +1726,6 @@ xfs_icsb_counter_disabled( > xfs_mount_t *mp, > xfs_sb_field_t field) > { > - ASSERT(field == XFS_SBS_FDBLOCKS); > return test_bit(field, &mp->m_icsb_counters); > } > > @@ -1698,8 +1736,6 @@ xfs_icsb_disable_counter( > { > xfs_icsb_cnts_t cnt; > > - ASSERT(field == XFS_SBS_FDBLOCKS); > - > /* > * If we are already disabled, then there is nothing to do > * here. We check before locking all the counters to avoid > @@ -1717,9 +1753,6 @@ xfs_icsb_disable_counter( > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > switch(field) { > - case XFS_SBS_FDBLOCKS: > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > - break; > default: > BUG(); > } > @@ -1735,18 +1768,11 @@ xfs_icsb_enable_counter( > uint64_t count, > uint64_t resid) > { > - xfs_icsb_cnts_t *cntp; > int i; > > - ASSERT(field == XFS_SBS_FDBLOCKS); > - > xfs_icsb_lock_all_counters(mp); > for_each_online_cpu(i) { > - cntp = per_cpu_ptr(mp->m_sb_cnts, i); > switch (field) { > - case XFS_SBS_FDBLOCKS: > - cntp->icsb_fdblocks = count + resid; > - break; > default: > BUG(); > break; > @@ -1765,9 +1791,6 @@ xfs_icsb_sync_counters_locked( > xfs_icsb_cnts_t cnt; > > xfs_icsb_count(mp, &cnt, flags); > - > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > } > > /* > @@ -1809,20 +1832,12 @@ xfs_icsb_balance_counter_locked( > int min_per_cpu) > { > uint64_t count, resid; > - int weight = num_online_cpus(); > - uint64_t min = (uint64_t)min_per_cpu; > > /* disable counter and sync counter */ > xfs_icsb_disable_counter(mp, field); > > /* update counters - first CPU gets residual*/ > switch (field) { > - case XFS_SBS_FDBLOCKS: > - count = mp->m_sb.sb_fdblocks; > - resid = do_div(count, weight); > - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) > - return; > - break; > default: > BUG(); > count = resid = 0; /* quiet, gcc */ > @@ -1851,7 +1866,6 @@ xfs_icsb_modify_counters( > int rsvd) > { > xfs_icsb_cnts_t *icsbp; > - long long lcounter; /* long counter for 64 bit fields */ > int ret = 0; > > might_sleep(); > @@ -1871,18 +1885,9 @@ again: > } > > switch (field) { > - case XFS_SBS_FDBLOCKS: > - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); > - > - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > - lcounter += delta; > - if (unlikely(lcounter < 0)) > - goto balance_counter; > - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > - break; > default: > BUG(); > - break; > + goto balance_counter; /* be still, gcc */ > } > xfs_icsb_unlock_cntr(icsbp); > preempt_enable(); > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 0cb32ce..76f5d25 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -85,6 +85,7 @@ typedef struct xfs_mount { > spinlock_t m_sb_lock; /* sb counter lock */ > struct percpu_counter m_icount; /* allocated inodes counter */ > struct percpu_counter m_ifree; /* free inodes counter */ > + struct percpu_counter m_fdblocks; /* free block counter */ > > struct xfs_buf *m_sb_bp; /* buffer for superblock */ > char *m_fsname; /* filesystem name */ > @@ -382,6 +383,8 @@ extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > uint, int); > 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); > extern int xfs_mount_log_sb(xfs_mount_t *); > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > extern int xfs_readsb(xfs_mount_t *, int); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index e06aa6b..4c6af31 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1089,6 +1089,7 @@ xfs_fs_statfs( > __uint64_t fakeinos, id; > __uint64_t icount; > __uint64_t ifree; > + __uint64_t fdblocks; > xfs_extlen_t lsize; > __int64_t ffree; > > @@ -1102,13 +1103,17 @@ xfs_fs_statfs( > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > icount = percpu_counter_sum(&mp->m_icount); > ifree = percpu_counter_sum(&mp->m_ifree); > + fdblocks = percpu_counter_sum(&mp->m_fdblocks); > > spin_lock(&mp->m_sb_lock); > statp->f_bsize = sbp->sb_blocksize; > lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; > statp->f_blocks = sbp->sb_dblocks - lsize; > - statp->f_bfree = statp->f_bavail = > - sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + spin_unlock(&mp->m_sb_lock); > + > + statp->f_bfree = fdblocks - XFS_ALLOC_SET_ASIDE(mp); > + statp->f_bavail = statp->f_bfree; > + > fakeinos = statp->f_bfree << sbp->sb_inopblog; > statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); > if (mp->m_maxicount) > @@ -1120,7 +1125,6 @@ xfs_fs_statfs( > ffree = statp->f_files - (icount - ifree); > statp->f_ffree = max_t(__int64_t, ffree, 0); > > - spin_unlock(&mp->m_sb_lock); > > if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) == > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 68680ce..e99f5e5 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -173,7 +173,7 @@ xfs_trans_reserve( > uint rtextents) > { > int error = 0; > - int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > /* Mark this thread as being in a transaction */ > current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); > @@ -184,8 +184,7 @@ xfs_trans_reserve( > * fail if the count would go below zero. > */ > if (blocks > 0) { > - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > - -((int64_t)blocks), rsvd); > + error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); > if (error != 0) { > current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > return -ENOSPC; > @@ -268,8 +267,7 @@ undo_log: > > undo_blocks: > if (blocks > 0) { > - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > - (int64_t)blocks, rsvd); > + xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); > tp->t_blk_res = 0; > } > > @@ -516,14 +514,13 @@ xfs_trans_unreserve_and_mod_sb( > xfs_mount_t *mp = tp->t_mountp; > /* REFERENCED */ > int error; > - int rsvd; > + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > int64_t blkdelta = 0; > int64_t rtxdelta = 0; > int64_t idelta = 0; > int64_t ifreedelta = 0; > > msbp = msb; > - rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > /* calculate deltas */ > if (tp->t_blk_res > 0) > @@ -547,8 +544,7 @@ xfs_trans_unreserve_and_mod_sb( > > /* apply the per-cpu counters */ > if (blkdelta) { > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > - blkdelta, rsvd); > + error = xfs_mod_fdblocks(mp, blkdelta, rsvd); > if (error) > goto out; > } > @@ -635,7 +631,7 @@ out_undo_icount: > xfs_mod_icount(mp, -idelta); > out_undo_fdblocks: > if (blkdelta) > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); > + xfs_mod_fdblocks(mp, -blkdelta, rsvd); > out: > ASSERT(error == 0); > return; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:10:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC4777F3F for ; Thu, 5 Feb 2015 08:10:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA8EE304039 for ; Thu, 5 Feb 2015 06:10:35 -0800 (PST) X-ASG-Debug-ID: 1423145433-04cbb04169c409b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YHfgCqhnG7eSoj2Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10: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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAUjL009799 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:10:31 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAPtx028682 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:10:28 -0500 Date: Thu, 5 Feb 2015 09:10:25 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/7] xfs: Remove icsb infrastructure Message-ID: <20150205141024.GF31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: Remove icsb infrastructure References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145433 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:06AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Now that the in-core superblock infrastructure has been replaced with > generic per-cpu counters, we don't need it anymore. Nuke it from > orbit so we are sure that it won't haunt us again... > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_sb.c | 8 +- > fs/xfs/xfs_fsops.c | 2 - > fs/xfs/xfs_iomap.c | 1 - > fs/xfs/xfs_linux.h | 9 - > fs/xfs/xfs_log_recover.c | 4 +- > fs/xfs/xfs_mount.c | 516 +---------------------------------------------- > fs/xfs/xfs_mount.h | 67 ------ > fs/xfs/xfs_super.c | 84 ++++++-- > fs/xfs/xfs_super.h | 2 + > 9 files changed, 72 insertions(+), 621 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 31a3e97..a270095 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -743,17 +743,15 @@ xfs_initialize_perag_data( > btree += pag->pagf_btreeblks; > xfs_perag_put(pag); > } > - /* > - * Overwrite incore superblock counters with just-read data > - */ > + > + /* Overwrite incore superblock counters with just-read data */ > spin_lock(&mp->m_sb_lock); > sbp->sb_ifree = ifree; > sbp->sb_icount = ialloc; > sbp->sb_fdblocks = bfree + bfreelst + btree; > spin_unlock(&mp->m_sb_lock); > > - /* Fixup the per-cpu counters as well. */ > - xfs_icsb_reinit_counters(mp); > + xfs_reinit_percpu_counters(mp); > > return 0; > } > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index fed97a9..a45c82b4 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -630,7 +630,6 @@ xfs_fs_counts( > xfs_mount_t *mp, > xfs_fsop_counts_t *cnt) > { > - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > 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) - > @@ -694,7 +693,6 @@ xfs_reserve_blocks( > */ > retry: > spin_lock(&mp->m_sb_lock); > - xfs_icsb_sync_counters_locked(mp, 0); > > /* > * If our previous reservation was larger than the current value, > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 205b948..38e633b 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -460,7 +460,6 @@ xfs_iomap_prealloc_size( > alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), > alloc_blocks); > > - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > freesp = percpu_counter_read_positive(&mp->m_fdblocks); > if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > shift = 2; > diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h > index c31d2c2..7c7842c 100644 > --- a/fs/xfs/xfs_linux.h > +++ b/fs/xfs/xfs_linux.h > @@ -116,15 +116,6 @@ typedef __uint64_t __psunsigned_t; > #undef XFS_NATIVE_HOST > #endif > > -/* > - * Feature macros (disable/enable) > - */ > -#ifdef CONFIG_SMP > -#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ > -#else > -#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */ > -#endif > - > #define irix_sgid_inherit xfs_params.sgid_inherit.val > #define irix_symlink_mode xfs_params.symlink_mode.val > #define xfs_panic_mask xfs_params.panic_mask.val > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index a5a945f..4f5784f 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -4463,10 +4463,10 @@ xlog_do_recover( > 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); > > - /* We've re-read the superblock so re-initialize per-cpu counters */ > - xfs_icsb_reinit_counters(log->l_mp); > > xlog_recover_check_summary(log); > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 9e433b2..1d26200 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -43,18 +43,6 @@ > #include "xfs_sysfs.h" > > > -#ifdef HAVE_PERCPU_SB > -STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, > - int); > -STATIC void xfs_icsb_balance_counter_locked(xfs_mount_t *, xfs_sb_field_t, > - int); > -STATIC void xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); > -#else > - > -#define xfs_icsb_balance_counter(mp, a, b) do { } while (0) > -#define xfs_icsb_balance_counter_locked(mp, a, b) do { } while (0) > -#endif > - > static DEFINE_MUTEX(xfs_uuid_table_mutex); > static int xfs_uuid_table_size; > static uuid_t *xfs_uuid_table; > @@ -347,8 +335,7 @@ reread: > goto reread; > } > > - /* Initialize per-cpu counters */ > - xfs_icsb_reinit_counters(mp); > + xfs_reinit_percpu_counters(mp); > > /* no need to be quiet anymore, so reset the buf ops */ > bp->b_ops = &xfs_sb_buf_ops; > @@ -1087,8 +1074,6 @@ xfs_log_sbcount(xfs_mount_t *mp) > if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) > return 0; > > - xfs_icsb_sync_counters(mp, 0); > - > /* > * we don't need to do this if we are updating the superblock > * counters on every modification. > @@ -1467,502 +1452,3 @@ xfs_dev_is_read_only( > } > return 0; > } > - > -#ifdef HAVE_PERCPU_SB > -/* > - * Per-cpu incore superblock counters > - * > - * Simple concept, difficult implementation > - * > - * Basically, replace the incore superblock counters with a distributed per cpu > - * counter for contended fields (e.g. free block count). > - * > - * Difficulties arise in that the incore sb is used for ENOSPC checking, and > - * hence needs to be accurately read when we are running low on space. Hence > - * there is a method to enable and disable the per-cpu counters based on how > - * much "stuff" is available in them. > - * > - * Basically, a counter is enabled if there is enough free resource to justify > - * running a per-cpu fast-path. If the per-cpu counter runs out (i.e. a local > - * ENOSPC), then we disable the counters to synchronise all callers and > - * re-distribute the available resources. > - * > - * If, once we redistributed the available resources, we still get a failure, > - * we disable the per-cpu counter and go through the slow path. > - * > - * The slow path is the current xfs_mod_incore_sb() function. This means that > - * when we disable a per-cpu counter, we need to drain its resources back to > - * the global superblock. We do this after disabling the counter to prevent > - * more threads from queueing up on the counter. > - * > - * Essentially, this means that we still need a lock in the fast path to enable > - * synchronisation between the global counters and the per-cpu counters. This > - * is not a problem because the lock will be local to a CPU almost all the time > - * and have little contention except when we get to ENOSPC conditions. > - * > - * Basically, this lock becomes a barrier that enables us to lock out the fast > - * path while we do things like enabling and disabling counters and > - * synchronising the counters. > - * > - * Locking rules: > - * > - * 1. m_sb_lock before picking up per-cpu locks > - * 2. per-cpu locks always picked up via for_each_online_cpu() order > - * 3. accurate counter sync requires m_sb_lock + per cpu locks > - * 4. modifying per-cpu counters requires holding per-cpu lock > - * 5. modifying global counters requires holding m_sb_lock > - * 6. enabling or disabling a counter requires holding the m_sb_lock > - * and _none_ of the per-cpu locks. > - * > - * Disabled counters are only ever re-enabled by a balance operation > - * that results in more free resources per CPU than a given threshold. > - * To ensure counters don't remain disabled, they are rebalanced when > - * the global resource goes above a higher threshold (i.e. some hysteresis > - * is present to prevent thrashing). > - */ > - > -#ifdef CONFIG_HOTPLUG_CPU > -/* > - * hot-plug CPU notifier support. > - * > - * We need a notifier per filesystem as we need to be able to identify > - * the filesystem to balance the counters out. This is achieved by > - * having a notifier block embedded in the xfs_mount_t and doing pointer > - * magic to get the mount pointer from the notifier block address. > - */ > -STATIC int > -xfs_icsb_cpu_notify( > - struct notifier_block *nfb, > - unsigned long action, > - void *hcpu) > -{ > - xfs_icsb_cnts_t *cntp; > - xfs_mount_t *mp; > - > - mp = (xfs_mount_t *)container_of(nfb, xfs_mount_t, m_icsb_notifier); > - cntp = (xfs_icsb_cnts_t *) > - per_cpu_ptr(mp->m_sb_cnts, (unsigned long)hcpu); > - switch (action) { > - case CPU_UP_PREPARE: > - case CPU_UP_PREPARE_FROZEN: > - /* Easy Case - initialize the area and locks, and > - * then rebalance when online does everything else for us. */ > - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > - break; > - case CPU_ONLINE: > - case CPU_ONLINE_FROZEN: > - xfs_icsb_lock(mp); > - xfs_icsb_unlock(mp); > - break; > - case CPU_DEAD: > - case CPU_DEAD_FROZEN: > - /* Disable all the counters, then fold the dead cpu's > - * count into the total on the global superblock and > - * re-enable the counters. */ > - xfs_icsb_lock(mp); > - spin_lock(&mp->m_sb_lock); > - > - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > - > - spin_unlock(&mp->m_sb_lock); > - xfs_icsb_unlock(mp); > - break; > - } > - > - return NOTIFY_OK; > -} > -#endif /* CONFIG_HOTPLUG_CPU */ > - > -int > -xfs_icsb_init_counters( > - xfs_mount_t *mp) > -{ > - xfs_icsb_cnts_t *cntp; > - int error; > - int i; > - > - error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); > - if (error) > - return error; > - > - error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); > - if (error) > - goto free_icount; > - > - error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); > - if (error) > - goto free_ifree; > - > - mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > - if (!mp->m_sb_cnts) { > - error = -ENOMEM; > - goto free_fdblocks; > - } > - > - for_each_online_cpu(i) { > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > - } > - > - mutex_init(&mp->m_icsb_mutex); > - > - /* > - * start with all counters disabled so that the > - * initial balance kicks us off correctly > - */ > - mp->m_icsb_counters = -1; > - > -#ifdef CONFIG_HOTPLUG_CPU > - mp->m_icsb_notifier.notifier_call = xfs_icsb_cpu_notify; > - mp->m_icsb_notifier.priority = 0; > - register_hotcpu_notifier(&mp->m_icsb_notifier); > -#endif /* CONFIG_HOTPLUG_CPU */ > - > - return 0; > - > -free_fdblocks: > - percpu_counter_destroy(&mp->m_fdblocks); > -free_ifree: > - percpu_counter_destroy(&mp->m_ifree); > -free_icount: > - percpu_counter_destroy(&mp->m_icount); > - return error; > -} > - > -void > -xfs_icsb_reinit_counters( > - xfs_mount_t *mp) > -{ > - 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); > - > - xfs_icsb_lock(mp); > - /* > - * start with all counters disabled so that the > - * initial balance kicks us off correctly > - */ > - mp->m_icsb_counters = -1; > - xfs_icsb_unlock(mp); > -} > - > -void > -xfs_icsb_destroy_counters( > - xfs_mount_t *mp) > -{ > - if (mp->m_sb_cnts) { > - unregister_hotcpu_notifier(&mp->m_icsb_notifier); > - free_percpu(mp->m_sb_cnts); > - } > - > - percpu_counter_destroy(&mp->m_icount); > - percpu_counter_destroy(&mp->m_ifree); > - percpu_counter_destroy(&mp->m_fdblocks); > - > - mutex_destroy(&mp->m_icsb_mutex); > -} > - > -STATIC void > -xfs_icsb_lock_cntr( > - xfs_icsb_cnts_t *icsbp) > -{ > - while (test_and_set_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags)) { > - ndelay(1000); > - } > -} > - > -STATIC void > -xfs_icsb_unlock_cntr( > - xfs_icsb_cnts_t *icsbp) > -{ > - clear_bit(XFS_ICSB_FLAG_LOCK, &icsbp->icsb_flags); > -} > - > - > -STATIC void > -xfs_icsb_lock_all_counters( > - xfs_mount_t *mp) > -{ > - xfs_icsb_cnts_t *cntp; > - int i; > - > - for_each_online_cpu(i) { > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - xfs_icsb_lock_cntr(cntp); > - } > -} > - > -STATIC void > -xfs_icsb_unlock_all_counters( > - xfs_mount_t *mp) > -{ > - xfs_icsb_cnts_t *cntp; > - int i; > - > - for_each_online_cpu(i) { > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > - xfs_icsb_unlock_cntr(cntp); > - } > -} > - > -STATIC void > -xfs_icsb_count( > - xfs_mount_t *mp, > - xfs_icsb_cnts_t *cnt, > - int flags) > -{ > - memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); > - > - if (!(flags & XFS_ICSB_LAZY_COUNT)) > - xfs_icsb_lock_all_counters(mp); > - > - > - if (!(flags & XFS_ICSB_LAZY_COUNT)) > - xfs_icsb_unlock_all_counters(mp); > -} > - > -STATIC int > -xfs_icsb_counter_disabled( > - xfs_mount_t *mp, > - xfs_sb_field_t field) > -{ > - return test_bit(field, &mp->m_icsb_counters); > -} > - > -STATIC void > -xfs_icsb_disable_counter( > - xfs_mount_t *mp, > - xfs_sb_field_t field) > -{ > - xfs_icsb_cnts_t cnt; > - > - /* > - * If we are already disabled, then there is nothing to do > - * here. We check before locking all the counters to avoid > - * the expensive lock operation when being called in the > - * slow path and the counter is already disabled. This is > - * safe because the only time we set or clear this state is under > - * the m_icsb_mutex. > - */ > - if (xfs_icsb_counter_disabled(mp, field)) > - return; > - > - xfs_icsb_lock_all_counters(mp); > - if (!test_and_set_bit(field, &mp->m_icsb_counters)) { > - /* drain back to superblock */ > - > - xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > - switch(field) { > - default: > - BUG(); > - } > - } > - > - xfs_icsb_unlock_all_counters(mp); > -} > - > -STATIC void > -xfs_icsb_enable_counter( > - xfs_mount_t *mp, > - xfs_sb_field_t field, > - uint64_t count, > - uint64_t resid) > -{ > - int i; > - > - xfs_icsb_lock_all_counters(mp); > - for_each_online_cpu(i) { > - switch (field) { > - default: > - BUG(); > - break; > - } > - resid = 0; > - } > - clear_bit(field, &mp->m_icsb_counters); > - xfs_icsb_unlock_all_counters(mp); > -} > - > -void > -xfs_icsb_sync_counters_locked( > - xfs_mount_t *mp, > - int flags) > -{ > - xfs_icsb_cnts_t cnt; > - > - xfs_icsb_count(mp, &cnt, flags); > -} > - > -/* > - * Accurate update of per-cpu counters to incore superblock > - */ > -void > -xfs_icsb_sync_counters( > - xfs_mount_t *mp, > - int flags) > -{ > - spin_lock(&mp->m_sb_lock); > - xfs_icsb_sync_counters_locked(mp, flags); > - spin_unlock(&mp->m_sb_lock); > -} > - > -/* > - * Balance and enable/disable counters as necessary. > - * > - * Thresholds for re-enabling counters are somewhat magic. inode counts are > - * chosen to be the same number as single on disk allocation chunk per CPU, and > - * free blocks is something far enough zero that we aren't going thrash when we > - * get near ENOSPC. We also need to supply a minimum we require per cpu to > - * prevent looping endlessly when xfs_alloc_space asks for more than will > - * be distributed to a single CPU but each CPU has enough blocks to be > - * reenabled. > - * > - * Note that we can be called when counters are already disabled. > - * xfs_icsb_disable_counter() optimises the counter locking in this case to > - * prevent locking every per-cpu counter needlessly. > - */ > - > -#define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 > -#define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ > - (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) > -STATIC void > -xfs_icsb_balance_counter_locked( > - xfs_mount_t *mp, > - xfs_sb_field_t field, > - int min_per_cpu) > -{ > - uint64_t count, resid; > - > - /* disable counter and sync counter */ > - xfs_icsb_disable_counter(mp, field); > - > - /* update counters - first CPU gets residual*/ > - switch (field) { > - default: > - BUG(); > - count = resid = 0; /* quiet, gcc */ > - break; > - } > - > - xfs_icsb_enable_counter(mp, field, count, resid); > -} > - > -STATIC void > -xfs_icsb_balance_counter( > - xfs_mount_t *mp, > - xfs_sb_field_t fields, > - int min_per_cpu) > -{ > - spin_lock(&mp->m_sb_lock); > - xfs_icsb_balance_counter_locked(mp, fields, min_per_cpu); > - spin_unlock(&mp->m_sb_lock); > -} > - > -int > -xfs_icsb_modify_counters( > - xfs_mount_t *mp, > - xfs_sb_field_t field, > - int64_t delta, > - int rsvd) > -{ > - xfs_icsb_cnts_t *icsbp; > - int ret = 0; > - > - might_sleep(); > -again: > - preempt_disable(); > - icsbp = this_cpu_ptr(mp->m_sb_cnts); > - > - /* > - * if the counter is disabled, go to slow path > - */ > - if (unlikely(xfs_icsb_counter_disabled(mp, field))) > - goto slow_path; > - xfs_icsb_lock_cntr(icsbp); > - if (unlikely(xfs_icsb_counter_disabled(mp, field))) { > - xfs_icsb_unlock_cntr(icsbp); > - goto slow_path; > - } > - > - switch (field) { > - default: > - BUG(); > - goto balance_counter; /* be still, gcc */ > - } > - xfs_icsb_unlock_cntr(icsbp); > - preempt_enable(); > - return 0; > - > -slow_path: > - preempt_enable(); > - > - /* > - * serialise with a mutex so we don't burn lots of cpu on > - * the superblock lock. We still need to hold the superblock > - * lock, however, when we modify the global structures. > - */ > - xfs_icsb_lock(mp); > - > - /* > - * Now running atomically. > - * > - * If the counter is enabled, someone has beaten us to rebalancing. > - * Drop the lock and try again in the fast path.... > - */ > - if (!(xfs_icsb_counter_disabled(mp, field))) { > - xfs_icsb_unlock(mp); > - goto again; > - } > - > - /* > - * The counter is currently disabled. Because we are > - * running atomically here, we know a rebalance cannot > - * be in progress. Hence we can go straight to operating > - * on the global superblock. We do not call xfs_mod_incore_sb() > - * here even though we need to get the m_sb_lock. Doing so > - * will cause us to re-enter this function and deadlock. > - * Hence we get the m_sb_lock ourselves and then call > - * xfs_mod_incore_sb_unlocked() as the unlocked path operates > - * directly on the global counters. > - */ > - spin_lock(&mp->m_sb_lock); > - ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > - spin_unlock(&mp->m_sb_lock); > - > - /* > - * Now that we've modified the global superblock, we > - * may be able to re-enable the distributed counters > - * (e.g. lots of space just got freed). After that > - * we are done. > - */ > - if (ret != -ENOSPC) > - xfs_icsb_balance_counter(mp, field, 0); > - xfs_icsb_unlock(mp); > - return ret; > - > -balance_counter: > - xfs_icsb_unlock_cntr(icsbp); > - preempt_enable(); > - > - /* > - * We may have multiple threads here if multiple per-cpu > - * counters run dry at the same time. This will mean we can > - * do more balances than strictly necessary but it is not > - * the common slowpath case. > - */ > - xfs_icsb_lock(mp); > - > - /* > - * running atomically. > - * > - * This will leave the counter in the correct state for future > - * accesses. After the rebalance, we simply try again and our retry > - * will either succeed through the fast path or slow path without > - * another balance operation being required. > - */ > - xfs_icsb_balance_counter(mp, field, delta); > - xfs_icsb_unlock(mp); > - goto again; > -} > - > -#endif > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 76f5d25..ff1d1d5 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -18,8 +18,6 @@ > #ifndef __XFS_MOUNT_H__ > #define __XFS_MOUNT_H__ > > -#ifdef __KERNEL__ > - > struct xlog; > struct xfs_inode; > struct xfs_mru_cache; > @@ -29,43 +27,6 @@ struct xfs_quotainfo; > struct xfs_dir_ops; > struct xfs_da_geometry; > > -#ifdef HAVE_PERCPU_SB > - > -/* > - * Valid per-cpu incore superblock counters. Note that if you add new counters, > - * you may need to define new counter disabled bit field descriptors as there > - * are more possible fields in the superblock that can fit in a bitfield on a > - * 32 bit platform. The XFS_SBS_* values for the current current counters just > - * fit. > - */ > -typedef struct xfs_icsb_cnts { > - uint64_t icsb_fdblocks; > - uint64_t icsb_ifree; > - unsigned long icsb_flags; > -} xfs_icsb_cnts_t; > - > -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ > - > -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ > - > -extern int xfs_icsb_init_counters(struct xfs_mount *); > -extern void xfs_icsb_reinit_counters(struct xfs_mount *); > -extern void xfs_icsb_destroy_counters(struct xfs_mount *); > -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); > -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); > -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, > - int64_t, int); > - > -#else > -#define xfs_icsb_init_counters(mp) (0) > -#define xfs_icsb_destroy_counters(mp) do { } while (0) > -#define xfs_icsb_reinit_counters(mp) do { } while (0) > -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) > -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) > -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ > - xfs_mod_incore_sb(mp, field, delta, rsvd) > -#endif > - > /* dynamic preallocation free space thresholds, 5% down to 1% */ > enum { > XFS_LOWSP_1_PCNT = 0, > @@ -156,12 +117,6 @@ typedef struct xfs_mount { > const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ > uint m_chsize; /* size of next field */ > atomic_t m_active_trans; /* number trans frozen */ > -#ifdef HAVE_PERCPU_SB > - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ > - unsigned long m_icsb_counters; /* disabled per-cpu counters */ > - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ > - struct mutex m_icsb_mutex; /* balancer sync lock */ > -#endif > struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ > struct delayed_work m_reclaim_work; /* background inode reclaim */ > struct delayed_work m_eofblocks_work; /* background eof blocks > @@ -294,26 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) > } > > /* > - * Per-cpu superblock locking functions > - */ > -#ifdef HAVE_PERCPU_SB > -static inline void > -xfs_icsb_lock(xfs_mount_t *mp) > -{ > - mutex_lock(&mp->m_icsb_mutex); > -} > - > -static inline void > -xfs_icsb_unlock(xfs_mount_t *mp) > -{ > - mutex_unlock(&mp->m_icsb_mutex); > -} > -#else > -#define xfs_icsb_lock(mp) > -#define xfs_icsb_unlock(mp) > -#endif > - > -/* > * This structure is for use by the xfs_mod_incore_sb_batch() routine. > * xfs_growfs can specify a few fields which are more than int limit > */ > @@ -396,6 +331,4 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); > > extern void xfs_set_low_space_thresholds(struct xfs_mount *); > > -#endif /* __KERNEL__ */ > - > #endif /* __XFS_MOUNT_H__ */ > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 4c6af31..af6d268 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1035,23 +1035,6 @@ xfs_free_fsname( > kfree(mp->m_logname); > } > > -STATIC void > -xfs_fs_put_super( > - struct super_block *sb) > -{ > - struct xfs_mount *mp = XFS_M(sb); > - > - xfs_filestream_unmount(mp); > - xfs_unmountfs(mp); > - > - xfs_freesb(mp); > - xfs_icsb_destroy_counters(mp); > - xfs_destroy_mount_workqueues(mp); > - xfs_close_devices(mp); > - xfs_free_fsname(mp); > - kfree(mp); > -} > - > STATIC int > xfs_fs_sync_fs( > struct super_block *sb, > @@ -1100,7 +1083,6 @@ xfs_fs_statfs( > statp->f_fsid.val[0] = (u32)id; > statp->f_fsid.val[1] = (u32)(id >> 32); > > - xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > icount = percpu_counter_sum(&mp->m_icount); > ifree = percpu_counter_sum(&mp->m_ifree); > fdblocks = percpu_counter_sum(&mp->m_fdblocks); > @@ -1405,6 +1387,51 @@ xfs_finish_flags( > return 0; > } > > +static int > +xfs_init_percpu_counters( > + struct xfs_mount *mp) > +{ > + int error; > + > + error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL); > + if (error) > + return ENOMEM; > + > + error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL); > + if (error) > + goto free_icount; > + > + error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); > + if (error) > + goto free_ifree; > + > + return 0; > + > +free_ifree: > + percpu_counter_destroy(&mp->m_ifree); > +free_icount: > + percpu_counter_destroy(&mp->m_icount); > + return -ENOMEM; > +} > + > +void > +xfs_reinit_percpu_counters( > + struct xfs_mount *mp) > +{ > + 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); > +} > + > +static void > +xfs_destroy_percpu_counters( > + struct xfs_mount *mp) > +{ > + percpu_counter_destroy(&mp->m_icount); > + percpu_counter_destroy(&mp->m_ifree); > + percpu_counter_destroy(&mp->m_fdblocks); > +} > + > STATIC int > xfs_fs_fill_super( > struct super_block *sb, > @@ -1453,7 +1480,7 @@ xfs_fs_fill_super( > if (error) > goto out_close_devices; > > - error = xfs_icsb_init_counters(mp); > + error = xfs_init_percpu_counters(mp); > if (error) > goto out_destroy_workqueues; > > @@ -1511,7 +1538,7 @@ xfs_fs_fill_super( > out_free_sb: > xfs_freesb(mp); > out_destroy_counters: > - xfs_icsb_destroy_counters(mp); > + xfs_destroy_percpu_counters(mp); > out_destroy_workqueues: > xfs_destroy_mount_workqueues(mp); > out_close_devices: > @@ -1528,6 +1555,23 @@ out_destroy_workqueues: > goto out_free_sb; > } > > +STATIC void > +xfs_fs_put_super( > + struct super_block *sb) > +{ > + struct xfs_mount *mp = XFS_M(sb); > + > + xfs_filestream_unmount(mp); > + xfs_unmountfs(mp); > + > + xfs_freesb(mp); > + xfs_destroy_percpu_counters(mp); > + xfs_destroy_mount_workqueues(mp); > + xfs_close_devices(mp); > + xfs_free_fsname(mp); > + kfree(mp); > +} > + > STATIC struct dentry * > xfs_fs_mount( > struct file_system_type *fs_type, > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > index 2b830c2..499058f 100644 > --- a/fs/xfs/xfs_super.h > +++ b/fs/xfs/xfs_super.h > @@ -72,6 +72,8 @@ extern const struct export_operations xfs_export_operations; > extern const struct xattr_handler *xfs_xattr_handlers[]; > extern const struct quotactl_ops xfs_quotactl_operations; > > +extern void xfs_reinit_percpu_counters(struct xfs_mount *mp); > + > #define XFS_M(sb) ((struct xfs_mount *)((sb)->s_fs_info)) > > #endif /* __XFS_SUPER_H__ */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:10:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 67D908016 for ; Thu, 5 Feb 2015 08:10:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 564418F804C for ; Thu, 5 Feb 2015 06:10:42 -0800 (PST) X-ASG-Debug-ID: 1423145440-04cbb04167c409d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VQqZZnxaiZyzIL3E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10:41 -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 (8.14.4/8.14.4) with ESMTP id t15EAd87030351 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:10:39 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAZSn010861 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:10:38 -0500 Date: Thu, 5 Feb 2015 09:10:35 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/7] xfs: introduce xfs_mod_frextents Message-ID: <20150205141035.GG31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce xfs_mod_frextents References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145441 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:07AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Add a new helper to modify the incore counter of free realtime > extents. This matches the helpers used for inode and data block > counters, and removes a significant users of the xfs_mod_incore_sb() > interface. > > Based on a patch originally from Christoph Hellwig. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_bmap.c | 8 +++----- > fs/xfs/xfs_mount.c | 27 +++++++++++++++++++-------- > fs/xfs/xfs_mount.h | 2 ++ > fs/xfs/xfs_trans.c | 18 ++++++++++-------- > 4 files changed, 34 insertions(+), 21 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index e39c9e8..b8e97fd0 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -4158,8 +4158,7 @@ xfs_bmapi_reserve_delalloc( > ASSERT(indlen > 0); > > if (rt) { > - error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, > - -((int64_t)extsz), 0); > + error = xfs_mod_frextents(mp, -((int64_t)extsz)); > } else { > error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); > } > @@ -4194,7 +4193,7 @@ xfs_bmapi_reserve_delalloc( > > out_unreserve_blocks: > if (rt) > - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); > + xfs_mod_frextents(mp, extsz); > else > xfs_mod_fdblocks(mp, alen, false); > out_unreserve_quota: > @@ -5278,8 +5277,7 @@ xfs_bunmapi( > > rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); > do_div(rtexts, mp->m_sb.sb_rextsize); > - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, > - (int64_t)rtexts, 0); > + xfs_mod_frextents(mp, (int64_t)rtexts); > (void)xfs_trans_reserve_quota_nblks(NULL, > ip, -((long)del.br_blockcount), 0, > XFS_QMOPT_RES_RTBLKS); > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 1d26200..284f528 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1199,6 +1199,24 @@ fdblocks_enospc: > return -ENOSPC; > } > > +int > +xfs_mod_frextents( > + struct xfs_mount *mp, > + int64_t delta) > +{ > + int64_t lcounter; > + int ret = 0; > + > + spin_lock(&mp->m_sb_lock); > + lcounter = mp->m_sb.sb_frextents + delta; > + if (lcounter < 0) > + ret = -ENOSPC; > + else > + mp->m_sb.sb_frextents = lcounter; > + spin_unlock(&mp->m_sb_lock); > + return ret; > +} > + > /* > * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > * a delta to a specified field in the in-core superblock. Simply > @@ -1228,16 +1246,9 @@ xfs_mod_incore_sb_unlocked( > case XFS_SBS_ICOUNT: > case XFS_SBS_IFREE: > case XFS_SBS_FDBLOCKS: > + case XFS_SBS_FREXTENTS: > ASSERT(0); > return -EINVAL; > - case XFS_SBS_FREXTENTS: > - lcounter = (long long)mp->m_sb.sb_frextents; > - lcounter += delta; > - if (lcounter < 0) { > - return -ENOSPC; > - } > - mp->m_sb.sb_frextents = lcounter; > - return 0; > case XFS_SBS_DBLOCKS: > lcounter = (long long)mp->m_sb.sb_dblocks; > lcounter += delta; > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index ff1d1d5..8970489 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -320,6 +320,8 @@ 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); > +extern int xfs_mod_frextents(struct xfs_mount *mp, int64_t delta); > + > extern int xfs_mount_log_sb(xfs_mount_t *); > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > extern int xfs_readsb(xfs_mount_t *, int); > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index e99f5e5..4e4bc5a 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -235,8 +235,7 @@ xfs_trans_reserve( > * fail if the count would go below zero. > */ > if (rtextents > 0) { > - error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, > - -((int64_t)rtextents), rsvd); > + error = xfs_mod_frextents(tp->t_mountp, -((int64_t)rtextents)); > if (error) { > error = -ENOSPC; > goto undo_log; > @@ -562,10 +561,10 @@ xfs_trans_unreserve_and_mod_sb( > } > > /* apply remaining deltas */ > - if (rtxdelta != 0) { > - msbp->msb_field = XFS_SBS_FREXTENTS; > - msbp->msb_delta = rtxdelta; > - msbp++; > + if (rtxdelta) { > + error = xfs_mod_frextents(mp, rtxdelta); > + if (error) > + goto out_undo_ifree; > } > > if (tp->t_flags & XFS_TRANS_SB_DIRTY) { > @@ -618,12 +617,15 @@ xfs_trans_unreserve_and_mod_sb( > error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, > (uint)(msbp - msb), rsvd); > if (error) > - goto out_undo_ifreecount; > + goto out_undo_frextents; > } > > return; > > -out_undo_ifreecount: > +out_undo_frextents: > + if (rtxdelta) > + xfs_mod_frextents(mp, -rtxdelta); > +out_undo_ifree: > if (ifreedelta) > xfs_mod_ifree(mp, -ifreedelta); > out_undo_icount: > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:10:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1A778017 for ; Thu, 5 Feb 2015 08:10:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F9BA304039 for ; Thu, 5 Feb 2015 06:10:54 -0800 (PST) X-ASG-Debug-ID: 1423145452-04cbb04167c409f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TLY0rFjzIG57k58Y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:10:53 -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 (8.14.4/8.14.4) with ESMTP id t15EAomN025140 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:10:50 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAj5O027823 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:10:48 -0500 Date: Thu, 5 Feb 2015 09:10:44 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched Message-ID: <20150205141044.GH31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145452 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:08AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Introduce helper functions for modifying fields in the superblock > into xfs_trans.c, the only caller of xfs_mod_incore_sb_batch(). We > can then use these directly in xfs_trans_unreserve_and_mod_sb() and > so remove another user of the xfs_mode_incore_sb() API without > losing any functionality or scalability of the transaction commit > code.. > > Based on a patch from Christoph Hellwig. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_mount.c | 51 -------------- > fs/xfs/xfs_mount.h | 11 --- > fs/xfs/xfs_trans.c | 198 ++++++++++++++++++++++++++++++++++------------------- > 3 files changed, 126 insertions(+), 134 deletions(-) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 284f528..9499e88 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1354,57 +1354,6 @@ xfs_mod_incore_sb( > } > > /* > - * Change more than one field in the in-core superblock structure at a time. > - * > - * The fields and changes to those fields are specified in the array of > - * xfs_mod_sb structures passed in. Either all of the specified deltas > - * will be applied or none of them will. If any modified field dips below 0, > - * then all modifications will be backed out and EINVAL will be returned. > - * > - * Note that this function may not be used for the superblock values that > - * are tracked with the in-memory per-cpu counters - a direct call to > - * xfs_mod_incore_sb is required for these. > - */ > -int > -xfs_mod_incore_sb_batch( > - struct xfs_mount *mp, > - xfs_mod_sb_t *msb, > - uint nmsb, > - int rsvd) > -{ > - xfs_mod_sb_t *msbp; > - int error = 0; > - > - /* > - * Loop through the array of mod structures and apply each individually. > - * If any fail, then back out all those which have already been applied. > - * Do all of this within the scope of the m_sb_lock so that all of the > - * changes will be atomic. > - */ > - spin_lock(&mp->m_sb_lock); > - for (msbp = msb; msbp < (msb + nmsb); msbp++) { > - ASSERT(msbp->msb_field < XFS_SBS_ICOUNT || > - msbp->msb_field > XFS_SBS_FDBLOCKS); > - > - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, > - msbp->msb_delta, rsvd); > - if (error) > - goto unwind; > - } > - spin_unlock(&mp->m_sb_lock); > - return 0; > - > -unwind: > - while (--msbp >= msb) { > - error = xfs_mod_incore_sb_unlocked(mp, msbp->msb_field, > - -msbp->msb_delta, rsvd); > - ASSERT(error == 0); > - } > - spin_unlock(&mp->m_sb_lock); > - return error; > -} > - > -/* > * xfs_getsb() is called to obtain the buffer for the superblock. > * The buffer is returned locked and read in from disk. > * The buffer should be released with a call to xfs_brelse(). > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 8970489..66f28c1 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -249,15 +249,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) > } > > /* > - * This structure is for use by the xfs_mod_incore_sb_batch() routine. > - * xfs_growfs can specify a few fields which are more than int limit > - */ > -typedef struct xfs_mod_sb { > - xfs_sb_field_t msb_field; /* Field to modify, see below */ > - int64_t msb_delta; /* Change to make to specified field */ > -} xfs_mod_sb_t; > - > -/* > * Per-ag incore structure, copies of information in agf and agi, to improve the > * performance of allocation group selection. > */ > @@ -314,8 +305,6 @@ extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, > > extern void xfs_unmountfs(xfs_mount_t *); > extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); > -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > - uint, int); > extern int xfs_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, > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > index 4e4bc5a..220ef2c 100644 > --- a/fs/xfs/xfs_trans.c > +++ b/fs/xfs/xfs_trans.c > @@ -485,6 +485,54 @@ xfs_trans_apply_sb_deltas( > sizeof(sbp->sb_frextents) - 1); > } > > +STATIC int > +xfs_sb_mod8( > + uint8_t *field, > + int8_t delta) > +{ > + int8_t counter = *field; > + > + counter += delta; > + if (counter < 0) { > + ASSERT(0); > + return -EINVAL; > + } > + *field = counter; > + return 0; > +} > + > +STATIC int > +xfs_sb_mod32( > + uint32_t *field, > + int32_t delta) > +{ > + int32_t counter = *field; > + > + counter += delta; > + if (counter < 0) { > + ASSERT(0); > + return -EINVAL; > + } > + *field = counter; > + return 0; > +} > + > +STATIC int > +xfs_sb_mod64( > + uint64_t *field, > + int64_t delta) > +{ > + int64_t counter = *field; > + > + counter += delta; > + if (counter < 0) { > + ASSERT(0); > + return -EINVAL; > + } > + *field = counter; > + return 0; > +} > + > /* > * xfs_trans_unreserve_and_mod_sb() is called to release unused reservations > * and apply superblock counter changes to the in-core superblock. The > @@ -492,13 +540,6 @@ xfs_trans_apply_sb_deltas( > * applied to the in-core superblock. The idea is that that has already been > * done. > * > - * This is done efficiently with a single call to xfs_mod_incore_sb_batch(). > - * However, we have to ensure that we only modify each superblock field only > - * once because the application of the delta values may not be atomic. That can > - * lead to ENOSPC races occurring if we have two separate modifcations of the > - * free space counter to put back the entire reservation and then take away > - * what we used. > - * > * If we are not logging superblock counters, then the inode allocated/free and > * used block counts are not updated in the on disk superblock. In this case, > * XFS_TRANS_SB_DIRTY will not be set when the transaction is updated but we > @@ -506,20 +547,15 @@ xfs_trans_apply_sb_deltas( > */ > void > xfs_trans_unreserve_and_mod_sb( > - xfs_trans_t *tp) > + struct xfs_trans *tp) > { > - xfs_mod_sb_t msb[9]; /* If you add cases, add entries */ > - xfs_mod_sb_t *msbp; > - xfs_mount_t *mp = tp->t_mountp; > - /* REFERENCED */ > - int error; > - bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > - int64_t blkdelta = 0; > - int64_t rtxdelta = 0; > - int64_t idelta = 0; > - int64_t ifreedelta = 0; > - > - msbp = msb; > + struct xfs_mount *mp = tp->t_mountp; > + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > + int64_t blkdelta = 0; > + int64_t rtxdelta = 0; > + int64_t idelta = 0; > + int64_t ifreedelta = 0; > + int error; > > /* calculate deltas */ > if (tp->t_blk_res > 0) > @@ -560,72 +596,90 @@ xfs_trans_unreserve_and_mod_sb( > goto out_undo_icount; > } > > + if (rtxdelta == 0 && !(tp->t_flags & XFS_TRANS_SB_DIRTY)) > + return; > + > /* apply remaining deltas */ > + spin_lock(&mp->m_sb_lock); > if (rtxdelta) { > - error = xfs_mod_frextents(mp, rtxdelta); > + error = xfs_sb_mod64(&mp->m_sb.sb_frextents, rtxdelta); Any reason why we don't continue to use the xfs_mod_frextents() function introduced in the previous patch? Seems like we should be consistent one way or the other. Brian > if (error) > goto out_undo_ifree; > } > > - if (tp->t_flags & XFS_TRANS_SB_DIRTY) { > - if (tp->t_dblocks_delta != 0) { > - msbp->msb_field = XFS_SBS_DBLOCKS; > - msbp->msb_delta = tp->t_dblocks_delta; > - msbp++; > - } > - if (tp->t_agcount_delta != 0) { > - msbp->msb_field = XFS_SBS_AGCOUNT; > - msbp->msb_delta = tp->t_agcount_delta; > - msbp++; > - } > - if (tp->t_imaxpct_delta != 0) { > - msbp->msb_field = XFS_SBS_IMAX_PCT; > - msbp->msb_delta = tp->t_imaxpct_delta; > - msbp++; > - } > - if (tp->t_rextsize_delta != 0) { > - msbp->msb_field = XFS_SBS_REXTSIZE; > - msbp->msb_delta = tp->t_rextsize_delta; > - msbp++; > - } > - if (tp->t_rbmblocks_delta != 0) { > - msbp->msb_field = XFS_SBS_RBMBLOCKS; > - msbp->msb_delta = tp->t_rbmblocks_delta; > - msbp++; > - } > - if (tp->t_rblocks_delta != 0) { > - msbp->msb_field = XFS_SBS_RBLOCKS; > - msbp->msb_delta = tp->t_rblocks_delta; > - msbp++; > - } > - if (tp->t_rextents_delta != 0) { > - msbp->msb_field = XFS_SBS_REXTENTS; > - msbp->msb_delta = tp->t_rextents_delta; > - msbp++; > - } > - if (tp->t_rextslog_delta != 0) { > - msbp->msb_field = XFS_SBS_REXTSLOG; > - msbp->msb_delta = tp->t_rextslog_delta; > - msbp++; > - } > - } > - > - /* > - * If we need to change anything, do it. > - */ > - if (msbp > msb) { > - error = xfs_mod_incore_sb_batch(tp->t_mountp, msb, > - (uint)(msbp - msb), rsvd); > + if (tp->t_dblocks_delta != 0) { > + error = xfs_sb_mod64(&mp->m_sb.sb_dblocks, tp->t_dblocks_delta); > if (error) > goto out_undo_frextents; > } > - > + if (tp->t_agcount_delta != 0) { > + error = xfs_sb_mod32(&mp->m_sb.sb_agcount, tp->t_agcount_delta); > + if (error) > + goto out_undo_dblocks; > + } > + if (tp->t_imaxpct_delta != 0) { > + error = xfs_sb_mod8(&mp->m_sb.sb_imax_pct, tp->t_imaxpct_delta); > + if (error) > + goto out_undo_agcount; > + } > + if (tp->t_rextsize_delta != 0) { > + error = xfs_sb_mod32(&mp->m_sb.sb_rextsize, > + tp->t_rextsize_delta); > + if (error) > + goto out_undo_imaxpct; > + } > + if (tp->t_rbmblocks_delta != 0) { > + error = xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, > + tp->t_rbmblocks_delta); > + if (error) > + goto out_undo_rextsize; > + } > + if (tp->t_rblocks_delta != 0) { > + error = xfs_sb_mod64(&mp->m_sb.sb_rblocks, tp->t_rblocks_delta); > + if (error) > + goto out_undo_rbmblocks; > + } > + if (tp->t_rextents_delta != 0) { > + error = xfs_sb_mod64(&mp->m_sb.sb_rextents, > + tp->t_rextents_delta); > + if (error) > + goto out_undo_rblocks; > + } > + if (tp->t_rextslog_delta != 0) { > + error = xfs_sb_mod8(&mp->m_sb.sb_rextslog, > + tp->t_rextslog_delta); > + if (error) > + goto out_undo_rextents; > + } > + spin_unlock(&mp->m_sb_lock); > return; > > +out_undo_rextents: > + if (tp->t_rextents_delta) > + xfs_sb_mod64(&mp->m_sb.sb_rextents, -tp->t_rextents_delta); > +out_undo_rblocks: > + if (tp->t_rblocks_delta) > + xfs_sb_mod64(&mp->m_sb.sb_rblocks, -tp->t_rblocks_delta); > +out_undo_rbmblocks: > + if (tp->t_rbmblocks_delta) > + xfs_sb_mod32(&mp->m_sb.sb_rbmblocks, -tp->t_rbmblocks_delta); > +out_undo_rextsize: > + if (tp->t_rextsize_delta) > + xfs_sb_mod32(&mp->m_sb.sb_rextsize, -tp->t_rextsize_delta); > +out_undo_imaxpct: > + if (tp->t_rextsize_delta) > + xfs_sb_mod8(&mp->m_sb.sb_imax_pct, -tp->t_imaxpct_delta); > +out_undo_agcount: > + if (tp->t_agcount_delta) > + xfs_sb_mod32(&mp->m_sb.sb_agcount, -tp->t_agcount_delta); > +out_undo_dblocks: > + if (tp->t_dblocks_delta) > + xfs_sb_mod64(&mp->m_sb.sb_dblocks, -tp->t_dblocks_delta); > out_undo_frextents: > if (rtxdelta) > - xfs_mod_frextents(mp, -rtxdelta); > + xfs_sb_mod64(&mp->m_sb.sb_frextents, -rtxdelta); > out_undo_ifree: > + spin_unlock(&mp->m_sb_lock); > if (ifreedelta) > xfs_mod_ifree(mp, -ifreedelta); > out_undo_icount: > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:11:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF3E27F3F for ; Thu, 5 Feb 2015 08:11:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DDC80304043 for ; Thu, 5 Feb 2015 06:11:06 -0800 (PST) X-ASG-Debug-ID: 1423145463-04cbb04169c40a10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BrFXhiRpYCDdO235 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:11:03 -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 (8.14.4/8.14.4) with ESMTP id t15EB1XS025477 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:11:01 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EAvHf029494 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:11:00 -0500 Date: Thu, 5 Feb 2015 09:10:57 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 7/7] xfs: remove xfs_mod_incore_sb API Message-ID: <20150205141057.GI31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: remove xfs_mod_incore_sb API References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145463 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:54:09AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Now that there are no users of the bitfield based incore superblock > modification API, just remove the whole damn lot of it, including > all the bitfield definitions. This finally removes a lot of cruft > that has been around for a long time. > > Credit goes to Christoph Hellwig for providing a great patch > connecting all the dots to enale us to do this. This patch is > derived from that work. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_format.h | 62 --------------------- > fs/xfs/xfs_fsops.c | 4 -- > fs/xfs/xfs_mount.c | 136 --------------------------------------------- > fs/xfs/xfs_mount.h | 3 +- > 4 files changed, 1 insertion(+), 204 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index 8eb7189..4daaa66 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -264,68 +264,6 @@ typedef struct xfs_dsb { > /* must be padded to 64 bit alignment */ > } xfs_dsb_t; > > -/* > - * Sequence number values for the fields. > - */ > -typedef enum { > - XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS, > - XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO, > - XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS, > - XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS, > - XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE, > - XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG, > - XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG, > - XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT, > - XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO, > - XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, > - XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, > - XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, > - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, > - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, > - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, > - XFS_SBS_PQUOTINO, XFS_SBS_LSN, > - XFS_SBS_FIELDCOUNT > -} xfs_sb_field_t; > - > -/* > - * Mask values, defined based on the xfs_sb_field_t values. > - * Only define the ones we're using. > - */ > -#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) > -#define XFS_SB_UUID XFS_SB_MVAL(UUID) > -#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) > -#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) > -#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) > -#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) > -#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) > -#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) > -#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) > -#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) > -#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) > -#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) > -#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) > -#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) > -#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) > -#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) > -#define XFS_SB_FEATURES2 (XFS_SB_MVAL(FEATURES2) | \ > - XFS_SB_MVAL(BAD_FEATURES2)) > -#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) > -#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) > -#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) > -#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) > -#define XFS_SB_CRC XFS_SB_MVAL(CRC) > -#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) > -#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) > -#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) > -#define XFS_SB_MOD_BITS \ > - (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ > - XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ > - XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ > - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ > - XFS_SB_FEATURES_COMPAT | XFS_SB_FEATURES_RO_COMPAT | \ > - XFS_SB_FEATURES_INCOMPAT | XFS_SB_FEATURES_LOG_INCOMPAT | \ > - XFS_SB_PQUOTINO) > - > > /* > * Misc. Flags - warning - these will be cleared by xfs_repair unless > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index a45c82b4..6c248bf 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -686,10 +686,6 @@ xfs_reserve_blocks( > * what to do. This means that the amount of free space can > * change while we do this, so we need to retry if we end up > * trying to reserve more space than is available. > - * > - * We also use the xfs_mod_incore_sb() interface so that we > - * don't have to care about whether per cpu counter are > - * enabled, disabled or even compiled in.... > */ > retry: > spin_lock(&mp->m_sb_lock); > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 9499e88..6e6bc40 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -1218,142 +1218,6 @@ xfs_mod_frextents( > } > > /* > - * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > - * a delta to a specified field in the in-core superblock. Simply > - * switch on the field indicated and apply the delta to that field. > - * Fields are not allowed to dip below zero, so if the delta would > - * do this do not apply it and return EINVAL. > - * > - * The m_sb_lock must be held when this routine is called. > - */ > -STATIC int > -xfs_mod_incore_sb_unlocked( > - xfs_mount_t *mp, > - xfs_sb_field_t field, > - int64_t delta, > - int rsvd) > -{ > - int scounter; /* short counter for 32 bit fields */ > - long long lcounter; /* long counter for 64 bit fields */ > - > - /* > - * With the in-core superblock spin lock held, switch > - * on the indicated field. Apply the delta to the > - * proper field. If the fields value would dip below > - * 0, then do not apply the delta and return EINVAL. > - */ > - switch (field) { > - case XFS_SBS_ICOUNT: > - case XFS_SBS_IFREE: > - case XFS_SBS_FDBLOCKS: > - case XFS_SBS_FREXTENTS: > - ASSERT(0); > - return -EINVAL; > - case XFS_SBS_DBLOCKS: > - lcounter = (long long)mp->m_sb.sb_dblocks; > - lcounter += delta; > - if (lcounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_dblocks = lcounter; > - return 0; > - case XFS_SBS_AGCOUNT: > - scounter = mp->m_sb.sb_agcount; > - scounter += delta; > - if (scounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_agcount = scounter; > - return 0; > - case XFS_SBS_IMAX_PCT: > - scounter = mp->m_sb.sb_imax_pct; > - scounter += delta; > - if (scounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_imax_pct = scounter; > - return 0; > - case XFS_SBS_REXTSIZE: > - scounter = mp->m_sb.sb_rextsize; > - scounter += delta; > - if (scounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_rextsize = scounter; > - return 0; > - case XFS_SBS_RBMBLOCKS: > - scounter = mp->m_sb.sb_rbmblocks; > - scounter += delta; > - if (scounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_rbmblocks = scounter; > - return 0; > - case XFS_SBS_RBLOCKS: > - lcounter = (long long)mp->m_sb.sb_rblocks; > - lcounter += delta; > - if (lcounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_rblocks = lcounter; > - return 0; > - case XFS_SBS_REXTENTS: > - lcounter = (long long)mp->m_sb.sb_rextents; > - lcounter += delta; > - if (lcounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_rextents = lcounter; > - return 0; > - case XFS_SBS_REXTSLOG: > - scounter = mp->m_sb.sb_rextslog; > - scounter += delta; > - if (scounter < 0) { > - ASSERT(0); > - return -EINVAL; > - } > - mp->m_sb.sb_rextslog = scounter; > - return 0; > - default: > - ASSERT(0); > - return -EINVAL; > - } > -} > - > -/* > - * xfs_mod_incore_sb() is used to change a field in the in-core > - * superblock structure by the specified delta. This modification > - * is protected by the m_sb_lock. Just use the xfs_mod_incore_sb_unlocked() > - * routine to do the work. > - */ > -int > -xfs_mod_incore_sb( > - struct xfs_mount *mp, > - xfs_sb_field_t field, > - int64_t delta, > - int rsvd) > -{ > - int status; > - > -#ifdef HAVE_PERCPU_SB > - ASSERT(field < XFS_SBS_IFREE || field > XFS_SBS_FDBLOCKS); > -#endif > - > - spin_lock(&mp->m_sb_lock); > - status = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); > - spin_unlock(&mp->m_sb_lock); > - > - return status; > -} > - > -/* > * xfs_getsb() is called to obtain the buffer for the superblock. > * The buffer is returned locked and read in from disk. > * The buffer should be released with a call to xfs_brelse(). > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 66f28c1..616e1ba 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -302,9 +302,8 @@ extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); > extern int xfs_mountfs(xfs_mount_t *mp); > extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, > xfs_agnumber_t *maxagi); > - > extern void xfs_unmountfs(xfs_mount_t *); > -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); > + > extern int xfs_mod_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, > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 5 08:18:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64E8E803D for ; Thu, 5 Feb 2015 08:18:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40A96304043 for ; Thu, 5 Feb 2015 06:18:41 -0800 (PST) X-ASG-Debug-ID: 1423145918-04cbb0416ac40d40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZHp4uQBmTM6Lx9Ra (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:18:39 -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 (8.14.4/8.14.4) with ESMTP id t15EIZvV013574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:18:36 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15EIUKY003334 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:18:33 -0500 Date: Thu, 5 Feb 2015 09:18:29 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter Message-ID: <20150205141829.GJ31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-4-git-send-email-david@fromorbit.com> <20150205141015.GE31625@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205141015.GE31625@laptop.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423145919 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 09:10:15AM -0500, Brian Foster wrote: > On Thu, Feb 05, 2015 at 07:54:05AM +1100, Dave Chinner wrote: > > XFS has hand-rolled per-cpu counters for the superblock since before > > there was any generic implementation. The free block counter is > > special in that it is used for ENOSPC detection outside transaction > > contexts for for delayed allocation. This means that the counter > > needs to be accurate at zero. The current per-cpu counter code jumps > > through lots of hoops to ensure we never run past zero, but we don't > > need to make all those jumps with the generic counter > > implementation. > > > > The generic counter implementation allows us to pass a "batch" > > threshold at which the addition/subtraction to the counter value > > will be folded back into global value under lock. We can use this > > feature to reduce the batch size as we approach 0 in a very similar > > manner to the existing counters and their rebalance algorithm. If we > > use a batch size of 1 as we approach 0, then every addition and > > subtraction will be done against the global value and hence allow > > accurate detection of zero threshold crossing. > > > > Hence we can replace the handrolled, accurate-at-zero counters with > > generic percpu counters. > > > > Note: this removes just enough of the icsb infrastructure to compile > > without warnings. The rest will go in subsequent commits. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/libxfs/xfs_bmap.c | 32 ++++---- > > fs/xfs/libxfs/xfs_sb.c | 1 + > > fs/xfs/xfs_fsops.c | 9 ++- > > fs/xfs/xfs_iomap.c | 2 +- > > fs/xfs/xfs_mount.c | 193 ++++++++++++++++++++++++----------------------- > > fs/xfs/xfs_mount.h | 3 + > > fs/xfs/xfs_super.c | 10 ++- > > fs/xfs/xfs_trans.c | 16 ++-- > > 8 files changed, 135 insertions(+), 131 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > > index 61ec015..e39c9e8 100644 > > --- a/fs/xfs/libxfs/xfs_bmap.c > > +++ b/fs/xfs/libxfs/xfs_bmap.c > > @@ -2212,9 +2212,8 @@ xfs_bmap_add_extent_delay_real( > > diff = (int)(temp + temp2 - startblockval(PREV.br_startblock) - > > (bma->cur ? bma->cur->bc_private.b.allocated : 0)); > > if (diff > 0) { > > - error = xfs_icsb_modify_counters(bma->ip->i_mount, > > - XFS_SBS_FDBLOCKS, > > - -((int64_t)diff), 0); > > + error = xfs_mod_fdblocks(bma->ip->i_mount, > > + -((int64_t)diff), false); > > ASSERT(!error); > > if (error) > > goto done; > > @@ -2265,9 +2264,8 @@ xfs_bmap_add_extent_delay_real( > > temp += bma->cur->bc_private.b.allocated; > > ASSERT(temp <= da_old); > > if (temp < da_old) > > - xfs_icsb_modify_counters(bma->ip->i_mount, > > - XFS_SBS_FDBLOCKS, > > - (int64_t)(da_old - temp), 0); > > + xfs_mod_fdblocks(bma->ip->i_mount, > > + (int64_t)(da_old - temp), false); > > } > > > > /* clear out the allocated field, done with it now in any case. */ > > @@ -2944,8 +2942,8 @@ xfs_bmap_add_extent_hole_delay( > > } > > if (oldlen != newlen) { > > ASSERT(oldlen > newlen); > > - xfs_icsb_modify_counters(ip->i_mount, XFS_SBS_FDBLOCKS, > > - (int64_t)(oldlen - newlen), 0); > > + xfs_mod_fdblocks(ip->i_mount, (int64_t)(oldlen - newlen), > > + false); > > /* > > * Nothing to do for disk quota accounting here. > > */ > > @@ -4163,15 +4161,13 @@ xfs_bmapi_reserve_delalloc( > > error = xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, > > -((int64_t)extsz), 0); > > } else { > > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - -((int64_t)alen), 0); > > + error = xfs_mod_fdblocks(mp, -((int64_t)alen), false); > > } > > > > if (error) > > goto out_unreserve_quota; > > > > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - -((int64_t)indlen), 0); > > + error = xfs_mod_fdblocks(mp, -((int64_t)indlen), false); > > if (error) > > goto out_unreserve_blocks; > > > > @@ -4200,7 +4196,7 @@ out_unreserve_blocks: > > if (rt) > > xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, extsz, 0); > > else > > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, alen, 0); > > + xfs_mod_fdblocks(mp, alen, false); > > out_unreserve_quota: > > if (XFS_IS_QUOTA_ON(mp)) > > xfs_trans_unreserve_quota_nblks(NULL, ip, (long)alen, 0, rt ? > > @@ -5012,10 +5008,8 @@ xfs_bmap_del_extent( > > * Nothing to do for disk quota accounting here. > > */ > > ASSERT(da_old >= da_new); > > - if (da_old > da_new) { > > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - (int64_t)(da_old - da_new), 0); > > - } > > + if (da_old > da_new) > > + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); > > done: > > *logflagsp = flags; > > return error; > > @@ -5290,8 +5284,8 @@ xfs_bunmapi( > > ip, -((long)del.br_blockcount), 0, > > XFS_QMOPT_RES_RTBLKS); > > } else { > > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - (int64_t)del.br_blockcount, 0); > > + 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); > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > > index b66aeab..31a3e97 100644 > > --- a/fs/xfs/libxfs/xfs_sb.c > > +++ b/fs/xfs/libxfs/xfs_sb.c > > @@ -773,6 +773,7 @@ xfs_log_sb( > > > > mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount); > > mp->m_sb.sb_ifree = percpu_counter_sum(&mp->m_ifree); > > + mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks); > > > > xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > > index fa74d03..fed97a9 100644 > > --- a/fs/xfs/xfs_fsops.c > > +++ b/fs/xfs/xfs_fsops.c > > @@ -633,9 +633,10 @@ xfs_fs_counts( > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > > 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); > > > > spin_lock(&mp->m_sb_lock); > > - cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > cnt->freertx = mp->m_sb.sb_frextents; > > spin_unlock(&mp->m_sb_lock); > > return 0; > > @@ -710,7 +711,8 @@ retry: > > } else { > > __int64_t free; > > > > - free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > + free = percpu_counter_sum(&mp->m_fdblocks) - > > + XFS_ALLOC_SET_ASIDE(mp); > > if (!free) > > goto out; /* ENOSPC and fdblks_delta = 0 */ > > > > @@ -749,8 +751,7 @@ out: > > * the extra reserve blocks from the reserve..... > > */ > > int error; > > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - fdblks_delta, 0); > > + error = xfs_mod_fdblocks(mp, fdblks_delta, 0); > > if (error == -ENOSPC) > > goto retry; > > } > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > > index ccb1dd0..205b948 100644 > > --- a/fs/xfs/xfs_iomap.c > > +++ b/fs/xfs/xfs_iomap.c > > @@ -461,7 +461,7 @@ xfs_iomap_prealloc_size( > > alloc_blocks); > > > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > > - freesp = mp->m_sb.sb_fdblocks; > > + freesp = percpu_counter_read_positive(&mp->m_fdblocks); > > if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > > shift = 2; > > if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > > index 650e8f1..9e433b2 100644 > > --- a/fs/xfs/xfs_mount.c > > +++ b/fs/xfs/xfs_mount.c > > @@ -1114,7 +1114,6 @@ xfs_mod_icount( > > return 0; > > } > > > > - > > int > > xfs_mod_ifree( > > struct xfs_mount *mp, > > @@ -1128,6 +1127,93 @@ xfs_mod_ifree( > > } > > return 0; > > } > > + > > +int > > +xfs_mod_fdblocks( > > + struct xfs_mount *mp, > > + int64_t delta, > > + bool rsvd) > > +{ > > + int64_t lcounter; > > + long long res_used; > > + s32 batch; > > + > > + if (delta > 0) { > > + /* > > + * If the reserve pool is depleted, put blocks back into it > > + * first. Most of the time the pool is full. > > + */ > > + if (likely(mp->m_resblks == mp->m_resblks_avail)) { > > + percpu_counter_add(&mp->m_fdblocks, delta); > > + return 0; > > + } > > + > > + 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; > > + } else { > > + delta -= res_used; > > + mp->m_resblks_avail = mp->m_resblks; > > Extra tab on the line above. > Forgot tag, this looks fine otherwise: Reviewed-by: Brian Foster > Brian > > > + percpu_counter_add(&mp->m_fdblocks, delta); > > + } > > + spin_unlock(&mp->m_sb_lock); > > + return 0; > > + } > > + > > + /* > > + * Taking blocks away, need to be more accurate the closer we > > + * are to zero. > > + * > > + * batch size is set to a maximum of 1024 blocks - if we are > > + * allocating of freeing extents larger than this then we aren't > > + * going to be hammering the counter lock so a lock per update > > + * is not a problem. > > + * > > + * If the counter has a value of less than 2 * max batch size, > > + * then make everything serialise as we are real close to > > + * ENOSPC. > > + */ > > +#define __BATCH 1024 > > + if (percpu_counter_compare(&mp->m_fdblocks, 2 * __BATCH) < 0) > > + batch = 1; > > + else > > + batch = __BATCH; > > +#undef __BATCH > > + > > + __percpu_counter_add(&mp->m_fdblocks, delta, batch); > > + if (percpu_counter_compare(&mp->m_fdblocks, > > + XFS_ALLOC_SET_ASIDE(mp)) >= 0) { > > + /* we had space! */ > > + return 0; > > + } > > + > > + /* > > + * lock up the sb for dipping into reserves before releasing the space > > + * that took us to ENOSPC. > > + */ > > + spin_lock(&mp->m_sb_lock); > > + percpu_counter_add(&mp->m_fdblocks, -delta); > > + if (!rsvd) > > + goto fdblocks_enospc; > > + > > + lcounter = (long long)mp->m_resblks_avail + delta; > > + if (lcounter >= 0) { > > + mp->m_resblks_avail = lcounter; > > + spin_unlock(&mp->m_sb_lock); > > + return 0; > > + } > > + printk_once(KERN_WARNING > > + "Filesystem \"%s\": reserve blocks depleted! " > > + "Consider increasing reserve pool size.", > > + mp->m_fsname); > > +fdblocks_enospc: > > + spin_unlock(&mp->m_sb_lock); > > + return -ENOSPC; > > +} > > + > > /* > > * xfs_mod_incore_sb_unlocked() is a utility routine commonly used to apply > > * a delta to a specified field in the in-core superblock. Simply > > @@ -1146,7 +1232,6 @@ xfs_mod_incore_sb_unlocked( > > { > > int scounter; /* short counter for 32 bit fields */ > > long long lcounter; /* long counter for 64 bit fields */ > > - long long res_used, rem; > > > > /* > > * With the in-core superblock spin lock held, switch > > @@ -1157,50 +1242,9 @@ xfs_mod_incore_sb_unlocked( > > switch (field) { > > case XFS_SBS_ICOUNT: > > case XFS_SBS_IFREE: > > + case XFS_SBS_FDBLOCKS: > > ASSERT(0); > > return -EINVAL; > > - case XFS_SBS_FDBLOCKS: > > - lcounter = (long long) > > - mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > - res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); > > - > > - if (delta > 0) { /* Putting blocks back */ > > - if (res_used > delta) { > > - mp->m_resblks_avail += delta; > > - } else { > > - rem = delta - res_used; > > - mp->m_resblks_avail = mp->m_resblks; > > - lcounter += rem; > > - } > > - } else { /* Taking blocks away */ > > - lcounter += delta; > > - if (lcounter >= 0) { > > - mp->m_sb.sb_fdblocks = lcounter + > > - XFS_ALLOC_SET_ASIDE(mp); > > - return 0; > > - } > > - > > - /* > > - * We are out of blocks, use any available reserved > > - * blocks if were allowed to. > > - */ > > - if (!rsvd) > > - return -ENOSPC; > > - > > - lcounter = (long long)mp->m_resblks_avail + delta; > > - if (lcounter >= 0) { > > - mp->m_resblks_avail = lcounter; > > - return 0; > > - } > > - printk_once(KERN_WARNING > > - "Filesystem \"%s\": reserve blocks depleted! " > > - "Consider increasing reserve pool size.", > > - mp->m_fsname); > > - return -ENOSPC; > > - } > > - > > - mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > > - return 0; > > case XFS_SBS_FREXTENTS: > > lcounter = (long long)mp->m_sb.sb_frextents; > > lcounter += delta; > > @@ -1323,7 +1367,7 @@ xfs_mod_incore_sb( > > * > > * Note that this function may not be used for the superblock values that > > * are tracked with the in-memory per-cpu counters - a direct call to > > - * xfs_icsb_modify_counters is required for these. > > + * xfs_mod_incore_sb is required for these. > > */ > > int > > xfs_mod_incore_sb_batch( > > @@ -1508,7 +1552,6 @@ xfs_icsb_cpu_notify( > > case CPU_ONLINE: > > case CPU_ONLINE_FROZEN: > > xfs_icsb_lock(mp); > > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > > xfs_icsb_unlock(mp); > > break; > > case CPU_DEAD: > > @@ -1518,13 +1561,9 @@ xfs_icsb_cpu_notify( > > * re-enable the counters. */ > > xfs_icsb_lock(mp); > > spin_lock(&mp->m_sb_lock); > > - xfs_icsb_disable_counter(mp, XFS_SBS_FDBLOCKS); > > - > > - mp->m_sb.sb_fdblocks += cntp->icsb_fdblocks; > > > > memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); > > > > - xfs_icsb_balance_counter_locked(mp, XFS_SBS_FDBLOCKS, 0); > > spin_unlock(&mp->m_sb_lock); > > xfs_icsb_unlock(mp); > > break; > > @@ -1550,10 +1589,14 @@ xfs_icsb_init_counters( > > if (error) > > goto free_icount; > > > > + error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL); > > + if (error) > > + goto free_ifree; > > + > > mp->m_sb_cnts = alloc_percpu(xfs_icsb_cnts_t); > > if (!mp->m_sb_cnts) { > > error = -ENOMEM; > > - goto free_ifree; > > + goto free_fdblocks; > > } > > > > for_each_online_cpu(i) { > > @@ -1577,6 +1620,8 @@ xfs_icsb_init_counters( > > > > return 0; > > > > +free_fdblocks: > > + percpu_counter_destroy(&mp->m_fdblocks); > > free_ifree: > > percpu_counter_destroy(&mp->m_ifree); > > free_icount: > > @@ -1590,6 +1635,7 @@ xfs_icsb_reinit_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); > > > > xfs_icsb_lock(mp); > > /* > > @@ -1597,7 +1643,6 @@ xfs_icsb_reinit_counters( > > * initial balance kicks us off correctly > > */ > > mp->m_icsb_counters = -1; > > - xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); > > xfs_icsb_unlock(mp); > > } > > > > @@ -1612,6 +1657,7 @@ xfs_icsb_destroy_counters( > > > > percpu_counter_destroy(&mp->m_icount); > > percpu_counter_destroy(&mp->m_ifree); > > + percpu_counter_destroy(&mp->m_fdblocks); > > > > mutex_destroy(&mp->m_icsb_mutex); > > } > > @@ -1665,18 +1711,11 @@ xfs_icsb_count( > > xfs_icsb_cnts_t *cnt, > > int flags) > > { > > - xfs_icsb_cnts_t *cntp; > > - int i; > > - > > memset(cnt, 0, sizeof(xfs_icsb_cnts_t)); > > > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > > xfs_icsb_lock_all_counters(mp); > > > > - for_each_online_cpu(i) { > > - cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); > > - cnt->icsb_fdblocks += cntp->icsb_fdblocks; > > - } > > > > if (!(flags & XFS_ICSB_LAZY_COUNT)) > > xfs_icsb_unlock_all_counters(mp); > > @@ -1687,7 +1726,6 @@ xfs_icsb_counter_disabled( > > xfs_mount_t *mp, > > xfs_sb_field_t field) > > { > > - ASSERT(field == XFS_SBS_FDBLOCKS); > > return test_bit(field, &mp->m_icsb_counters); > > } > > > > @@ -1698,8 +1736,6 @@ xfs_icsb_disable_counter( > > { > > xfs_icsb_cnts_t cnt; > > > > - ASSERT(field == XFS_SBS_FDBLOCKS); > > - > > /* > > * If we are already disabled, then there is nothing to do > > * here. We check before locking all the counters to avoid > > @@ -1717,9 +1753,6 @@ xfs_icsb_disable_counter( > > > > xfs_icsb_count(mp, &cnt, XFS_ICSB_LAZY_COUNT); > > switch(field) { > > - case XFS_SBS_FDBLOCKS: > > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > > - break; > > default: > > BUG(); > > } > > @@ -1735,18 +1768,11 @@ xfs_icsb_enable_counter( > > uint64_t count, > > uint64_t resid) > > { > > - xfs_icsb_cnts_t *cntp; > > int i; > > > > - ASSERT(field == XFS_SBS_FDBLOCKS); > > - > > xfs_icsb_lock_all_counters(mp); > > for_each_online_cpu(i) { > > - cntp = per_cpu_ptr(mp->m_sb_cnts, i); > > switch (field) { > > - case XFS_SBS_FDBLOCKS: > > - cntp->icsb_fdblocks = count + resid; > > - break; > > default: > > BUG(); > > break; > > @@ -1765,9 +1791,6 @@ xfs_icsb_sync_counters_locked( > > xfs_icsb_cnts_t cnt; > > > > xfs_icsb_count(mp, &cnt, flags); > > - > > - if (!xfs_icsb_counter_disabled(mp, XFS_SBS_FDBLOCKS)) > > - mp->m_sb.sb_fdblocks = cnt.icsb_fdblocks; > > } > > > > /* > > @@ -1809,20 +1832,12 @@ xfs_icsb_balance_counter_locked( > > int min_per_cpu) > > { > > uint64_t count, resid; > > - int weight = num_online_cpus(); > > - uint64_t min = (uint64_t)min_per_cpu; > > > > /* disable counter and sync counter */ > > xfs_icsb_disable_counter(mp, field); > > > > /* update counters - first CPU gets residual*/ > > switch (field) { > > - case XFS_SBS_FDBLOCKS: > > - count = mp->m_sb.sb_fdblocks; > > - resid = do_div(count, weight); > > - if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) > > - return; > > - break; > > default: > > BUG(); > > count = resid = 0; /* quiet, gcc */ > > @@ -1851,7 +1866,6 @@ xfs_icsb_modify_counters( > > int rsvd) > > { > > xfs_icsb_cnts_t *icsbp; > > - long long lcounter; /* long counter for 64 bit fields */ > > int ret = 0; > > > > might_sleep(); > > @@ -1871,18 +1885,9 @@ again: > > } > > > > switch (field) { > > - case XFS_SBS_FDBLOCKS: > > - BUG_ON((mp->m_resblks - mp->m_resblks_avail) != 0); > > - > > - lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > - lcounter += delta; > > - if (unlikely(lcounter < 0)) > > - goto balance_counter; > > - icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); > > - break; > > default: > > BUG(); > > - break; > > + goto balance_counter; /* be still, gcc */ > > } > > xfs_icsb_unlock_cntr(icsbp); > > preempt_enable(); > > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > > index 0cb32ce..76f5d25 100644 > > --- a/fs/xfs/xfs_mount.h > > +++ b/fs/xfs/xfs_mount.h > > @@ -85,6 +85,7 @@ typedef struct xfs_mount { > > spinlock_t m_sb_lock; /* sb counter lock */ > > struct percpu_counter m_icount; /* allocated inodes counter */ > > struct percpu_counter m_ifree; /* free inodes counter */ > > + struct percpu_counter m_fdblocks; /* free block counter */ > > > > struct xfs_buf *m_sb_bp; /* buffer for superblock */ > > char *m_fsname; /* filesystem name */ > > @@ -382,6 +383,8 @@ extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > > uint, int); > > 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); > > extern int xfs_mount_log_sb(xfs_mount_t *); > > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > > extern int xfs_readsb(xfs_mount_t *, int); > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > > index e06aa6b..4c6af31 100644 > > --- a/fs/xfs/xfs_super.c > > +++ b/fs/xfs/xfs_super.c > > @@ -1089,6 +1089,7 @@ xfs_fs_statfs( > > __uint64_t fakeinos, id; > > __uint64_t icount; > > __uint64_t ifree; > > + __uint64_t fdblocks; > > xfs_extlen_t lsize; > > __int64_t ffree; > > > > @@ -1102,13 +1103,17 @@ xfs_fs_statfs( > > xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT); > > icount = percpu_counter_sum(&mp->m_icount); > > ifree = percpu_counter_sum(&mp->m_ifree); > > + fdblocks = percpu_counter_sum(&mp->m_fdblocks); > > > > spin_lock(&mp->m_sb_lock); > > statp->f_bsize = sbp->sb_blocksize; > > lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; > > statp->f_blocks = sbp->sb_dblocks - lsize; > > - statp->f_bfree = statp->f_bavail = > > - sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > + spin_unlock(&mp->m_sb_lock); > > + > > + statp->f_bfree = fdblocks - XFS_ALLOC_SET_ASIDE(mp); > > + statp->f_bavail = statp->f_bfree; > > + > > fakeinos = statp->f_bfree << sbp->sb_inopblog; > > statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); > > if (mp->m_maxicount) > > @@ -1120,7 +1125,6 @@ xfs_fs_statfs( > > ffree = statp->f_files - (icount - ifree); > > statp->f_ffree = max_t(__int64_t, ffree, 0); > > > > - spin_unlock(&mp->m_sb_lock); > > > > if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > > ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) == > > diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c > > index 68680ce..e99f5e5 100644 > > --- a/fs/xfs/xfs_trans.c > > +++ b/fs/xfs/xfs_trans.c > > @@ -173,7 +173,7 @@ xfs_trans_reserve( > > uint rtextents) > > { > > int error = 0; > > - int rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > > > /* Mark this thread as being in a transaction */ > > current_set_flags_nested(&tp->t_pflags, PF_FSTRANS); > > @@ -184,8 +184,7 @@ xfs_trans_reserve( > > * fail if the count would go below zero. > > */ > > if (blocks > 0) { > > - error = xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > > - -((int64_t)blocks), rsvd); > > + error = xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); > > if (error != 0) { > > current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); > > return -ENOSPC; > > @@ -268,8 +267,7 @@ undo_log: > > > > undo_blocks: > > if (blocks > 0) { > > - xfs_icsb_modify_counters(tp->t_mountp, XFS_SBS_FDBLOCKS, > > - (int64_t)blocks, rsvd); > > + xfs_mod_fdblocks(tp->t_mountp, -((int64_t)blocks), rsvd); > > tp->t_blk_res = 0; > > } > > > > @@ -516,14 +514,13 @@ xfs_trans_unreserve_and_mod_sb( > > xfs_mount_t *mp = tp->t_mountp; > > /* REFERENCED */ > > int error; > > - int rsvd; > > + bool rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > int64_t blkdelta = 0; > > int64_t rtxdelta = 0; > > int64_t idelta = 0; > > int64_t ifreedelta = 0; > > > > msbp = msb; > > - rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; > > > > /* calculate deltas */ > > if (tp->t_blk_res > 0) > > @@ -547,8 +544,7 @@ xfs_trans_unreserve_and_mod_sb( > > > > /* apply the per-cpu counters */ > > if (blkdelta) { > > - error = xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, > > - blkdelta, rsvd); > > + error = xfs_mod_fdblocks(mp, blkdelta, rsvd); > > if (error) > > goto out; > > } > > @@ -635,7 +631,7 @@ out_undo_icount: > > xfs_mod_icount(mp, -idelta); > > out_undo_fdblocks: > > if (blkdelta) > > - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, -blkdelta, rsvd); > > + xfs_mod_fdblocks(mp, -blkdelta, rsvd); > > out: > > ASSERT(error == 0); > > return; > > -- > > 2.0.0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+ea762c8cc76d03fd538b+4183+infradead.org+hch@bombadil.srs.infradead.org Thu Feb 5 08:19:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5436C803D for ; Thu, 5 Feb 2015 08:19:57 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 417488F8066 for ; Thu, 5 Feb 2015 06:19:57 -0800 (PST) X-ASG-Debug-ID: 1423145996-04cb6c2e69c6d830001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id NwDNKG7tA8CBSPxX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:19:56 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea762c8cc76d03fd538b+4183+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 1YJNHe-0005Hy-T9; Thu, 05 Feb 2015 14:19:54 +0000 Date: Thu, 5 Feb 2015 06:19:54 -0800 From: Christoph Hellwig To: Brian Foster Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched Message-ID: <20150205141954.GA18047@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-7-git-send-email-david@fromorbit.com> <20150205141044.GH31625@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205141044.GH31625@laptop.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1423145996 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Feb 05, 2015 at 09:10:44AM -0500, Brian Foster wrote: > > /* apply remaining deltas */ > > + spin_lock(&mp->m_sb_lock); > > if (rtxdelta) { > > - error = xfs_mod_frextents(mp, rtxdelta); > > + error = xfs_sb_mod64(&mp->m_sb.sb_frextents, rtxdelta); > > Any reason why we don't continue to use the xfs_mod_frextents() function > introduced in the previous patch? Seems like we should be consistent one > way or the other. We're already under the sb_lock and would need another lock roundtrip to avoid a deadlock in that case. But mit might be worth to simply make the real time extent counter a percpu one to behave similar to the other counters that can be manipulated outside of the transaction commit code. From bfoster@redhat.com Thu Feb 5 08:27:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93DF88045 for ; Thu, 5 Feb 2015 08:27:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EFDF8F804C for ; Thu, 5 Feb 2015 06:27:34 -0800 (PST) X-ASG-Debug-ID: 1423146453-04cb6c2e6cc6db60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0T5RsQSB6vp2r5k1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 06:27: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 (8.14.4/8.14.4) with ESMTP id t15ERBXr015245 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 5 Feb 2015 09:27:11 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15ER7p2016830 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 09:27:10 -0500 Date: Thu, 5 Feb 2015 09:27:07 -0500 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched Message-ID: <20150205142707.GK31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: replace xfs_mod_incore_sb_batched References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-7-git-send-email-david@fromorbit.com> <20150205141044.GH31625@laptop.bfoster> <20150205141954.GA18047@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205141954.GA18047@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423146453 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 06:19:54AM -0800, Christoph Hellwig wrote: > On Thu, Feb 05, 2015 at 09:10:44AM -0500, Brian Foster wrote: > > > /* apply remaining deltas */ > > > + spin_lock(&mp->m_sb_lock); > > > if (rtxdelta) { > > > - error = xfs_mod_frextents(mp, rtxdelta); > > > + error = xfs_sb_mod64(&mp->m_sb.sb_frextents, rtxdelta); > > > > Any reason why we don't continue to use the xfs_mod_frextents() function > > introduced in the previous patch? Seems like we should be consistent one > > way or the other. > > We're already under the sb_lock and would need another lock roundtrip to > avoid a deadlock in that case. But mit might be worth to simply make > the real time extent counter a percpu one to behave similar to the other > counters that can be manipulated outside of the transaction commit code. > Ah, thanks... missed that the lock was taken there. This one looks fine to me as well: Reviewed-by: Brian Foster > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Thu Feb 5 10:44:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CEB8F8021 for ; Thu, 5 Feb 2015 10:44:56 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9E908F804B for ; Thu, 5 Feb 2015 08:44:56 -0800 (PST) X-ASG-Debug-ID: 1423154694-04cb6c2e6bc71710001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id I6BKTPpxAXDddzzZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 08:44:55 -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 (8.14.4/8.14.4) with ESMTP id t15GirNO019923 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 11:44:54 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15Gioup016699 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 5 Feb 2015 11:44:52 -0500 Message-ID: <54D39E01.3000108@redhat.com> Date: Thu, 05 Feb 2015 10:44:49 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH V2] xfs: fix panic_mask documentation References: <54D0F858.5010804@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfs: fix panic_mask documentation In-Reply-To: <54D0F858.5010804@redhat.com> 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: 1423154695 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This bit of the docs didn't quite reflect reality. Signed-off-by: Eric Sandeen --- V2: s/AND/OR/ diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 5be51fd..2e56845 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -287,9 +287,9 @@ The following sysctls are available for the XFS filesystem: XFS_ERRLEVEL_LOW: 1 XFS_ERRLEVEL_HIGH: 5 - fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127) + fs.xfs.panic_mask (Min: 0 Default: 0 Max: 255) Causes certain error conditions to call BUG(). Value is a bitmask; - AND together the tags which represent errors which should cause panics: + OR together the tags which represent errors which should cause panics: XFS_NO_PTAG 0 XFS_PTAG_IFLUSH 0x00000001 @@ -299,6 +299,7 @@ The following sysctls are available for the XFS filesystem: XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010 XFS_PTAG_SHUTDOWN_IOERROR 0x00000020 XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 + XFS_PTAG_FSBLOCK_ZERO 0x00000080 This option is intended for debugging only. From bfoster@redhat.com Thu Feb 5 15:50:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2EC777FEF for ; Thu, 5 Feb 2015 15:50:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E176304039 for ; Thu, 5 Feb 2015 13:50:27 -0800 (PST) X-ASG-Debug-ID: 1423173025-04cb6c2e69c7af60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jRNwBO7nOVr0Zl9y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 13:50:25 -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 (8.14.4/8.14.4) with ESMTP id t15LoO6Y009546 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 16:50:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15LoOr7008232 for ; Thu, 5 Feb 2015 16:50:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3672F1231FF; Thu, 5 Feb 2015 16:50:23 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/2] repair: fix v5 sb ino alignment calculation for large blocksizes Date: Thu, 5 Feb 2015 16:50:22 -0500 X-ASG-Orig-Subj: [PATCH 1/2] repair: fix v5 sb ino alignment calculation for large blocksizes Message-Id: <1423173023-54866-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1423173023-54866-1-git-send-email-bfoster@redhat.com> References: <1423173023-54866-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: 1423173025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_repair validates the superblock inode alignment field against several possible valid values. On v5 superblocks, the inode alignment can be scaled up based on the inode size in relation to the minimum inode size. If the block size is larger than the default cluster size (consider large page size arches such as ppc64), the initial alignment value calculates to zero. If the inode size is large enough such that sb_inoalignmt is not zero, sb_validate_ino_align() scales the align value by the factor of inode size increase. If align is zero, however, we multiply by zero, the subsequent check incorrectly fails and the overall superblock verification fails as well. To reproduce, format an fs as follows on ppc64 and run xfs_repair: mkfs.xfs -f -m crc=1 -b size=64k -i size=2k Fix the scaled alignment calculation by scaling the default cluster size appropriately to avoid a multiplication by zero. Signed-off-by: Brian Foster --- repair/sb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/repair/sb.c b/repair/sb.c index ad27756..2805fbd 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -196,7 +196,8 @@ sb_validate_ino_align(struct xfs_sb *sb) if (!xfs_sb_version_hascrc(sb)) return false; - align *= sb->sb_inodesize / XFS_DINODE_MIN_SIZE; + align = (XFS_INODE_BIG_CLUSTER_SIZE * + sb->sb_inodesize / XFS_DINODE_MIN_SIZE) >> sb->sb_blocklog; if (align == sb->sb_inoalignmt) return true; -- 1.8.3.1 From bfoster@redhat.com Thu Feb 5 15:50:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D4AA8022 for ; Thu, 5 Feb 2015 15:50:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E2D7304043 for ; Thu, 5 Feb 2015 13:50:27 -0800 (PST) X-ASG-Debug-ID: 1423173025-04cb6c2e6ac7af60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id usEJi6GUpmzszlNv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 13:50:26 -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 (8.14.4/8.14.4) with ESMTP id t15LoOoh016185 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 16:50:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15LoO3W008100 for ; Thu, 5 Feb 2015 16:50:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 42E891256B5; Thu, 5 Feb 2015 16:50:23 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/2] repair: check ino alignment value to avoid mod by zero Date: Thu, 5 Feb 2015 16:50:23 -0500 X-ASG-Orig-Subj: [PATCH 2/2] repair: check ino alignment value to avoid mod by zero Message-Id: <1423173023-54866-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1423173023-54866-1-git-send-email-bfoster@redhat.com> References: <1423173023-54866-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: 1423173025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_repair checks inode records for valid alignment according to the alignment specified in the superblock. It currently performs the alignment check whenever fs_aligned_inodes is set, which is determined based on whether the fs supports the field. Support for the field does not guarantee its value is non-zero, however. For example, a large block size fs on a large page size arch (e.g., ppc64): mkfs.xfs -f -m crc=1,finobt=1 -b size=64k ... can lead to incorrect badly aligned inode record messages from xfs_repair and other problems. Update the inobt and finobt checks to verify that alignment is a non-zero value before attempting to use it to divide (mod) by zero. Signed-off-by: Brian Foster --- repair/scan.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/repair/scan.c b/repair/scan.c index 142d8d7..ce8d7f5 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -770,7 +770,8 @@ scan_single_ino_chunk( (inodes_per_block <= XFS_INODES_PER_CHUNK && off != 0) || (inodes_per_block > XFS_INODES_PER_CHUNK && off % XFS_INODES_PER_CHUNK != 0) || - (fs_aligned_inodes && agbno % fs_ino_alignment != 0)) { + (fs_aligned_inodes && fs_ino_alignment && + agbno % fs_ino_alignment != 0)) { do_warn( _("badly aligned inode rec (starting inode = %" PRIu64 ")\n"), lino); @@ -929,7 +930,8 @@ scan_single_finobt_chunk( (inodes_per_block <= XFS_INODES_PER_CHUNK && off != 0) || (inodes_per_block > XFS_INODES_PER_CHUNK && off % XFS_INODES_PER_CHUNK != 0) || - (fs_aligned_inodes && agbno % fs_ino_alignment != 0)) { + (fs_aligned_inodes && fs_ino_alignment && + agbno % fs_ino_alignment != 0)) { do_warn( _("badly aligned finobt inode rec (starting inode = %" PRIu64 ")\n"), lino); -- 1.8.3.1 From bfoster@redhat.com Thu Feb 5 15:50:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 004918032 for ; Thu, 5 Feb 2015 15:50:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6C67304039 for ; Thu, 5 Feb 2015 13:50:29 -0800 (PST) X-ASG-Debug-ID: 1423173025-04bdf01eeda4b2c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MQju4nW96krkxBNy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 13:50:25 -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 (8.14.4/8.14.4) with ESMTP id t15LoO1B031456 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 16:50:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15LoOHg008098 for ; Thu, 5 Feb 2015 16:50:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 277C91256B4; Thu, 5 Feb 2015 16:50:23 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfsprogs/repair: fix a couple large block size alignment issues Date: Thu, 5 Feb 2015 16:50:21 -0500 X-ASG-Orig-Subj: [PATCH 0/2] xfsprogs/repair: fix a couple large block size alignment issues Message-Id: <1423173023-54866-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: 1423173025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This is just a couple fixes for issues I came across while playing with larger block and inode sizes on a ppc64 box... Brian Brian Foster (2): repair: fix v5 sb ino alignment calculation for large blocksizes repair: check ino alignment value to avoid mod by zero repair/sb.c | 3 ++- repair/scan.c | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Thu Feb 5 16:05:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 990D17F58 for ; Thu, 5 Feb 2015 16:05:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 78F9B8F8059 for ; Thu, 5 Feb 2015 14:05:56 -0800 (PST) X-ASG-Debug-ID: 1423173955-04cbb04169c4f4d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pIomQjPGpqN5uo4H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Feb 2015 14:05:55 -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 (8.14.4/8.14.4) with ESMTP id t15M5sJ3024407 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 5 Feb 2015 17:05:55 -0500 Received: from laptop.bfoster (vpn-60-99.rdu2.redhat.com [10.10.60.99]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t15M5ox7002582 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 5 Feb 2015 17:05:53 -0500 Date: Thu, 5 Feb 2015 17:05:50 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH V2] xfs: fix panic_mask documentation Message-ID: <20150205220550.GL31625@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: fix panic_mask documentation References: <54D0F858.5010804@redhat.com> <54D39E01.3000108@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54D39E01.3000108@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423173955 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 10:44:49AM -0600, Eric Sandeen wrote: > This bit of the docs didn't quite reflect reality. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > V2: s/AND/OR/ > > diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt > index 5be51fd..2e56845 100644 > --- a/Documentation/filesystems/xfs.txt > +++ b/Documentation/filesystems/xfs.txt > @@ -287,9 +287,9 @@ The following sysctls are available for the XFS filesystem: > XFS_ERRLEVEL_LOW: 1 > XFS_ERRLEVEL_HIGH: 5 > > - fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127) > + fs.xfs.panic_mask (Min: 0 Default: 0 Max: 255) > Causes certain error conditions to call BUG(). Value is a bitmask; > - AND together the tags which represent errors which should cause panics: > + OR together the tags which represent errors which should cause panics: > > XFS_NO_PTAG 0 > XFS_PTAG_IFLUSH 0x00000001 > @@ -299,6 +299,7 @@ The following sysctls are available for the XFS filesystem: > XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010 > XFS_PTAG_SHUTDOWN_IOERROR 0x00000020 > XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 > + XFS_PTAG_FSBLOCK_ZERO 0x00000080 > > This option is intended for debugging only. > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu Feb 5 16:15:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF6767F7E for ; Thu, 5 Feb 2015 16:15:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E1F8304032 for ; Thu, 5 Feb 2015 14:15:33 -0800 (PST) X-ASG-Debug-ID: 1423174530-04cbb04167c4f830001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id sguGKaG57bKXA78f for ; Thu, 05 Feb 2015 14:15:30 -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: AvkJAJjq01R5LL/s/2dsb2JhbABagwaBK7AEAQEBAQEBBpgsBAICgRtEAQEBAQF9hA0BBTIBIyMQCAMYCSUPBSUDIROILNZxAQEBBwIgGIVsiUEzB4QpBYVQknOSbCKBfx+BZCoxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 08:45:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJUhg-0005xR-F4; Fri, 06 Feb 2015 09:15:16 +1100 Date: Fri, 6 Feb 2015 09:15:16 +1100 From: Dave Chinner To: Bruno =?iso-8859-1?Q?Pr=E9mont?= Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150205221516.GT4251@dastard> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> <20150205151007.7c954c01@pluto.restena.lu> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20150205151007.7c954c01@pluto.restena.lu> 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: 1423174530 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 05, 2015 at 03:10:07PM +0100, Bruno Prmont wrote: > Hi Dave, > > New crash, new trace, this time on 3.18.2. > It looks like this time a NULL dereference happened prior to touched memory poison being detected. > > Once again it's during normal system operation (no mount/umount activity) Can you rebuild the kernel with CONFIG_XFS_WARN=y and see if that throws any interesting messages into logs? However: > [1900390.261491] ============================================================================= > [1900390.272989] BUG task_struct (Tainted: G D W ): Poison overwritten > [1900390.283021] ----------------------------------------------------------------------------- > [1900390.283021] > [1900390.297056] INFO: 0xffff880213d651b3-0xffff880213d651b3. First byte 0x6d instead of 0x6b > [1900390.309044] INFO: Slab 0xffffea00084f5800 objects=16 used=16 fp=0x (null) flags=0x8000000000004080 > [1900390.323087] INFO: Object 0xffff880213d64ba0 @offset=19360 fp=0xffff880213d61e40 > [1900390.323087] > [1900390.336988] Bytes b4 ffff880213d64b90: 60 2d d6 13 02 88 ff ff 5a 5a 5a 5a 5a 5a 5a 5a `-......ZZZZZZZZ > [1900390.350988] Object ffff880213d64ba0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [1900390.364943] Object ffff880213d64bb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk .... > [1900391.674636] Object ffff880213d651b0: 6b 6b 6b 6d 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkmkkkkkkkkkkkk ^^ There's a single bit that has been flipped in the task_struct slab. So more than just XFS is seeing memory corruption - this is in core kernel structure slab caches. I'm not sure, either, how XFS could cause corruption in this slab. So, I'd be checking all the previous memory corruptions to see if they are single bit errors, and if there is any pattern to the addresses at which they occur. The above bit flip makes me think "hardware issue" and everything else stems from that... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 5 16:18:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2DE388028 for ; Thu, 5 Feb 2015 16:18:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1906E8F8059 for ; Thu, 5 Feb 2015 14:18:40 -0800 (PST) X-ASG-Debug-ID: 1423174718-04cbb04167c4f9b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id cpKHun1u4ORA5TkD for ; Thu, 05 Feb 2015 14:18:38 -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: AhEKALDr01R5LL/s/2dsb2JhbABagwZSWa94DAEBAQEBAQaSQYVrBAICgRtEAQEBAQF9hAwBAQEDATocIwULCAMOCgklDwUlAyETH4gGBw7WVgEBCAIgGIVsh2eCDQeEKQWNNYUzhVuBGIVJjAsiggIcgWQqMQGCQQEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 08:48:38 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJUkj-0005y1-6a; Fri, 06 Feb 2015 09:18:25 +1100 Date: Fri, 6 Feb 2015 09:18:25 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb Message-ID: <20150205221825.GU4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/7 V2] xfs: use generic percpu counters for icsb References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <20150205140840.GB31625@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205140840.GB31625@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423174718 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14967 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Feb 05, 2015 at 09:08:40AM -0500, Brian Foster wrote: > On Thu, Feb 05, 2015 at 07:54:02AM +1100, Dave Chinner wrote: > > Hi folks, > > > > This is the second version of the generic per-cpu counter rework > > patch series. The first version can be found here: > > > > http://oss.sgi.com/archives/xfs/2015-02/msg00000.html > > > > New in V2: > > > > - drop the moving of the struct xfs_sb to xfs_super.h > > - fixed all the little things that Christoph and Brian noted. > > - keep the per-cpu counters in the struct xfs_mount and keep the > > functions to sync them with the struct xfs_sb values when read > > from disk or written to disk. > > - integrated Christoph Hellwig's additional cleanup patch. This was > > done by: > > - intergating xfs_mod_XXX factoring into the relevant percpu > > counter conversion patch > > - separating out xfs_mod_frextents into it's won patch > > - separating out the replacement of > > xfs_mod_incore_sb_batched > > - doing all the now unused API removal in a separate patch > > > > The series passes xfstests without regressions, and no scalability > > issues have been seen in my performance tests on a 16p VM. SGI - you > > still need to test this, though. :) > > > > Thoughts, comments? > > > > All in all this looks pretty good to me save a couple notes pointed out > in the patches. In a quick test, this handles the imaxct overshoot > problem Eric noted much better than the current implementation. That > said, it's still not precise. Right. > My understanding is that's fine, but I wonder if we want to tack on a > variant of Eric's original patch as well so when we still do overshoot > imaxpct (albeit by much less than before: I reproduce an overshoot of > <100 inodes vs several thousand) we at least report an accurate inode > count. Thoughts? Yes, Eric's patch is still necessary. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 5 17:37:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 96E3A8017 for ; Thu, 5 Feb 2015 17:37:37 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8466E304043 for ; Thu, 5 Feb 2015 15:37:37 -0800 (PST) X-ASG-Debug-ID: 1423179454-04cb6c2e69c7dd40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id braYzCBwPzBgwZUd for ; Thu, 05 Feb 2015 15:37:35 -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: AvkJAFT901R5LL/s/2dsb2JhbABagwaBK7AFAQEBAQEBBpgsBAICgR5EAQEBAQF9hA0BBTocIxAIAw4KCSUPBSUDIROILNZJAQEIAiAYhWyJdAeEKQWYQ5JsIoQCKjGCQgEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 10:07:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJVz7-00066T-1r; Fri, 06 Feb 2015 10:37:21 +1100 Date: Fri, 6 Feb 2015 10:37:21 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfsprogs/repair: fix a couple large block size alignment issues Message-ID: <20150205233720.GV4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfsprogs/repair: fix a couple large block size alignment issues References: <1423173023-54866-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423173023-54866-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423179454 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 05, 2015 at 04:50:21PM -0500, Brian Foster wrote: > Hi all, > > This is just a couple fixes for issues I came across while playing with > larger block and inode sizes on a ppc64 box... Yup, fixes look sane. I'll test and pull them in. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 5 17:40:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB8487F5E for ; Thu, 5 Feb 2015 17:40:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 589C8AC003 for ; Thu, 5 Feb 2015 15:40:49 -0800 (PST) X-ASG-Debug-ID: 1423179646-04cb6c2e69c7de00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id g2YSOIfFrcvS8FXe for ; Thu, 05 Feb 2015 15:40:47 -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: AkcSAED+01R5LL/s/2dsb2JhbABagwaBK7AFAQEBAQEBBpgsAgIBAQKBHkQBAQEBAX2EDAEBAQQ6HCMQCAMOBwMJJQ8FJQMhE4gs1kgBAQgCIBiFbIl0B4QpAQSETgeTboo7iDEihAIqMYJCAQEB Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 10:10:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJW2D-000675-Eo; Fri, 06 Feb 2015 10:40:33 +1100 Date: Fri, 6 Feb 2015 10:40:33 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, Namjae Jeon Subject: Re: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range Message-ID: <20150205234033.GW4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range References: <1421853126-4505-1-git-send-email-linkinjeon@gmail.com> <1421853126-4505-5-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1421853126-4505-5-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423179646 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 22, 2015 at 12:11:59AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > Add finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Reviewed-by: Brian Foster I've just pulled this patch into xfsprogs in preparation for getting this functionality fully reviewed and merged in the 3.21 kernel cycle. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 5 18:24:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A61D0801E for ; Thu, 5 Feb 2015 18:24:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50506AC001 for ; Thu, 5 Feb 2015 16:24:19 -0800 (PST) X-ASG-Debug-ID: 1423182254-04bdf01eeea4ea80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id tIdBUcURTMQmvDYR for ; Thu, 05 Feb 2015 16:24:14 -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: AhwKADYJ1FR5LL/s/2dsb2JhbABagwYiMFmveQwBAQEBAQEGkjcChXMEgSJEAQEBAQF9hGk7JDQFJQM0iCywL6YuGIVsihGCFwxAgTAFkmiFW4EYixeGPSKBRQyCMSoxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 10:54:13 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJWiF-0006ET-OP for xfs@oss.sgi.com; Fri, 06 Feb 2015 11:23:59 +1100 Date: Fri, 6 Feb 2015 11:23:59 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 354240e Message-ID: <20150206002359.GX4251@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 354240e MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="J2SCkAp4GZ/dPZZf" 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: 1423182254 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14971 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --J2SCkAp4GZ/dPZZf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The 354240e branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. Unless there are late breaking bug fixes, this will be the last update to this branch before the 3.20 merge window opens (expected early next week). -Dave. The new head of the 354240e branch is commit: 354240e Merge branch 'xfs-misc-fixes-for-3.20-4' into for-next New Commits: Christoph Hellwig (1): [f8079b8] xfs: growfs should use synchronous transactions Dave Chinner (1): [354240e] Merge branch 'xfs-misc-fixes-for-3.20-4' into for-next Eric Sandeen (2): [de8bd0e] xfs: fix panic_mask documentation [01f9882] xfs: report proper f_files in statfs if we overshoot imaxpct kbuild test robot (1): [f92090e] xfs: xfs_ioctl_setattr_check_projid can be static Code Diffstat: Documentation/filesystems/xfs.txt | 5 +++-- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_ioctl.c | 4 ++-- fs/xfs/xfs_super.c | 5 +++++ 4 files changed, 11 insertions(+), 4 deletions(-) --=20 Dave Chinner david@fromorbit.com --J2SCkAp4GZ/dPZZf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJU1AmfAAoJEK3oKUf0dfodmlEQAK4qQa0Aa+HltVFuYdtAGbgB 6OzAfcKSt9UROhssRyH5kQzqOUsfoZr8YWdTJCWn4nN/ODXhl/HLld/9wfg9TGGN vjyoGBT1FJphgSIfFh+m4HKwFiPHLmZGm/kVYjB7RGGs3M569bXthlx9IA5wzTxb bTLsn8UjQlTJOZAYC2JIMktusaPoeYxtMc2qg2fCsmv7Pk5SgDl4BqioLHk5TV+a 2DUrxkSUAELIQOfCdVkZe5zsX0bkmpyrsKAXItlcBprBuMrBYahebgtiLaKBk9Zx sSuVQvsNlsP+36xUWZeDbpopB4gRYjQypJ0A05BdAtY0eytIKheCrq3FFf39DjPk kakytD35pTjhCrl4mqUE9tAyOz7AnD/1ElH58uFy2QeBuAm+R9XkwYMGLcGIpv2L g9otIWzYouk9f4Ta6YtlNHSj/XPADn177Yn5XXb17vkJs06Ocm4KKEi3I8BxOb97 QE28/+eWruKWoPjDe4sxZ48zGbJGQwl0uTOZKd+TYlP443lYsnku/edaSFDaxkeF 94oon2yLJnMb0TxGxUlRqU3KHCF+2sLVftjfjtvh1kyGzmMdRKoLGM+HM0KBR/GP rctYKzTeiBMv+bB960fnciVzpzJLZ7CP+gUHjb5x3s7wRItt1yNCCtv1WYG7E47f zNwmfWyI4oSWwhU0GozN =l2Vk -----END PGP SIGNATURE----- --J2SCkAp4GZ/dPZZf-- From david@fromorbit.com Thu Feb 5 20:56:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C26917F47 for ; Thu, 5 Feb 2015 20:56:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1473304032 for ; Thu, 5 Feb 2015 18:56:03 -0800 (PST) X-ASG-Debug-ID: 1423191360-04cbb04167c544d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bNEt3YohxPiRiqUJ for ; Thu, 05 Feb 2015 18:56:01 -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: AhgKAJcs1FR5LL/s/2dsb2JhbABagwYiMFmCMq1HDAEBAQEBAQaSNwKFcwSBH0QBAQEBAX2EaTskNAUlAzSILK9oph0YhWyKEYIXDECBMAWFUI0YhVuSbCKBRQwBgjAqMYJCAQEB Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 13:26:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJZ58-0006SB-Rc for xfs@oss.sgi.com; Fri, 06 Feb 2015 13:55:46 +1100 Date: Fri, 6 Feb 2015 13:55:46 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to bf988de Message-ID: <20150206025546.GK12722@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to bf988de MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="gBBFr7Ir9EOA20Yy" 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: 1423191360 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --gBBFr7Ir9EOA20Yy Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: bf988de xfs_quota: manpage - project command requires arguments New Commits: Brian Foster (4): [6d23d9a] repair: fix unnecessary secondary scan if only last sb is c= orrupt [8216a58] repair: remove unused strided secondary sb scan logic [16e1627] repair: fix v5 sb ino alignment calculation for large block= sizes [ca0a799] repair: check ino alignment value to avoid mod by zero Eric Sandeen (5): [2116b6a] xfs_repair: do not check symlink component lengths [7511a9c] xfs_repair: fix max block offset test [89c4bb8] libxfs: report VERSION in libxfs_fs_repair_cmn_err() [48e75fb] xfs_quota: fix typo in manpage [bf988de] xfs_quota: manpage - project command requires arguments Namjae Jeon (1): [555bc8c] xfs_io: add finsert command for insert range Romain Naour (1): [ece49da] xfsprogs: do not do any dynamic linking of libtool libraries Code Diffstat: copy/Makefile | 2 +- db/Makefile | 2 +- growfs/Makefile | 2 +- io/Makefile | 2 +- io/prealloc.c | 39 ++++++++++++++++++++++++++++- libxfs/util.c | 1 + logprint/Makefile | 2 +- man/man8/xfs_quota.8 | 9 ++----- mkfs/Makefile | 2 +- repair/Makefile | 2 +- repair/dinode.c | 39 ++++++----------------------- repair/globals.h | 2 -- repair/sb.c | 70 ++++++++++++++++++------------------------------= ---- repair/scan.c | 6 +++-- 14 files changed, 84 insertions(+), 96 deletions(-) --=20 Dave Chinner david@fromorbit.com --gBBFr7Ir9EOA20Yy Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJU1C0yAAoJEK3oKUf0dfodq9oP/RoJoayyU5zuM9iuwTh+AoAK xG2mcGPs9bf/5fzMr6yAgmElbh1rRP3ap1yLZzrsDazPkxFmr4HxcKI7jNpcJVNJ bIu+lD69/7xK2F/CWrYG8Irhh1tCjgamEu5PF4EgEv2ZYofjL/fgpZX13Gx+vD60 YTWcJA2AniTjDw3XffEZshcugWfvYxDGNjJZcLOkWv7NX6co+is4GFi8qOuUOCdS JijHi8vTkvD8gRjECVQMnw74zDeECCMhRiMy0dBazNGGEwz7//SvK5Q8KsyO+8yZ Zk+d3xPgz0ue0goe0kRogZgnifLk/1eb8FAxQG5t23/nW+qnlTLxmQcgyISjaGVF 7VXHvRFBQ35RPCW7l+vLYMVwDkg1LjlGoVt9iU++64ld111a2Iam314RQ9OkJvN7 2WEhmjE24afJ1Ssll6NTQilI5FSfPJtnQvV5jw3rN5yt9BKMcQQFA/feScUioySr QMjjrBSB6eawEKARo3dwMFDmLWg2QIb+1+hA4m5F2Du2XmqJj6f9rrcIfa9FuAHx N38nFpmF02KlYNCZJmwe6ypCMybaiaIC/hQT0dZxgdAMLc8ivy/3jHUNgg/OWDvL Lro35THb87Chlu+KOh1xL+xPYJDMHPR1xYnOeyrp9anLI4V4XLLq/xPvWXHCKAsd KCuqzvw6+bLABacTYw5u =7YAe -----END PGP SIGNATURE----- --gBBFr7Ir9EOA20Yy-- From david@fromorbit.com Thu Feb 5 21:11:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5338A801A for ; Thu, 5 Feb 2015 21:11:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F401DAC003 for ; Thu, 5 Feb 2015 19:11:47 -0800 (PST) X-ASG-Debug-ID: 1423192302-04bdf01eeda50f90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id v7IbNPxjjkzMnNxl for ; Thu, 05 Feb 2015 19:11:43 -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: AkMSAPMv1FR5LL/s/2dsb2JhbABagwaBK4IyrVMBAQEBAQEGmCwCAgEBAoEbRAEBAQEBfYQMAQEBBDocIxAIAw4HAwklDwUlAyETiCzVVAEBAQcCAR8YhWyJdAeEKQWETgeTboEYgwOGIIgxIoQCKjGCQgEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 13:41:42 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJZKL-0006U2-Cw; Fri, 06 Feb 2015 14:11:29 +1100 Date: Fri, 6 Feb 2015 14:11:29 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, Namjae Jeon , bfoster@redhat.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org Subject: Re: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range Message-ID: <20150206031129.GL12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range References: <1421853126-4505-1-git-send-email-linkinjeon@gmail.com> <1421853126-4505-5-git-send-email-linkinjeon@gmail.com> <20150205234033.GW4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205234033.GW4251@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423192302 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14974 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Namjae, On Fri, Feb 06, 2015 at 10:40:33AM +1100, Dave Chinner wrote: > On Thu, Jan 22, 2015 at 12:11:59AM +0900, Namjae Jeon wrote: > > From: Namjae Jeon > > > > Add finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > Reviewed-by: Brian Foster > > I've just pulled this patch into xfsprogs in preparation for getting > this functionality fully reviewed and merged in the 3.21 kernel > cycle. xfs/293 3s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/293.out.bad) --- tests/xfs/293.out 2014-01-20 16:57:34.000000000 +1100 +++ /home/dave/src/xfstests-dev/results//xfs/293.out.bad 2015-02-06 12:21:47.000000000 +1100 @@ -1,2 +1,3 @@ QA output created by 293 Silence is golden +finsert not documented in the xfs_io manpage ..... Can you send a patch that updates the xfs_io man page, please? Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Thu Feb 5 22:28:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D09858037 for ; Thu, 5 Feb 2015 22:28:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4CFD7AC001 for ; Thu, 5 Feb 2015 20:27:58 -0800 (PST) X-ASG-Debug-ID: 1423196874-04cbb04169c55850001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id 649vG1BV8rlwvn92 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 05 Feb 2015 20:27:56 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJC009H91QIS110@mailout4.samsung.com> for xfs@oss.sgi.com; Fri, 06 Feb 2015 13:27:54 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id E6.29.19034.AC244D45; Fri, 06 Feb 2015 13:27:54 +0900 (KST) X-AuditID: cbfee691-f79b86d000004a5a-d1-54d442ca7b89 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id D4.89.09430.AC244D45; Fri, 06 Feb 2015 13:27:54 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJC009AT1QHAW40@mmp2.samsung.com>; Fri, 06 Feb 2015 13:27:53 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: tytso@mit.edu, bfoster@redhat.com, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, 'Namjae Jeon' References: <1421853126-4505-1-git-send-email-linkinjeon@gmail.com> <1421853126-4505-5-git-send-email-linkinjeon@gmail.com> <20150205234033.GW4251@dastard> <20150206031129.GL12722@dastard> In-reply-to: <20150206031129.GL12722@dastard> Subject: RE: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range Date: Fri, 06 Feb 2015 13:27:53 +0900 X-ASG-Orig-Subj: RE: [PATCH v9 4/11] xfsprogs: xfs_io: add finsert command for insert range Message-id: <001e01d041c5$466b6330$d3422990$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQFeEwaBS0Q8AoICLdMysUUZS5e1ywI7JulUAeCziicCDbKKNJ2WF6fg Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrJIsWRmVeSWpSXmKPExsWyRsSkRPeU05UQg91LBCyWTrzEbPHuc5XF lmP3GC2u373FbDFz3h02iz17T7JYXN41h82itecnu8WivluMDpwepxZJeOycdZfdo+nMUWaP 1Re2Mnq833eVzaNvyypGj8+b5ALYo7hsUlJzMstSi/TtErgyJvXeZS24xlnRt+M7SwPjCfYu Rk4OCQETiduLtzNB2GISF+6tZ+ti5OIQEljKKHH41i8mmKLWjg3MILaQwHRGiYcbcyGK/jJK /Nj5naWLkYODTUBb4s8WUZAaEQENiWl7jzCD1DALXACqf9vJAtFwgFFi5fY7jCBVnAK6Egt/ HGEHaRYWCJV4/yMSJMwioCoxb/0PsMW8ApYS/V1zWCBsQYkfk++B2cwCWhLrdx5ngrDlJTav ecsMcaiCxI6zrxkhjnCT2Lx5BVSNiMS+F+8YQW6QEGjlkLi7cT07xDIBiW+TD4E9ICEgK7Hp ANQcSYmDK26wTGCUmIVk9Swkq2chWT0LyYoFjCyrGEVTC5ILipPSi0z1ihNzi0vz0vWS83M3 MQJj/PS/ZxN3MN4/YH2IUYCDUYmHN4H3SogQa2JZcWXuIUZToIsmMkuJJucDE0leSbyhsZmR hamJqbGRuaWZkjivjvTPYCGB9MSS1OzU1ILUovii0pzU4kOMTBycUg2Ma9vP3GvaILgt+zHL ZNE31zWVTt8Vn39zf2iawa3FN/RmHIrQZfBbzzxfqco0SXVa7udz2084mdwvDHKP9umaJRb9 +Iv+bdUgC8nsljCdyKroxVmfrnRftT8h8mfReqE/363dtudKxk59JvCucKf4vNn8B/rF7ZaJ e5/QOvek6IzLuqqiOIY4JZbijERDLeai4kQA//OnzewCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrMKsWRmVeSWpSXmKPExsVy+t9jQd1TTldCDN6+5rBYOvESs8W7z1UW W47dY7S4fvcWs8XMeXfYLPbsPclicXnXHDaL1p6f7BaL+m4xOnB6nFok4bFz1l12j6YzR5k9 Vl/Yyujxft9VNo++LasYPT5vkgtgj2pgtMlITUxJLVJIzUvOT8nMS7dV8g6Od443NTMw1DW0 tDBXUshLzE21VXLxCdB1y8wBukxJoSwxpxQoFJBYXKykb4dpQmiIm64FTGOErm9IEFyPkQEa SFjDmDGp9y5rwTXOir4d31kaGE+wdzFyckgImEi0dmxghrDFJC7cW88GYgsJTGeUeLgxt4uR C8j+yyjxY+d3li5GDg42AW2JP1tEQWpEBDQkpu09wgxSwyxwAaj+bScLRMMBRomV2+8wglRx CuhKLPxxhB2kWVggVOL9j0iQMIuAqsS89T+YQGxeAUuJ/q45LBC2oMSPyffAbGYBLYn1O48z QdjyEpvXvIU6VEFix9nXjBBHuEls3rwCqkZEYt+Ld4wTGIVmIRk1C8moWUhGzULSsoCRZRWj aGpBckFxUnqukV5xYm5xaV66XnJ+7iZGcAJ5Jr2DcVWDxSFGAQ5GJR7eBN4rIUKsiWXFlbmH GCU4mJVEeBn+Xg4R4k1JrKxKLcqPLyrNSS0+xGgK9OlEZinR5HxgcssriTc0NjEzsjQyN7Qw MjZXEudVsm8LERJITyxJzU5NLUgtgulj4uCUamAs4d47Yc1CwbkSk++47BNYVGypGd+144gh 46T9G4OMFi+9OifvivfKpx8vn/m14fmFKtEHfBHx6qGOLck24scX8OQtf7Oqt+22vdHW7Zcm 7w6K5IrY4Pfl6oRIeT/2vKbPk1l27jW53lNdEyKf6Oq7Wu3hB8O/EZmn9zz+e53lz++MzN99 e5seKLEUZyQaajEXFScCAFKqmHY2AwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1423196876 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > Hi Namjae, Hi Dave, > > On Fri, Feb 06, 2015 at 10:40:33AM +1100, Dave Chinner wrote: > > On Thu, Jan 22, 2015 at 12:11:59AM +0900, Namjae Jeon wrote: > > > From: Namjae Jeon > > > > > > Add finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. > > > > > > Signed-off-by: Namjae Jeon > > > Signed-off-by: Ashish Sangwan > > > Reviewed-by: Brian Foster > > > > I've just pulled this patch into xfsprogs in preparation for getting > > this functionality fully reviewed and merged in the 3.21 kernel > > cycle. > > xfs/293 3s ... - output mismatch (see /home/dave/src/xfstests-dev/results//xfs/293.out.bad) > --- tests/xfs/293.out 2014-01-20 16:57:34.000000000 +1100 > +++ /home/dave/src/xfstests-dev/results//xfs/293.out.bad 2015-02-06 12:21:47.000000000 +1100 > @@ -1,2 +1,3 @@ > QA output created by 293 > Silence is golden > +finsert not documented in the xfs_io manpage > ..... > > Can you send a patch that updates the xfs_io man page, please? Okay, I will send it soon. Thanks a lot! > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dave@fromorbit.com Thu Feb 5 22:47:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D7DA7F7D for ; Thu, 5 Feb 2015 22:47:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 385B9AC001 for ; Thu, 5 Feb 2015 20:47:04 -0800 (PST) X-ASG-Debug-ID: 1423198022-04cbb04169c55c80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SJaAWVfhoviGLwWX for ; Thu, 05 Feb 2015 20:47:02 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aj4HAGRG1FR5LL/s/2dsb2JhbABagwaBK7AFAQEBAQEBBplRRAEBAQEBfYQ6LyMYGGoDNIgs1XuGBIoRhBMFmVuFSYwLIoFFAQuCMSoxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Feb 2015 15:17:01 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YJaoa-0006as-Mn; Fri, 06 Feb 2015 15:46:48 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YJaoa-00080W-LV; Fri, 06 Feb 2015 15:46:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: y@disappointment.disaster Subject: [PATCH] xfs: only trace buffer items if they exist Date: Fri, 6 Feb 2015 15:46:48 +1100 X-ASG-Orig-Subj: [PATCH] xfs: only trace buffer items if they exist Message-Id: <1423198008-30748-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423198022 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The commit 2d3d0c5 ("xfs: lobotomise xfs_trans_read_buf_map()") left a landmine in the tracing code: trace_xfs_trans_buf_read() is now call on all buffers that are read through this interface rather than just buffers in transactions. For buffers outside transaction context, bp->b_fspriv is null, and so the buf log item tracing functions cannot be called. This causes a NULL pointer dereference in the trace_xfs_trans_buf_read() function when tracing is turned on. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_buf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 0a4d4ab..7579841 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -327,9 +327,10 @@ xfs_trans_read_buf_map( return -EIO; } - if (tp) + if (tp) { _xfs_trans_bjoin(tp, bp, 1); - trace_xfs_trans_read_buf(bp->b_fspriv); + trace_xfs_trans_read_buf(bp->b_fspriv); + } *bpp = bp; return 0; -- 2.0.0 From namjae.jeon@samsung.com Thu Feb 5 23:10:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 168CE7F5A for ; Thu, 5 Feb 2015 23:10:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99475AC001 for ; Thu, 5 Feb 2015 21:10:34 -0800 (PST) X-ASG-Debug-ID: 1423199431-04cbb0416ac56150001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id KE1WVi4y0Kd9iHio (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 05 Feb 2015 21:10:32 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJC008M03PIKW60@mailout4.samsung.com> for xfs@oss.sgi.com; Fri, 06 Feb 2015 14:10:30 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id A6.19.11124.6CC44D45; Fri, 06 Feb 2015 14:10:30 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-1f-54d44cc66331 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id D0.14.09430.6CC44D45; Fri, 06 Feb 2015 14:10:30 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJC002HZ3PITO90@mmp1.samsung.com>; Fri, 06 Feb 2015 14:10:30 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, Ashish Sangwan Subject: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Date: Fri, 06 Feb 2015 14:10:30 +0900 X-ASG-Orig-Subj: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-id: <001f01d041cb$39fbbc70$adf33550$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdBByrRxymHXV1QQTgCP2xB+6zwbpw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprKIsWRmVeSWpSXmKPExsWyRsSkSPeYz5UQg8U/DC2WTrzEbLHl2D1G iz17T7JYLOq7xejA4nFqkYTH6gtbGT36tqxi9Pi8SS6AJYrLJiU1J7MstUjfLoEro/eIbcEG 9opFU76zNTBOYOti5OCQEDCRePm9qIuRE8gUk7hwbz1QmItDSGApo8SRkzPYIRImEpu+fmCC SCxilFj1bxUjhPOXUWLb95mMIJPYBLQl/mwRBWkQEVCTmDRpBzNImFkgRuJDgyWIKSwQLPGu URakgkVAVeLk29vMIDavgKXE/AXfWSBsQYkfk++B2cwCWhLrdx5ngrDlJTavecsMcY6CxI6z rxkhNulJ/Pz1iR2iRkRi34t3jBA169gljq6Rh9glIPFt8iEWiHdlJTYdgBojKXFwxQ2WCYxi s5BsnoVk8ywkm2ch2bCAkWUVo2hqQXJBcVJ6kZFecWJucWleul5yfu4mRmBsnf73rG8H480D 1ocYBTgYlXh4E3ivhAixJpYVV+YeYjQFumgis5Rocj4wgvNK4g2NzYwsTE1MjY3MLc2UxHkT pH4GCwmkJ5akZqemFqQWxReV5qQWH2Jk4uCUamCUvFy6rOavpFXM81vxEWbrqzWtNc1+Vd/T NLqXzBN+ZkNy/vwCj81PAsudG+16dNYsO/Vmpe/lEkGNDZu+Bu/uln9h8vFlQPk3r5Z7D/8/ zTASF4/x8bFSLjrGI3GwSWODfMb0FzODLNyWRW6Z59ig/neKx7d1GVFH9D37n30R5tjBdinR 4KkSS3FGoqEWc1FxIgCuBB2cqAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrIIsWRmVeSWpSXmKPExsVy+t9jAd1jPldCDDp6tS2WTrzEbLHl2D1G iz17T7JYLOq7xejA4nFqkYTH6gtbGT36tqxi9Pi8SS6AJaqB0SYjNTEltUghNS85PyUzL91W yTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMHaKWSQlliTilQKCCxuFhJ3w7ThNAQN10L mMYIXd+QILgeIwM0kLCGMaP3iG3BBvaKRVO+szUwTmDrYuTkkBAwkdj09QMThC0mceHeeqA4 F4eQwCJGiVX/VjFCOH8ZJbZ9nwnkcHCwCWhL/NkiCtIgIqAmMWnSDmaQMLNAjMSHBksQU1gg WOJdoyxIBYuAqsTJt7eZQWxeAUuJ+Qu+s0DYghI/Jt8Ds5kFtCTW7zzOBGHLS2xe85YZ4hwF iR1nXzNCbNKT+PnrEztEjYjEvhfvGCcwCsxCMmoWklGzkIyahaRlASPLKkbR1ILkguKk9Fwj veLE3OLSvHS95PzcTYzg6H0mvYNxVYPFIUYBDkYlHt4E3ishQqyJZcWVuYcYJTiYlUR4Gf5e DhHiTUmsrEotyo8vKs1JLT7EaAr06URmKdHkfGBiySuJNzQ2MTOyNDI3tDAyNlcS51WybwsR EkhPLEnNTk0tSC2C6WPi4JRqYFTmDjxn+WLlM9P+xLnp8yXtL2ReNUhyesl2w0BI8TTv1bsH 8ut6df4uXvPPPWDDh+ATHve3tcTdXuA3J6hMfWZuIsvBs9vn7xFK9b8nZ9IgPmvT9m6dm1PW JPC4yz5b96Ug25yHc8rN/aflemalbQ4pdLLcaZg9v37+8pPfugKFZk+7sUdz9jklluKMREMt 5qLiRACjy+0K9AIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1423199432 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man/man8/xfs_io.8 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index cf27b99..416206f 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the manual page to de-allocates blocks and eliminates the hole created in this process by shifting data blocks into the hole. .TP +.BI finsert " offset length" +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the +.BR fallocate (2) +manual page to create the hole by shifting data blocks. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.8.5.5 From sandeen@sandeen.net Thu Feb 5 23:26:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 55DAD8009 for ; Thu, 5 Feb 2015 23:26:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 43564304039 for ; Thu, 5 Feb 2015 21:26:03 -0800 (PST) X-ASG-Debug-ID: 1423200361-04cbb04168c564d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yElUXPtNuK76QG8R for ; Thu, 05 Feb 2015 21:26:01 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DFDFB602D662; Thu, 5 Feb 2015 23:26:00 -0600 (CST) Message-ID: <54D45068.2030209@sandeen.net> Date: Thu, 05 Feb 2015 23:26:00 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Namjae Jeon , Dave Chinner CC: linux-fsdevel@vger.kernel.org, Ashish Sangwan , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE References: <001f01d041cb$39fbbc70$adf33550$@samsung.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE In-Reply-To: <001f01d041cb$39fbbc70$adf33550$@samsung.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: 1423200361 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/5/15 11:10 PM, Namjae Jeon wrote: > Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > --- > man/man8/xfs_io.8 | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index cf27b99..416206f 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the > manual page to de-allocates blocks and eliminates the hole created in this process > by shifting data blocks into the hole. > .TP > +.BI finsert " offset length" > +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the > +.BR fallocate (2) > +manual page So, it looks like the fallocate(2) manpage will need an update as well. :) (linux-man@vger.kernel.org I believe) Thanks, -Eric From namjae.jeon@samsung.com Thu Feb 5 23:40:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 16982803C for ; Thu, 5 Feb 2015 23:40:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 047B68F8064 for ; Thu, 5 Feb 2015 21:40:05 -0800 (PST) X-ASG-Debug-ID: 1423201200-04cb6c2e6ac83580001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id e7LGUpQviGPnjfJh (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 05 Feb 2015 21:40:01 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJC0096D52NS180@mailout4.samsung.com> for xfs@oss.sgi.com; Fri, 06 Feb 2015 14:39:59 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 45.B9.17016.DA354D45; Fri, 06 Feb 2015 14:39:57 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-1d-54d453ad7f2a Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id B4.FA.09430.CA354D45; Fri, 06 Feb 2015 14:39:56 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJC00EOG52KMU50@mmp2.samsung.com>; Fri, 06 Feb 2015 14:39:56 +0900 (KST) From: Namjae Jeon To: 'Eric Sandeen' , 'Dave Chinner' Cc: linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' , xfs@oss.sgi.com References: <001f01d041cb$39fbbc70$adf33550$@samsung.com> <54D45068.2030209@sandeen.net> In-reply-to: <54D45068.2030209@sandeen.net> Subject: RE: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Date: Fri, 06 Feb 2015 14:39:56 +0900 X-ASG-Orig-Subj: RE: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-id: <002401d041cf$570eae40$052c0ac0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQHfjCuZWX9mXwjA1jY+crEVPEolmgJRinPanLH4K4A= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBIsWRmVeSWpSXmKPExsWyRsSkWHdt8JUQg90r2CyWTrzEbLHl2D1G iz17T7JYtF7RsljUd4vRgdXj1CIJj9UXtjJ69G1ZxeixZfFDJo/Pm+QCWKO4bFJSczLLUov0 7RK4Mlo2fmcueMtR0TGxtIGxg72LkZNDQsBEYvWTrawQtpjEhXvr2boYuTiEBJYyStyeMpcN puj53oUsEInpjBI7+/5AVf1llJjzqxtoFAcHm4C2xJ8toiANIgJ+EhtePWYEsZkF4iS+fn7E BlIiJBAl0XwsEcTkBKre2esDUiEsEC6x8GgzC4jNIqAqMfvcemYQm1fAUuLB2odMELagxI/J 91ggJmpJrN95nAnClpfYvOYtM8SZChI7zr5mhLjASmL+n1PMEDUiEvtevGMEuVhC4Bq7xJr9 a9gglglIfJt8iAXkHgkBWYlNB6DmSEocXHGDZQKjxCwkq2chWT0LyepZSFYsYGRZxSiaWpBc UJyUXmSoV5yYW1yal66XnJ+7iREYoaf/PevdwXj7gPUhRgEORiUe3p38V0KEWBPLiitzDzGa Al00kVlKNDkfmAbySuINjc2MLExNTI2NzC3NlMR5FaV+BgsJpCeWpGanphakFsUXleakFh9i ZOLglGpgnHplHv9aVdkZv4p3zt+t/2etZUrlH7/rl75Ese9gvnRq1Xy2KbLKXFzqL68WXtxf ZtAzV1iv9JTu1rexcT+2csfqXPdxXe/fmWBn5vB4/Z1Hb/6czklp0l4i3mmeV+C6tMLdc876 /nYFzRfTjeewiYUG3NBi71ggpf/CnbN0Ss0VPvc6jsxiJZbijERDLeai4kQAjNYQnMsCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpileLIzCtJLcpLzFFi42I5/e+xoO6a4CshBvcn2lgsnXiJ2WLLsXuM Fnv2nmSxaL2iZbGo7xajA6vHqUUSHqsvbGX06NuyitFjy+KHTB6fN8kFsEY1MNpkpCampBYp pOYl56dk5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAO1WUihLzCkFCgUkFhcr 6dthmhAa4qZrAdMYoesbEgTXY2SABhLWMGa0bPzOXPCWo6JjYmkDYwd7FyMnh4SAicTzvQtZ IGwxiQv31rN1MXJxCAlMZ5TY2fcHyvnLKDHnVzdQBwcHm4C2xJ8toiANIgJ+EhtePWYEsZkF 4iS+fn7EBlIiJBAl0XwsEcTkBKre2esDUiEsEC6x8Ggz2CoWAVWJ2efWM4PYvAKWEg/WPmSC sAUlfky+xwIxUUti/c7jTBC2vMTmNW+ZIc5UkNhx9jUjxAVWEvP/nGKGqBGR2PfiHeMERqFZ SEbNQjJqFpJRs5C0LGBkWcUomlqQXFCclJ5rpFecmFtcmpeul5yfu4kRHP/PpHcwrmqwOMQo wMGoxMObwHslRIg1say4MvcQowQHs5IIL8PfyyFCvCmJlVWpRfnxRaU5qcWHGE2BPp3ILCWa nA9MTXkl8YbGJmZGlkbmhhZGxuZK4rxK9m0hQgLpiSWp2ampBalFMH1MHJxSDYyblhz63LKs 6tVeqXYxkcJrRrPvuB06uY1nncn8tpRZc5W1Hn7b4OYTY/gjf+LUHx2n/qyL3FL74+TbSYZS 9z8de840oyBWcWrRcpOepTvlo0RPrDr5o1bo3f4VLT9nvWo/r3Gv9OXC/invfO/8LZI4n/XT NKRw3onj3dYPrl+9OPvFimV3lh4x8FZiKc5INNRiLipOBACJFGEHFQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1423201201 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > On 2/5/15 11:10 PM, Namjae Jeon wrote: > > Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > --- > > man/man8/xfs_io.8 | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > index cf27b99..416206f 100644 > > --- a/man/man8/xfs_io.8 > > +++ b/man/man8/xfs_io.8 > > @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the > > manual page to de-allocates blocks and eliminates the hole created in this process > > by shifting data blocks into the hole. > > .TP > > +.BI finsert " offset length" > > +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the > > +.BR fallocate (2) > > +manual page > Hi Eric, > So, it looks like the fallocate(2) manpage will need an update as well. :) Right, I am planning to send the manpage patch for insert range when merging linus tree.. > (linux-man@vger.kernel.org I believe) Okay. Thanks for your point :) > > Thanks, > -Eric From bfoster@redhat.com Fri Feb 6 13:53:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7BD0C7F90 for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2335430407B for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04cb6c2f0e00020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DB8Ela8bi5XgRL6P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7bX003239 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr63N023187 for ; Fri, 6 Feb 2015 14:53:06 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8307D1256B6; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 03/18] xfs: sparse inode chunks feature helpers and mount requirements Date: Fri, 6 Feb 2015 14:52:50 -0500 X-ASG-Orig-Subj: [PATCH v3 03/18] xfs: sparse inode chunks feature helpers and mount requirements Message-Id: <1423252385-3063-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inode chunks feature uses the helper function to enable the allocation of sparse inode chunks. The incompatible feature bit is set on disk at mkfs time to prevent mount from unsupported kernels. Also, enforce the inode alignment requirements required for sparse inode chunks at mount time. When enabled, full inode chunks (and all inode record) alignment is increased from cluster size to inode chunk size. Sparse inode alignment must match the cluster size of the fs. Both superblock alignment fields are set as such by mkfs when sparse inode support is enabled. Finally, warn that sparse inode chunks is an experimental feature until further notice. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 7 +++++++ fs/xfs/libxfs/xfs_sb.c | 22 ++++++++++++++++++++++ fs/xfs/xfs_mount.c | 16 ++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 051c24d..26e5d92 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -519,6 +519,7 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ (XFS_SB_FEAT_INCOMPAT_FTYPE) @@ -568,6 +569,12 @@ static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); } +static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES); +} + /* * end of superblock version macros */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index d6b4dbeb..90d252a 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -182,6 +182,28 @@ xfs_mount_validate_sb( return -EFSCORRUPTED; } + /* + * Full inode chunks must be aligned to inode chunk size when + * sparse inodes are enabled to support the sparse chunk + * allocation algorithm and prevent overlapping inode records. + */ + if (xfs_sb_version_hassparseinodes(sbp)) { + uint32_t align; + + xfs_alert(mp, + "v5 superblock with sparse inode chunk support detected.\n" + "This feature is EXPERIMENTAL. Use at your own risk!"); + + align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize + >> sbp->sb_blocklog; + if (sbp->sb_inoalignmt != align) { + xfs_warn(mp, "Invalid inode alignment (%u blks). " + "Must match inode chunk size (%u blks) with sparse inodes.", + sbp->sb_inoalignmt, align); + return -EINVAL; + } + } + if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { xfs_warn(mp, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4fa80e6..7ac52a3 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -738,6 +738,22 @@ xfs_mountfs( } /* + * If enabled, sparse inode chunk alignment is expected to match the + * cluster size. Full inode chunk alignment must match the chunk size, + * but that is checked on sb read verification... + */ + if (xfs_sb_version_hassparseinodes(&mp->m_sb) && + mp->m_sb.sb_spinoalignmt != + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) { + xfs_warn(mp, "Invalid sparse inode chunk alignment (%u blks). " + "Must match cluster size (%llu blks).", + mp->m_sb.sb_spinoalignmt, + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)); + error = -EINVAL; + goto out_remove_uuid; + } + + /* * Set inode alignment fields */ xfs_set_inoalignment(mp); -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BB897FAA for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 31E3830407E for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04cb6c2f0d00020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3VwkBu5IFGz9JiUI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7PP003243 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7kb007127 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B08681256B9; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 06/18] xfs: pass inode count through ordered icreate log item Date: Fri, 6 Feb 2015 14:52:53 -0500 X-ASG-Orig-Subj: [PATCH v3 06/18] xfs: pass inode count through ordered icreate log item Message-Id: <1423252385-3063-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 v5 superblocks use an ordered log item for logging the initialization of inode chunks. The icreate log item is currently hardcoded to an inode count of 64 inodes. The agbno and extent length are used to initialize the inode chunk from log recovery. While an incorrect inode count does not lead to bad inode chunk initialization, we should pass the correct inode count such that log recovery has enough data to perform meaningful validity checks on the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 7 ++++--- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/xfs_log_recover.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 32fdb7c..72ade0e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -228,6 +228,7 @@ xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, struct list_head *buffer_list, + int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, @@ -283,7 +284,7 @@ xfs_ialloc_inode_init( * they track in the AIL as if they were physically logged. */ if (tp) - xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, + xfs_icreate_log(tp, agno, agbno, icount, mp->m_sb.sb_inodesize, length, gen); } else version = 2; @@ -502,8 +503,8 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - error = xfs_ialloc_inode_init(args.mp, tp, NULL, agno, args.agbno, - args.len, prandom_u32()); + error = xfs_ialloc_inode_init(args.mp, tp, NULL, newlen, agno, + args.agbno, args.len, prandom_u32()); if (error) return error; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 100007d..4d4b702 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -156,7 +156,7 @@ int xfs_inobt_get_rec(struct xfs_btree_cur *cur, * Inode chunk initialisation routine */ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, - struct list_head *buffer_list, + struct list_head *buffer_list, int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a5a945f..ecc73d5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3091,8 +3091,8 @@ xlog_recover_do_icreate_pass2( XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) return 0; - xfs_ialloc_inode_init(mp, NULL, buffer_list, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); + xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, + be32_to_cpu(icl->icl_gen)); return 0; } -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B37D37FFA for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CC4C304081 for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cbb0221500020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oUT5aQAE0Ukxir9R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr74T032281 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7rB010102 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 038C81256BF; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 12/18] xfs: filter out sparse regions from individual inode allocation Date: Fri, 6 Feb 2015 14:52:59 -0500 X-ASG-Orig-Subj: [PATCH v3 12/18] xfs: filter out sparse regions from individual inode allocation Message-Id: <1423252385-3063-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from an existing record with free inodes traditionally selects the first inode available according to the ir_free mask. With sparse inode chunks, the ir_free mask could refer to an unallocated region. We must mask the unallocated regions out of ir_free before using it to select a free inode in the chunk. Create the xfs_inobt_first_free_inode() helper to find the first free inode available of the allocated regions of the inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 3e5d3eb..2691d3e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1183,6 +1183,30 @@ xfs_inobt_ialloc_bitmap( } /* + * Return the offset of the first free inode in the record. If the inode chunk + * is sparsely allocated, we convert the record holemask to inode granularity + * and mask off the unallocated regions from the inode free mask. + */ +STATIC int +xfs_inobt_first_free_inode( + struct xfs_inobt_rec_incore *rec) +{ + xfs_inofree_t realfree; + DECLARE_BITMAP(alloc, 64); + + /* if there are no holes, return the first available offset */ + if (!xfs_inobt_issparse(rec->ir_holemask)) + return xfs_lowbit64(rec->ir_free); + + xfs_inobt_ialloc_bitmap(alloc, rec); + realfree = bitmap_to_u64(alloc, 64); + + realfree &= rec->ir_free; + + return xfs_lowbit64(realfree); +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int @@ -1412,7 +1436,7 @@ newino: } alloc_inode: - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1661,7 +1685,7 @@ xfs_dialloc_ag( if (error) goto error_cur; - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BE2B7803C for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4731B30407F for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3700020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BQl2sdDHFFiDwJEs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Dx026127 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7Rq022352 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D23AF1256BC; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 09/18] xfs: support min/max agbno args in block allocator Date: Fri, 6 Feb 2015 14:52:56 -0500 X-ASG-Orig-Subj: [PATCH v3 09/18] xfs: support min/max agbno args in block allocator Message-Id: <1423252385-3063-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block allocator supports various arguments to tweak block allocation behavior and set allocation requirements. The sparse inode chunk feature introduces a new requirement not supported by the current arguments. Sparse inode allocations must convert or merge into an inode record that describes a fixed length chunk (64 inodes x inodesize). Full inode chunk allocations by definition always result in valid inode records. Sparse chunk allocations are smaller and the associated records can refer to blocks not owned by the inode chunk. This model can result in invalid inode records in certain cases. For example, if a sparse allocation occurs near the start of an AG, the aligned inode record for that chunk might refer to agbno 0. If an allocation occurs towards the end of the AG and the AG size is not aligned, the inode record could refer to blocks beyond the end of the AG. While neither of these scenarios directly result in corruption, they both insert invalid inode records and at minimum cause repair to complain, are unlikely to merge into full chunks over time and set land mines for other areas of code. To guarantee sparse inode chunk allocation creates valid inode records, support the ability to specify an agbno range limit for XFS_ALLOCTYPE_NEAR_BNO block allocations. The min/max agbno's are specified in the allocation arguments and limit the block allocation algorithms to that range. The starting 'agbno' hint is clamped to the range if the specified agbno is out of range. If no sufficient extent is available within the range, the allocation fails. For backwards compatibility, the min/max fields can be initialized to 0 to disable range limiting (e.g., equivalent to min=0,max=agsize). Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_alloc.c | 42 +++++++++++++++++++++++++++++++++++++----- fs/xfs/libxfs/xfs_alloc.h | 2 ++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf44..0ddf6c9 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -149,13 +149,27 @@ xfs_alloc_compute_aligned( { xfs_agblock_t bno; xfs_extlen_t len; + xfs_extlen_t diff; /* Trim busy sections out of found extent */ xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + /* + * If we have a largish extent that happens to start before min_agbno, + * see if we can shift it into range... + */ + if (bno < args->min_agbno && bno + len > args->min_agbno) { + diff = args->min_agbno - bno; + if (len > diff) { + bno += diff; + len -= diff; + } + } + if (args->alignment > 1 && len >= args->minlen) { xfs_agblock_t aligned_bno = roundup(bno, args->alignment); - xfs_extlen_t diff = aligned_bno - bno; + + diff = aligned_bno - bno; *resbno = aligned_bno; *reslen = diff >= len ? 0 : len - diff; @@ -790,9 +804,13 @@ xfs_alloc_find_best_extent( * The good extent is closer than this one. */ if (!dir) { + if (*sbnoa > args->max_agbno) + goto out_use_good; if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { + if (*sbnoa < args->min_agbno) + goto out_use_good; if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -879,6 +897,17 @@ xfs_alloc_ag_vextent_near( dofirst = prandom_u32() & 1; #endif + /* handle unitialized agbno range so caller doesn't have to */ + if (!args->min_agbno && !args->max_agbno) + args->max_agbno = args->mp->m_sb.sb_agblocks - 1; + ASSERT(args->min_agbno <= args->max_agbno); + + /* clamp agbno to the range if it's outside */ + if (args->agbno < args->min_agbno) + args->agbno = args->min_agbno; + if (args->agbno > args->max_agbno) + args->agbno = args->max_agbno; + restart: bno_cur_lt = NULL; bno_cur_gt = NULL; @@ -971,6 +1000,8 @@ restart: <bnoa, <lena); if (ltlena < args->minlen) continue; + if (ltbnoa < args->min_agbno || ltbnoa > args->max_agbno) + continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ASSERT(args->len >= args->minlen); @@ -1091,11 +1122,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); - if (ltlena >= args->minlen) + if (ltlena >= args->minlen && ltbnoa >= args->min_agbno) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) goto error0; - if (!i) { + if (!i || ltbnoa < args->min_agbno) { xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); bno_cur_lt = NULL; @@ -1107,11 +1138,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, gtbno, gtlen, >bnoa, >lena); - if (gtlena >= args->minlen) + if (gtlena >= args->minlen && gtbnoa <= args->max_agbno) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) goto error0; - if (!i) { + if (!i || gtbnoa > args->max_agbno) { xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR); bno_cur_gt = NULL; @@ -1211,6 +1242,7 @@ restart: ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltnew >= args->min_agbno && ltnew <= args->max_agbno); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index d1b4b6a..29f27b2 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -112,6 +112,8 @@ typedef struct xfs_alloc_arg { xfs_extlen_t total; /* total blocks needed in xaction */ xfs_extlen_t alignment; /* align answer to multiple of this */ xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */ + xfs_agblock_t min_agbno; /* set an agbno range for NEAR allocs */ + xfs_agblock_t max_agbno; /* ... */ xfs_extlen_t len; /* output: actual size of extent */ xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ xfs_alloctype_t otype; /* original allocation type */ -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF90A803D for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6663730407A for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cbb0221400020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id j6Sodqn0tfdQ8Abh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Ci032282 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7e7017041 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1439B1256B4; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 13/18] xfs: update free inode record logic to support sparse inode records Date: Fri, 6 Feb 2015 14:53:00 -0500 X-ASG-Orig-Subj: [PATCH v3 13/18] xfs: update free inode record logic to support sparse inode records Message-Id: <1423252385-3063-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_difree_inobt() uses logic in a couple places that assume inobt records refer to fully allocated chunks. Specifically, the use of mp->m_ialloc_inos can cause problems for inode chunks that are sparsely allocated. Sparse inode chunks can, by definition, define a smaller number of inodes than a full inode chunk. Fix the logic that determines whether an inode record should be removed from the inobt to use the ir_free mask rather than ir_freecount. Fix the agi counters modification to use ir_freecount to add the actual number of inodes freed rather than assuming a full inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 2691d3e..e50e57a 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1975,7 +1975,7 @@ xfs_difree_inobt( * When an inode cluster is free, it becomes eligible for removal */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && - (rec.ir_freecount == mp->m_ialloc_inos)) { + (rec.ir_free == XFS_INOBT_ALL_FREE)) { *deleted = 1; *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); @@ -1985,7 +1985,7 @@ xfs_difree_inobt( * AGI and Superblock inode counts, and mark the disk space * to be freed when the transaction is committed. */ - ilen = mp->m_ialloc_inos; + ilen = rec.ir_freecount; be32_add_cpu(&agi->agi_count, -ilen); be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); @@ -2108,7 +2108,7 @@ xfs_difree_finobt( * keeping inode chunks permanently on disk, remove the record. * Otherwise, update the record with the new information. */ - if (rec.ir_freecount == mp->m_ialloc_inos && + if (rec.ir_free == XFS_INOBT_ALL_FREE && !(mp->m_flags & XFS_MOUNT_IKEEP)) { error = xfs_btree_delete(cur, &i); if (error) -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C00458047 for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 659CD8F80BA for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cb6c2f0f00030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VfhZbQeTSt08kvtk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr71F016993 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr6Mh022339 for ; Fri, 6 Feb 2015 14:53:06 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5ADA71256B4; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 00/18] xfs: sparse inode chunks Date: Fri, 6 Feb 2015 14:52:47 -0500 X-ASG-Orig-Subj: [PATCH v3 00/18] xfs: sparse inode chunks Message-Id: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v3 of sparse inode chunk suport for XFS. The primary update for this version is an update to how inodes are aligned when sparse inode support is enabled. Inode chunks are currently aligned to cluster size to support single I/O per inode cluster. This means that the minimum block range between two non-adjacent inode chunks is the cluster size. Cluster size is also the granularity of sparse allocation. Therefore, it is possible to allocate a cluster size chunk that cannot be converted to an inode record due to overlap on both sides (ambiguous metadata). The only recourse in this situation is to undo the allocation and likely return ENOSPC. Given the added complexity of that and the already complicated inode allocation path, an approach that avoids this potential condition in the first place is preferred. To address this situation, inode alignment is increased from cluster size to chunk size (by mkfs) when sparse inode chunks are enabled. This guarantees that the minimum block range between two non-adjacent inode chunks is at least big enough for one full chunk. This greatly simplifies sparse inode record management. Allocations occur at cluster size granularity and are shifted into inode records that align to chunk size. In other words, for any particular sparse allocation, a well known record startino is determined by aligning the agbno of the allocation to the chunk size. The increased inode chunk alignment does limit the ability to allocate full inode chunks on a significantly populated fs, but what is lost in that regard is regained by the ability to allocate sparse records in any AG that can satisfy the minimum free space requirement[1]. Other changes in this version include marking the feature as experimental, a block allocation agbno range limit to avoid invalid inode records at AG boundaries, DEBUG mode allocation logic to improve test coverage, etc. This series survives xfstests regression runs on basic v5 configurations as well as some longer term debug mode fsstress testing. Thoughts, reviews, flames appreciated! Brian [1] - This can also be mitigated by future work to consider allocation of inode chunks in batches rather than one at a time. v3: - Rebase to latest for-next (bulkstat rework, data structure shuffling, etc.). - Fix issparse helper logic. - Update inode alignment model w/ spinodes enabled. All inode records are chunk size aligned, sparse allocations cluster size aligned (both enforced on mount). - Reworked sparse inode record merge logic to coincide w/ new alignment model. - Mark feature as experimental (warn on mount). - Include and use block allocation agbno range limit to prevent allocation of invalid inode records. - Add some DEBUG bits to improve sparse alloc. test coverage. v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html - Use a manually set feature bit instead of dynamic based on the existence of sparse inode chunks. - Add sb/mp fields for sparse alloc. granularity (use instead of cluster size). - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page size arches. - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. - Use byte of pad space in inobt record for inode count field. - Convert bitmap mgmt to use generic bitmap code. - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. - Add fs geometry bit for sparse inodes. - Rebase to latest for-next (bulkstat refactor). v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html Brian Foster (18): xfs: add sparse inode chunk alignment superblock field xfs: use sparse chunk alignment for min. inode allocation requirement xfs: sparse inode chunks feature helpers and mount requirements xfs: introduce inode record hole mask for sparse inode chunks xfs: create macros/helpers for dealing with sparse inode chunks xfs: pass inode count through ordered icreate log item xfs: handle sparse inode chunks in icreate log recovery xfs: helpers to convert holemask to/from generic bitmap xfs: support min/max agbno args in block allocator xfs: allocate sparse inode chunks on full chunk allocation failure xfs: randomly do sparse inode allocations in DEBUG mode xfs: filter out sparse regions from individual inode allocation xfs: update free inode record logic to support sparse inode records xfs: only free allocated regions of inode chunks xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() xfs: use actual inode count for sparse records in bulkstat/inumbers xfs: add fs geometry bit for sparse inode chunks xfs: enable sparse inode chunks for v5 superblocks fs/xfs/libxfs/xfs_alloc.c | 42 ++- fs/xfs/libxfs/xfs_alloc.h | 2 + fs/xfs/libxfs/xfs_format.h | 33 +- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 651 ++++++++++++++++++++++++++++++++++++--- fs/xfs/libxfs/xfs_ialloc.h | 17 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +- fs/xfs/libxfs/xfs_sb.c | 31 +- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_inode.c | 28 +- fs/xfs/xfs_itable.c | 14 +- fs/xfs/xfs_log_recover.c | 23 +- fs/xfs/xfs_mount.c | 16 + fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_trace.h | 47 +++ 15 files changed, 836 insertions(+), 79 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D99FE804A for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A4FD8F80B9 for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3500020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AXM1tpiDc3h4NBdy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr743003247 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7NB023195 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 20B351231FF; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 14/18] xfs: only free allocated regions of inode chunks Date: Fri, 6 Feb 2015 14:53:01 -0500 X-ASG-Orig-Subj: [PATCH v3 14/18] xfs: only free allocated regions of inode chunks Message-Id: <1423252385-3063-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode chunk is currently added to the transaction free list based on a simple fsb conversion and hardcoded chunk length. The nature of sparse chunks is such that the physical chunk of inodes on disk may consist of one or more discontiguous parts. Blocks that reside in the holes of the inode chunk are not inodes and could be allocated to any other use or not allocated at all. Refactor the existing xfs_bmap_add_free() call into the xfs_difree_inode_chunk() helper. The new helper uses the existing calculation if a chunk is not sparse. Otherwise, use the inobt record holemask to free the contiguous regions of the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 81 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index e50e57a..2bac038 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1910,6 +1910,83 @@ out_error: return error; } +/* + * Free the blocks of an inode chunk. We must consider that the inode chunk + * might be sparse and only free the regions that are allocated as part of the + * chunk. + */ +STATIC void +xfs_difree_inode_chunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *rec, + struct xfs_bmap_free *flist) +{ + xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); + int startidx, endidx; + int nextbit; + xfs_agblock_t agbno; + int contigblk; + DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS); + + 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); + return; + } + + /* holemask is only 16-bits (fits in an unsigned long) */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * Find contiguous ranges of zeroes (i.e., allocated regions) in the + * holemask and convert the start/end index of each range to an extent. + * We start with the start and end index both pointing at the first 0 in + * the mask. + */ + startidx = endidx = find_first_zero_bit(holemask, + XFS_INOBT_HOLEMASK_BITS); + nextbit = startidx + 1; + while (startidx < XFS_INOBT_HOLEMASK_BITS) { + nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS, + nextbit); + /* + * If the next zero bit is contiguous, update the end index of + * the current range and continue. + */ + if (nextbit != XFS_INOBT_HOLEMASK_BITS && + nextbit == endidx + 1) { + endidx = nextbit; + goto next; + } + + /* + * nextbit is not contiguous with the current end index. Convert + * the current start/end to an extent and add it to the free + * list. + */ + agbno = sagbno + (startidx * XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + contigblk = ((endidx - startidx + 1) * + XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + + ASSERT(agbno % mp->m_sb.sb_spinoalignmt == 0); + ASSERT(contigblk % mp->m_sb.sb_spinoalignmt == 0); + xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, agbno), contigblk, + flist, mp); + + /* reset range to current bit and carry on... */ + startidx = endidx = nextbit; + +next: + nextbit++; + } +} + STATIC int xfs_difree_inobt( struct xfs_mount *mp, @@ -2001,9 +2078,7 @@ xfs_difree_inobt( goto error0; } - 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_difree_inode_chunk(mp, agno, &rec, flist); } else { *deleted = 0; -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2D6B804C for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B7AC30407B for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3600030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GjTaM7tPDiU4WuE3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Sm017001 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7mQ022350 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5111C1256B7; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 18/18] xfs: enable sparse inode chunks for v5 superblocks Date: Fri, 6 Feb 2015 14:53:05 -0500 X-ASG-Orig-Subj: [PATCH v3 18/18] xfs: enable sparse inode chunks for v5 superblocks Message-Id: <1423252385-3063-19-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Enable mounting of filesystems with sparse inode support enabled. Add the incompat. feature bit to the *_ALL mask. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index b2faced..f1ce389 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -521,7 +521,8 @@ xfs_sb_has_ro_compat_feature( #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) + (XFS_SB_FEAT_INCOMPAT_FTYPE| \ + XFS_SB_FEAT_INCOMPAT_SPINODES) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1092F804E for ; Fri, 6 Feb 2015 13:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D6AE8F80A8 for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cbb0221600030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id APFTPHq4jVeb7F11 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7PQ021002 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7kd007127 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4693E1256C0; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 17/18] xfs: add fs geometry bit for sparse inode chunks Date: Fri, 6 Feb 2015 14:53:04 -0500 X-ASG-Orig-Subj: [PATCH v3 17/18] xfs: add fs geometry bit for sparse inode chunks Message-Id: <1423252385-3063-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define an fs geometry bit for sparse inode chunks such that the characteristic of the fs can be identified by userspace. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 18dc721..89689c6 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ +#define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fba6532..ea390ef 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -101,7 +101,9 @@ xfs_fs_geometry( (xfs_sb_version_hasftype(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | (xfs_sb_version_hasfinobt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FINOBT : 0); + XFS_FSOP_GEOM_FLAGS_FINOBT : 0) | + (xfs_sb_version_hassparseinodes(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_SPINODES : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09CC7804D for ; Fri, 6 Feb 2015 13:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A556530407F for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cb6c2f0e00030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9S4vfkBCYnGT6Mlj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Q8016998 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7mO022350 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C77571256BB; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap Date: Fri, 6 Feb 2015 14:52:55 -0500 X-ASG-Orig-Subj: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap Message-Id: <1423252385-3063-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inobt record holemask field is a condensed data type designed to fit into the existing on-disk record and is zero based (allocated regions are set to 0, sparse regions are set to 1) to provide backwards compatibility. This makes the type somewhat complex for use in higher level inode manipulations such as individual inode allocation, etc. Rather than foist the complexity of dealing with this field to every bit of logic that requires inode granular information, create the xfs_inobt_ialloc_bitmap() helper to convert the holemask to an inode allocation bitmap. The inode allocation bitmap is inode granularity similar to the inobt record free mask and indicates which inodes of the chunk are physically allocated on disk, irrespective of whether the inode is considered allocated or free by the filesystem. The generic bitmap type requires the use of generic kernel bitmap APIs. The bitmap_to_u64() helper is provided to convert the bitmap back to a native 64-bit type (for native bitwise operations). This is required because the generic bitmap code represents a bitmap as an array of unsigned long in a little endian style (though each array value is cpu order). To ensure compatibility with various word sizes and endianness', bitmap_to_u64() exports the bitmap to little endian and swaps back to cpu byte order. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 72ade0e..fc001d9 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -39,6 +39,8 @@ #include "xfs_icache.h" #include "xfs_trace.h" +STATIC void +xfs_inobt_ialloc_bitmap(unsigned long *, struct xfs_inobt_rec_incore *); /* * Allocation group level functions. @@ -739,6 +741,73 @@ xfs_ialloc_get_rec( return 0; } +static inline uint64_t +bitmap_to_u64( + const unsigned long *bitmap, + int nbits) +{ + __le64 lebitmap; + + ASSERT(nbits <= 64); + + /* + * The bitmap format depends on the native word size. E.g., bit 0 could + * land in the middle of the 64 bits on a big endian 32-bit arch (see + * arch/powerpc/include/asm/bitops.h). To handle this, export the bitmap + * as 64-bit little endian and convert back to native byte order. + */ + bitmap_copy_le(&lebitmap, bitmap, nbits); + return le64_to_cpu(lebitmap); +} + +/* + * Convert the inode record holemask to an inode allocation bitmap. The inode + * allocation bitmap is inode granularity and specifies whether an inode is + * physically allocated on disk (not whether the inode is considered allocated + * or free by the fs). + * + * We have to be careful with regard to byte order and word size since the + * generic bitmap code uses primitive types. + */ +STATIC void +xfs_inobt_ialloc_bitmap( + unsigned long *allocbmap, + struct xfs_inobt_rec_incore *rec) +{ + int nextbit; + DECLARE_BITMAP(holemask, 16); + + bitmap_zero(allocbmap, 64); + + /* + * bitmaps are represented as an array of unsigned long (each in cpu + * byte order). ir_holemask is only 16 bits, so direct assignment is + * safe. + */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * holemask is a 16-bit bitmap and inode records span 64 inodes. Thus + * each holemask bit represents multiple (XFS_INODES_PER_HOLEMASK_BIT) + * inodes. Since holemask bits represent holes, each set bit represents + * a region of the physical chunk that is not tracked by the record. + * + * We want an inode granularity allocation bitmap. We have to invert the + * holemask and set XFS_INODES_PER_HOLEMASK_BIT bits for each set bit. + * We invert and expand simultaneously by walking the unset (zeroed) + * holemask bits. For each zero bit in holemask, set the corresponding + * XFS_INODES_PER_HOLEMASK_BIT bits in the allocation bitmap. + */ + nextbit = find_first_zero_bit(holemask, 16); + while (nextbit < 16) { + bitmap_set(allocbmap, nextbit * XFS_INODES_PER_HOLEMASK_BIT, + XFS_INODES_PER_HOLEMASK_BIT); + + nextbit = find_next_zero_bit(holemask, 16, nextbit + 1); + } +} + /* * Allocate an inode using the inobt-only algorithm. */ -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 997207FA3 for ; Fri, 6 Feb 2015 13:53:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 231D630407A for ; Fri, 6 Feb 2015 11:53:09 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3400020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QKCUuPCgmztkfJzR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7dB016997 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7Ia010099 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9FF081256B8; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 05/18] xfs: create macros/helpers for dealing with sparse inode chunks Date: Fri, 6 Feb 2015 14:52:52 -0500 X-ASG-Orig-Subj: [PATCH v3 05/18] xfs: create macros/helpers for dealing with sparse inode chunks Message-Id: <1423252385-3063-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sparse inode chunks allow the traditional inode btree record format to describe an inode chunk that is not fully allocated and/or contiguous. The granularity of a sparse chunk is defined by the the 16-bit holemask field in the inode record. Assuming 64 inodes per full chunk, a single holemask bit accounts for 4 inodes. Define a constant for the number of inodes per holemask bit and a helper function to easily detect sparse inode chunks. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 6c2f1be..b2faced 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1285,6 +1285,10 @@ typedef __uint64_t xfs_inofree_t; #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) +#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(__uint16_t)) +#define XFS_INODES_PER_HOLEMASK_BIT \ + (XFS_INODES_PER_CHUNK / (NBBY * sizeof(__uint16_t))) + static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; @@ -1309,6 +1313,11 @@ typedef struct xfs_inobt_rec_incore { xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; +static inline bool xfs_inobt_issparse(uint16_t holemask) +{ + /* non-zero holemask represents a sparse rec. */ + return holemask; +} /* * Key structure -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 88C1B7F90 for ; Fri, 6 Feb 2015 13:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2FDEE30407F for ; Fri, 6 Feb 2015 11:53:10 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cbb0221700030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DszqFBFHi2IaHFfw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7wm020999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7Q2022354 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id DEBF31256BD; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure Date: Fri, 6 Feb 2015 14:52:57 -0500 X-ASG-Orig-Subj: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure Message-Id: <1423252385-3063-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode chunk. If all else fails, reduce the allocation to the minimum sparse granularity and attempt to allocate a sparse inode chunk. If sparse chunk allocation succeeds, check whether an inobt record already exists that can track the chunk. If so, inherit and update the existing record. Otherwise, insert a new record for the sparse chunk. Update xfs_inobt_insert_rec() to take the holemask as a parameter and set the associated field on disk. Create the xfs_inobt_update_insert() helper to handle the sparse chunk allocation case - insert or update an existing record depending on whether it already exists. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 397 +++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_trace.h | 47 ++++++ 2 files changed, 426 insertions(+), 18 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index fc001d9..090d114 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -122,12 +122,16 @@ xfs_inobt_get_rec( STATIC int xfs_inobt_insert_rec( struct xfs_btree_cur *cur, + __uint16_t holemask, + __uint8_t count, __int32_t freecount, xfs_inofree_t free, int *stat) { - cur->bc_rec.i.ir_holemask = 0; - cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ + ASSERT(count == 0 || xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)); + + cur->bc_rec.i.ir_holemask = holemask; + cur->bc_rec.i.ir_count = count; cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); @@ -151,6 +155,19 @@ xfs_inobt_insert( xfs_agino_t thisino; int i; int error; + uint8_t count; + + /* + * Only set ir_count in the inobt record if the sparse inodes feature is + * enabled. If disabled, we must maintain backwards compatibility with + * the older inobt record format where the current count and holemask + * fields map to the higher order bytes of freecount and thus must be + * zeroed. + */ + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) + count = XFS_INODES_PER_CHUNK; + else + count = 0; cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); @@ -164,7 +181,7 @@ xfs_inobt_insert( } ASSERT(i == 0); - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + error = xfs_inobt_insert_rec(cur, 0, count, XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); @@ -174,8 +191,58 @@ xfs_inobt_insert( } xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +} +/* + * Update or insert a new record based on a sparse inode chunk allocation. + * + * If a record already exists, the new record is an updated version of that + * record based on a merge of sparse inode chunks. Update the record in place. + * Otherwise, insert a new record in the tree. Note that the record to insert + * must already have been aligned and merged, if necessary. + */ +STATIC int +xfs_inobt_update_insert( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + struct xfs_inobt_rec_incore *rec, + xfs_btnum_t btnum) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int i; + int error; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + error = xfs_inobt_lookup(cur, rec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + if (i == 1) { + /* found a record, update it with the merged record */ + error = xfs_inobt_update(cur, rec); + if (error) + goto error; + goto out; + } + + /* no existing record, insert a new one */ + error = xfs_inobt_insert_rec(cur, rec->ir_holemask, rec->ir_count, + rec->ir_freecount, rec->ir_free, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + +out: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; + +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; } /* @@ -215,8 +282,36 @@ xfs_check_agi_freecount( } return 0; } + +/* + * Verify that an inode record has a valid inode count. With sparse inode chunk + * support enabled, the count must be consistent with the holemask. Otherwise, + * the count is set to 0. + */ +STATIC int +xfs_inobt_rec_check_count( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + int inocount; + DECLARE_BITMAP(allocbmap, XFS_INODES_PER_CHUNK); + + if (!xfs_sb_version_hassparseinodes(&mp->m_sb)) { + if (rec->ir_count) + return -EFSCORRUPTED; + return 0; + } + + xfs_inobt_ialloc_bitmap(allocbmap, rec); + inocount = bitmap_weight(allocbmap, XFS_INODES_PER_CHUNK); + if (inocount != rec->ir_count) + return -EFSCORRUPTED; + + return 0; +} #else #define xfs_check_agi_freecount(cur, agi) 0 +#define xfs_inobt_rec_check_count(mp, rec) 0 #endif /* @@ -358,6 +453,183 @@ xfs_ialloc_inode_init( } /* + * Align a record for a recently allocated sparse chunk. The input is a record + * that describes the unaligned chunk. The record is aligned such that it is fit + * for insertion (or merge) into the on-disk inode btrees. + */ +STATIC void +xfs_align_sparse_rec( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + xfs_agblock_t agbno; + xfs_agblock_t mod; + int offset; + uint16_t allocmask; + + agbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); + mod = agbno % mp->m_sb.sb_inoalignmt; + if (!mod) + return; + + /* calculate the inode offset and align startino */ + offset = mod << mp->m_sb.sb_inopblog; + rec->ir_startino -= offset; + + /* + * Since startino has been aligned down, we have to left shift + * ir_holemask such that it continues to represent the same physical + * inodes as the unaligned record. The unaligned record by definition + * tracks the allocated inodes with the lowest order bits. + * + * ir_holemask is inverted before the shift such that set bits represent + * allocated inodes. This makes it safe for the bit-shift to introduce + * zeroes in the lower order bits without corrupting the record. + * + * Note that no change is required for ir_count, ir_freecount or + * ir_free. The count values are not affected by alignment and ir_free + * is initialized to 1s for all inodes, sparse or otherwise. + */ + allocmask = ~rec->ir_holemask; + allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; + rec->ir_holemask = ~allocmask; +} + +/* + * Determine whether two sparse inode records can be merged. The inode ranges + * must match and there must be no allocation overlap between the records. + */ +STATIC bool +__xfs_inobt_can_merge( + struct xfs_inobt_rec_incore *trec, /* tgt record */ + struct xfs_inobt_rec_incore *srec) /* src record */ +{ + DECLARE_BITMAP(talloc, 64); + DECLARE_BITMAP(salloc, 64); + DECLARE_BITMAP(tmp, 64); + + /* records must cover the same inode range */ + if (trec->ir_startino != srec->ir_startino) + return false; + + /* both records must be sparse */ + if (!xfs_inobt_issparse(trec->ir_holemask) || + !xfs_inobt_issparse(srec->ir_holemask)) + return false; + + /* can't exceed capacity of a full record */ + if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK) + return false; + + /* verify there is no allocation overlap */ + xfs_inobt_ialloc_bitmap(talloc, trec); + xfs_inobt_ialloc_bitmap(salloc, srec); + + bitmap_and(tmp, salloc, talloc, 64); + if (!bitmap_empty(tmp, 64)) + return false; + + return true; +} + +/* + * Merge two sparse inode records. The caller must call __xfs_inobt_can_merge() + * to ensure the merge is valid. + */ +STATIC void +__xfs_inobt_rec_merge( + struct xfs_inobt_rec_incore *trec, /* target */ + struct xfs_inobt_rec_incore *srec) /* src */ +{ + ASSERT(trec->ir_startino == srec->ir_startino); + + /* combine the counts */ + trec->ir_count += srec->ir_count; + trec->ir_freecount += srec->ir_freecount; + + /* merge the holemask */ + trec->ir_holemask &= srec->ir_holemask; + + /* merge the free mask */ + trec->ir_free &= srec->ir_free; +} + +/* + * Determine whether a newly allocated sparse inode chunk record overlaps with + * an existing sparse record in the inobt. When sparse inode chunks are enabled, + * all inode chunk alignment is increased from cluster size to physical inode + * chunk size. This means that the smallest, non-zero gap between two inode + * chunks is at least one full inode chunk. When a sparse inode chunk is + * allocated, the containing record is also aligned in this manner such that + * future sparse allocations within that same range all align to the same record + * startino. This alignment policy supports the ability to merge sparse chunks + * into complete chunks over time. + * + * Given an newly allocated/aligned sparse inode record, look up whether a + * sparse record already exists at this startino. If so, merge the two records + * and return the merged record in nrec. + * + * An error is returned if records overlap but a merge is not possible. Given + * the alignment constraints described above, this should never happen and thus + * is treated as fs corruption. + */ +STATIC int +xfs_inobt_rec_merge( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_btnum_t btnum, + struct xfs_inobt_rec_incore *nrec) /* in/out: new/merged rec. */ +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int error; + int i; + struct xfs_inobt_rec_incore rec; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + /* the new record is pre-aligned so we know where to look */ + error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + /* if nothing there, we're done */ + if (i == 0) + goto out; + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + ASSERT(rec.ir_startino == nrec->ir_startino); + + /* + * This should never happen. If we have coexisting records that cannot + * merge, something is seriously wrong. + */ + if (!__xfs_inobt_can_merge(nrec, &rec)) { + error = -EFSCORRUPTED; + goto error; + } + + trace_xfs_irec_merge_pre(mp, agno, rec.ir_startino, rec.ir_holemask, + nrec->ir_startino, nrec->ir_holemask); + + __xfs_inobt_rec_merge(nrec, &rec); + + trace_xfs_irec_merge_post(mp, agno, nrec->ir_startino, + nrec->ir_holemask); + +out: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ @@ -375,6 +647,9 @@ xfs_ialloc_ag_alloc( xfs_agino_t newlen; /* new number of inodes */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ + uint16_t allocmask = (uint16_t) -1; /* init. to full chunk */ + struct xfs_inobt_rec_incore rec; + struct xfs_perag *pag; memset(&args, 0, sizeof(args)); @@ -490,6 +765,45 @@ xfs_ialloc_ag_alloc( return error; } + /* + * Finally, try a sparse allocation if the filesystem supports it and + * the sparse allocation length is smaller than a full chunk. + */ + if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && + args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && + args.fsbno == NULLFSBLOCK) { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.agbno = be32_to_cpu(agi->agi_root); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); + args.alignment = args.mp->m_sb.sb_spinoalignmt; + args.prod = 1; + + args.minlen = args.mp->m_ialloc_min_blks; + args.maxlen = args.minlen; + + /* + * The inode record will be aligned to full chunk size. We must + * prevent sparse allocation from AG boundaries that result in + * invalid inode records, such as records that start at agbno 0 + * or extend beyond the AG. + * + * Set min agbno to the first aligned, non-zero agbno and max to + * the last aligned agbno that is at least one full chunk from + * the end of the AG. + */ + args.min_agbno = args.mp->m_sb.sb_inoalignmt; + args.max_agbno = round_down(args.mp->m_sb.sb_agblocks, + args.mp->m_sb.sb_inoalignmt) - + args.mp->m_ialloc_blks; + + error = xfs_alloc_vextent(&args); + if (error) + return error; + + newlen = args.len << args.mp->m_sb.sb_inopblog; + allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1; + } + if (args.fsbno == NULLFSBLOCK) { *alloc = 0; return 0; @@ -514,6 +828,65 @@ xfs_ialloc_ag_alloc( * Convert the results. */ newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); + + if (xfs_inobt_issparse(~allocmask)) { + /* + * We've allocated a sparse chunk... + */ + rec.ir_startino = newino; + rec.ir_holemask = ~allocmask; + rec.ir_count = newlen; + rec.ir_freecount = newlen; + rec.ir_free = XFS_INOBT_ALL_FREE; + + /* align record and update newino for agi_newino */ + xfs_align_sparse_rec(args.mp, &rec); + newino = rec.ir_startino; + + error = xfs_inobt_rec_merge(args.mp, tp, agbp, XFS_BTNUM_INO, + &rec); + if (!error) + error = xfs_inobt_rec_check_count(args.mp, &rec); + if (error == -EFSCORRUPTED) { + xfs_alert(args.mp, + "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u", + XFS_AGINO_TO_INO(args.mp, agno, + rec.ir_startino), + rec.ir_holemask, rec.ir_count); + xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE); + } + if (error) + return error; + + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, + XFS_BTNUM_FINO); + if (error) + return error; + } + } else { + /* full chunk - insert new records to both btrees */ + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, + newlen, XFS_BTNUM_FINO); + if (error) + return error; + } + } + + /* + * Update AGI counts and newino. + */ be32_add_cpu(&agi->agi_count, newlen); be32_add_cpu(&agi->agi_freecount, newlen); pag = xfs_perag_get(args.mp, agno); @@ -522,20 +895,6 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btrees. - */ - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_INO); - if (error) - return error; - - if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_FINO); - if (error) - return error; - } - /* * Log allocation group header fields */ xfs_ialloc_log_agi(tp, agbp, @@ -1672,7 +2031,9 @@ xfs_difree_finobt( */ XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); - error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + error = xfs_inobt_insert_rec(cur, ibtrec->ir_holemask, + ibtrec->ir_count, + ibtrec->ir_freecount, ibtrec->ir_free, &i); if (error) goto error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..12a4bf4 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -734,6 +734,53 @@ TRACE_EVENT(xfs_iomap_prealloc_size, __entry->blocks, __entry->shift, __entry->writeio_blocks) ) +TRACE_EVENT(xfs_irec_merge_pre, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask, xfs_agino_t nagino, uint16_t nholemask), + TP_ARGS(mp, agno, agino, holemask, nagino, nholemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + __field(xfs_agino_t, nagino) + __field(uint16_t, nholemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + __entry->nagino = nagino; + __entry->nholemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x) new (%u:0x%x)", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, + __entry->agino, __entry->holemask, __entry->nagino, + __entry->nholemask) +) + +TRACE_EVENT(xfs_irec_merge_post, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask), + TP_ARGS(mp, agno, agino, holemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x)", MAJOR(__entry->dev), + MINOR(__entry->dev), __entry->agno, __entry->agino, + __entry->holemask) +) + #define DEFINE_IREF_EVENT(name) \ DEFINE_EVENT(xfs_iref_class, name, \ TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A5938050 for ; Fri, 6 Feb 2015 13:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BAAF7AC00C for ; Fri, 6 Feb 2015 11:53:08 -0800 (PST) X-ASG-Debug-ID: 1423252388-04cb6c2f0d00030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ceevfx6SpS7K1OeR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7CH020998 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7jr022356 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id EB3D71256BE; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode Date: Fri, 6 Feb 2015 14:52:58 -0500 X-ASG-Orig-Subj: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode Message-Id: <1423252385-3063-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sparse inode allocations generally only occur when full inode chunk allocation fails. This requires some level of filesystem space usage and fragmentation. For filesystems formatted with sparse inode chunks enabled, do random sparse inode chunk allocs when compiled in DEBUG mode to increase test coverage. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 090d114..3e5d3eb 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -652,9 +652,18 @@ xfs_ialloc_ag_alloc( struct xfs_perag *pag; +#ifdef DEBUG + int do_sparse = 0; + + /* randomly do sparse inode allocations */ + if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb)) + do_sparse = prandom_u32() & 1; +#endif + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; + args.fsbno = NULLFSBLOCK; /* * Locking will ensure that we don't have two callers in here @@ -675,6 +684,10 @@ xfs_ialloc_ag_alloc( agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + args.mp->m_ialloc_blks; +#ifdef DEBUG + if (do_sparse) + goto sparse_alloc; +#endif if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); @@ -713,8 +726,7 @@ xfs_ialloc_ag_alloc( * subsequent requests. */ args.minalignslop = 0; - } else - args.fsbno = NULLFSBLOCK; + } if (unlikely(args.fsbno == NULLFSBLOCK)) { /* @@ -769,6 +781,9 @@ xfs_ialloc_ag_alloc( * Finally, try a sparse allocation if the filesystem supports it and * the sparse allocation length is smaller than a full chunk. */ +#ifdef DEBUG +sparse_alloc: +#endif if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && args.fsbno == NULLFSBLOCK) { -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 16EF7803C for ; Fri, 6 Feb 2015 13:53:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8D128F80A8 for ; Fri, 6 Feb 2015 11:53:11 -0800 (PST) X-ASG-Debug-ID: 1423252387-04cb6c2f0f00020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id J5ZaSQrbGQMgrzjO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Rj032275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr6e3023185 for ; Fri, 6 Feb 2015 14:53:06 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 74D901256B5; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 02/18] xfs: use sparse chunk alignment for min. inode allocation requirement Date: Fri, 6 Feb 2015 14:52:49 -0500 X-ASG-Orig-Subj: [PATCH v3 02/18] xfs: use sparse chunk alignment for min. inode allocation requirement Message-Id: <1423252385-3063-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_select() iterates through the allocation groups looking for free inodes or free space to determine whether to allow an inode allocation to proceed. If no free inodes are available, it assumes that an AG must have an extent longer than mp->m_ialloc_blks. Sparse inode chunk support currently allows for allocations smaller than the traditional inode chunk size specified in m_ialloc_blks. The current minimum sparse allocation is set in the superblock sb_spinoalignmt field at mkfs time. Create a new m_ialloc_min_blks field in xfs_mount and use this to represent the minimum supported allocation size for inode chunks. Initialize m_ialloc_min_blks at mount time based on whether sparse inodes are supported. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 5 +++++ fs/xfs/xfs_mount.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..6f2153e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -644,7 +644,7 @@ xfs_ialloc_ag_select( * if we fail allocation due to alignment issues then it is most * likely a real ENOSPC condition. */ - ineed = mp->m_ialloc_blks; + ineed = mp->m_ialloc_min_blks; if (flags && ineed > 1) ineed += xfs_ialloc_cluster_alignment(mp); longest = pag->pagf_longest; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index eb22b5f..d6b4dbeb 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -697,6 +697,11 @@ xfs_sb_mount_common( mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; + + if (sbp->sb_spinoalignmt) + mp->m_ialloc_min_blks = sbp->sb_spinoalignmt; + else + mp->m_ialloc_min_blks = mp->m_ialloc_blks; } /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a5b2ff8..97f17d5 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -136,6 +136,8 @@ typedef struct xfs_mount { __uint64_t m_flags; /* global mount flags */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ + int m_ialloc_min_blks;/* min blocks in sparse inode + * allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ struct xfs_trans_resv m_resv; /* precomputed res values */ -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47655805A for ; Fri, 6 Feb 2015 13:53:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D3D628F80A8 for ; Fri, 6 Feb 2015 11:53:08 -0800 (PST) X-ASG-Debug-ID: 1423252387-04cbb0221700020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LWhyj6BUO0KvJzAn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7Kl026118 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr6dv023183 for ; Fri, 6 Feb 2015 14:53:06 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 679CD1231FF; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field Date: Fri, 6 Feb 2015 14:52:48 -0500 X-ASG-Orig-Subj: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field Message-Id: <1423252385-3063-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add sb_spinoalignmt to the superblock to specify sparse inode chunk alignment. This also currently represents the minimum allowable sparse chunk allocation size. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 6 +++--- fs/xfs/libxfs/xfs_sb.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 8eb7189..051c24d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -170,7 +170,7 @@ typedef struct xfs_sb { __uint32_t sb_features_log_incompat; __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; + xfs_extlen_t sb_spinoalignmt;/* sparse inode chunk alignment */ xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -256,7 +256,7 @@ typedef struct xfs_dsb { __be32 sb_features_log_incompat; __le32 sb_crc; /* superblock crc */ - __be32 sb_pad; + __be32 sb_spinoalignmt;/* sparse inode chunk alignment */ __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -282,7 +282,7 @@ typedef enum { XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINOALIGNMT, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe9..eb22b5f 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -382,7 +382,7 @@ __xfs_sb_from_disk( be32_to_cpu(from->sb_features_log_incompat); /* crc is only used on disk, not in memory; just init to 0 here. */ to->sb_crc = 0; - to->sb_pad = 0; + to->sb_spinoalignmt = be32_to_cpu(from->sb_spinoalignmt); to->sb_pquotino = be64_to_cpu(from->sb_pquotino); to->sb_lsn = be64_to_cpu(from->sb_lsn); /* Convert on-disk flags to in-memory flags? */ @@ -524,7 +524,7 @@ xfs_sb_to_disk( cpu_to_be32(from->sb_features_incompat); to->sb_features_log_incompat = cpu_to_be32(from->sb_features_log_incompat); - to->sb_pad = 0; + to->sb_spinoalignmt = cpu_to_be32(from->sb_spinoalignmt); to->sb_lsn = cpu_to_be64(from->sb_lsn); } } -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C543B8047 for ; Fri, 6 Feb 2015 13:53:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F4F3AC009 for ; Fri, 6 Feb 2015 11:53:07 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3600020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0tpgYQBh5h0HGQZn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7hB016994 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr6sL022341 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8B5031256B7; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Date: Fri, 6 Feb 2015 14:52:51 -0500 X-ASG-Orig-Subj: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-Id: <1423252385-3063-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inode btrees track 64 inodes per record, regardless of inode size. Thus, inode chunks on disk vary in size depending on the size of the inodes. This creates a contiguous allocation requirement for new inode chunks that can be difficult to satisfy on an aged and fragmented (free space) filesystem. The inode record freecount currently uses 4 bytes on disk to track the free inode count. With a maximum freecount value of 64, only one byte is required. Convert the freecount field to a single byte and use two of the remaining 3 higher order bytes left for the hole mask field. Use the final leftover byte for the total count field. The hole mask field tracks holes in the chunks of physical space that the inode record refers to. This facilitates the sparse allocation of inode chunks when contiguous chunks are not available and allows the inode btrees to identify what portions of the chunk contain valid inodes. The total count field contains the total number of valid inodes referred to by the record. This can also be deduced from the hole mask. The count field provides clarity and redundancy for internal record verification. Note that both fields are initialized to zero to maintain backwards compatibility with existing filesystems (e.g., the higher order bytes of freecount are always 0). Tracking holes means that the hole mask is initialized to zero and thus remains "valid" in accordance with a non-sparse inode fs when no sparse chunks are physically allocated. Update the inode record management functions to handle the new fields and initialize to zero. [XXX: The count field breaks backwards compatibility with !sparseinode fs. Should we reconsider the addition of total count or the idea of converting back and forth between sparse inode fs with a feature bit?] Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 8 ++++++-- fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 26e5d92..6c2f1be 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1295,13 +1295,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) */ typedef struct xfs_inobt_rec { __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ + __be16 ir_holemask; /* hole mask for sparse chunks */ + __u8 ir_count; /* total inode count */ + __u8 ir_freecount; /* count of free inodes (set bits) */ __be64 ir_free; /* free inode mask */ } xfs_inobt_rec_t; typedef struct xfs_inobt_rec_incore { xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ + __uint16_t ir_holemask; /* hole mask for sparse chunks */ + __uint8_t ir_count; /* total inode count */ + __uint8_t ir_freecount; /* count of free inodes (set bits) */ xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 6f2153e..32fdb7c 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -65,6 +65,8 @@ xfs_inobt_lookup( int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; cur->bc_rec.i.ir_freecount = 0; cur->bc_rec.i.ir_free = 0; return xfs_btree_lookup(cur, dir, stat); @@ -82,7 +84,9 @@ xfs_inobt_update( union xfs_btree_rec rec; rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); + rec.inobt.ir_count = irec->ir_count; + rec.inobt.ir_freecount = irec->ir_freecount; rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -102,7 +106,9 @@ xfs_inobt_get_rec( error = xfs_btree_get_rec(cur, &rec, stat); if (!error && *stat == 1) { irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); + irec->ir_holemask = be16_to_cpu(rec->inobt.ir_holemask); + irec->ir_count = rec->inobt.ir_count; + irec->ir_freecount = rec->inobt.ir_freecount; irec->ir_free = be64_to_cpu(rec->inobt.ir_free); } return error; @@ -118,6 +124,8 @@ xfs_inobt_insert_rec( xfs_inofree_t free, int *stat) { + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 964c465..c9378e8 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -167,7 +167,9 @@ xfs_inobt_init_rec_from_cur( union xfs_btree_rec *rec) { rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino); - rec->inobt.ir_freecount = cpu_to_be32(cur->bc_rec.i.ir_freecount); + rec->inobt.ir_holemask = cpu_to_be16(cur->bc_rec.i.ir_holemask); + rec->inobt.ir_count = cur->bc_rec.i.ir_count; + rec->inobt.ir_freecount = cur->bc_rec.i.ir_freecount; rec->inobt.ir_free = cpu_to_be64(cur->bc_rec.i.ir_free); } -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0046D804A for ; Fri, 6 Feb 2015 13:53:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3DB18AC00B for ; Fri, 6 Feb 2015 11:53:08 -0800 (PST) X-ASG-Debug-ID: 1423252387-04bdf02f3700030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HSmYLC2Rbvz2gwsl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:07 -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 (8.14.4/8.14.4) with ESMTP id t16Jr7ft026133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7wZ017039 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3D07C1256B5; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 16/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Date: Fri, 6 Feb 2015 14:53:03 -0500 X-ASG-Orig-Subj: [PATCH v3 16/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Message-Id: <1423252385-3063-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252387 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The bulkstat and inumbers mechanisms make the assumption that inode records consist of a full 64 inode chunk in several places. For example, this is used to track how many inodes have been processed overall as well as to determine whether a record has allocated inodes that must be handled. This assumption is invalid for sparse inode records. While sparse inodes will be marked as free in the ir_free mask, they are not accounted as free in ir_freecount because they cannot be allocated. Therefore, ir_freecount may be less than 64 inodes in an inode record for which all physically allocated inodes are free (and in turn ir_freecount < 64 does not signify that the record has allocated inodes). Create the xfs_inobt_count() helper to calculate the total number of physically allocated inodes based on the holemask. Use the helper in xfs_bulkstat() and xfs_inumbers() instead of the fixed XFS_INODE_PER_CHUNK value to ensure correct accounting in the event of sparse inode records. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 16 ++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.h | 5 +++++ fs/xfs/xfs_itable.c | 14 ++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index c104ee5..4d151ed 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1207,6 +1207,22 @@ xfs_inobt_first_free_inode( } /* + * Calculate the real count of inodes in a chunk. + */ +int +xfs_inobt_count( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + ASSERT(!xfs_inobt_rec_check_count(mp, rec)); + + if (!xfs_inobt_issparse(rec->ir_holemask)) + return XFS_INODES_PER_CHUNK; + + return rec->ir_count; +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 12401fe..065abfc 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -170,4 +170,9 @@ int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); +/* + * Calculate the real count of inodes in a chunk. + */ +int xfs_inobt_count(struct xfs_mount *mp, struct xfs_inobt_rec_incore *rec); + #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 82e3142..34eecdf 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -252,7 +252,8 @@ xfs_bulkstat_grab_ichunk( } irec->ir_free |= xfs_inobt_maskn(0, idx); - *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + *icount = xfs_inobt_count(cur->bc_mp, irec) - + irec->ir_freecount; } return 0; @@ -415,6 +416,8 @@ xfs_bulkstat( goto del_cursor; if (icount) { irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; @@ -447,13 +450,16 @@ xfs_bulkstat( * If this chunk has any allocated inodes, save it. * Also start read-ahead now for this chunk. */ - if (r.ir_freecount < XFS_INODES_PER_CHUNK) { + if (r.ir_freecount < xfs_inobt_count(mp, &r)) { xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - icount += XFS_INODES_PER_CHUNK - r.ir_freecount; + icount += xfs_inobt_count(mp, &r) - + r.ir_freecount; } error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { @@ -600,7 +606,7 @@ xfs_inumbers( buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); buffer[bufidx].xi_alloccount = - XFS_INODES_PER_CHUNK - r.ir_freecount; + xfs_inobt_count(mp, &r) - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; if (++bufidx == bcount) { long written; -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 973C6804F for ; Fri, 6 Feb 2015 13:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1200330407B for ; Fri, 6 Feb 2015 11:53:10 -0800 (PST) X-ASG-Debug-ID: 1423252388-04bdf02f3500030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FExCTr12WFftDwFc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr8iv001316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7Ic010099 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 35D7C1256B6; Fri, 6 Feb 2015 14:53:06 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 15/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Date: Fri, 6 Feb 2015 14:53:02 -0500 X-ASG-Orig-Subj: [PATCH v3 15/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Message-Id: <1423252385-3063-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ifree_cluster() is called to mark all in-memory inodes and inode buffers as stale. This occurs after we've removed the inobt records and dropped any references of inobt data. xfs_ifree_cluster() uses the starting inode number to walk the namespace of inodes expected for a single chunk a cluster buffer at a time. The cluster buffer disk addresses are calculated by decoding the sequential inode numbers expected from the chunk. The problem with this approach is that if the inode chunk being removed is a sparse chunk, not all of the buffer addresses that are calculated as part of this sequence may be inode clusters. Attempting to acquire the buffer based on expected inode characterstics (i.e., cluster length) can lead to errors and is generally incorrect. We already use a couple variables to carry requisite state from xfs_difree() to xfs_ifree_cluster(). Rather than add a third, define a new internal structure to carry the existing parameters through these functions. Add an alloc field that represents the physical allocation bitmap of inodes in the chunk being removed. Modify xfs_ifree_cluster() to check each inode against the bitmap and skip the clusters that were never allocated as real inodes on disk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 18 +++++++++--------- fs/xfs/libxfs/xfs_ialloc.h | 10 ++++++++-- fs/xfs/xfs_inode.c | 28 ++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 2bac038..c104ee5 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1994,8 +1994,7 @@ xfs_difree_inobt( struct xfs_buf *agbp, xfs_agino_t agino, struct xfs_bmap_free *flist, - int *deleted, - xfs_ino_t *first_ino, + struct xfs_icluster *xic, struct xfs_inobt_rec_incore *orec) { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); @@ -2053,9 +2052,12 @@ xfs_difree_inobt( */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_free == XFS_INOBT_ALL_FREE)) { + DECLARE_BITMAP(alloc, 64); - *deleted = 1; - *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->deleted = 1; + xic->first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xfs_inobt_ialloc_bitmap(alloc, &rec); + xic->alloc = bitmap_to_u64(alloc, 64); /* * Remove the inode cluster from the AGI B+Tree, adjust the @@ -2080,7 +2082,7 @@ xfs_difree_inobt( xfs_difree_inode_chunk(mp, agno, &rec, flist); } else { - *deleted = 0; + xic->deleted = 0; error = xfs_inobt_update(cur, &rec); if (error) { @@ -2219,8 +2221,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted,/* set if inode cluster was deleted */ - xfs_ino_t *first_ino)/* first inode in deleted cluster */ + struct xfs_icluster *xic) /* cluster info if deleted */ { /* REFERENCED */ xfs_agblock_t agbno; /* block number containing inode */ @@ -2271,8 +2272,7 @@ xfs_difree( /* * Fix up the inode allocation btree. */ - error = xfs_difree_inobt(mp, tp, agbp, agino, flist, deleted, first_ino, - &rec); + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, xic, &rec); if (error) goto error0; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 4d4b702..12401fe 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -28,6 +28,13 @@ struct xfs_btree_cur; /* Move inodes in clusters of this size */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 +struct xfs_icluster { + bool deleted; /* record is deleted */ + xfs_ino_t first_ino; /* first inode number */ + uint64_t alloc; /* inode phys. allocation bitmap for + * sparse chunks */ +}; + /* Calculate and return the number of filesystem blocks per inode cluster */ static inline int xfs_icluster_size_fsb( @@ -90,8 +97,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino); /* first inode in deleted cluster */ + struct xfs_icluster *ifree); /* cluster info if deleted */ /* * Return the location of the inode in imap, for mapping it into a buffer. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index daafa1f..a054110 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2182,9 +2182,9 @@ xfs_iunlink_remove( */ STATIC int xfs_ifree_cluster( - xfs_inode_t *free_ip, - xfs_trans_t *tp, - xfs_ino_t inum) + xfs_inode_t *free_ip, + xfs_trans_t *tp, + struct xfs_icluster *xic) { xfs_mount_t *mp = free_ip->i_mount; int blks_per_cluster; @@ -2197,13 +2197,26 @@ xfs_ifree_cluster( xfs_inode_log_item_t *iip; xfs_log_item_t *lip; struct xfs_perag *pag; + xfs_ino_t inum; + inum = xic->first_ino; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum)); blks_per_cluster = xfs_icluster_size_fsb(mp); inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; nbufs = mp->m_ialloc_blks / blks_per_cluster; for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) { + /* + * The allocation bitmap tells us which inodes of the chunk were + * physically allocated. Skip the cluster if an inode falls into + * a sparse region. + */ + if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) { + ASSERT(((inum - xic->first_ino) % + inodes_per_cluster) == 0); + continue; + } + blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); @@ -2361,8 +2374,7 @@ xfs_ifree( xfs_bmap_free_t *flist) { int error; - int delete; - xfs_ino_t first_ino; + struct xfs_icluster xic = { 0 }; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(ip->i_d.di_nlink == 0); @@ -2378,7 +2390,7 @@ xfs_ifree( if (error) return error; - error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino); + error = xfs_difree(tp, ip->i_ino, flist, &xic); if (error) return error; @@ -2395,8 +2407,8 @@ xfs_ifree( ip->i_d.di_gen++; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (delete) - error = xfs_ifree_cluster(ip, tp, first_ino); + if (xic.deleted) + error = xfs_ifree_cluster(ip, tp, &xic); return error; } -- 1.8.3.1 From bfoster@redhat.com Fri Feb 6 13:53:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 31204804C for ; Fri, 6 Feb 2015 13:53:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D3E5AC00C for ; Fri, 6 Feb 2015 11:53:08 -0800 (PST) X-ASG-Debug-ID: 1423252387-04cbb0221600020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dOhIUWVhtfJoiJHk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 11:53:08 -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 (8.14.4/8.14.4) with ESMTP id t16Jr78X026123 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16Jr7wX017039 for ; Fri, 6 Feb 2015 14:53:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id BCF951256BA; Fri, 6 Feb 2015 14:53:05 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery Date: Fri, 6 Feb 2015 14:52:54 -0500 X-ASG-Orig-Subj: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery Message-Id: <1423252385-3063-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1423252385-3063-1-git-send-email-bfoster@redhat.com> References: <1423252385-3063-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: 1423252388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Recovery of icreate transactions assumes hardcoded values for the inode count and chunk length. Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update the icreate validity checks to allow for appropriately sized inode chunks and verify the inode count matches what is expected based on the extent length rather than assuming a hardcoded count. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ecc73d5..5a5ee20 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3068,12 +3068,19 @@ xlog_recover_do_icreate_pass2( return -EINVAL; } - /* existing allocation is fixed value */ - ASSERT(count == mp->m_ialloc_inos); - ASSERT(length == mp->m_ialloc_blks); - if (count != mp->m_ialloc_inos || - length != mp->m_ialloc_blks) { - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); + /* inode chunk is either full or sparse */ + if (length != mp->m_ialloc_blks && + length != mp->m_ialloc_min_blks) { + xfs_warn(log->l_mp, + "%s: unsupported chunk length", __FUNCTION__); + return -EINVAL; + } + + /* verify inode count is consistent with extent length */ + if ((count >> mp->m_sb.sb_inopblog) != length) { + xfs_warn(log->l_mp, + "%s: inconsistent inode count and chunk length", + __FUNCTION__); return -EINVAL; } -- 1.8.3.1 From david@fromorbit.com Fri Feb 6 16:21:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 049927F63 for ; Fri, 6 Feb 2015 16:21:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65B64AC00C for ; Fri, 6 Feb 2015 14:21:04 -0800 (PST) X-ASG-Debug-ID: 1423261261-04bdf06a5b00f70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id pdAFX5SMCZl0ogUD for ; Fri, 06 Feb 2015 14:21:02 -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: ApEUAKM91VR5LL/s/2dsb2JhbABagwaBLLAhAQEBAQEBBpgtAgIBAQKBGkQBAQEBAX2EDQEFOhwjEAgDDgoJJQ8FJQMhE4gs1UgBAQEHAgEfGIVsiXQHhCkFmEWBGIsYgn+DPiKEAioxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 08:51:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJrGZ-00005i-8A; Sat, 07 Feb 2015 09:20:47 +1100 Date: Sat, 7 Feb 2015 09:20:47 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "J. Bruce Fields" , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150206222047.GM12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150205135756.GA6386@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423261261 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 05, 2015 at 02:57:56PM +0100, Christoph Hellwig wrote: > I've updated the patch and pushed out a new pnfsd-for-3.20-4 branch. > > The changes relative to the old one are below: Hi Christoph, with these changes I think this is fine to be merged with the experimental tag attached to it Acked-by: Dave Chinner I'm expecting the merge window to open on Monday so it's kinda late to be adding new stuff to the XFS tree and co-ordinating it with the NFS tree merge - how were you planning to get this to merged? I've already merged all but the two pNFSD support patches, so there's some duplicate commits in your pnfsd-for-3.20-4 branch. i.e. these commits in your tree: b8d5187 xfs: factor out a xfs_update_prealloc_flags() helper 6d5ca2a xfs: update the superblock using a synchronous transaction in growfs e3ea93e xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten are already merged into the xfs for-next branch as: 8add71c xfs: factor out a xfs_update_prealloc_flags() helper f8079b8 xfs: growfs should use synchronous transactions d32057f xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten A straight merge from your tree ends up with both sets of commits in the history. So a rebase on your side, or me pulling them into the XFS tree is probably required to keep the history clean. I didn't really want to add any more to the XFS tree this close to the merge window opening, but I've already got a regression fix that needs to be added, so perhaps I'll delay sending Linus a pull request for a week and just merge all of these XFS changes directly. What do you think? Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Fri Feb 6 16:22:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47FFF7F63 for ; Fri, 6 Feb 2015 16:22:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 34E278F8094 for ; Fri, 6 Feb 2015 14:22:07 -0800 (PST) X-ASG-Debug-ID: 1423261326-04cb6c6b0a00ef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uJLFc96qTbOhFKMa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Feb 2015 14:22:06 -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 (8.14.4/8.14.4) with ESMTP id t16MM5Bv020220 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 6 Feb 2015 17:22:06 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t16MM4jG030210 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 6 Feb 2015 17:22:05 -0500 Message-ID: <54D53E8C.8070207@redhat.com> Date: Fri, 06 Feb 2015 16:22:04 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* 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: 1423261326 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 These 2 patches provide information about which filesystem hit the error... Thanks, -Eric From david@fromorbit.com Fri Feb 6 16:22:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FCD37F63 for ; Fri, 6 Feb 2015 16:22:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F87D304043 for ; Fri, 6 Feb 2015 14:22:43 -0800 (PST) X-ASG-Debug-ID: 1423261361-04cb6c6b0c00f10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Vg1FKIhA5ozAOkU9 for ; Fri, 06 Feb 2015 14:22:41 -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: ApEUAKM91VR5LL/s/2dsb2JhbABagwaBLLAhAQEBAQEBBpgtAgIBAQKBGkQBAQEBAX2EDQEFOhwjEAgDGAklDwUlAyETiCzVSCwYhWyJdAeEKQWEUAeTboEYiSSBdIY9IoQCKjGCQgEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 08:52:40 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJrIB-00005x-Pe; Sat, 07 Feb 2015 09:22:27 +1100 Date: Sat, 7 Feb 2015 09:22:27 +1100 From: Dave Chinner To: Namjae Jeon Cc: 'Eric Sandeen' , linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-ID: <20150206222227.GN12722@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE References: <001f01d041cb$39fbbc70$adf33550$@samsung.com> <54D45068.2030209@sandeen.net> <002401d041cf$570eae40$052c0ac0$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <002401d041cf$570eae40$052c0ac0$@samsung.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: 1423261361 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:39:56PM +0900, Namjae Jeon wrote: > > On 2/5/15 11:10 PM, Namjae Jeon wrote: > > > Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. > > > > > > Signed-off-by: Namjae Jeon > > > Signed-off-by: Ashish Sangwan > > > --- > > > man/man8/xfs_io.8 | 5 +++++ > > > 1 file changed, 5 insertions(+) > > > > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > > index cf27b99..416206f 100644 > > > --- a/man/man8/xfs_io.8 > > > +++ b/man/man8/xfs_io.8 > > > @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the > > > manual page to de-allocates blocks and eliminates the hole created in this process > > > by shifting data blocks into the hole. > > > .TP > > > +.BI finsert " offset length" > > > +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the > > > +.BR fallocate (2) > > > +manual page > > > Hi Eric, > > So, it looks like the fallocate(2) manpage will need an update as well. :) > Right, I am planning to send the manpage patch for insert range when merging linus tree.. Best to have the man page with the rest of the code changes, that way they all get reviewed at the same time. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Feb 6 16:23:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 307117F63 for ; Fri, 6 Feb 2015 16:23:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D7C1304043 for ; Fri, 6 Feb 2015 14:23:13 -0800 (PST) X-ASG-Debug-ID: 1423261389-04cbb0116300f50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id g4AAJjA3pF4Ss4q9 for ; Fri, 06 Feb 2015 14:23:09 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7F3AA602D78F; Fri, 6 Feb 2015 16:22:47 -0600 (CST) Message-ID: <54D53EB6.6000306@sandeen.net> Date: Fri, 06 Feb 2015 16:22:46 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 1/2] xfs: pass mp to XFS_WANT_CORRUPTED_GOTO References: <54D53E8C.8070207@redhat.com> X-ASG-Orig-Subj: [PATCH 1/2] xfs: pass mp to XFS_WANT_CORRUPTED_GOTO In-Reply-To: <54D53E8C.8070207@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: 1423261389 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, if we hit an XFS_WANT_CORRUPTED_GOTO we don't print any information about which filesystem hit it. Passing in the mp allows us to print the filesystem (device) name, which is a pretty critical piece of information. Tested by running fsfuzzer 'til I hit some. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf44..d38d69a 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -682,7 +682,7 @@ xfs_alloc_ag_vextent_exact( error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); ASSERT(fbno <= args->agbno); /* @@ -783,7 +783,7 @@ xfs_alloc_find_best_extent( error = xfs_alloc_get_rec(*scur, sbno, slen, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena); /* @@ -946,7 +946,7 @@ restart: if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); if (ltlen >= args->minlen) break; if ((error = xfs_btree_increment(cnt_cur, 0, &i))) @@ -966,7 +966,7 @@ restart: */ if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); if (ltlena < args->minlen) @@ -999,7 +999,7 @@ restart: cnt_cur->bc_ptrs[0] = besti; if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); args->len = blen; if (!xfs_alloc_fix_minleft(args)) { @@ -1088,7 +1088,7 @@ restart: if (bno_cur_lt) { if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); if (ltlena >= args->minlen) @@ -1104,7 +1104,7 @@ restart: if (bno_cur_gt) { if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); xfs_alloc_compute_aligned(args, gtbno, gtlen, >bnoa, >lena); if (gtlena >= args->minlen) @@ -1303,7 +1303,7 @@ restart: error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); @@ -1342,7 +1342,7 @@ restart: * This can't happen in the second case above. */ rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); - XFS_WANT_CORRUPTED_GOTO(rlen == 0 || + XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), error0); if (rlen < args->maxlen) { xfs_agblock_t bestfbno; @@ -1362,13 +1362,13 @@ restart: if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); if (flen < bestrlen) break; xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen); rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); - XFS_WANT_CORRUPTED_GOTO(rlen == 0 || + XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 || (rlen <= flen && rbno + rlen <= fbno + flen), error0); if (rlen > bestrlen) { @@ -1383,7 +1383,7 @@ restart: if ((error = xfs_alloc_lookup_eq(cnt_cur, bestfbno, bestflen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); rlen = bestrlen; rbno = bestrbno; flen = bestflen; @@ -1408,7 +1408,7 @@ restart: if (!xfs_alloc_fix_minleft(args)) goto out_nominleft; rlen = args->len; - XFS_WANT_CORRUPTED_GOTO(rlen <= flen, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, rlen <= flen, error0); /* * Allocate and initialize a cursor for the by-block tree. */ @@ -1422,7 +1422,7 @@ restart: cnt_cur = bno_cur = NULL; args->len = rlen; args->agbno = rbno; - XFS_WANT_CORRUPTED_GOTO( + XFS_WANT_CORRUPTED_GOTO(args->mp, args->agbno + args->len <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); @@ -1467,7 +1467,7 @@ xfs_alloc_ag_vextent_small( if (i) { if ((error = xfs_alloc_get_rec(ccur, &fbno, &flen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0); } /* * Nothing in the btree, try the freelist. Make sure @@ -1493,7 +1493,7 @@ xfs_alloc_ag_vextent_small( } args->len = 1; args->agbno = fbno; - XFS_WANT_CORRUPTED_GOTO( + XFS_WANT_CORRUPTED_GOTO(args->mp, args->agbno + args->len <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length), error0); @@ -1579,7 +1579,7 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_get_rec(bno_cur, <bno, <len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * It's not contiguous, though. */ @@ -1591,7 +1591,8 @@ xfs_free_ag_extent( * space was invalid, it's (partly) already free. * Very bad. */ - XFS_WANT_CORRUPTED_GOTO(ltbno + ltlen <= bno, error0); + XFS_WANT_CORRUPTED_GOTO(mp, + ltbno + ltlen <= bno, error0); } } /* @@ -1606,7 +1607,7 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_get_rec(bno_cur, >bno, >len, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * It's not contiguous, though. */ @@ -1618,7 +1619,7 @@ xfs_free_ag_extent( * space was invalid, it's (partly) already free. * Very bad. */ - XFS_WANT_CORRUPTED_GOTO(gtbno >= bno + len, error0); + XFS_WANT_CORRUPTED_GOTO(mp, gtbno >= bno + len, error0); } } /* @@ -1635,31 +1636,31 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); if ((error = xfs_btree_delete(cnt_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Delete the old by-size entry on the right. */ if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); if ((error = xfs_btree_delete(cnt_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Delete the old by-block entry for the right block. */ if ((error = xfs_btree_delete(bno_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Move the by-block cursor back to the left neighbor. */ if ((error = xfs_btree_decrement(bno_cur, 0, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); #ifdef DEBUG /* * Check that this is the right record: delete didn't @@ -1672,7 +1673,7 @@ xfs_free_ag_extent( if ((error = xfs_alloc_get_rec(bno_cur, &xxbno, &xxlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO( + XFS_WANT_CORRUPTED_GOTO(mp, i == 1 && xxbno == ltbno && xxlen == ltlen, error0); } @@ -1695,17 +1696,17 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); if ((error = xfs_btree_delete(cnt_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Back up the by-block cursor to the left neighbor, and * update its length. */ if ((error = xfs_btree_decrement(bno_cur, 0, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); nbno = ltbno; nlen = len + ltlen; if ((error = xfs_alloc_update(bno_cur, nbno, nlen))) @@ -1721,10 +1722,10 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); if ((error = xfs_btree_delete(cnt_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Update the starting block and length of the right * neighbor in the by-block tree. @@ -1743,7 +1744,7 @@ xfs_free_ag_extent( nlen = len; if ((error = xfs_btree_insert(bno_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); } xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR); bno_cur = NULL; @@ -1752,10 +1753,10 @@ xfs_free_ag_extent( */ if ((error = xfs_alloc_lookup_eq(cnt_cur, nbno, nlen, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 0, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, error0); if ((error = xfs_btree_insert(cnt_cur, &i))) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR); cnt_cur = NULL; diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index b5eb474..c655a41 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -410,7 +410,7 @@ xfs_bmap_check_leaf_extents( goto error_norelse; } block = XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO( + XFS_WANT_CORRUPTED_GOTO(mp, xfs_bmap_sanity_check(mp, bp, level), error0); if (level == 0) @@ -424,7 +424,8 @@ xfs_bmap_check_leaf_extents( xfs_check_block(block, mp, 0, 0); pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); bno = be64_to_cpu(*pp); - XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + XFS_WANT_CORRUPTED_GOTO(mp, + XFS_FSB_SANITY_CHECK(mp, bno), error0); if (bp_release) { bp_release = 0; xfs_trans_brelse(NULL, bp); @@ -1025,7 +1026,7 @@ xfs_bmap_add_attrfork_btree( if ((error = xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) goto error0; /* must be at least one entry */ - XFS_WANT_CORRUPTED_GOTO(stat == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, stat == 1, error0); if ((error = xfs_btree_new_iroot(cur, flags, &stat))) goto error0; if (stat == 0) { @@ -1309,14 +1310,14 @@ xfs_bmap_read_extents( if (error) return error; block = XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO( - xfs_bmap_sanity_check(mp, bp, level), - error0); + XFS_WANT_CORRUPTED_GOTO(mp, + xfs_bmap_sanity_check(mp, bp, level), error0); if (level == 0) break; pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); bno = be64_to_cpu(*pp); - XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); + XFS_WANT_CORRUPTED_GOTO(mp, + XFS_FSB_SANITY_CHECK(mp, bno), error0); xfs_trans_brelse(tp, bp); } /* @@ -1343,7 +1344,7 @@ xfs_bmap_read_extents( XFS_ERRLEVEL_LOW, ip->i_mount, block); goto error0; } - XFS_WANT_CORRUPTED_GOTO( + XFS_WANT_CORRUPTED_GOTO(mp, xfs_bmap_sanity_check(mp, bp, 0), error0); /* @@ -1753,7 +1754,9 @@ xfs_bmap_add_extent_delay_real( xfs_filblks_t temp=0; /* value for da_new calculations */ xfs_filblks_t temp2=0;/* value for da_new calculations */ int tmp_rval; /* partial logging flags */ + struct xfs_mount *mp; + mp = bma->tp ? bma->tp->t_mountp : NULL; ifp = XFS_IFORK_PTR(bma->ip, XFS_DATA_FORK); ASSERT(bma->idx >= 0); @@ -1864,15 +1867,15 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_blockcount, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_btree_delete(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_btree_decrement(bma->cur, 0, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + @@ -1905,7 +1908,7 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + @@ -1936,7 +1939,7 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_blockcount, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, PREV.br_startoff, new->br_startblock, PREV.br_blockcount + @@ -1966,12 +1969,12 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; error = xfs_btree_insert(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } break; @@ -1999,7 +2002,7 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + @@ -2036,12 +2039,12 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; error = xfs_btree_insert(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { @@ -2082,7 +2085,7 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_blockcount, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + @@ -2120,12 +2123,12 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; error = xfs_btree_insert(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { @@ -2189,12 +2192,12 @@ xfs_bmap_add_extent_delay_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); bma->cur->bc_rec.b.br_state = XFS_EXT_NORM; error = xfs_btree_insert(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } if (xfs_bmap_needs_btree(bma->ip, XFS_DATA_FORK)) { @@ -2307,6 +2310,7 @@ xfs_bmap_add_extent_unwritten_real( /* left is 0, right is 1, prev is 2 */ int rval=0; /* return value (logging flags) */ int state = 0;/* state bits, accessed thru macros */ + struct xfs_mount *mp = tp->t_mountp; *logflagsp = 0; @@ -2419,19 +2423,19 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_startblock, RIGHT.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_delete(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_decrement(cur, 0, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_delete(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_decrement(cur, 0, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + PREV.br_blockcount + @@ -2462,13 +2466,13 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_delete(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_decrement(cur, 0, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, LEFT.br_startoff, LEFT.br_startblock, LEFT.br_blockcount + PREV.br_blockcount, @@ -2497,13 +2501,13 @@ xfs_bmap_add_extent_unwritten_real( RIGHT.br_startblock, RIGHT.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_delete(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_btree_decrement(cur, 0, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, new->br_startoff, new->br_startblock, new->br_blockcount + RIGHT.br_blockcount, @@ -2530,7 +2534,7 @@ xfs_bmap_add_extent_unwritten_real( new->br_startblock, new->br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, new->br_startoff, new->br_startblock, new->br_blockcount, newext))) @@ -2567,7 +2571,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, PREV.br_startoff + new->br_blockcount, PREV.br_startblock + new->br_blockcount, @@ -2609,7 +2613,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, PREV.br_startoff + new->br_blockcount, PREV.br_startblock + new->br_blockcount, @@ -2619,7 +2623,7 @@ xfs_bmap_add_extent_unwritten_real( cur->bc_rec.b = *new; if ((error = xfs_btree_insert(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } break; @@ -2649,7 +2653,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, PREV.br_startoff, PREV.br_startblock, PREV.br_blockcount - new->br_blockcount, @@ -2687,7 +2691,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); if ((error = xfs_bmbt_update(cur, PREV.br_startoff, PREV.br_startblock, PREV.br_blockcount - new->br_blockcount, @@ -2697,11 +2701,11 @@ xfs_bmap_add_extent_unwritten_real( new->br_startblock, new->br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); cur->bc_rec.b.br_state = XFS_EXT_NORM; if ((error = xfs_btree_insert(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } break; @@ -2735,7 +2739,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_startblock, PREV.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); /* new right extent - oldext */ if ((error = xfs_bmbt_update(cur, r[1].br_startoff, r[1].br_startblock, r[1].br_blockcount, @@ -2747,7 +2751,7 @@ xfs_bmap_add_extent_unwritten_real( new->br_startoff - PREV.br_startoff; if ((error = xfs_btree_insert(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); /* * Reset the cursor to the position of the new extent * we are about to insert as we can't trust it after @@ -2757,12 +2761,12 @@ xfs_bmap_add_extent_unwritten_real( new->br_startblock, new->br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); /* new middle extent - newext */ cur->bc_rec.b.br_state = new->br_state; if ((error = xfs_btree_insert(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } break; @@ -2966,7 +2970,9 @@ xfs_bmap_add_extent_hole_real( xfs_bmbt_irec_t right; /* right neighbor extent entry */ int rval=0; /* return value (logging flags) */ int state; /* state bits, accessed thru macros */ + struct xfs_mount *mp; + mp = bma->tp ? bma->tp->t_mountp : NULL; ifp = XFS_IFORK_PTR(bma->ip, whichfork); ASSERT(bma->idx >= 0); @@ -3054,15 +3060,15 @@ xfs_bmap_add_extent_hole_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_btree_delete(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_btree_decrement(bma->cur, 0, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + @@ -3095,7 +3101,7 @@ xfs_bmap_add_extent_hole_real( &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, left.br_startoff, left.br_startblock, left.br_blockcount + @@ -3129,7 +3135,7 @@ xfs_bmap_add_extent_hole_real( right.br_blockcount, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); error = xfs_bmbt_update(bma->cur, new->br_startoff, new->br_startblock, new->br_blockcount + @@ -3159,12 +3165,12 @@ xfs_bmap_add_extent_hole_real( new->br_blockcount, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 0, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 0, done); bma->cur->bc_rec.b.br_state = new->br_state; error = xfs_btree_insert(bma->cur, &i); if (error) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } break; } @@ -4799,7 +4805,7 @@ xfs_bmap_del_extent( got.br_startblock, got.br_blockcount, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } da_old = da_new = 0; } else { @@ -4833,7 +4839,7 @@ xfs_bmap_del_extent( } if ((error = xfs_btree_delete(cur, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); break; case 2: @@ -4933,7 +4939,8 @@ xfs_bmap_del_extent( got.br_startblock, temp, &i))) goto done; - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, + i == 1, done); /* * Update the btree record back * to the original value. @@ -4954,7 +4961,7 @@ xfs_bmap_del_extent( error = -ENOSPC; goto done; } - XFS_WANT_CORRUPTED_GOTO(i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); } else flags |= xfs_ilog_fext(whichfork); XFS_IFORK_NEXT_SET(ip, whichfork, diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 81cad43..8c5ce10 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -2285,7 +2285,7 @@ xfs_btree_rshift( if (error) goto error0; i = xfs_btree_lastrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); error = xfs_btree_increment(tcur, level, &i); if (error) @@ -3138,7 +3138,7 @@ xfs_btree_insert( goto error0; } - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); level++; /* @@ -3582,15 +3582,15 @@ xfs_btree_delrec( * Actually any entry but the first would suffice. */ i = xfs_btree_lastrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); error = xfs_btree_increment(tcur, level, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); i = xfs_btree_lastrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); /* Grab a pointer to the block. */ right = xfs_btree_get_block(tcur, level, &rbp); @@ -3634,12 +3634,12 @@ xfs_btree_delrec( rrecs = xfs_btree_get_numrecs(right); if (!xfs_btree_ptr_is_null(cur, &lptr)) { i = xfs_btree_firstrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); error = xfs_btree_decrement(tcur, level, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); } } @@ -3653,13 +3653,13 @@ xfs_btree_delrec( * previous block. */ i = xfs_btree_firstrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); error = xfs_btree_decrement(tcur, level, &i); if (error) goto error0; i = xfs_btree_firstrec(tcur, level); - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); /* Grab a pointer to the block. */ left = xfs_btree_get_block(tcur, level, &lbp); diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..f95c4ae 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -783,12 +783,12 @@ xfs_dialloc_ag_inobt( error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); error = xfs_inobt_get_rec(cur, &rec, &j); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(j == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, j == 1, error0); if (rec.ir_freecount > 0) { /* @@ -944,19 +944,19 @@ newino: error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); for (;;) { error = xfs_inobt_get_rec(cur, &rec, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); if (rec.ir_freecount > 0) break; error = xfs_btree_increment(cur, 0, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); } alloc_inode: @@ -1039,10 +1039,10 @@ xfs_dialloc_ag_finobt_near( error = xfs_inobt_get_rec(rcur, &rrec, &j); if (error) goto error_rcur; - XFS_WANT_CORRUPTED_GOTO(j == 1, error_rcur); + XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, j == 1, error_rcur); } - XFS_WANT_CORRUPTED_GOTO(i == 1 || j == 1, error_rcur); + XFS_WANT_CORRUPTED_GOTO(lcur->bc_mp, i == 1 || j == 1, error_rcur); if (i == 1 && j == 1) { /* * Both the left and right records are valid. Choose the closer @@ -1475,14 +1475,14 @@ xfs_difree_inobt( __func__, error); goto error0; } - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); error = xfs_inobt_get_rec(cur, &rec, &i); if (error) { xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", __func__, error); goto error0; } - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0); /* * Get the offset in the inode chunk. */ @@ -1592,7 +1592,7 @@ xfs_difree_finobt( * freed an inode in a previously fully allocated chunk. If not, * something is out of sync. */ - XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); + XFS_WANT_CORRUPTED_GOTO(mp, ibtrec->ir_freecount == 1, error); error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, ibtrec->ir_free, &i); @@ -1613,12 +1613,12 @@ xfs_difree_finobt( error = xfs_inobt_get_rec(cur, &rec, &i); if (error) goto error; - XFS_WANT_CORRUPTED_GOTO(i == 1, error); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error); rec.ir_free |= XFS_INOBT_MASK(offset); rec.ir_freecount++; - XFS_WANT_CORRUPTED_GOTO((rec.ir_free == ibtrec->ir_free) && + XFS_WANT_CORRUPTED_GOTO(mp, (rec.ir_free == ibtrec->ir_free) && (rec.ir_freecount == ibtrec->ir_freecount), error); diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 799e5a2..e85a951 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -84,7 +84,7 @@ xfs_trim_extents( error = xfs_alloc_get_rec(cur, &fbno, &flen, &i); if (error) goto out_del_cursor; - XFS_WANT_CORRUPTED_GOTO(i == 1, out_del_cursor); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_del_cursor); ASSERT(flen <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_longest)); /* diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 279a76e..13eeca3 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -40,13 +40,13 @@ extern void xfs_verifier_error(struct xfs_buf *bp); /* * Macros to set EFSCORRUPTED & return/branch. */ -#define XFS_WANT_CORRUPTED_GOTO(x,l) \ +#define XFS_WANT_CORRUPTED_GOTO(mp, x, l) \ { \ int fs_is_ok = (x); \ ASSERT(fs_is_ok); \ if (unlikely(!fs_is_ok)) { \ XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_GOTO", \ - XFS_ERRLEVEL_LOW, NULL); \ + XFS_ERRLEVEL_LOW, mp); \ error = -EFSCORRUPTED; \ goto l; \ } \ From sandeen@sandeen.net Fri Feb 6 16:23:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 142377F63 for ; Fri, 6 Feb 2015 16:23:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8276304051 for ; Fri, 6 Feb 2015 14:23:47 -0800 (PST) X-ASG-Debug-ID: 1423261425-04bdf06a5c01020001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FNTKuyRgKaMWVSlz for ; Fri, 06 Feb 2015 14:23:45 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1AB82602D78F; Fri, 6 Feb 2015 16:23:45 -0600 (CST) Message-ID: <54D53EF0.5060705@sandeen.net> Date: Fri, 06 Feb 2015 16:23:44 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 2/2] xfs: pass mp to XFS_WANT_CORRUPTED_RETURN References: <54D53E8C.8070207@redhat.com> X-ASG-Orig-Subj: [PATCH 2/2] xfs: pass mp to XFS_WANT_CORRUPTED_RETURN In-Reply-To: <54D53E8C.8070207@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: 1423261425 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, if we hit an XFS_WANT_CORRUPTED_RETURN we don't print any information about which filesystem hit it. Passing in the mp allows us to print the filesystem (device) name, which is a pretty critical piece of information. Tested by running fsfuzzer 'til I hit some. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index d38d69a..14a222f 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -315,6 +315,9 @@ xfs_alloc_fixup_trees( xfs_agblock_t nfbno2; /* second new free startblock */ xfs_extlen_t nflen1=0; /* first new free length */ xfs_extlen_t nflen2=0; /* second new free length */ + struct xfs_mount *mp; + + mp = cnt_cur->bc_mp; /* * Look up the record in the by-size tree if necessary. @@ -323,13 +326,13 @@ xfs_alloc_fixup_trees( #ifdef DEBUG if ((error = xfs_alloc_get_rec(cnt_cur, &nfbno1, &nflen1, &i))) return error; - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, i == 1 && nfbno1 == fbno && nflen1 == flen); #endif } else { if ((error = xfs_alloc_lookup_eq(cnt_cur, fbno, flen, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } /* * Look up the record in the by-block tree if necessary. @@ -338,13 +341,13 @@ xfs_alloc_fixup_trees( #ifdef DEBUG if ((error = xfs_alloc_get_rec(bno_cur, &nfbno1, &nflen1, &i))) return error; - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, i == 1 && nfbno1 == fbno && nflen1 == flen); #endif } else { if ((error = xfs_alloc_lookup_eq(bno_cur, fbno, flen, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } #ifdef DEBUG @@ -355,7 +358,7 @@ xfs_alloc_fixup_trees( bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]); cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, bnoblock->bb_numrecs == cntblock->bb_numrecs); } #endif @@ -386,25 +389,25 @@ xfs_alloc_fixup_trees( */ if ((error = xfs_btree_delete(cnt_cur, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); /* * Add new by-size btree entry(s). */ if (nfbno1 != NULLAGBLOCK) { if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno1, nflen1, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 0); + XFS_WANT_CORRUPTED_RETURN(mp, i == 0); if ((error = xfs_btree_insert(cnt_cur, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } if (nfbno2 != NULLAGBLOCK) { if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno2, nflen2, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 0); + XFS_WANT_CORRUPTED_RETURN(mp, i == 0); if ((error = xfs_btree_insert(cnt_cur, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } /* * Fix up the by-block btree entry(s). @@ -415,7 +418,7 @@ xfs_alloc_fixup_trees( */ if ((error = xfs_btree_delete(bno_cur, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } else { /* * Update the by-block entry to start later|be shorter. @@ -429,10 +432,10 @@ xfs_alloc_fixup_trees( */ if ((error = xfs_alloc_lookup_eq(bno_cur, nfbno2, nflen2, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 0); + XFS_WANT_CORRUPTED_RETURN(mp, i == 0); if ((error = xfs_btree_insert(bno_cur, &i))) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); } return 0; } diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index c655a41..3d1a675 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5458,6 +5458,7 @@ xfs_bmse_merge( struct xfs_bmbt_irec left; xfs_filblks_t blockcount; int error, i; + struct xfs_mount *mp = ip->i_mount; xfs_bmbt_get_all(gotp, &got); xfs_bmbt_get_all(leftp, &left); @@ -5492,19 +5493,19 @@ xfs_bmse_merge( got.br_blockcount, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); error = xfs_btree_delete(cur, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); /* lookup and update size of the previous extent */ error = xfs_bmbt_lookup_eq(cur, left.br_startoff, left.br_startblock, left.br_blockcount, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); left.br_blockcount = blockcount; @@ -5526,6 +5527,7 @@ xfs_bmse_shift_one( int *logflags) { struct xfs_ifork *ifp; + struct xfs_mount *mp; xfs_fileoff_t startoff; struct xfs_bmbt_rec_host *leftp; struct xfs_bmbt_irec got; @@ -5533,13 +5535,14 @@ xfs_bmse_shift_one( int error; int i; + mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); xfs_bmbt_get_all(gotp, &got); startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ - XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); + XFS_WANT_CORRUPTED_RETURN(mp, !isnullstartblock(got.br_startblock)); /* * Check for merge if we've got an extent to the left, otherwise make @@ -5578,7 +5581,7 @@ xfs_bmse_shift_one( got.br_blockcount, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(mp, i == 1); got.br_startoff = startoff; return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 8c5ce10..c72283d 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -168,7 +168,7 @@ xfs_btree_check_lptr( xfs_fsblock_t bno, /* btree block disk address */ int level) /* btree block level */ { - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, level > 0 && bno != NULLFSBLOCK && XFS_FSB_SANITY_CHECK(cur->bc_mp, bno)); @@ -187,7 +187,7 @@ xfs_btree_check_sptr( { xfs_agblock_t agblocks = cur->bc_mp->m_sb.sb_agblocks; - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, level > 0 && bno != NULLAGBLOCK && bno != 0 && @@ -1825,7 +1825,7 @@ xfs_btree_lookup( error = xfs_btree_increment(cur, 0, &i); if (error) goto error0; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); *stat = 1; return 0; diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index 5ff31be..de1ea16 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -89,7 +89,7 @@ __xfs_dir3_data_check( * so just ensure that the count falls somewhere inside the * block right now. */ - XFS_WANT_CORRUPTED_RETURN(be32_to_cpu(btp->count) < + XFS_WANT_CORRUPTED_RETURN(mp, be32_to_cpu(btp->count) < ((char *)btp - p) / sizeof(struct xfs_dir2_leaf_entry)); break; case cpu_to_be32(XFS_DIR3_DATA_MAGIC): @@ -107,21 +107,21 @@ __xfs_dir3_data_check( bf = ops->data_bestfree_p(hdr); count = lastfree = freeseen = 0; if (!bf[0].length) { - XFS_WANT_CORRUPTED_RETURN(!bf[0].offset); + XFS_WANT_CORRUPTED_RETURN(mp, !bf[0].offset); freeseen |= 1 << 0; } if (!bf[1].length) { - XFS_WANT_CORRUPTED_RETURN(!bf[1].offset); + XFS_WANT_CORRUPTED_RETURN(mp, !bf[1].offset); freeseen |= 1 << 1; } if (!bf[2].length) { - XFS_WANT_CORRUPTED_RETURN(!bf[2].offset); + XFS_WANT_CORRUPTED_RETURN(mp, !bf[2].offset); freeseen |= 1 << 2; } - XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[0].length) >= + XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(bf[0].length) >= be16_to_cpu(bf[1].length)); - XFS_WANT_CORRUPTED_RETURN(be16_to_cpu(bf[1].length) >= + XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(bf[1].length) >= be16_to_cpu(bf[2].length)); /* * Loop over the data/unused entries. @@ -134,18 +134,18 @@ __xfs_dir3_data_check( * doesn't need to be there. */ if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { - XFS_WANT_CORRUPTED_RETURN(lastfree == 0); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, lastfree == 0); + XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == (char *)dup - (char *)hdr); dfp = xfs_dir2_data_freefind(hdr, bf, dup); if (dfp) { i = (int)(dfp - bf); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, (freeseen & (1 << i)) == 0); freeseen |= 1 << i; } else { - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(dup->length) <= be16_to_cpu(bf[2].length)); } @@ -160,13 +160,13 @@ __xfs_dir3_data_check( * The linear search is crude but this is DEBUG code. */ dep = (xfs_dir2_data_entry_t *)p; - XFS_WANT_CORRUPTED_RETURN(dep->namelen != 0); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, dep->namelen != 0); + XFS_WANT_CORRUPTED_RETURN(mp, !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, be16_to_cpu(*ops->data_entry_tag_p(dep)) == (char *)dep - (char *)hdr); - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, ops->data_get_ftype(dep) < XFS_DIR3_FT_MAX); count++; lastfree = 0; @@ -183,14 +183,15 @@ __xfs_dir3_data_check( be32_to_cpu(lep[i].hashval) == hash) break; } - XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); + XFS_WANT_CORRUPTED_RETURN(mp, + i < be32_to_cpu(btp->count)); } p += ops->data_entsize(dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. */ - XFS_WANT_CORRUPTED_RETURN(freeseen == 7); + XFS_WANT_CORRUPTED_RETURN(mp, freeseen == 7); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { for (i = stale = 0; i < be32_to_cpu(btp->count); i++) { @@ -198,13 +199,13 @@ __xfs_dir3_data_check( cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) stale++; if (i > 0) - XFS_WANT_CORRUPTED_RETURN( + XFS_WANT_CORRUPTED_RETURN(mp, be32_to_cpu(lep[i].hashval) >= be32_to_cpu(lep[i - 1].hashval)); } - XFS_WANT_CORRUPTED_RETURN(count == + XFS_WANT_CORRUPTED_RETURN(mp, count == be32_to_cpu(btp->count) - be32_to_cpu(btp->stale)); - XFS_WANT_CORRUPTED_RETURN(stale == be32_to_cpu(btp->stale)); + XFS_WANT_CORRUPTED_RETURN(mp, stale == be32_to_cpu(btp->stale)); } return 0; } diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index f95c4ae..db04448 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -700,7 +700,7 @@ xfs_ialloc_next_rec( error = xfs_inobt_get_rec(cur, rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); } return 0; @@ -724,7 +724,7 @@ xfs_ialloc_get_rec( error = xfs_inobt_get_rec(cur, rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); } return 0; @@ -1016,7 +1016,7 @@ xfs_dialloc_ag_finobt_near( error = xfs_inobt_get_rec(lcur, rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(lcur->bc_mp, i == 1); /* * See if we've landed in the parent inode record. The finobt @@ -1095,7 +1095,7 @@ xfs_dialloc_ag_finobt_newino( error = xfs_inobt_get_rec(cur, rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); return 0; } } @@ -1106,12 +1106,12 @@ xfs_dialloc_ag_finobt_newino( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); error = xfs_inobt_get_rec(cur, rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); return 0; } @@ -1133,19 +1133,19 @@ xfs_dialloc_ag_update_inobt( error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); error = xfs_inobt_get_rec(cur, &rec, &i); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(i == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) % XFS_INODES_PER_CHUNK) == 0); rec.ir_free &= ~XFS_INOBT_MASK(offset); rec.ir_freecount--; - XFS_WANT_CORRUPTED_RETURN((rec.ir_free == frec->ir_free) && + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, (rec.ir_free == frec->ir_free) && (rec.ir_freecount == frec->ir_freecount)); return xfs_inobt_update(cur, &rec); diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 13eeca3..c0394ed 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -52,13 +52,13 @@ extern void xfs_verifier_error(struct xfs_buf *bp); } \ } -#define XFS_WANT_CORRUPTED_RETURN(x) \ +#define XFS_WANT_CORRUPTED_RETURN(mp, x) \ { \ int fs_is_ok = (x); \ ASSERT(fs_is_ok); \ if (unlikely(!fs_is_ok)) { \ XFS_ERROR_REPORT("XFS_WANT_CORRUPTED_RETURN", \ - XFS_ERRLEVEL_LOW, NULL); \ + XFS_ERRLEVEL_LOW, mp); \ return -EFSCORRUPTED; \ } \ } diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 82e3142..8042989 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -229,7 +229,7 @@ xfs_bulkstat_grab_ichunk( error = xfs_inobt_get_rec(cur, irec, &stat); if (error) return error; - XFS_WANT_CORRUPTED_RETURN(stat == 1); + XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, stat == 1); /* Check if the record contains the inode in request */ if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { From david@fromorbit.com Fri Feb 6 16:41:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 36F137FA5 for ; Fri, 6 Feb 2015 16:41:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E03EAC008 for ; Fri, 6 Feb 2015 14:41:04 -0800 (PST) X-ASG-Debug-ID: 1423262461-04cbb01165014e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ra6pk9KDv8xURFtp for ; Fri, 06 Feb 2015 14:41:01 -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: ApEUAFVC1VR5LL/s/2dsb2JhbABagwaBLLAmAQEBAQEBBpgtAgIBAQKBGkQBAQEBAX2EDQEFOhwjEAgDDgoJJQ8FJQMhE4gs1VkBAQgCAR8YhWyJdAeEKQWYRYEYhUmMDCKEAioxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 09:11:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJrZv-000099-TB; Sat, 07 Feb 2015 09:40:47 +1100 Date: Sat, 7 Feb 2015 09:40:47 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field Message-ID: <20150206224047.GO12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423262461 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:48PM -0500, Brian Foster wrote: > Add sb_spinoalignmt to the superblock to specify sparse inode chunk > alignment. This also currently represents the minimum allowable sparse > chunk allocation size. > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_format.h | 6 +++--- > fs/xfs/libxfs/xfs_sb.c | 4 ++-- > 2 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index 8eb7189..051c24d 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -170,7 +170,7 @@ typedef struct xfs_sb { > __uint32_t sb_features_log_incompat; > > __uint32_t sb_crc; /* superblock crc */ > - __uint32_t sb_pad; > + xfs_extlen_t sb_spinoalignmt;/* sparse inode chunk alignment */ That's a mounthful. sb_spino_align is a bit easier to read, IMO. > @@ -282,7 +282,7 @@ typedef enum { > XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, > XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, > XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, > - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, > + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINOALIGNMT, > XFS_SBS_PQUOTINO, XFS_SBS_LSN, > XFS_SBS_FIELDCOUNT > } xfs_sb_field_t; These are gone in the for-next tree. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Fri Feb 6 16:43:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 968357FA5 for ; Fri, 6 Feb 2015 16:43:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 62E9D8F809E for ; Fri, 6 Feb 2015 14:43:00 -0800 (PST) X-ASG-Debug-ID: 1423262578-04bdf06a59014a0001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id vuTXD7EoRnIPgjkA for ; Fri, 06 Feb 2015 14:42: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 285543387; Fri, 6 Feb 2015 17:42:58 -0500 (EST) Date: Fri, 6 Feb 2015 17:42:58 -0500 From: "J. Bruce Fields" To: Dave Chinner Cc: Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150206224258.GJ29783@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150206222047.GM12722@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1423262578 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Feb 07, 2015 at 09:20:47AM +1100, Dave Chinner wrote: > On Thu, Feb 05, 2015 at 02:57:56PM +0100, Christoph Hellwig wrote: > > I've updated the patch and pushed out a new pnfsd-for-3.20-4 branch. > > > > The changes relative to the old one are below: > > Hi Christoph, with these changes I think this is fine to be merged > with the experimental tag attached to it > > Acked-by: Dave Chinner > > I'm expecting the merge window to open on Monday so it's kinda late > to be adding new stuff to the XFS tree and co-ordinating it with the > NFS tree merge - how were you planning to get this to merged? > > I've already merged all but the two pNFSD support patches, so > there's some duplicate commits in your pnfsd-for-3.20-4 branch. > i.e. these commits in your tree: > > b8d5187 xfs: factor out a xfs_update_prealloc_flags() helper > 6d5ca2a xfs: update the superblock using a synchronous transaction in growfs > e3ea93e xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten > > are already merged into the xfs for-next branch as: > > 8add71c xfs: factor out a xfs_update_prealloc_flags() helper > f8079b8 xfs: growfs should use synchronous transactions > d32057f xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten > > A straight merge from your tree ends up with both sets of commits in > the history. So a rebase on your side, or me pulling them into the > XFS tree is probably required to keep the history clean. > > I didn't really want to add any more to the XFS tree this close to > the merge window opening, but I've already got a regression fix that > needs to be added, so perhaps I'll delay sending Linus a pull > request for a week and just merge all of these XFS changes directly. > > What do you think? You'd basically just be pulling my tree (Christoph's is just my nfsd tree with his patches on top, and I've been testing with exactly that locally, just putting off pushing it out till we decide this.) So anyway, fine with me if you want to just pull that into the xfs tree. Mine's ready whenever, so if I send my pull pretty soon after the merge window and you send it a little later then we still keep the property that Linus's merge still has a diffstat only in our respective areas. (OK, it's a little more complicated because I've got the same arrangement with jlayton, so the order is jlayton's lock pull, then my nfsd pull, then your xfs pull. Is this getting too complicated? jlayton and I are both ready to so and I think it'd work.) I'm also fine with duplicating those few patches, or whatever. --b. From david@fromorbit.com Fri Feb 6 16:55:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A2427FC7 for ; Fri, 6 Feb 2015 16:55:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E74CEAC009 for ; Fri, 6 Feb 2015 14:55:19 -0800 (PST) X-ASG-Debug-ID: 1423263317-04cbb0116401840001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MaApS1yPtHudyxNm for ; Fri, 06 Feb 2015 14:55:17 -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: ApIUABxG1VR5LL/s/2dsb2JhbABagwaBLLAmAQEBAQEBBpgtAgIBAQKBFUQBAQEBAX2EDQEFJxMcIxAIAw4KCSUPBSUDIROILNU6AQEIAgEfGIVsiXQHhCkFlk2BeIEYEIU5iE6DPiKCMoFQKjGCQgEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 09:25:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJrnY-0000Ae-Re; Sat, 07 Feb 2015 09:54:52 +1100 Date: Sat, 7 Feb 2015 09:54:52 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 03/18] xfs: sparse inode chunks feature helpers and mount requirements Message-ID: <20150206225452.GP12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 03/18] xfs: sparse inode chunks feature helpers and mount requirements References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423263317 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:50PM -0500, Brian Foster wrote: > The sparse inode chunks feature uses the helper function to enable the > allocation of sparse inode chunks. The incompatible feature bit is set > on disk at mkfs time to prevent mount from unsupported kernels. > > Also, enforce the inode alignment requirements required for sparse inode > chunks at mount time. When enabled, full inode chunks (and all inode > record) alignment is increased from cluster size to inode chunk size. > Sparse inode alignment must match the cluster size of the fs. Both > superblock alignment fields are set as such by mkfs when sparse inode > support is enabled. > > Finally, warn that sparse inode chunks is an experimental feature until > further notice. > > Signed-off-by: Brian Foster .... > @@ -182,6 +182,28 @@ xfs_mount_validate_sb( > return -EFSCORRUPTED; > } > > + /* > + * Full inode chunks must be aligned to inode chunk size when > + * sparse inodes are enabled to support the sparse chunk > + * allocation algorithm and prevent overlapping inode records. > + */ > + if (xfs_sb_version_hassparseinodes(sbp)) { > + uint32_t align; > + > + xfs_alert(mp, > + "v5 superblock with sparse inode chunk support detected.\n" > + "This feature is EXPERIMENTAL. Use at your own risk!"); No need to mention v5 superblocks here - we've already got that in the initial mount output. Say: "EXPERIMENTAL sparse inode chunk feature enabled. Use at your own risk!" > + > + align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize > + >> sbp->sb_blocklog; > + if (sbp->sb_inoalignmt != align) { > + xfs_warn(mp, "Invalid inode alignment (%u blks). " > + "Must match inode chunk size (%u blks) with sparse inodes.", "Inode block alignment (%u) must match chunk size (%u) for sparse inodes." That makes both error messages a single line a easy to grep for. > @@ -738,6 +738,22 @@ xfs_mountfs( > } > > /* > + * If enabled, sparse inode chunk alignment is expected to match the > + * cluster size. Full inode chunk alignment must match the chunk size, > + * but that is checked on sb read verification... > + */ > + if (xfs_sb_version_hassparseinodes(&mp->m_sb) && > + mp->m_sb.sb_spinoalignmt != > + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) { Indent the second line of the comaprison so it's distinct from the logic comparison. i.e. at first glance the above looks like three logic conditions being compared, when in fact it is only two. if (xfs_sb_version_hassparseinodes(&mp->m_sb) && mp->m_sb.sb_spinoalignmt != XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) { This makes it clear at a glance there are only two logic conditions in the if() statement. > + xfs_warn(mp, "Invalid sparse inode chunk alignment (%u blks). " > + "Must match cluster size (%llu blks).", "Sparse inode chunk block alignment (%u) must match cluster size (%u)." Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Feb 6 17:16:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 683EF7FDF for ; Fri, 6 Feb 2015 17:16:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8C6BAC009 for ; Fri, 6 Feb 2015 15:16:48 -0800 (PST) X-ASG-Debug-ID: 1423264603-04bdf06a5901cf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PCeNae2jxG5OATHf for ; Fri, 06 Feb 2015 15:16:43 -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: ApQUAKJK1VR5LL/s/2dsb2JhbABQCoMGgSywJgEBAQEBAQaYLQICAQECgRVEAQEBAQF9hAwBAQEDAScTHCMFCwgDDgoJJQ8FJQMhE4glB9VHAQEBBwIBHxiFbIkYXAeEKQWUe4NKgRiLGIY9IoF/HxSBUCoxgkIBAQE Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 09:46:43 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJs8F-0000DW-Fw; Sat, 07 Feb 2015 10:16:15 +1100 Date: Sat, 7 Feb 2015 10:16:15 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150206231615.GQ12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423264603 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:51PM -0500, Brian Foster wrote: > The inode btrees track 64 inodes per record, regardless of inode size. > Thus, inode chunks on disk vary in size depending on the size of the > inodes. This creates a contiguous allocation requirement for new inode > chunks that can be difficult to satisfy on an aged and fragmented (free > space) filesystem. > > The inode record freecount currently uses 4 bytes on disk to track the > free inode count. With a maximum freecount value of 64, only one byte is > required. Convert the freecount field to a single byte and use two of > the remaining 3 higher order bytes left for the hole mask field. Use > the final leftover byte for the total count field. > > The hole mask field tracks holes in the chunks of physical space that > the inode record refers to. This facilitates the sparse allocation of > inode chunks when contiguous chunks are not available and allows the > inode btrees to identify what portions of the chunk contain valid > inodes. The total count field contains the total number of valid inodes > referred to by the record. This can also be deduced from the hole mask. > The count field provides clarity and redundancy for internal record > verification. > > Note that both fields are initialized to zero to maintain backwards > compatibility with existing filesystems (e.g., the higher order bytes of > freecount are always 0). Tracking holes means that the hole mask is > initialized to zero and thus remains "valid" in accordance with a > non-sparse inode fs when no sparse chunks are physically allocated. > Update the inode record management functions to handle the new fields > and initialize to zero. > > [XXX: The count field breaks backwards compatibility with !sparseinode > fs. Should we reconsider the addition of total count or the idea of > converting back and forth between sparse inode fs with a feature bit?] > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_format.h | 8 ++++++-- > fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- > fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- > 3 files changed, 19 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index 26e5d92..6c2f1be 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -1295,13 +1295,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) > */ > typedef struct xfs_inobt_rec { > __be32 ir_startino; /* starting inode number */ > - __be32 ir_freecount; /* count of free inodes (set bits) */ > + __be16 ir_holemask; /* hole mask for sparse chunks */ > + __u8 ir_count; /* total inode count */ > + __u8 ir_freecount; /* count of free inodes (set bits) */ > __be64 ir_free; /* free inode mask */ > } xfs_inobt_rec_t; I think I'd prefer to see a union here so that we explicitly state what the difference in the on-disk format is. i.e. similar to how we express the difference in long and short btree block headers. struct xfs_inobt_rec { __be32 ir_startino; /* starting inode number */ __be32 ir_freecount; /* count of free inodes (set bits) */ union { struct { __be32 ir_freecount; } f; struct { __be16 ir_holemask; /* hole mask for sparse chunks */ __u8 ir_count; /* total inode count */ __u8 ir_freecount; /* count of free inodes (set bits) */ } sp; } __be64 ir_free; /* free inode mask */ }; This will prevent us from using the wrong method of referencing/modifying the record because we now need to be explicit in how we modify it... > typedef struct xfs_inobt_rec_incore { > xfs_agino_t ir_startino; /* starting inode number */ > - __int32_t ir_freecount; /* count of free inodes (set bits) */ > + __uint16_t ir_holemask; /* hole mask for sparse chunks */ > + __uint8_t ir_count; /* total inode count */ > + __uint8_t ir_freecount; /* count of free inodes (set bits) */ > xfs_inofree_t ir_free; /* free inode mask */ > } xfs_inobt_rec_incore_t; Though this is still fine - it doesn't need to explicitly follow the on-disk format structure, but it would be nice to be explicit on conversion to disk format records what we are actually using from this record. > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 6f2153e..32fdb7c 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -65,6 +65,8 @@ xfs_inobt_lookup( > int *stat) /* success/failure */ > { > cur->bc_rec.i.ir_startino = ino; > + cur->bc_rec.i.ir_holemask = 0; > + cur->bc_rec.i.ir_count = 0; > cur->bc_rec.i.ir_freecount = 0; > cur->bc_rec.i.ir_free = 0; > return xfs_btree_lookup(cur, dir, stat); > @@ -82,7 +84,9 @@ xfs_inobt_update( > union xfs_btree_rec rec; > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > + rec.inobt.ir_count = irec->ir_count; > + rec.inobt.ir_freecount = irec->ir_freecount; > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > return xfs_btree_update(cur, &rec); > } Hmmm - perhaps a similar set of helpers for sparse inode enabled filesystems > @@ -118,6 +124,8 @@ xfs_inobt_insert_rec( > xfs_inofree_t free, > int *stat) > { > + cur->bc_rec.i.ir_holemask = 0; > + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > cur->bc_rec.i.ir_freecount = freecount; > cur->bc_rec.i.ir_free = free; > return xfs_btree_insert(cur, stat); That would make this sort of thing very clear - this doesn't look like it would work for a sparse chunk record... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Feb 6 17:20:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 809107F59 for ; Fri, 6 Feb 2015 17:20:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E0C04AC007 for ; Fri, 6 Feb 2015 15:20:28 -0800 (PST) X-ASG-Debug-ID: 1423264826-04cb6c6b0b01ae0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8EwibELDnb9LoC3h for ; Fri, 06 Feb 2015 15:20:26 -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: ApIUALZL1VR5LL/s/2dsb2JhbABagwaBLLAmAQEBAQEBBpgtAgIBAQKBFUQBAQEBAX2EDQEFJxMcIxAIAw4KCSUPBSUDIROILNVBAQEBBwIBHxiFbIl0B4QpBZhFgRiLGIY9IoQCKjGCQgEBAQ Received: from ppp121-44-191-236.lns20.syd7.internode.on.net (HELO dastard) ([121.44.191.236]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Feb 2015 09:50:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YJsBe-0000Do-Nz; Sat, 07 Feb 2015 10:19:46 +1100 Date: Sat, 7 Feb 2015 10:19:46 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery Message-ID: <20150206231946.GR12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-8-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-8-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423264826 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.14996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:54PM -0500, Brian Foster wrote: > Recovery of icreate transactions assumes hardcoded values for the inode > count and chunk length. > > Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update > the icreate validity checks to allow for appropriately sized inode > chunks and verify the inode count matches what is expected based on the > extent length rather than assuming a hardcoded count. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_log_recover.c | 19 +++++++++++++------ > 1 file changed, 13 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index ecc73d5..5a5ee20 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3068,12 +3068,19 @@ xlog_recover_do_icreate_pass2( > return -EINVAL; > } > > - /* existing allocation is fixed value */ > - ASSERT(count == mp->m_ialloc_inos); > - ASSERT(length == mp->m_ialloc_blks); > - if (count != mp->m_ialloc_inos || > - length != mp->m_ialloc_blks) { > - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); > + /* inode chunk is either full or sparse */ > + if (length != mp->m_ialloc_blks && > + length != mp->m_ialloc_min_blks) { > + xfs_warn(log->l_mp, > + "%s: unsupported chunk length", __FUNCTION__); > + return -EINVAL; > + } Hmmm - this would prevent recovery of sparse inode chunk allocation in multiples of mp->m_ialloc_min_blks, right? Surely we can allow any sub-chunk extent size to be allocated as long as alignment and size restrictions are met? Cheers, Dave. -- Dave Chinner david@fromorbit.com From case-xfs=oss.sgi.com@watersuites.com Sat Feb 7 17:20:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD73A7F47 for ; Sat, 7 Feb 2015 17:20:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9246D304032 for ; Sat, 7 Feb 2015 15:20:09 -0800 (PST) X-ASG-Debug-ID: 1423351174-04bdf06a5c537e0001-NocioJ Received: from host.watersuites.com (host.watersuites.com [185.10.58.213]) by cuda.sgi.com with ESMTP id 0NTLSi9YYpOtce1b for ; Sat, 07 Feb 2015 15:19:35 -0800 (PST) X-Barracuda-Envelope-From: case-xfs=oss.sgi.com@watersuites.com X-Barracuda-Apparent-Source-IP: 185.10.58.213 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=watersuites.com; h=MIME-Version:Content-Type:Date:Message-Id:Subject:From:To; i=case@watersuites.com; bh=Aw8KdaUbtKwP1T/U2BxcI1Py6xk=; b=vsCp1jfW0LdRCLHlCh8kNtkUNCDjlBZbmqezpcaunKfTcLViE2C5eae3OTa50J6+sFVBbJzmSCxL tIaMlVh0RZlm7NXox8s2i65XQ9z+IDX4o+HO2AHDaL6k3pYsG8CrPZ36RbAIxnM3v83FA8P5G1Gj 8wgqZhwmzGoexGOgZT8= Received: by host.watersuites.com id hqqejq0001g7 for ; Sat, 7 Feb 2015 18:18:12 -0500 (envelope-from ) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b10ae1f42b10791728c57c37bb032d" Date: Sat, 7 Feb 2015 18:18:12 -0500 Message-Id: Subject: =?UTF-8?B?VHJhbnNmb3JtIFlvdXIgaVBhZCBJbnRvIEEgTGFwdG9wIFJlcGxhY2VtZW50Lg==?= From: Touch_fire Case and Keyboard X-ASG-Orig-Subj: =?UTF-8?B?VHJhbnNmb3JtIFlvdXIgaVBhZCBJbnRvIEEgTGFwdG9wIFJlcGxhY2VtZW50Lg==?= To: xfs@oss.sgi.com X-Barracuda-Connect: host.watersuites.com[185.10.58.213] X-Barracuda-Start-Time: 1423351174 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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, HTML_IMAGE_RATIO_08, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15024 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message --b10ae1f42b10791728c57c37bb032d Content-Type: text/plain; -Touch-fire,_-Inc.|1117__NW__54th__Street|Seattle,__WA__98107 jfidler to_unsubscribe_ click__here. Amrcan war plannrs ha no houghs of rurnng capur Brsh rrory. Th polcy wll b o prpar h provncs an rrors of CRIMSON an RED o bcom sas an rrors of h BLUE unon upon h claraon of pac. 7 Th SNP favours connu us of srlng n an npnn Scolan hrough a formal currncy unon wh h UK, wh h Bank of Englan sng s nrs ras an monary polcy an acng as s cnral bank.155 Th wh papr Scolan's Fuur nf fv ky rasons ha a currncy unon woul b n boh Scolan an h UK's nrss mmaly pos-npnnc: Scolan's man rang parnr s h UK (2/3 of xpors n 2011); compans oprang n Scolan an h UK ...hav complx cross-borr supply chans; hr s hgh labour mobly; on ky masurmns of an opmal currncy ara, h Scosh an UK conoms scor wll; an shor-rm conomc rns n h UK an Scolan hav a rlavly hgh gr of synchroncy.81 1.3 Namng Unr h rms of h 2010 Draf Bll, h followng popl wr nl o vo n h rfrnum:13 Th oubl flash was c on Spmbr 22, 1 979, a 00:53 GMT, by h Amrcan Vla sall 6911, whch carr varous snsors sgn spcfcally o c nuclar xplosons ha conravn h Paral Nuclar Ts Ban Tray. In aon o bng abl o c gamma rays, X-rays, an nurons, h sall also conan wo slcon sol-sa bhangmr snsors ha coul c h ual lgh flashs assoca wh an amosphrc nuclar xploson: h nal brf, nns flash, follow by a scon, longr flash.6 2.4 Ina Th U.S. govrnmn shoul classfy aonal nformaon abou h vn. A horough publc arng of h xsng nformaon coul rsolv h conrovrsy. 5 S also Aonally, arly chncal spculaon also xamn h possbly ha h Vla ha rcor a combnaon of naural phnomna, such as lghnng n conjuncon wh a mor srk. Ohr arly ma rpors of h m scuss h possbly of a nar-Earh objc (NEO) suprbol, such as by an asro, occurrng.9 Th Vla sall's flash cors wr snsv o lghnng suprbols,10pag n whch rsul n wo scnss, John Warrn an Robr Fryman from h Los Alamos Naonal Laboraory (hn call h Los Alamos Scnfc Laboraory), mmaly flyng o an nvsgang a rar, ovrlan suprbol occurrnc on Bll I s lan, Nwfounlan, n Aprl 1978.11 Thr obsrvaons of h vn, call h 'Bll Islan Boom', no bulng srucural amag, a farm anmals an sroy lcrcal vcs amongs ohr vnc (h suprbol's blas was har 55 klomrs away n Cap Broyl, Nwfounlan).12a Th Bll Islan Boom was among som 600 mysry booms ha occurr along h Norh Amrcan asrn saboar from la 1977 o m-1978.12 Inllgnc Ys Scolan was h man campagn group for npnnc, whl Br Toghr was h man campagn group n favour of mananng h unon. Many ohr campagn groups, polcal pars, busnsss, nwspaprs an promnn nvuals wr also nvolv. Promnn ssus ras urng h campagn nclu whch currncy an npnn Scolan woul us, publc xpnur, EU mmbrshp, an Norh Sa ol. Elcoral Rgsraon Offcrs. Thy compl an manan h lcoral rgsr an lss of posal an proxy vors.384 Mar collson Svral anonymous prss rlass whch appar followng h scovry l o h suggson ha h Marr Man was cra by popl from h Un Sas. Th rlass quo masurmns n mls, yars an nchs, nsa of h mrc sysm usually us n Ausrala. Ths woul b unusual for an Ausralan prss rlas, bu snc h mrc sysm was only nrouc n Ausrala n h arly 1970s, olr Ausralans sll ofn quo mpral masurmns. Th rlass also sa your Sa of SA, Qunslan Barrr Rf an mnon Aborgns from h local Ingnous Trrors, rms no us by Ausralans. Th prss rlass also mnon h Gra Srpn n Oho, whch s no wll known ous h US. Bu has bn conjcur ha hs faurs of h prss rlass may hav bn r hrrngs, nsr o prov h lluson of Amrcan auhorshp.caon n Conns h US shl voluon.svg Tn vors scovr ha somon ha vo unr hr nams a pollng saons n Glasgow,406 a mho of frau rm 'prsonaon', an hs l o an nvsgaon by Polc Scolan.406 4 In popular culur Scosh Labour lar Johann Lamon sa ha h polcy shoul b mplmn mmaly f h Scosh govrnmn blv woul hav a bnfcal ffc,72 bu Salmon rspon ha unr voluon h coss of h polcy woul hav o b fnanc by cus lswhr n publc xpnur.72 In March 2014, h Naonal Day Nursrs Assocaon sa ha h plan coul no b mplmn unlss grar funng was prov by local auhors o prva nursrs.74 A rpor by h Scosh Parlamn Informaon Cnr quson h conomc bnf of h polcy, ponng ou ha hr wr only 64,000 mohrs of chlrn ag bwn 1 an 5 who wr conomcally nacv.75 A spoksman for Salmon sa ha h sma oal 104,000 womn woul nr h workforc ovr a longr pro, as fuur gnraons of mohrs woul also b abl o work, sang: Th ky pon abou h polcy s ha osn' happn on on ay or on yar an hn cas.75 --b10ae1f42b10791728c57c37bb032d Content-Type: text/html;
Touch-fire Case & Keyboard
-Touch-fire,_-Inc.|1117__NW__54th__Street|Seattle,__WA__98107
xfs to_unsubscribe_ click__here.

Prsng Offcrs (on pr pollng plac).384 Thy wr rsponsbl for h ovrall managmn of h pollng plac. Th SNP rpa s commmn o hol a rfrnum whn publsh s 2011 Scosh parlamnary lcon manfso.18 Days bfor h lcon, Salmon sa ha lgslaon for a rfrnum woul b propos n h 2n half of h parlamn, as h wan o scur mor powrs for h Scosh Parlamn va h Scolan Bll frs.19 Th SNP gan an ovrall majory n h lcon, wnnng 69 from 129 sas, hrby ganng a mana o hol an npnnc rfrnum.2021 In January 2012, Elan Murray MSP of Labour l a ba argung ha h franchs shoul b xn o Scos lvng ous Scolan, nclung h approxmaly 800,000 lvng n h ohr pars of h UK.35 Ths was oppos by h Scosh Govrnmn, whch argu ha woul graly ncras h complxy of h rfrnum an sa ha hr was vnc from h Un Naons Human Rghs Comm ha ohr naons mgh quson h lgmacy of a rfrnum f h franchs s no rroral.35 Lonar Wss, a h m Saff Drcor of h Sna Subcomm on Enrgy an Nuclar Prolfraon, has also ras concrns abou h fnngs of h A-Hoc Panl, argung ha was s up by h Carr amnsraon o counr mbarrassng an growng opnon ha was an Isral nuclar s.29 Spcfc nllgnc abou h Isral nuclar program was no shar wh h panl whos rpor hrfor prouc h plausbl nably ha h amnsraon sough.29 Dbas For h mos par, h U.S. Rous wr h prmary mans of nr-cy vhcl ravl; h man xcpons wr oll roas such as h Pnnsylvana Turnpk an parkway rous such as h Mrr Parkway. Many of h frs hgh-sp roas wr U.S. Hghways: h Gulf Frway carr US 75,27 h Pasana Frway carr US 66,28 an h Pulask Skyway carr US 1 an US 9.29 Namng Th Vla Incn, also known as h Souh Alanc Flash, was an unnf oubl flash of lgh c by an Amrcan Vla Hol sall on Spmbr 22, 1979, nar h Prnc Ewar Islans off Anarcca, whch many blv was of nuclar orgn. Th mos wspra hory among hos who blv h flash was of nuclar orgn s ha rsul from a jon Souh Afrcan an Isral nuclar s .123 Th opc rmans hghly spu oay. Grar onln acvy amongs Ys supporrs was confrm by pollng conuc by TNS BMRB n Jun 2014, whch show ha Ys supporrs wr hr ms mor lkly o hav scuss h npnnc quson onln. Profssor Mchal Kang sa n Aprl 2014 ha h pro-npnnc movmn was vsbly srongr an fghng a groun war, whl UK govrnmn supporrs ar fghng an 'ar war' of facs an fgurs.339 Survvors 1 In h 2010 Draf Bll, h Scosh govrnmn propos ha hr woul b a sgna organsaon campagnng for a 'Ys' vo an a sgna organsaon campagnng for a 'No' vo, boh of whch woul b prm o spn up o ?750,000 on hr campagn an o sn on fr malsho o vry houshol or vor n h rfrnum franchs. Thr was o b no publc funng for campagns. Polcal pars wr ach o b allow o spn ?100,000.13 Ths propos lm on pary spnng was rvs o ?250,000 n 2012.44 Th Labour Pary was comm o hom rul for Scolan n h 1920s, bu slpp own s agna n h followng yars.2 Th Scosh Naonal Pary (SNP) was form n 1934, bu no achv sgnfcan lcoral succss unl h 1960s.2 A ocumn callng for hom rul, h S cosh Covnan, was sgn by 2 mllon popl (ou of a populaon of 5 mllon) n h la 1940s.2 Hom rul, now known as Scosh voluon, no bcom a srous proposal unl h la 1970s as h Labour govrnmn of Jm Callaghan cam unr lcoral prssur from h SNP.2 Typ F-86 Sabr 1.1 Offc of Scnc an Tchnology valuaon Th Fral-A Hghway Ac of 1956 appropra funng for h Inrsa Hghway Sysm, o consruc a vas nwork of frways across h counry. By 1957, AASHO ha c o assgn a nw gr o h nw rous, o b numbr n h oppos rcons as h U.S. Hghway gr. Though h Inrsa numbrs wr o supplmn, rahr han rplac, h U.S. Rou numbrs, n many cass (spcally n h ws) h US hghways wr rrou along h nw Inrsas.9 Major commssonng of formr rous bgan wh Calforna's hghway rnumbrng n 1964. Th 1985 rmoval of US 66 s ofn sn as h n of an ra of US hghways.30 Canaan counrpar Th Scosh Socals Pary favours an npnn Scosh currncy pgg o srlng n h shor rm.176 Th Scosh Grn Pary sa ha kpng srlng as a shor rm ransonal arrangmn shoul no b rul ou, bu h Scosh govrnmn shoul kp an op n mn abou movng owars an npnn currncy.177 Th Jmmy R Founaon, n arly 2013, scrb rnon of h poun as a goo ransonal arrangmn, bu rcommn h vnual sablshmn of an npnn Scosh currncy o nsula Scolan from h UK's conomc nsably.178 Ohr proponns of an npnn Scosh currncy nclu Ys Scolan charman Dnns Canavan an formr SNP puy lar Jm Sllars.179 Th Barn formula has rsul n hghr pr-capa publc spnng n Scolan han Englan.181 If Norh Sa ol rvnu s calcula on a gographc bass, Scolan also proucs mor pr capa ax rvnu han h UK avrag.182183 Th Insu for Fscal Sus rpor n Novmbr 2012 ha a gographc shar of Norh Sa ol woul mor han covr h hghr publc spnng, bu warn ha ol prcs ar volal an ha ol s a fn rsourc.183 Th Govrnmn Expnur an Rvnu Scolan rpor for 2012/13 foun ha Norh Sa ol rvnu ha falln by 41.5% an ha Scolan's publc spnng fc ha ncras from ?4.6 bllon o ?8.6 bllon.184185 Da Fbruary 5, 1958

--b10ae1f42b10791728c57c37bb032d-- From shhuiw@foxmail.com Sat Feb 7 22:45:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 372E87F4E for ; Sat, 7 Feb 2015 22:45:55 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 267078F8037 for ; Sat, 7 Feb 2015 20:45:51 -0800 (PST) X-ASG-Debug-ID: 1423370745-04cb6c6b0a55b00001-NocioJ Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) by cuda.sgi.com with ESMTP id W6uBixixhBaDDX2r (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 07 Feb 2015 20:45:48 -0800 (PST) X-Barracuda-Envelope-From: shhuiw@foxmail.com X-Barracuda-Apparent-Source-IP: 54.207.19.206 X-QQ-mid: esmtp11t1423370718t021t15027 Received: from me.io.internal.tilera.com (unknown [123.113.104.152]) by esmtp4.qq.com (ESMTP) with id ; Sun, 08 Feb 2015 12:45:07 +0800 (CST) X-QQ-SSF: 0100000000000020312000000000000 X-QQ-FEAT: UPMsb6NLLMxl1FiN6LnIj3+qgGDJWeenZo5ltvfD20pomPeekEuPkC1h1rJ6A S0FKPh9KU2qoiQubcJ7Jr+zpeqbtXG0Te6h9Kdx4FxpDKCvTqrdzNCCKMwfvZuM2LSZfIbE BouqO3aAPJZW6r+61lDOPRcsZYLF82gnmtfFYPuTPoMVI0QGd5ctUjZhZeWOtOhKoseY9YH bmH5GWbkYfQ== X-QQ-GoodBg: 0 From: Wang Sheng-Hui To: david@fromorbit.com, xfs@oss.sgi.com, sandeen@sandeen.net, hch@lst.de, bfoster@redhat.com, tinguely@sgi.com Subject: [PATCH] xfs: move the comment on log device near the right log dev check in xfs_mount_validate_sb Date: Sun, 8 Feb 2015 12:45:04 +0800 X-ASG-Orig-Subj: [PATCH] xfs: move the comment on log device near the right log dev check in xfs_mount_validate_sb Message-Id: <1423370704-3464-1-git-send-email-shhuiw@foxmail.com> X-Mailer: git-send-email 2.1.2 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbgbr1.qq.com[54.207.19.206] X-Barracuda-Start-Time: 1423370746 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15030 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The beginning is about magic and version number check. Move the comment on log device near the log dev check logic. Signed-off-by: Wang Sheng-Hui --- fs/xfs/libxfs/xfs_sb.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 752915f..b4bb852 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -174,20 +174,13 @@ xfs_mount_validate_sb( bool check_inprogress, bool check_version) { + /* check magic number and version number */ - /* - * If the log device and data device have the - * same device number, the log is internal. - * Consequently, the sb_logstart should be non-zero. If - * we have a zero sb_logstart in this case, we may be trying to mount - * a volume filesystem in a non-volume manner. - */ if (sbp->sb_magicnum != XFS_SB_MAGIC) { xfs_warn(mp, "bad magic number"); return -EWRONGFS; } - if (!xfs_sb_good_version(sbp)) { xfs_warn(mp, "bad version"); return -EWRONGFS; @@ -245,6 +238,14 @@ xfs_mount_validate_sb( return -EFSCORRUPTED; } + /* + * If the log device and data device have the + * same device number, the log is internal. + * Consequently, the sb_logstart should be non-zero. If + * we have a zero sb_logstart in this case, we may be trying to mount + * a volume filesystem in a non-volume manner. + */ + if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { xfs_warn(mp, -- 2.1.2 From root@krios.tbi.univie.ac.at Sat Feb 7 23:25:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D8ADB7F56 for ; Sat, 7 Feb 2015 23:25:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8C5E304032 for ; Sat, 7 Feb 2015 21:25:10 -0800 (PST) X-ASG-Debug-ID: 1423373105-04bdf06a5b5d630001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id 47aBLx6UOzkKBBZh for ; Sat, 07 Feb 2015 21:25:05 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 03F4A5EE2D; Sun, 8 Feb 2015 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id E93F15F00F; Sun, 8 Feb 2015 06:25:02 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20150208052502.E93F15F00F@krios.tbi.univie.ac.at> Date: Sun, 8 Feb 2015 06:25:02 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1423373105 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From hch@lst.de Sun Feb 8 07:34:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA8AB7F51 for ; Sun, 8 Feb 2015 07:34:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 863C5AC001 for ; Sun, 8 Feb 2015 05:34:41 -0800 (PST) X-ASG-Debug-ID: 1423402478-04bdf06a5a72220001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id DHvCKWs48BIKNDp8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 08 Feb 2015 05:34:39 -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 02A621436D; Sun, 8 Feb 2015 14:34:36 +0100 (CET) Date: Sun, 8 Feb 2015 14:34:35 +0100 From: Christoph Hellwig To: "J. Bruce Fields" Cc: Dave Chinner , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150208133435.GA27081@lst.de> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150206224258.GJ29783@fieldses.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1423402479 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > You'd basically just be pulling my tree (Christoph's is just my nfsd > tree with his patches on top, and I've been testing with exactly that > locally, just putting off pushing it out till we decide this.) > > So anyway, fine with me if you want to just pull that into the xfs tree. > Mine's ready whenever, so if I send my pull pretty soon after the merge > window and you send it a little later then we still keep the property > that Linus's merge still has a diffstat only in our respective areas. > > (OK, it's a little more complicated because I've got the same > arrangement with jlayton, so the order is jlayton's lock pull, then my > nfsd pull, then your xfs pull. Is this getting too complicated? > jlayton and I are both ready to so and I think it'd work.) > > I'm also fine with duplicating those few patches, or whatever. Maybe the better idea is to pull the xfs tree in the nfsd tree, but that would require Dave sending an early pull request so that the nfsd pull doesn't get delayed. Or we just defer the pnfsd merge. While I tried to get it in in time for 3.20 all the delays during review mean we're really late no and should punt it to 3.21. From jeff.layton@primarydata.com Sun Feb 8 08:09:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5BCA77F54 for ; Sun, 8 Feb 2015 08:09:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D135BAC001 for ; Sun, 8 Feb 2015 06:09:48 -0800 (PST) X-ASG-Debug-ID: 1423404585-04cb6c6b096be80001-NocioJ Received: from mail-qg0-f42.google.com (mail-qg0-f42.google.com [209.85.192.42]) by cuda.sgi.com with ESMTP id VixnZc7H9T16HCDf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Feb 2015 06:09:46 -0800 (PST) X-Barracuda-Envelope-From: jeff.layton@primarydata.com X-Barracuda-Apparent-Source-IP: 209.85.192.42 Received: by mail-qg0-f42.google.com with SMTP id z107so12073717qgd.1 for ; Sun, 08 Feb 2015 06:09:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=zNXi+0zr5bc3QhUGkxKuBo9rvXWawshejobTV2NWa94=; b=dMKsfA+i2sKBBl0+VtPnl23sDrd5BQvr/w+t5APvfvKkJkHz5NTbu5mtc0kgwcBPve WY5Q95nKCdLZDyESvljPz6uGfdwq19AJsF1b5TbhtqHJa8Bq/8UwyVhAHs7Pibx4OpqK PvdRr5L9y4p0BU+8TjGPOB2rO+8AjYBf0rvUuB5UZovJubAhkhJabmoMWwlOkHh8XlvW GFF1VN5bKSG80tKdmazrxrveDeOLHFEWE0wYUfx4jevqEXnLDsKphJkQYzeUVl4Zpcu+ xq9jEJJys0BY0nqQFtXqJgp89Gjvd/4JQ+6+Y8tb77mxZg2AiCwbn/t/c4R8NqxALJUi +LDw== X-Gm-Message-State: ALoCoQlRaCfN0oc+P+MtIG6imJEhiDOXBiZCM9gS7W0XaTzUHMa9sO/ZJYM0GaG5mwakLzRZKXi/ X-Received: by 10.140.19.175 with SMTP id 44mr28767640qgh.79.1423404585595; Sun, 08 Feb 2015 06:09:45 -0800 (PST) Received: from tlielax.poochiereds.net ([2606:a000:1105:ab:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id z7sm8791370qas.34.2015.02.08.06.09.45 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Feb 2015 06:09:45 -0800 (PST) Date: Sun, 8 Feb 2015 09:09:42 -0500 From: Jeff Layton To: Christoph Hellwig Cc: "J. Bruce Fields" , Dave Chinner , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150208090942.51e99687@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations In-Reply-To: <20150208133435.GA27081@lst.de> References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qg0-f42.google.com[209.85.192.42] X-Barracuda-Start-Time: 1423404586 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, 8 Feb 2015 14:34:35 +0100 Christoph Hellwig wrote: > On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > > You'd basically just be pulling my tree (Christoph's is just my nfsd > > tree with his patches on top, and I've been testing with exactly that > > locally, just putting off pushing it out till we decide this.) > > > > So anyway, fine with me if you want to just pull that into the xfs tree. > > Mine's ready whenever, so if I send my pull pretty soon after the merge > > window and you send it a little later then we still keep the property > > that Linus's merge still has a diffstat only in our respective areas. > > > > (OK, it's a little more complicated because I've got the same > > arrangement with jlayton, so the order is jlayton's lock pull, then my > > nfsd pull, then your xfs pull. Is this getting too complicated? > > jlayton and I are both ready to so and I think it'd work.) > > > > I'm also fine with duplicating those few patches, or whatever. > > Maybe the better idea is to pull the xfs tree in the nfsd tree, but > that would require Dave sending an early pull request so that the > nfsd pull doesn't get delayed. > > Or we just defer the pnfsd merge. While I tried to get it in in time > for 3.20 all the delays during review mean we're really late no and should > punt it to 3.21. FWIW, I plan to send a pull request for the locking changes as soon as the merge window opens. Hopefully that won't be an issue for long... -- Jeff Layton From bfoster@redhat.com Sun Feb 8 10:04:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 928417F58 for ; Sun, 8 Feb 2015 10:04:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7009B8F8052 for ; Sun, 8 Feb 2015 08:04:11 -0800 (PST) X-ASG-Debug-ID: 1423411447-04cbb01163767d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GFdNvaDtsQYkHPDq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 08 Feb 2015 08:04:07 -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 (8.14.4/8.14.4) with ESMTP id t18G44XH002885 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sun, 8 Feb 2015 11:04:05 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t18G448c013023; Sun, 8 Feb 2015 11:04:04 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 562981256B4; Sun, 8 Feb 2015 11:04:03 -0500 (EST) Date: Sun, 8 Feb 2015 11:04:03 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field Message-ID: <20150208160402.GA2927@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-2-git-send-email-bfoster@redhat.com> <20150206224047.GO12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150206224047.GO12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423411447 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Feb 07, 2015 at 09:40:47AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:48PM -0500, Brian Foster wrote: > > Add sb_spinoalignmt to the superblock to specify sparse inode chunk > > alignment. This also currently represents the minimum allowable sparse > > chunk allocation size. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_format.h | 6 +++--- > > fs/xfs/libxfs/xfs_sb.c | 4 ++-- > > 2 files changed, 5 insertions(+), 5 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > index 8eb7189..051c24d 100644 > > --- a/fs/xfs/libxfs/xfs_format.h > > +++ b/fs/xfs/libxfs/xfs_format.h > > @@ -170,7 +170,7 @@ typedef struct xfs_sb { > > __uint32_t sb_features_log_incompat; > > > > __uint32_t sb_crc; /* superblock crc */ > > - __uint32_t sb_pad; > > + xfs_extlen_t sb_spinoalignmt;/* sparse inode chunk alignment */ > > That's a mounthful. sb_spino_align is a bit easier to read, IMO. > Ok. > > @@ -282,7 +282,7 @@ typedef enum { > > XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, > > XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, > > XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, > > - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, > > + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINOALIGNMT, > > XFS_SBS_PQUOTINO, XFS_SBS_LSN, > > XFS_SBS_FIELDCOUNT > > } xfs_sb_field_t; > > These are gone in the for-next tree. > The per-field logging stuff is gone... this apparently still exists. It looks like it goes away as part of the icsb rework so this will drop naturally whenever that goes in. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Sun Feb 8 10:06:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D1847F58 for ; Sun, 8 Feb 2015 10:06:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F011D304032 for ; Sun, 8 Feb 2015 08:06:05 -0800 (PST) X-ASG-Debug-ID: 1423411564-04cbb01163769b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7hVT0Qm6SWEKMn7R (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 08 Feb 2015 08:06:04 -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 (8.14.4/8.14.4) with ESMTP id t18G62eh020166 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sun, 8 Feb 2015 11:06:02 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t18G627O011783; Sun, 8 Feb 2015 11:06:02 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F3701256B4; Sun, 8 Feb 2015 11:06:01 -0500 (EST) Date: Sun, 8 Feb 2015 11:06:01 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150208160600.GB2927@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> <20150206231615.GQ12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150206231615.GQ12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423411564 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Feb 07, 2015 at 10:16:15AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:51PM -0500, Brian Foster wrote: > > The inode btrees track 64 inodes per record, regardless of inode size. > > Thus, inode chunks on disk vary in size depending on the size of the > > inodes. This creates a contiguous allocation requirement for new inode > > chunks that can be difficult to satisfy on an aged and fragmented (free > > space) filesystem. > > > > The inode record freecount currently uses 4 bytes on disk to track the > > free inode count. With a maximum freecount value of 64, only one byte is > > required. Convert the freecount field to a single byte and use two of > > the remaining 3 higher order bytes left for the hole mask field. Use > > the final leftover byte for the total count field. > > > > The hole mask field tracks holes in the chunks of physical space that > > the inode record refers to. This facilitates the sparse allocation of > > inode chunks when contiguous chunks are not available and allows the > > inode btrees to identify what portions of the chunk contain valid > > inodes. The total count field contains the total number of valid inodes > > referred to by the record. This can also be deduced from the hole mask. > > The count field provides clarity and redundancy for internal record > > verification. > > > > Note that both fields are initialized to zero to maintain backwards > > compatibility with existing filesystems (e.g., the higher order bytes of > > freecount are always 0). Tracking holes means that the hole mask is > > initialized to zero and thus remains "valid" in accordance with a > > non-sparse inode fs when no sparse chunks are physically allocated. > > Update the inode record management functions to handle the new fields > > and initialize to zero. > > > > [XXX: The count field breaks backwards compatibility with !sparseinode > > fs. Should we reconsider the addition of total count or the idea of > > converting back and forth between sparse inode fs with a feature bit?] > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_format.h | 8 ++++++-- > > fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- > > fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- > > 3 files changed, 19 insertions(+), 5 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > index 26e5d92..6c2f1be 100644 > > --- a/fs/xfs/libxfs/xfs_format.h > > +++ b/fs/xfs/libxfs/xfs_format.h > > @@ -1295,13 +1295,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) > > */ > > typedef struct xfs_inobt_rec { > > __be32 ir_startino; /* starting inode number */ > > - __be32 ir_freecount; /* count of free inodes (set bits) */ > > + __be16 ir_holemask; /* hole mask for sparse chunks */ > > + __u8 ir_count; /* total inode count */ > > + __u8 ir_freecount; /* count of free inodes (set bits) */ > > __be64 ir_free; /* free inode mask */ > > } xfs_inobt_rec_t; > > I think I'd prefer to see a union here so that we explicitly state > what the difference in the on-disk format is. i.e. similar to how we > express the difference in long and short btree block headers. > > struct xfs_inobt_rec { > __be32 ir_startino; /* starting inode number */ > __be32 ir_freecount; /* count of free inodes (set bits) */ > union { > struct { > __be32 ir_freecount; > } f; > struct { > __be16 ir_holemask; /* hole mask for sparse chunks */ > __u8 ir_count; /* total inode count */ > __u8 ir_freecount; /* count of free inodes (set bits) */ > } sp; > } > __be64 ir_free; /* free inode mask */ > }; > > This will prevent us from using the wrong method of > referencing/modifying the record because we now need to be explicit > in how we modify it... > I agree in principle. This is definitely explicit in that there are two variants of this structure that must be handled in a particular way. That said, 'sparse' and 'full' aren't quite logical differentiators given that we now have the ir_count field and that it is used whenever sparse inode support is enabled. In other words, a sparse enabled fs' always uses the 'sp' variant of the inobt record, regardless of whether the record happens to sparse. Ultimately, I think the benefit of doing something like this depends on its utility... > > typedef struct xfs_inobt_rec_incore { > > xfs_agino_t ir_startino; /* starting inode number */ > > - __int32_t ir_freecount; /* count of free inodes (set bits) */ > > + __uint16_t ir_holemask; /* hole mask for sparse chunks */ > > + __uint8_t ir_count; /* total inode count */ > > + __uint8_t ir_freecount; /* count of free inodes (set bits) */ > > xfs_inofree_t ir_free; /* free inode mask */ > > } xfs_inobt_rec_incore_t; > > Though this is still fine - it doesn't need to explicitly follow the > on-disk format structure, but it would be nice to be explicit on > conversion to disk format records what we are actually using from > this record. > Ok. > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > > index 6f2153e..32fdb7c 100644 > > --- a/fs/xfs/libxfs/xfs_ialloc.c > > +++ b/fs/xfs/libxfs/xfs_ialloc.c > > @@ -65,6 +65,8 @@ xfs_inobt_lookup( > > int *stat) /* success/failure */ > > { > > cur->bc_rec.i.ir_startino = ino; > > + cur->bc_rec.i.ir_holemask = 0; > > + cur->bc_rec.i.ir_count = 0; > > cur->bc_rec.i.ir_freecount = 0; > > cur->bc_rec.i.ir_free = 0; > > return xfs_btree_lookup(cur, dir, stat); > > @@ -82,7 +84,9 @@ xfs_inobt_update( > > union xfs_btree_rec rec; > > > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > > + rec.inobt.ir_count = irec->ir_count; > > + rec.inobt.ir_freecount = irec->ir_freecount; > > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > > return xfs_btree_update(cur, &rec); > > } > > Hmmm - perhaps a similar set of helpers for sparse inode enabled > filesystems > We could do that for the insert/update helpers, but note again the separate helpers would not split along the lines of sparse vs full chunks. Even if we were to change the design such that they do, that would have th effect of complicating some of the subsequent code. For example, the merge/update code currently has no reason to care about whether it has created a full chunk out of multiple sparse chunks. This would require more code to make that distinction simply to pick the correct api, for something that can easily be done with a simple generic helper. The same goes for things like the finobt, where now lookup/update/insert has to make distinctions depending on the type of inode record. An alternate approach could be to stick with the generic helpers, but try and tweak them to use the appropriate on-disk format depending on the record. Then again, how can one really identify one from the other in the lookup or _get_rec() scenarios? > > @@ -118,6 +124,8 @@ xfs_inobt_insert_rec( > > xfs_inofree_t free, > > int *stat) > > { > > + cur->bc_rec.i.ir_holemask = 0; > > + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > > cur->bc_rec.i.ir_freecount = freecount; > > cur->bc_rec.i.ir_free = free; > > return xfs_btree_insert(cur, stat); > > That would make this sort of thing very clear - this doesn't look > like it would work for a sparse chunk record... > Right... but this is just a plumbing patch and effectively a placeholder for the subsequent patches that implement the mechanism. I suppose the api could have been pulled back sooner into this patch, but I'd rather not reshuffle things just for that intermediate state. That context probably wasn't quite clear to me at the time. Before I go one way or another here with regard to the on-disk data structure, care to take a look at the subsequent patch(es) that use these helpers? Patch 10 in particular pretty much sums up how these helpers are used for sparse inode record management. FWIW, comments on the generic bitmap stuff is also appreciated as that's another area I'm not totally convinved is done right. :) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Sun Feb 8 10:06:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 173727F63 for ; Sun, 8 Feb 2015 10:06:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF5BE304032 for ; Sun, 8 Feb 2015 08:06:11 -0800 (PST) X-ASG-Debug-ID: 1423411570-04bdf06a5c7b830001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6le3WH3fl4eq1Uu4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 08 Feb 2015 08:06:10 -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 (8.14.4/8.14.4) with ESMTP id t18G69U3003062 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sun, 8 Feb 2015 11:06:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t18G68gt005584; Sun, 8 Feb 2015 11:06:09 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D64241256B4; Sun, 8 Feb 2015 11:06:07 -0500 (EST) Date: Sun, 8 Feb 2015 11:06:07 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery Message-ID: <20150208160607.GC2927@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 07/18] xfs: handle sparse inode chunks in icreate log recovery References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-8-git-send-email-bfoster@redhat.com> <20150206231946.GR12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150206231946.GR12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423411570 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Feb 07, 2015 at 10:19:46AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:54PM -0500, Brian Foster wrote: > > Recovery of icreate transactions assumes hardcoded values for the inode > > count and chunk length. > > > > Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update > > the icreate validity checks to allow for appropriately sized inode > > chunks and verify the inode count matches what is expected based on the > > extent length rather than assuming a hardcoded count. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_log_recover.c | 19 +++++++++++++------ > > 1 file changed, 13 insertions(+), 6 deletions(-) > > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index ecc73d5..5a5ee20 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -3068,12 +3068,19 @@ xlog_recover_do_icreate_pass2( > > return -EINVAL; > > } > > > > - /* existing allocation is fixed value */ > > - ASSERT(count == mp->m_ialloc_inos); > > - ASSERT(length == mp->m_ialloc_blks); > > - if (count != mp->m_ialloc_inos || > > - length != mp->m_ialloc_blks) { > > - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); > > + /* inode chunk is either full or sparse */ > > + if (length != mp->m_ialloc_blks && > > + length != mp->m_ialloc_min_blks) { > > + xfs_warn(log->l_mp, > > + "%s: unsupported chunk length", __FUNCTION__); > > + return -EINVAL; > > + } > > Hmmm - this would prevent recovery of sparse inode chunk allocation > in multiples of mp->m_ialloc_min_blks, right? Surely we can allow > any sub-chunk extent size to be allocated as long as alignment and > size restrictions are met? > Indeed it does prevent recovery of allocations in multiples of m_ialloc_min_blks, but that is not supported at the moment so this alone shouldn't cause any problems. The reason for the limitation is the same general issue of dealing with allocations that may not be guaranteed to convert directly to valid inode records. In other words, this is the minimum allocation we can guarantee will span only a single record. Now that I think about it after doing the whole agbno range thing, perhaps an 'end_align' allocation argument might be a way to deal with that one? For example, sparse allocs could request a cluster aligned start bno and a chunk aligned end bno..? That might require multiple sparse alloc attempts to take full advantage, probably requires more thought either way... Also note that for all fs' that this feature supports (i.e., v5), the next multiple of the m_ialloc_min_blks corresponds to a full chunk (due to the cluster size scaling). Given all of that, I'd at least prefer to defer more advanced allocation support from this initial series as an enhancement (provided there's value). Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Sun Feb 8 15:21:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CDFAC7F60 for ; Sun, 8 Feb 2015 15:21:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D042AC004 for ; Sun, 8 Feb 2015 13:21:07 -0800 (PST) X-ASG-Debug-ID: 1423430464-04bdf06a5c86470001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 5uL5w5k7yBe85wIN for ; Sun, 08 Feb 2015 13:21:05 -0800 (PST) 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: A2BFFADd0tdUPPb7LHlcgwaBLIIzg3mpeQMGmDcCAgEBAoEORAEBAQEBAQUBAQEBODuEDQEFOhwjEAgDGAkaCw8FJQMHGhOIGQMQwwwLhWcBAQEHAgEfGIVsiXQHhCoFmEaKQIgxglSBUCoxgkIBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 07:50:52 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKZHf-0003Ki-5J; Mon, 09 Feb 2015 08:20:51 +1100 Date: Mon, 9 Feb 2015 08:20:51 +1100 From: Dave Chinner To: Wang Sheng-Hui Cc: xfs@oss.sgi.com, sandeen@sandeen.net, hch@lst.de, bfoster@redhat.com, tinguely@sgi.com Subject: Re: [PATCH] xfs: move the comment on log device near the right log dev check in xfs_mount_validate_sb Message-ID: <20150208212051.GZ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: move the comment on log device near the right log dev check in xfs_mount_validate_sb References: <1423370704-3464-1-git-send-email-shhuiw@foxmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423370704-3464-1-git-send-email-shhuiw@foxmail.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: 1423430464 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 08, 2015 at 12:45:04PM +0800, Wang Sheng-Hui wrote: > The beginning is about magic and version number check. > Move the comment on log device near the log dev check logic. > > Signed-off-by: Wang Sheng-Hui The comment is old and redundant. The error messages document the reason for the checks better than the comment and the comments about volume mounts date back to Irix and so aren't relevant any more. So just remove the comment. > --- > fs/xfs/libxfs/xfs_sb.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 752915f..b4bb852 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -174,20 +174,13 @@ xfs_mount_validate_sb( > bool check_inprogress, > bool check_version) > { > + /* check magic number and version number */ No need to add a redundant comment - it is obvious what the code it refers to is checking. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 15:36:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 889307F63 for ; Sun, 8 Feb 2015 15:36:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67D57304032 for ; Sun, 8 Feb 2015 13:36:22 -0800 (PST) X-ASG-Debug-ID: 1423431378-04bdf06a5c86b40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DBDupq8Mj3NtBqAl for ; Sun, 08 Feb 2015 13:36:19 -0800 (PST) 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: A2AcCwBQ1tdUPPb7LHlcgwaBLIIzg3mpeQMGlFmDXgQCAoEORAEBAQEBAQUBAQEBODuEDQEFOhwjEAgDGAklDwUlAwcaE4gsyQMBAQgCAR8YhWyJdAeDFoEUBZhGikCIMYQkKjGCQgEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 08:05:02 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKZVO-0003Lk-Mz; Mon, 09 Feb 2015 08:35:02 +1100 Date: Mon, 9 Feb 2015 08:35:02 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150208213502.GA4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54D53E8C.8070207@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: 1423431378 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: > These 2 patches provide information about which filesystem > hit the error... If we are going to touch every one of these macros, then can we rename them to something a little shorter like XFS_CORRUPT_GOTO() and XFS_CORRUPT_RETURN() at the same time? That will make the code a little less eye-bleedy where there are lots of these statements, and make formatting of complex checks a bit easier, too... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 15:43:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A8D2B7F63 for ; Sun, 8 Feb 2015 15:43:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42064AC001 for ; Sun, 8 Feb 2015 13:43:59 -0800 (PST) X-ASG-Debug-ID: 1423431836-04bdf06a5c86f80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HUCmS02dZN3G7QLf for ; Sun, 08 Feb 2015 13:43:57 -0800 (PST) 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: A2BFFACE19dUPPb7LHlcgwaBLIIzg3mpeQMGmDcCAgEBAoEORAEBAQEBAQUBAQEBODuEDQEFOhwjEAgDDgoJJQ8FJQMHGhOILMkGAQEBAQYCAR8YhWyJdAeDFoEUBZhGgRmFSYwPhCQqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 08:13:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKZdz-0003MK-O9; Mon, 09 Feb 2015 08:43:55 +1100 Date: Mon, 9 Feb 2015 08:43:55 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field Message-ID: <20150208214355.GB4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 01/18] xfs: add sparse inode chunk alignment superblock field References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-2-git-send-email-bfoster@redhat.com> <20150206224047.GO12722@dastard> <20150208160402.GA2927@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208160402.GA2927@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423431836 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 08, 2015 at 11:04:03AM -0500, Brian Foster wrote: > On Sat, Feb 07, 2015 at 09:40:47AM +1100, Dave Chinner wrote: > > On Fri, Feb 06, 2015 at 02:52:48PM -0500, Brian Foster wrote: > > > Add sb_spinoalignmt to the superblock to specify sparse inode chunk > > > alignment. This also currently represents the minimum allowable sparse > > > chunk allocation size. > > > > > > Signed-off-by: Brian Foster > > > --- > > > fs/xfs/libxfs/xfs_format.h | 6 +++--- > > > fs/xfs/libxfs/xfs_sb.c | 4 ++-- > > > 2 files changed, 5 insertions(+), 5 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > > index 8eb7189..051c24d 100644 > > > --- a/fs/xfs/libxfs/xfs_format.h > > > +++ b/fs/xfs/libxfs/xfs_format.h > > > @@ -170,7 +170,7 @@ typedef struct xfs_sb { > > > __uint32_t sb_features_log_incompat; > > > > > > __uint32_t sb_crc; /* superblock crc */ > > > - __uint32_t sb_pad; > > > + xfs_extlen_t sb_spinoalignmt;/* sparse inode chunk alignment */ > > > > That's a mounthful. sb_spino_align is a bit easier to read, IMO. > > > > Ok. > > > > @@ -282,7 +282,7 @@ typedef enum { > > > XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, > > > XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, > > > XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, > > > - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, > > > + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINOALIGNMT, > > > XFS_SBS_PQUOTINO, XFS_SBS_LSN, > > > XFS_SBS_FIELDCOUNT > > > } xfs_sb_field_t; > > > > These are gone in the for-next tree. > > > > The per-field logging stuff is gone... this apparently still exists. It > looks like it goes away as part of the icsb rework so this will drop > naturally whenever that goes in. Ah, I can't even keep up with what I'm doing! :) Yeah, that will go into the tree as soon as the 3.20 merge window is done. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 15:57:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 765717F6B for ; Sun, 8 Feb 2015 15:57:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8FFEAC001 for ; Sun, 8 Feb 2015 13:57:15 -0800 (PST) X-ASG-Debug-ID: 1423432632-04cbb011647f410001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id B9pzOImaNL5wOZEE for ; Sun, 08 Feb 2015 13:57:12 -0800 (PST) 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: A2BHFAAF29dUPPb7LHlSCoMGgSyCM4N5qXkDBpg3AgIBAQKBDkQBAQEBAQEFAQEBATg7hAwBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIJQfIcwEBAQEGAQEBAR4YhWyJGFwHgxaBFAWUfINKgRmLG4Y9giEDHBSBUCoxgkIBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 08:27:11 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKZqo-0003NC-RF; Mon, 09 Feb 2015 08:57:10 +1100 Date: Mon, 9 Feb 2015 08:57:10 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150208215710.GC4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> <20150206231615.GQ12722@dastard> <20150208160600.GB2927@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208160600.GB2927@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423432632 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 08, 2015 at 11:06:01AM -0500, Brian Foster wrote: > On Sat, Feb 07, 2015 at 10:16:15AM +1100, Dave Chinner wrote: > > On Fri, Feb 06, 2015 at 02:52:51PM -0500, Brian Foster wrote: > > > The inode btrees track 64 inodes per record, regardless of inode size. > > > Thus, inode chunks on disk vary in size depending on the size of the > > > inodes. This creates a contiguous allocation requirement for new inode > > > chunks that can be difficult to satisfy on an aged and fragmented (free > > > space) filesystem. > > > > > > The inode record freecount currently uses 4 bytes on disk to track the > > > free inode count. With a maximum freecount value of 64, only one byte is > > > required. Convert the freecount field to a single byte and use two of > > > the remaining 3 higher order bytes left for the hole mask field. Use > > > the final leftover byte for the total count field. > > > > > > The hole mask field tracks holes in the chunks of physical space that > > > the inode record refers to. This facilitates the sparse allocation of > > > inode chunks when contiguous chunks are not available and allows the > > > inode btrees to identify what portions of the chunk contain valid > > > inodes. The total count field contains the total number of valid inodes > > > referred to by the record. This can also be deduced from the hole mask. > > > The count field provides clarity and redundancy for internal record > > > verification. > > > > > > Note that both fields are initialized to zero to maintain backwards > > > compatibility with existing filesystems (e.g., the higher order bytes of > > > freecount are always 0). Tracking holes means that the hole mask is > > > initialized to zero and thus remains "valid" in accordance with a > > > non-sparse inode fs when no sparse chunks are physically allocated. > > > Update the inode record management functions to handle the new fields > > > and initialize to zero. > > > > > > [XXX: The count field breaks backwards compatibility with !sparseinode > > > fs. Should we reconsider the addition of total count or the idea of > > > converting back and forth between sparse inode fs with a feature bit?] > > > > > > Signed-off-by: Brian Foster > > > --- > > > fs/xfs/libxfs/xfs_format.h | 8 ++++++-- > > > fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- > > > fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- > > > 3 files changed, 19 insertions(+), 5 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > > index 26e5d92..6c2f1be 100644 > > > --- a/fs/xfs/libxfs/xfs_format.h > > > +++ b/fs/xfs/libxfs/xfs_format.h > > > @@ -1295,13 +1295,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) > > > */ > > > typedef struct xfs_inobt_rec { > > > __be32 ir_startino; /* starting inode number */ > > > - __be32 ir_freecount; /* count of free inodes (set bits) */ > > > + __be16 ir_holemask; /* hole mask for sparse chunks */ > > > + __u8 ir_count; /* total inode count */ > > > + __u8 ir_freecount; /* count of free inodes (set bits) */ > > > __be64 ir_free; /* free inode mask */ > > > } xfs_inobt_rec_t; > > > > I think I'd prefer to see a union here so that we explicitly state > > what the difference in the on-disk format is. i.e. similar to how we > > express the difference in long and short btree block headers. > > > > struct xfs_inobt_rec { > > __be32 ir_startino; /* starting inode number */ > > __be32 ir_freecount; /* count of free inodes (set bits) */ > > union { > > struct { > > __be32 ir_freecount; > > } f; > > struct { > > __be16 ir_holemask; /* hole mask for sparse chunks */ > > __u8 ir_count; /* total inode count */ > > __u8 ir_freecount; /* count of free inodes (set bits) */ > > } sp; > > } > > __be64 ir_free; /* free inode mask */ > > }; > > > > This will prevent us from using the wrong method of > > referencing/modifying the record because we now need to be explicit > > in how we modify it... > > > > I agree in principle. This is definitely explicit in that there are two > variants of this structure that must be handled in a particular way. > That said, 'sparse' and 'full' aren't quite logical differentiators > given that we now have the ir_count field and that it is used whenever > sparse inode support is enabled. In other words, a sparse enabled fs' > always uses the 'sp' variant of the inobt record, regardless of whether > the record happens to sparse. Sure, that's fine for the in memory code, but we've always been explicit about the disk format and marshalling to/from it, especially in the cases where the structure on disk can have multiple formats. > > > @@ -82,7 +84,9 @@ xfs_inobt_update( > > > union xfs_btree_rec rec; > > > > > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > > > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > > > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > > > + rec.inobt.ir_count = irec->ir_count; > > > + rec.inobt.ir_freecount = irec->ir_freecount; > > > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > > > return xfs_btree_update(cur, &rec); > > > } > > > > Hmmm - perhaps a similar set of helpers for sparse inode enabled > > filesystems > > > > We could do that for the insert/update helpers, but note again the > separate helpers would not split along the lines of sparse vs full > chunks. Even if we were to change the design such that they do, that > would have th effect of complicating some of the subsequent code. For I suspect it might, but I really don't like the idea of writing fields that don't actually exist (and hence are always zero) in the on-disk format to disk. See, for example, the v5 superblock field writes are conditional in xfs_sb_to_disk, the v3 inode field writes are conditional in xfs_dinode_to_disk, etc. > example, the merge/update code currently has no reason to care about > whether it has created a full chunk out of multiple sparse chunks. This > would require more code to make that distinction simply to pick the > correct api, for something that can easily be done with a simple generic > helper. The same goes for things like the finobt, where now > lookup/update/insert has to make distinctions depending on the type of > inode record. That was another thing that wasn't clear to me - does the finobt record format change on disk? I don't think it does, as it only holds a free count and a free inode bitmask, so it doesn't care which bits of the chunk are allocated or not.... > An alternate approach could be to stick with the generic helpers, but > try and tweak them to use the appropriate on-disk format depending on > the record. Then again, how can one really identify one from the other > in the lookup or _get_rec() scenarios? Solving these problem was exactly why I suggested different helpers - the btree ops structure that is chosen for the cursor is in a place where we know what format we are using, and that avoids needing "if (xfs_sb_version...)" checks in the helpers to determine what format we need to use. > > > @@ -118,6 +124,8 @@ xfs_inobt_insert_rec( > > > xfs_inofree_t free, > > > int *stat) > > > { > > > + cur->bc_rec.i.ir_holemask = 0; > > > + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > > > cur->bc_rec.i.ir_freecount = freecount; > > > cur->bc_rec.i.ir_free = free; > > > return xfs_btree_insert(cur, stat); > > > > That would make this sort of thing very clear - this doesn't look > > like it would work for a sparse chunk record... > > Right... but this is just a plumbing patch and effectively a placeholder > for the subsequent patches that implement the mechanism. I suppose the > api could have been pulled back sooner into this patch, but I'd rather > not reshuffle things just for that intermediate state. That context > probably wasn't quite clear to me at the time. > > Before I go one way or another here with regard to the on-disk data > structure, care to take a look at the subsequent patch(es) that use > these helpers? Patch 10 in particular pretty much sums up how these > helpers are used for sparse inode record management. Yup, I'll get to it. > FWIW, comments on the generic bitmap stuff is also appreciated as that's > another area I'm not totally convinved is done right. :) Why use the generic bitmap stuff rather than the existing XFS code? If that's just an in-memory change to the free mask processing, then it can be done separately to the sparse inode functionality, and probably should be done first in the series.... -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 16:39:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 61F077F6D for ; Sun, 8 Feb 2015 16:39:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 337808F8033 for ; Sun, 8 Feb 2015 14:39:39 -0800 (PST) X-ASG-Debug-ID: 1423435176-04bdf06a5b88630001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id xUvteGLmM5xWHLfR for ; Sun, 08 Feb 2015 14:39:37 -0800 (PST) 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: A2BqFgBo5NdUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ5EAQEBAQEBBQEBAQE4O4QNAQUnExwjEAgDDgoJJQ8FJQMHGhOILMkQAQEBAQEFAQEBAR4YhWyJdAeDFoEUBZhGknGCVIFQKjGCQgEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 08:59:20 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKaLv-0003PU-8U; Mon, 09 Feb 2015 09:29:19 +1100 Date: Mon, 9 Feb 2015 09:29:19 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 16/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Message-ID: <20150208222919.GD4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 16/18] xfs: use actual inode count for sparse records in bulkstat/inumbers References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-17-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-17-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423435176 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:53:03PM -0500, Brian Foster wrote: > The bulkstat and inumbers mechanisms make the assumption that inode > records consist of a full 64 inode chunk in several places. For example, > this is used to track how many inodes have been processed overall as > well as to determine whether a record has allocated inodes that must be > handled. > > This assumption is invalid for sparse inode records. While sparse inodes > will be marked as free in the ir_free mask, they are not accounted as > free in ir_freecount because they cannot be allocated. Therefore, > ir_freecount may be less than 64 inodes in an inode record for which all > physically allocated inodes are free (and in turn ir_freecount < 64 does > not signify that the record has allocated inodes). > > Create the xfs_inobt_count() helper to calculate the total number of > physically allocated inodes based on the holemask. Use the helper in > xfs_bulkstat() and xfs_inumbers() instead of the fixed > XFS_INODE_PER_CHUNK value to ensure correct accounting in the event of > sparse inode records. > > Signed-off-by: Brian Foster This should be moved to early in the patchset as a preparation patch. i.e. xfs_inobt_issparse() can be introduced without any other dependencies on the sparse inode changes, and then this factoring can be added before any of the actual sparse inode changes. That way anywhere that uses the number of allocated inodes in a chunk will be correct for sparse inodes even before sparse inode support is added... > --- > fs/xfs/libxfs/xfs_ialloc.c | 16 ++++++++++++++++ > fs/xfs/libxfs/xfs_ialloc.h | 5 +++++ > fs/xfs/xfs_itable.c | 14 ++++++++++---- > 3 files changed, 31 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index c104ee5..4d151ed 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -1207,6 +1207,22 @@ xfs_inobt_first_free_inode( > } > > /* > + * Calculate the real count of inodes in a chunk. > + */ > +int > +xfs_inobt_count( > + struct xfs_mount *mp, > + struct xfs_inobt_rec_incore *rec) > +{ > + ASSERT(!xfs_inobt_rec_check_count(mp, rec)); > + > + if (!xfs_inobt_issparse(rec->ir_holemask)) > + return XFS_INODES_PER_CHUNK; > + > + return rec->ir_count; > +} This btree record state check should probably be added to xfs_ialloc_btree.c. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 16:42:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7A3037F6D for ; Sun, 8 Feb 2015 16:42:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18505AC001 for ; Sun, 8 Feb 2015 14:42:08 -0800 (PST) X-ASG-Debug-ID: 1423435326-04cbb01165801f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id wpv6mh6CsdCk3rCv for ; Sun, 08 Feb 2015 14:42:06 -0800 (PST) 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: A2BqFgDP5ddUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ5EAQEBAQEBBQEBAQE4O4QNAQUnExwjEAgDDgoJJQ8FJQMHGhOILMkRAQEBAQYCAR8YhWyJdAeDFoEUBZhGgRmLG4Y9glSBUCoxgkIBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 09:03:18 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKaPl-0003Po-Qz; Mon, 09 Feb 2015 09:33:17 +1100 Date: Mon, 9 Feb 2015 09:33:17 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 13/18] xfs: update free inode record logic to support sparse inode records Message-ID: <20150208223317.GE4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 13/18] xfs: update free inode record logic to support sparse inode records References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-14-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-14-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423435326 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, Feb 06, 2015 at 02:53:00PM -0500, Brian Foster wrote: > xfs_difree_inobt() uses logic in a couple places that assume inobt > records refer to fully allocated chunks. Specifically, the use of > mp->m_ialloc_inos can cause problems for inode chunks that are sparsely > allocated. Sparse inode chunks can, by definition, define a smaller > number of inodes than a full inode chunk. > > Fix the logic that determines whether an inode record should be removed > from the inobt to use the ir_free mask rather than ir_freecount. > > Fix the agi counters modification to use ir_freecount to add the actual > number of inodes freed rather than assuming a full inode chunk. > > Signed-off-by: Brian Foster This should be moved to the start of the series, along with any other code that does rec.ir_freecount checks to see if the chunk has inodes in use or not. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 16:49:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 967737F6D for ; Sun, 8 Feb 2015 16:49:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30487AC002 for ; Sun, 8 Feb 2015 14:49:53 -0800 (PST) X-ASG-Debug-ID: 1423435783-04bdf06a5b88a50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NAa64IayjsNHzy8w for ; Sun, 08 Feb 2015 14:49:44 -0800 (PST) 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: A2BpFgAC59dUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ5EAQEBAQEBBQEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gsyREBAQgCIBiFbIl0B4QqBZhGknGCVIFQKjGCQgEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 09:19:43 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKafe-0003S3-UO; Mon, 09 Feb 2015 09:49:42 +1100 Date: Mon, 9 Feb 2015 09:49:42 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 12/18] xfs: filter out sparse regions from individual inode allocation Message-ID: <20150208224942.GG4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 12/18] xfs: filter out sparse regions from individual inode allocation References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-13-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-13-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423435783 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15055 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:59PM -0500, Brian Foster wrote: > Inode allocation from an existing record with free inodes traditionally > selects the first inode available according to the ir_free mask. With > sparse inode chunks, the ir_free mask could refer to an unallocated > region. We must mask the unallocated regions out of ir_free before using > it to select a free inode in the chunk. > > Create the xfs_inobt_first_free_inode() helper to find the first free > inode available of the allocated regions of the inode chunk. > > Signed-off-by: Brian Foster Helper can go early on in the patch set, and then when the sparse inode support is added the bitmap stuff can added to the helepr. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 17:04:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C39377F72 for ; Sun, 8 Feb 2015 17:04:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2848304032 for ; Sun, 8 Feb 2015 15:04:29 -0800 (PST) X-ASG-Debug-ID: 1423436666-04cb6c6b097fd90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Z8GcTt7z5RF69QTQ for ; Sun, 08 Feb 2015 15:04:26 -0800 (PST) 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: A2CAFgBH6tdUPPb7LHlcgwZSWoIzg3mpaQwBAQEBAQEGkkSFcwICAQECgQ1EAQEBAQEBBQEBAQE4O4QMAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTiCUHyRQBAQgCAR8YhWyJdAeEKgWSa4VbgU+RIoQkKjGCQgEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 09:32:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKas4-0003Tp-E3; Mon, 09 Feb 2015 10:02:32 +1100 Date: Mon, 9 Feb 2015 10:02:32 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode Message-ID: <20150208230232.GH4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-12-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-12-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423436666 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15055 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:58PM -0500, Brian Foster wrote: > Sparse inode allocations generally only occur when full inode chunk > allocation fails. This requires some level of filesystem space usage and > fragmentation. > > For filesystems formatted with sparse inode chunks enabled, do random > sparse inode chunk allocs when compiled in DEBUG mode to increase test > coverage. > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_ialloc.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 090d114..3e5d3eb 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -652,9 +652,18 @@ xfs_ialloc_ag_alloc( > > struct xfs_perag *pag; > > +#ifdef DEBUG > + int do_sparse = 0; > + > + /* randomly do sparse inode allocations */ > + if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb)) > + do_sparse = prandom_u32() & 1; > +#endif > + Bit ugly with all the ifdefs. If you define the do_sparse variable outside the ifdef, then the rest of the code other than this check doesn't need ifdefs. > memset(&args, 0, sizeof(args)); > args.tp = tp; > args.mp = tp->t_mountp; > + args.fsbno = NULLFSBLOCK; > > /* > * Locking will ensure that we don't have two callers in here > @@ -675,6 +684,10 @@ xfs_ialloc_ag_alloc( > agno = be32_to_cpu(agi->agi_seqno); > args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + > args.mp->m_ialloc_blks; > +#ifdef DEBUG > + if (do_sparse) > + goto sparse_alloc; > +#endif > if (likely(newino != NULLAGINO && > (args.agbno < be32_to_cpu(agi->agi_length)))) { > args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); > @@ -713,8 +726,7 @@ xfs_ialloc_ag_alloc( > * subsequent requests. > */ > args.minalignslop = 0; > - } else > - args.fsbno = NULLFSBLOCK; > + } > > if (unlikely(args.fsbno == NULLFSBLOCK)) { > /* > @@ -769,6 +781,9 @@ xfs_ialloc_ag_alloc( > * Finally, try a sparse allocation if the filesystem supports it and > * the sparse allocation length is smaller than a full chunk. > */ > +#ifdef DEBUG > +sparse_alloc: > +#endif > if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && > args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && > args.fsbno == NULLFSBLOCK) { The label can go after the if() statement, right? We've already guaranteed all those other parameters are true, though I suspect there's a case where that m_ialloc_min_blks < m_ialloc_blks will fail: block size larger than inode chunk size (e.g. 64k block size, 512 byte inodes) so that would result in the code above failing to allocate any inode chunks at all... Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Sun Feb 8 17:41:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 532247F7B for ; Sun, 8 Feb 2015 17:41:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1367C304039 for ; Sun, 8 Feb 2015 15:41:36 -0800 (PST) X-ASG-Debug-ID: 1423438892-04bdf06a5a89db0001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id aqu4BZIBSXI6oLK0 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 08 Feb 2015 15:41:34 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJH001FR8H2TN20@mailout1.samsung.com> for xfs@oss.sgi.com; Mon, 09 Feb 2015 08:41:27 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 9E.1C.18484.624F7D45; Mon, 09 Feb 2015 08:41:26 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-6d-54d7f42648f9 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id D2.F2.09430.624F7D45; Mon, 09 Feb 2015 08:41:26 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJH00EYU8H22R50@mmp2.samsung.com>; Mon, 09 Feb 2015 08:41:26 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: 'Eric Sandeen' , linux-fsdevel@vger.kernel.org, 'Ashish Sangwan' , xfs@oss.sgi.com References: <001f01d041cb$39fbbc70$adf33550$@samsung.com> <54D45068.2030209@sandeen.net> <002401d041cf$570eae40$052c0ac0$@samsung.com> <20150206222227.GN12722@dastard> In-reply-to: <20150206222227.GN12722@dastard> Subject: RE: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Date: Mon, 09 Feb 2015 08:41:26 +0900 X-ASG-Orig-Subj: RE: [PATCH] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-id: <001501d043f8$c143a290$43cae7b0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQHfjCuZWX9mXwjA1jY+crEVPEolmgJRinPaAqcVcFQCdmhPg5yNXvTA Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrBIsWRmVeSWpSXmKPExsWyRsSkSFfty/UQg4mfrCyWTrzEbLHl2D1G iz17T7JYtF7RsljUd4vRgdXj1CIJj9UXtjJ69G1ZxeixZfFDJo/Pm+QCWKO4bFJSczLLUov0 7RK4MnbP/8FSsIa74uhZrgbG+xxdjJwcEgImErdn/maGsMUkLtxbz9bFyMUhJLCUUeLp/DPs XYwcYEWN7fYQ8emMEie2P2SCcP4ySkw++YsRpIhNQFvizxZRkEEiAhoS0/YeARvKLNDCKPFv bQxIiZDAakaJGfIgYU4BXYltx7awg9jCAuESC482s4DYLAKqEovuLgSL8wpYSvxZe4YRwhaU +DH5HgvESC2J9TuPM0HY8hKb17yFul9BYsfZ14wQJ7hJzFixgxWiRkRi34t3jCAnSwhcY5dY /v0mO8QyAYlvkw+xQPwoK7HpANQcSYmDK26wTGCUmIVk9Swkq2chWT0LyYoFjCyrGEVTC5IL ipPSi4z1ihNzi0vz0vWS83M3MQIj9PS/Z/07GO8esD7EKMDBqMTD2yF3PUSINbGsuDL3EKMp 0EUTmaVEk/OBaSCvJN7Q2MzIwtTE1NjI3NJMSZx3odTPYCGB9MSS1OzU1ILUovii0pzU4kOM TBycUg2MMdWeb80iP4dKyfrxmO1eyru1Jlt3gd7BY/yrf82/FLXgbnn1lh2nV8pdM/tw3f34 /MrqLAthvrZvzwXuvfXiTHx6yslkr7JTu3jIlqVpc1SPbVh5v+Sn17srB+IKek/fP5a019w0 wPb7kbWvH+yNspK+X3I8acPD8PlFtlfaeJs7Tf9aNbdGKLEUZyQaajEXFScCABMxXSfLAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpileLIzCtJLcpLzFFi42I5/e+xoK7al+shBos2GVssnXiJ2WLLsXuM Fnv2nmSxaL2iZbGo7xajA6vHqUUSHqsvbGX06NuyitFjy+KHTB6fN8kFsEY1MNpkpCampBYp pOYl56dk5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAO1WUihLzCkFCgUkFhcr 6dthmhAa4qZrAdMYoesbEgTXY2SABhLWMGbsnv+DpWANd8XRs1wNjPc5uhg5OCQETCQa2+27 GDmBTDGJC/fWs3UxcnEICUxnlDix/SEThPOXUWLyyV+MIA1sAtoSf7aIgjSICGhITNt7hBnE ZhZoYZT4tzYGpERIYDWjxAx5kDCngK7EtmNb2EFsYYFwiYVHm1lAbBYBVYlFdxeCxXkFLCX+ rD3DCGELSvyYfI8FYqSWxPqdx5kgbHmJzWveMkPcqSCx4+xrRogT3CRmrNjBClEjIrHvxTvG CYxCs5CMmoVk1Cwko2YhaVnAyLKKUTS1ILmgOCk910ivODG3uDQvXS85P3cTIzj+n0nvYFzV YHGIUYCDUYmHt0PueogQa2JZcWXuIUYJDmYlEV6jj0Ah3pTEyqrUovz4otKc1OJDjKZAn05k lhJNzgemprySeENjEzMjSyNzQwsjY3MlcV4l+7YQIYH0xJLU7NTUgtQimD4mDk6pBsY5K2Wy Vrz+MG2x97JyriU8r/Q0lkzI3n/7mL7mJtuYQ64Kf6vqNx2ZoXNgWtPJAgn2z0vKg8vNklbm ss84sDCjf5LhZPH7M84yzpDfdOd61c99Jpoa9eVLxD8yWE1/88A8h/OiY23zVO4r/BP3SXWL xr+VZ+Xe/cF00+Z4Y4OQKGcD+cK6NSuUWIozEg21mIuKEwH+Lpc9FQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1423438893 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > On Fri, Feb 06, 2015 at 02:39:56PM +0900, Namjae Jeon wrote: > > > On 2/5/15 11:10 PM, Namjae Jeon wrote: > > > > Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. > > > > > > > > Signed-off-by: Namjae Jeon > > > > Signed-off-by: Ashish Sangwan > > > > --- > > > > man/man8/xfs_io.8 | 5 +++++ > > > > 1 file changed, 5 insertions(+) > > > > > > > > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > > > > index cf27b99..416206f 100644 > > > > --- a/man/man8/xfs_io.8 > > > > +++ b/man/man8/xfs_io.8 > > > > @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the > > > > manual page to de-allocates blocks and eliminates the hole created in this process > > > > by shifting data blocks into the hole. > > > > .TP > > > > +.BI finsert " offset length" > > > > +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the > > > > +.BR fallocate (2) > > > > +manual page > > > > > Hi Eric, > > > So, it looks like the fallocate(2) manpage will need an update as well. :) > > Right, I am planning to send the manpage patch for insert range when merging linus tree.. > > Best to have the man page with the rest of the code changes, that > way they all get reviewed at the same time. :) Agree. I will also send the manpage patch soon. Thanks :) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Sun Feb 8 17:58:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BEC0F7F7E for ; Sun, 8 Feb 2015 17:58:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F2938F8033 for ; Sun, 8 Feb 2015 15:58:05 -0800 (PST) X-ASG-Debug-ID: 1423439882-04bdf06a5b8aa00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id bGGnFwVEfEs8pANg for ; Sun, 08 Feb 2015 15:58:02 -0800 (PST) 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: A2BqFgBn99dUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ1EAQEBAQEBBQEBAQE4O4QNAQUnExwjEAgDDgoJJQ8FJQMHGhOILMkPAQEIAgEfGIVsiXQHhCoFlHyDSpJxgiQcgWQqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 10:24:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKbge-0003X2-Ia; Mon, 09 Feb 2015 10:54:48 +1100 Date: Mon, 9 Feb 2015 10:54:48 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap Message-ID: <20150208235448.GI4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-9-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-9-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423439882 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, Feb 06, 2015 at 02:52:55PM -0500, Brian Foster wrote: > The inobt record holemask field is a condensed data type designed to fit > into the existing on-disk record and is zero based (allocated regions > are set to 0, sparse regions are set to 1) to provide backwards > compatibility. This makes the type somewhat complex for use in higher > level inode manipulations such as individual inode allocation, etc. > > Rather than foist the complexity of dealing with this field to every bit > of logic that requires inode granular information, create the > xfs_inobt_ialloc_bitmap() helper to convert the holemask to an inode > allocation bitmap. The inode allocation bitmap is inode granularity > similar to the inobt record free mask and indicates which inodes of the > chunk are physically allocated on disk, irrespective of whether the > inode is considered allocated or free by the filesystem. The generic > bitmap type requires the use of generic kernel bitmap APIs. > > The bitmap_to_u64() helper is provided to convert the bitmap back to a > native 64-bit type (for native bitwise operations). This is required > because the generic bitmap code represents a bitmap as an array of > unsigned long in a little endian style (though each array value is cpu > order). To ensure compatibility with various word sizes and endianness', > bitmap_to_u64() exports the bitmap to little endian and swaps back to > cpu byte order. > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_ialloc.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 69 insertions(+) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 72ade0e..fc001d9 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -39,6 +39,8 @@ > #include "xfs_icache.h" > #include "xfs_trace.h" > > +STATIC void > +xfs_inobt_ialloc_bitmap(unsigned long *, struct xfs_inobt_rec_incore *); xfs_inobt_irec_to_allocmap() seems more appropriate for what it does. I'd also suggest it should be in xfs_ialloc_btree.c, too. > /* > * Allocation group level functions. > @@ -739,6 +741,73 @@ xfs_ialloc_get_rec( > return 0; > } > > +static inline uint64_t > +bitmap_to_u64( > + const unsigned long *bitmap, > + int nbits) > +{ > + __le64 lebitmap; > + > + ASSERT(nbits <= 64); > + > + /* > + * The bitmap format depends on the native word size. E.g., bit 0 could > + * land in the middle of the 64 bits on a big endian 32-bit arch (see > + * arch/powerpc/include/asm/bitops.h). To handle this, export the bitmap > + * as 64-bit little endian and convert back to native byte order. > + */ > + bitmap_copy_le(&lebitmap, bitmap, nbits); > + return le64_to_cpu(lebitmap); > +} Ok, so this is for doing logic operations on the bitmap, such as inverting or masking out a bunch of bits? The first use of this function is xfs_inobt_first_free_inode(), and the other use is in xfs_difree_inobt() to build the mask of inodes in the chunk that need to be freed, and in both those cases they do xfs_inobt_ialloc_bitmap(alloc, rec) allocmask = bitmap_to_u64(alloc, 64); and the local stack bitmap is otherwise unused. So, wouldn't a helper like: /* * Return a host format mask of all the allocated inodes in the * chunk. The bitmap format depends on the native word size (e.g. * see arch/powerpc/include/asm/bitops.h) and so we have to marshall * the bitmap through a defined endian conversion so that we can * perform host native 64 bit logic operations on the resultant * allocation mask. * * A bit value of 1 means the inode is allocated, a value of 0 means it * is free. */ u64 xfs_inobt_irec_to_allocmask( struct xfs_inobt_rec_incore *irec) { DECLARE_BITMAP(allocmap, 64), __le64 lebitmap; xfs_inobt_rec_to_allocmap(&allocmap, irec); bitmap_copy_le(&lebitmap, allocmap, 64); return le64_to_cpu(lebitmap); } > + > +/* > + * Convert the inode record holemask to an inode allocation bitmap. The inode > + * allocation bitmap is inode granularity and specifies whether an inode is > + * physically allocated on disk (not whether the inode is considered allocated > + * or free by the fs). > + * > + * We have to be careful with regard to byte order and word size since the > + * generic bitmap code uses primitive types. " a bit value of 1 means the inode is allocated, a value of 0 means it is free" > + */ > +STATIC void > +xfs_inobt_ialloc_bitmap( > + unsigned long *allocbmap, > + struct xfs_inobt_rec_incore *rec) > +{ > + int nextbit; > + DECLARE_BITMAP(holemask, 16); > + > + bitmap_zero(allocbmap, 64); > + > + /* > + * bitmaps are represented as an array of unsigned long (each in cpu > + * byte order). ir_holemask is only 16 bits, so direct assignment is > + * safe. > + */ > + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); BUILD_BUG_ON(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); i.e. if we come across a platform where this fails, break the build rather than waiting for the unlikely event of someone running a debug kernel on that platform... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 8 18:02:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB5B57F7E for ; Sun, 8 Feb 2015 18:02:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 990BE304043 for ; Sun, 8 Feb 2015 16:02:34 -0800 (PST) X-ASG-Debug-ID: 1423440151-04cbb0116381e20001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0AuXqas5PEjfnOxi for ; Sun, 08 Feb 2015 16:02:31 -0800 (PST) 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: A2BpFgCR+NdUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ1EAQEBAQEBBQEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gsyRQBAQgCAR8YhWyJHVcHhCoFmEaBGYVJjA+EJCoxgQOBPwEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 10:31:12 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKbmq-0003Y8-Bt; Mon, 09 Feb 2015 11:01:12 +1100 Date: Mon, 9 Feb 2015 11:01:12 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 09/18] xfs: support min/max agbno args in block allocator Message-ID: <20150209000112.GJ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 09/18] xfs: support min/max agbno args in block allocator References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-10-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-10-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423440151 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:56PM -0500, Brian Foster wrote: > The block allocator supports various arguments to tweak block allocation > behavior and set allocation requirements. The sparse inode chunk feature > introduces a new requirement not supported by the current arguments. > Sparse inode allocations must convert or merge into an inode record that > describes a fixed length chunk (64 inodes x inodesize). Full inode chunk > allocations by definition always result in valid inode records. Sparse > chunk allocations are smaller and the associated records can refer to > blocks not owned by the inode chunk. This model can result in invalid > inode records in certain cases. > > For example, if a sparse allocation occurs near the start of an AG, the > aligned inode record for that chunk might refer to agbno 0. If an > allocation occurs towards the end of the AG and the AG size is not > aligned, the inode record could refer to blocks beyond the end of the > AG. While neither of these scenarios directly result in corruption, they > both insert invalid inode records and at minimum cause repair to > complain, are unlikely to merge into full chunks over time and set land > mines for other areas of code. > > To guarantee sparse inode chunk allocation creates valid inode records, > support the ability to specify an agbno range limit for > XFS_ALLOCTYPE_NEAR_BNO block allocations. The min/max agbno's are > specified in the allocation arguments and limit the block allocation > algorithms to that range. The starting 'agbno' hint is clamped to the > range if the specified agbno is out of range. If no sufficient extent is > available within the range, the allocation fails. For backwards > compatibility, the min/max fields can be initialized to 0 to disable > range limiting (e.g., equivalent to min=0,max=agsize). > > Signed-off-by: Brian Foster Seems sane on reading the implementation. I'll see if I still think that way when I read the code that uses it ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From shhuiw@foxmail.com Sun Feb 8 19:00:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C73017F83 for ; Sun, 8 Feb 2015 19:00:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6558304032 for ; Sun, 8 Feb 2015 17:00:42 -0800 (PST) X-ASG-Debug-ID: 1423443636-04cbb0116484420001-NocioJ Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) by cuda.sgi.com with ESMTP id FqGyMS85hsz1pY0i (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 08 Feb 2015 17:00:38 -0800 (PST) X-Barracuda-Envelope-From: shhuiw@foxmail.com X-Barracuda-Apparent-Source-IP: 54.206.16.166 X-QQ-mid: esmtp34t1423443628t253t27822 Received: from me.io.internal.tilera.com (unknown [123.113.104.152]) by esmtp4.qq.com (ESMTP) with id ; Mon, 09 Feb 2015 09:00:20 +0800 (CST) X-QQ-SSF: 0100000000000030211200000000000 X-QQ-FEAT: 80ePTlCTi2j3diJUvgmHEITwdz0Sl00orOPfrPTUkOQNbfEb9YQWaxzz38f9w ubHvzwk2elUBkx4U6QgYKqExRhgprHRmemkCh6HAt3tXB01DAPWve1B1o24SWMpZtnYJQo+ H8SzXUGer3KHx6+vGHF0wd6/x7ti5n0uP+w7e1rSIA48qOIjUrk63fjQp3FUkRv+0ofSpZq I7V6gknJ22g== X-QQ-GoodBg: 0 From: Wang Sheng-Hui To: david@fromorbit.com, xfs@oss.sgi.com Subject: [PATCH] xfs: remove old and redundant comment in xfs_mount_validate_sb Date: Mon, 9 Feb 2015 09:00:16 +0800 X-ASG-Orig-Subj: [PATCH] xfs: remove old and redundant comment in xfs_mount_validate_sb Message-Id: <1423443616-3004-1-git-send-email-shhuiw@foxmail.com> X-Mailer: git-send-email 2.1.2 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbgau1.qq.com[54.206.16.166] X-Barracuda-Start-Time: 1423443637 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Per Dave, The error messages document the reason for the checks better than the comment and the comments about volume mounts date back to Irix and so aren't relevant any more. So just remove the old and redundant comment. Signed-off-by: Wang Sheng-Hui --- fs/xfs/libxfs/xfs_sb.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 752915f..b231c59 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -174,14 +174,6 @@ xfs_mount_validate_sb( bool check_inprogress, bool check_version) { - - /* - * If the log device and data device have the - * same device number, the log is internal. - * Consequently, the sb_logstart should be non-zero. If - * we have a zero sb_logstart in this case, we may be trying to mount - * a volume filesystem in a non-volume manner. - */ if (sbp->sb_magicnum != XFS_SB_MAGIC) { xfs_warn(mp, "bad magic number"); return -EWRONGFS; -- 2.1.2 From david@fromorbit.com Sun Feb 8 19:25:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0728A7F85 for ; Sun, 8 Feb 2015 19:25:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E880B304032 for ; Sun, 8 Feb 2015 17:25:25 -0800 (PST) X-ASG-Debug-ID: 1423445122-04cb6c6b0c86a10001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id vPurYI6tnEiOyake for ; Sun, 08 Feb 2015 17:25:22 -0800 (PST) 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: A2BqFgBtC9hUPPb7LHlcgwaBLIIzg3mpdQEBAQEBAQaYNwICAQECgQ1EAQEBAQEBBQEBAQE4O4QNAQUnExwjEAgDDgoJJQ8FJQMHGhOILMkVAQEIAgEfGIVshAqFageEKgWNOIdEg0qBGYMDiBiGPYIhAxwUgVAqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Feb 2015 11:55:20 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKd6F-0003dp-4Y; Mon, 09 Feb 2015 12:25:19 +1100 Date: Mon, 9 Feb 2015 12:25:19 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure Message-ID: <20150209012519.GK4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-11-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423252385-3063-11-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1423445122 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15059 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 06, 2015 at 02:52:57PM -0500, Brian Foster wrote: > xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode > chunk. If all else fails, reduce the allocation to the minimum sparse > granularity and attempt to allocate a sparse inode chunk. > > If sparse chunk allocation succeeds, check whether an inobt record > already exists that can track the chunk. If so, inherit and update the > existing record. Otherwise, insert a new record for the sparse chunk. > > Update xfs_inobt_insert_rec() to take the holemask as a parameter and > set the associated field on disk. Create the xfs_inobt_update_insert() > helper to handle the sparse chunk allocation case - insert or update an > existing record depending on whether it already exists. > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_ialloc.c | 397 +++++++++++++++++++++++++++++++++++++++++++-- > fs/xfs/xfs_trace.h | 47 ++++++ > 2 files changed, 426 insertions(+), 18 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index fc001d9..090d114 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -122,12 +122,16 @@ xfs_inobt_get_rec( > STATIC int > xfs_inobt_insert_rec( > struct xfs_btree_cur *cur, > + __uint16_t holemask, > + __uint8_t count, > __int32_t freecount, > xfs_inofree_t free, > int *stat) > { > - cur->bc_rec.i.ir_holemask = 0; > - cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > + ASSERT(count == 0 || xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)); > + > + cur->bc_rec.i.ir_holemask = holemask; > + cur->bc_rec.i.ir_count = count; > cur->bc_rec.i.ir_freecount = freecount; > cur->bc_rec.i.ir_free = free; > return xfs_btree_insert(cur, stat); Ok, so I'd definitely prefer two separate helpers here so that we don't need asserts or validity checking.... > @@ -151,6 +155,19 @@ xfs_inobt_insert( > xfs_agino_t thisino; > int i; > int error; > + uint8_t count; > + > + /* > + * Only set ir_count in the inobt record if the sparse inodes feature is > + * enabled. If disabled, we must maintain backwards compatibility with > + * the older inobt record format where the current count and holemask > + * fields map to the higher order bytes of freecount and thus must be > + * zeroed. > + */ > + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) > + count = XFS_INODES_PER_CHUNK; > + else > + count = 0; I'd strongly suggest that we pass the holemask, count and freecount from the caller, for reasons that will become obvious later. > @@ -164,7 +181,7 @@ xfs_inobt_insert( > } > ASSERT(i == 0); > > - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, > + error = xfs_inobt_insert_rec(cur, 0, count, XFS_INODES_PER_CHUNK, > XFS_INOBT_ALL_FREE, &i); > if (error) { > xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); And this hunk would become: if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { error = xfs_inobt_insert_sprec(cur, holemask, count, freecount, &i); holemask, else error = xfs_inobt_insert_rec(cur, count, freecount, &i); > @@ -174,8 +191,58 @@ xfs_inobt_insert( > } > > xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); > + return 0; > +} > > +/* > + * Update or insert a new record based on a sparse inode chunk allocation. > + * > + * If a record already exists, the new record is an updated version of that > + * record based on a merge of sparse inode chunks. Update the record in place. > + * Otherwise, insert a new record in the tree. Note that the record to insert > + * must already have been aligned and merged, if necessary. > + */ > +STATIC int > +xfs_inobt_update_insert( > + struct xfs_mount *mp, > + struct xfs_trans *tp, > + struct xfs_buf *agbp, > + struct xfs_inobt_rec_incore *rec, > + xfs_btnum_t btnum) > +{ > + struct xfs_btree_cur *cur; > + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); > + int i; > + int error; > + > + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); > + > + error = xfs_inobt_lookup(cur, rec->ir_startino, XFS_LOOKUP_EQ, &i); > + if (error) > + goto error; > + if (i == 1) { > + /* found a record, update it with the merged record */ > + error = xfs_inobt_update(cur, rec); > + if (error) > + goto error; > + goto out; > + } > + > + /* no existing record, insert a new one */ > + error = xfs_inobt_insert_rec(cur, rec->ir_holemask, rec->ir_count, > + rec->ir_freecount, rec->ir_free, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + > +out: > + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); > return 0; > + > +error: > + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); > + return error; > } I think that the way you've factored out the sparse inode record update code can do with some work. I'll come back to this. > @@ -358,6 +453,183 @@ xfs_ialloc_inode_init( > } > > /* > + * Align a record for a recently allocated sparse chunk. The input is a record > + * that describes the unaligned chunk. The record is aligned such that it is fit > + * for insertion (or merge) into the on-disk inode btrees. > + */ > +STATIC void > +xfs_align_sparse_rec( > + struct xfs_mount *mp, > + struct xfs_inobt_rec_incore *rec) > +{ > + xfs_agblock_t agbno; > + xfs_agblock_t mod; > + int offset; > + uint16_t allocmask; > + > + agbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); > + mod = agbno % mp->m_sb.sb_inoalignmt; > + if (!mod) > + return; > + > + /* calculate the inode offset and align startino */ > + offset = mod << mp->m_sb.sb_inopblog; > + rec->ir_startino -= offset; > + > + /* > + * Since startino has been aligned down, we have to left shift > + * ir_holemask such that it continues to represent the same physical > + * inodes as the unaligned record. The unaligned record by definition > + * tracks the allocated inodes with the lowest order bits. > + * > + * ir_holemask is inverted before the shift such that set bits represent > + * allocated inodes. This makes it safe for the bit-shift to introduce > + * zeroes in the lower order bits without corrupting the record. > + * > + * Note that no change is required for ir_count, ir_freecount or > + * ir_free. The count values are not affected by alignment and ir_free > + * is initialized to 1s for all inodes, sparse or otherwise. > + */ > + allocmask = ~rec->ir_holemask; > + allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; > + rec->ir_holemask = ~allocmask; > +} I don't understand why the holemask would need changing. I would have expected this to be done before the hole mask has been placed inside the record. Indeed, putting it into the record first means we have to deal with inversions and jump through other hoops. static void xfs_align_sparse_ino( struct xfs_mount *mp, xfs_agino_t *startino, uint16_t *allocmask) { agbno = XFS_AGINO_TO_AGBNO(mp, *startino); mod = agbno % mp->m_sb.sb_inoalignmt; if (!mod) return; offset = mod << mp->m_sb.sb_inopblog; *startino -= offset; *allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; } And then place the result in the irec.... > +/* > + * Determine whether a sparse inode records can be merged. The inode ranges > + * must match and there must be no allocation overlap between the records. > + */ Hmmm - src + target is not great for an operation where both records are a source. Perhaps be explict in the comment? e.g. /* * Determine whether the source inode record can be merged into a * target record. Both records must be sparse, the inode ranges * must match and there must be no allocation overlap between the * records. */ > +STATIC bool > +__xfs_inobt_can_merge( > + struct xfs_inobt_rec_incore *trec, /* tgt record */ > + struct xfs_inobt_rec_incore *srec) /* src record */ If we detect overlap, isn't that an indication of corruption? > +{ > + DECLARE_BITMAP(talloc, 64); > + DECLARE_BITMAP(salloc, 64); > + DECLARE_BITMAP(tmp, 64); > + > + /* records must cover the same inode range */ > + if (trec->ir_startino != srec->ir_startino) > + return false; > + > + /* both records must be sparse */ > + if (!xfs_inobt_issparse(trec->ir_holemask) || > + !xfs_inobt_issparse(srec->ir_holemask)) > + return false; > + > + /* can't exceed capacity of a full record */ > + if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK) > + return false; probably also need to check that both records have inodes allocated in them. ir_count == 0 is indicative of a corrupt record, right? > + > + /* verify there is no allocation overlap */ > + xfs_inobt_ialloc_bitmap(talloc, trec); > + xfs_inobt_ialloc_bitmap(salloc, srec); > + > + bitmap_and(tmp, salloc, talloc, 64); > + if (!bitmap_empty(tmp, 64)) > + return false; And if one has an ir_count of zero, the bitmap will always be zero.... > +/* > + * Merge two sparse inode records. The caller must call __xfs_inobt_can_merge() > + * to ensure the merge is valid. > + */ same thing about src/target here. > +STATIC void > +__xfs_inobt_rec_merge( > + struct xfs_inobt_rec_incore *trec, /* target */ > + struct xfs_inobt_rec_incore *srec) /* src */ > +{ > + ASSERT(trec->ir_startino == srec->ir_startino); > + > + /* combine the counts */ > + trec->ir_count += srec->ir_count; > + trec->ir_freecount += srec->ir_freecount; > + > + /* merge the holemask */ > + trec->ir_holemask &= srec->ir_holemask; Comments in this function are not very useful. Please remind me: does the holemask use bit value of 1 as allocated or as a hole? My head is full of allocmask stuff and so I can't tell if a merge should use |= or &= to get the correct value. > + /* merge the free mask */ > + trec->ir_free &= srec->ir_free; Same here. > +} > + > +/* > + * Determine whether a newly allocated sparse inode chunk record overlaps with > + * an existing sparse record in the inobt. When sparse inode chunks are enabled, > + * all inode chunk alignment is increased from cluster size to physical inode > + * chunk size. This means that the smallest, non-zero gap between two inode > + * chunks is at least one full inode chunk. When a sparse inode chunk is > + * allocated, the containing record is also aligned in this manner such that > + * future sparse allocations within that same range all align to the same record > + * startino. This alignment policy supports the ability to merge sparse chunks > + * into complete chunks over time. > + * > + * Given an newly allocated/aligned sparse inode record, look up whether a > + * sparse record already exists at this startino. If so, merge the two records > + * and return the merged record in nrec. > + * > + * An error is returned if records overlap but a merge is not possible. Given > + * the alignment constraints described above, this should never happen and thus > + * is treated as fs corruption. > + */ > +STATIC int > +xfs_inobt_rec_merge( > + struct xfs_mount *mp, > + struct xfs_trans *tp, > + struct xfs_buf *agbp, > + xfs_btnum_t btnum, > + struct xfs_inobt_rec_incore *nrec) /* in/out: new/merged rec. */ > +{ > + struct xfs_btree_cur *cur; > + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); > + int error; > + int i; > + struct xfs_inobt_rec_incore rec; > + > + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); > + > + /* the new record is pre-aligned so we know where to look */ > + error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); > + if (error) > + goto error; > + /* if nothing there, we're done */ > + if (i == 0) > + goto out; > + > + error = xfs_inobt_get_rec(cur, &rec, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + ASSERT(rec.ir_startino == nrec->ir_startino); XFS_WANT_CORRUPTED_GOTO() is better than an assert here. On a debug kernel, it will still assert, but on a production kernel it will trigger a corruption error rather than potentially propagating a corruption further. > + /* > + * This should never happen. If we have coexisting records that cannot > + * merge, something is seriously wrong. > + */ > + if (!__xfs_inobt_can_merge(nrec, &rec)) { > + error = -EFSCORRUPTED; > + goto error; > + } Ah, so it is a corruption issue if merges can't occur. ;) XFS_WANT_CORRUPTED_GOTO(!__xfs_inobt_can_merge(nrec, &rec)); > @@ -514,6 +828,65 @@ xfs_ialloc_ag_alloc( > * Convert the results. > */ > newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); > + > + if (xfs_inobt_issparse(~allocmask)) { > + /* > + * We've allocated a sparse chunk... > + */ > + rec.ir_startino = newino; > + rec.ir_holemask = ~allocmask; > + rec.ir_count = newlen; > + rec.ir_freecount = newlen; > + rec.ir_free = XFS_INOBT_ALL_FREE; > + > + /* align record and update newino for agi_newino */ > + xfs_align_sparse_rec(args.mp, &rec); > + newino = rec.ir_startino; See my earlier comments about aligning before putting stuff into the record, especially as you are having to pull modified information straight back out of the record. > + error = xfs_inobt_rec_merge(args.mp, tp, agbp, XFS_BTNUM_INO, > + &rec); > + if (!error) > + error = xfs_inobt_rec_check_count(args.mp, &rec); > + if (error == -EFSCORRUPTED) { > + xfs_alert(args.mp, > + "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u", > + XFS_AGINO_TO_INO(args.mp, agno, > + rec.ir_startino), > + rec.ir_holemask, rec.ir_count); > + xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE); > + } > + if (error) > + return error; > + > + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, > + XFS_BTNUM_INO); > + if (error) > + return error; > + > + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { > + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, > + XFS_BTNUM_FINO); > + if (error) > + return error; > + } I think this needs to become a helper function, and the implementation refactored. The reason I say this is that the xfs_inobt_rec_merge() function already looks up the record that is to be updated, and if it exists if calculates the merged record value. If then drops all that state and returns the merged record. Then we call xfs_inobt_update_insert() to determine if we have to update the existing record with the merged record (i.e. build all the state again), and then call xfs_inobt_update() on that record. Essentially, if xfs_inobt_rec_merge() determines we have a merge candidate, we should do the btree update there immediately, as well as fix up the finobt record. If we aren't doing a record merge and update, then it's just an insert operation, and we can use the modified xfs_inobt_insert() function I mentioned earlier to pass the partial chunk record information for insertion. Perhaps even just pass the irec structure... > + } else { > + /* full chunk - insert new records to both btrees */ > + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, > + XFS_BTNUM_INO); > + if (error) > + return error; > + > + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { > + error = xfs_inobt_insert(args.mp, tp, agbp, newino, > + newlen, XFS_BTNUM_FINO); > + if (error) > + return error; > + } And this could pass an irec that indicates a full inode chunk rather than just the subset of inofmration needed to describe a full inode chunk. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jojo@nb-channel.com Sun Feb 8 20:53:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1432D7F87 for ; Sun, 8 Feb 2015 20:53:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA4DD8F8033 for ; Sun, 8 Feb 2015 18:53:25 -0800 (PST) X-ASG-Debug-ID: 1423450402-04bdf06a5a92490001-NocioJ Received: from hwhost4.qiye.163.com (hwhost4.qiye.163.com [180.150.142.123]) by cuda.sgi.com with ESMTP id IXkmzLBogB6TDPK7 for ; Sun, 08 Feb 2015 18:53:22 -0800 (PST) X-Barracuda-Envelope-From: jojo@nb-channel.com X-Barracuda-Apparent-Source-IP: 180.150.142.123 Received: from jojo$nb-channel.com ( [36.22.59.216] ) by ajax-webmail-wmsvr1 (Coremail) ; Mon, 9 Feb 2015 10:40:42 +0800 (CST) X-Originating-IP: [36.22.59.216] Date: Mon, 9 Feb 2015 10:40:42 +0800 (CST) From: Jojo To: xfs@oss.sgi.com Subject: =?UTF-8?Q?FW=EF=BC=9Aelevator_door_operator?= X-Priority: 3 X-ASG-Orig-Subj: =?UTF-8?Q?FW=EF=BC=9Aelevator_door_operator?= X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20140422(26738.6344) Copyright (c) 2002-2015 www.mailtech.cn 163-hosting Content-Type: multipart/alternative; boundary="----=_Part_20860_1934128085.1423449642760" MIME-Version: 1.0 Message-ID: <24ab4e37.9c7.14b6c35d708.Coremail.jojo@nb-channel.com> X-CM-TRANSID:yWR4CkBZkkUrHthUx3o+AA--.252W X-CM-SenderInfo: pmrm0qlqenuxpdqqvzoofrz/1tbiBBKVS1NXwLgbzAAEsn X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== X-Barracuda-Connect: hwhost4.qiye.163.com[180.150.142.123] X-Barracuda-Start-Time: 1423450402 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15062 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_20860_1934128085.1423449642760 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 SGkKCiAKClRoaXMgaXMgTmluYSBmcm9tIE5pbmdibyBDaGFubmVsIEVsZWN0cmljYWwgY28uLGx0 ZC4gV2UgYXJlIGEgcHJvZmVzc2lvbmFsIG1hbnVmYWN0dXJlciAgYW5kIGRlc2lnbmVyIGluIGVs ZXZhdG9yIHBhcnRzLCAgaXRzIG1haW4gcHJvZHVjdHMgYXJlIGFjY2Vzc29yaWVzIG9mIGVsZXZh dG9yIGFuZCBlc2NhbGF0b3Igc3VjaCBhczogZG9vciBvcGVyYXRvciwgc2VjdXJpdHkgY29tcG9u ZW50cywgTG9hZCBtZWFzdXJpbmcgZGV2aWNlLCBsaWdodCBjdXJ0YWluIGFuZCBtb3Zpbmcgd2Fs a3dheeKAmXMgcGVkYWwgZXRjLgoKV2Ugc2VsbCBoaWdoIHF1YWxpdHkgZWxldmF0b3IgYWNjZXNz b3JpZXMgb2YgZG9tZXN0aWMgYW5kIGludGVybmF0aW9uYWwgZmFtb3VzIGJyYW5kcy4gV2UgY2Fu IGZvcm0gY29tcGxldGUgc2V0cyB0byBtYW55IGVsZXZhdG9yIGJyYW5kcyBzdWNoIGFzIE1pdHN1 YmlzaGksIFRoeXNzZW4sIE90aXMsIFNjaGluZGxlciwgS09ORSwgRnVqaSwgYW5kIFl1bmd0YXkg ZXRjLgoKIAoKUGxzIGZlZWwgZnJlZSB0byBjb250YWN0IHdpdGggbWUgaWYgeW91IHdvdWxkIGxp a2UgdG8ga25vdyBtb3JlICEKCkIud2lzaGVzCgogCgpOaW5hCgogCk5pbmdibyBDaGFubmVsIEVs ZWN0cm9tZWNoYW5pY2FsIENvLiBMdGQKUm9vbSAxNTEyLE1vcmdhbiBJbnRlcm5hdGlvbmFsIEJ1 bGRpbmcgQywKVGFpaGUgUm9hZCxCZWlsdW4sIE5pbmdibywgWmhlamlhbmcgMzAwMDEyLCBDaGlu YQpUZWw6IDAwODYgNTc0IDg2ODAyNjg4ICAgICBGYXg6IDAwODYgNTc0ODY4MDI3ODgKU2t5cGU6 Y2hhbm5lbC1uaW5hCgoK ------=_Part_20860_1934128085.1423449642760 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PERJVj4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJ TjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGFsaWduPSJsZWZ0 Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6 ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBt c28tZm9udC1rZXJuaW5nOiAwcHQiPjxGT05UIHNpemU9IjMiPkhpPG86cD48L286cD48L0ZPTlQ+ PC9TUEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7 IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGFsaWdu PSJsZWZ0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1G QU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQiPjxvOnA+PEZPTlQgc2l6ZT0iMyI+Jm5ic3A7PC9G T05UPjwvbzpwPjwvU1BBTj48L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIiBhbGlnbj0ibGVmdCI+PFNQQU4+PEZPTlQgZmFjZT0iQXJpYWwiPlRoaXMgaXMgTmluYSBm cm9tIE5pbmdibyBDaGFubmVsIEVsZWN0cmljYWwgY28uLGx0ZC4gV2UgYXJlIGEgcHJvZmVzc2lv bmFsIG1hbnVmYWN0dXJlciZuYnNwOyBhbmQgZGVzaWduZXIgaW4gZWxldmF0b3IgcGFydHMsJm5i c3A7IGl0cyBtYWluIHByb2R1Y3RzIGFyZSBhY2Nlc3NvcmllcyBvZiBlbGV2YXRvciBhbmQgZXNj YWxhdG9yIHN1Y2ggYXM6IGRvb3Igb3BlcmF0b3IsIHNlY3VyaXR5IGNvbXBvbmVudHMsIExvYWQg bWVhc3VyaW5nIGRldmljZSwgbGlnaHQgY3VydGFpbiBhbmQgbW92aW5nIHdhbGt3YXnigJlzIHBl ZGFsIGV0Yy48bzpwPjwvbzpwPjwvRk9OVD48L1NQQU4+PC9QPgo8UCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2lu YXRpb246IHdpZG93LW9ycGhhbiIgYWxpZ249ImxlZnQiPjxTUEFOPjxGT05UIGZhY2U9IkFyaWFs Ij5XZSBzZWxsIGhpZ2ggcXVhbGl0eSBlbGV2YXRvciBhY2Nlc3NvcmllcyBvZiBkb21lc3RpYyBh bmQgaW50ZXJuYXRpb25hbCBmYW1vdXMgYnJhbmRzLiBXZSBjYW4gZm9ybSBjb21wbGV0ZSBzZXRz IHRvIG1hbnkgZWxldmF0b3IgYnJhbmRzIHN1Y2ggYXMgTWl0c3ViaXNoaSwgVGh5c3NlbiwgT3Rp cywgU2NoaW5kbGVyLCBLT05FLCBGdWppLCBhbmQgWXVuZ3RheSBldGMuPC9GT05UPjwvU1BBTj48 L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46 IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiBhbGlnbj0ibGVmdCI+ PFNQQU4+PEZPTlQgZmFjZT0iQXJpYWwiPjwvRk9OVD48L1NQQU4+Jm5ic3A7PC9QPgo8UCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgYWxpZ249ImxlZnQiPjxTUEFOIGxhbmc9 IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fu cy1zZXJpZic7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDBwdCI+PEZPTlQgc2l6ZT0iMyI+UGxzIGZlZWwgZnJlZSB0byBjb250YWN0IHdpdGggbWUg aWYgeW91IHdvdWxkIGxpa2UgdG8ga25vdyBtb3JlICEgPC9GT05UPjwvU1BBTj48L1A+PFNQQU4g bGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwn LCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMHB0Ij4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9IldISVRFLVNQQUNFOiBu b3JtYWw7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBXT1JELVNQQUNJTkc6IDBweDsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQ6IDE0cHgvMjNweCBBcmlhbDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgTEVU VEVSLVNQQUNJTkc6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9r ZS13aWR0aDogMHB4Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkxJTkUtSEVJR0hUOiAyMXB4 IiB2ZXJkYW5hPSIiIGZvbnQtc2l6ZTo9IiI+PFNQQU4gc3R5bGU9IldISVRFLVNQQUNFOiBub3Jt YWw7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBXT1JELVNQQUNJTkc6IDBweDsgRkxPQVQ6IG5vbmU7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxNHB4LzIxcHggQXJpYWw7IERJU1BMQVk6IGlubGlu ZSAhaW1wb3J0YW50OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyAt d2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxGT05UIHNpemU9IjMiPkIud2lzaGVzPC9G T05UPjwvU1BBTj48L1NQQU4+PC9QPgo8UCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iV0hJVEUt U1BBQ0U6IG5vcm1hbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBD T0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRweC8yM3B4IEFyaWFsOyBNQVJHSU46IDBjbSAwY20g MHB0OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iTElORS1IRUlH SFQ6IDIxcHgiIHZlcmRhbmE9IiIgZm9udC1zaXplOj0iIj48Rk9OVCBzaXplPSIzIj48L0ZPTlQ+ PC9TUEFOPiZuYnNwOzwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9IldISVRFLVNQQUNF OiBub3JtYWw7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBXT1JELVNQQUNJTkc6IDBweDsgQ09MT1I6 IHJnYigwLDAsMCk7IEZPTlQ6IDE0cHgvMjNweCBBcmlhbDsgTUFSR0lOOiAwY20gMGNtIDBwdDsg TEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0 cm9rZS13aWR0aDogMHB4Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkxJTkUtSEVJR0hUOiAy MXB4IiB2ZXJkYW5hPSIiIGZvbnQtc2l6ZTo9IiI+PEZPTlQgc2l6ZT0iMyI+TmluYTwvRk9OVD48 L1NQQU4+PC9QPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsg VEVYVC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVDogMTRweC8yMXB4IEFyaWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlO REVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIHZlcmRhbmE9IiIgbXNv LWJpZGktZm9udC1zaXplOj0iIj4KPERJViB2ZXJkYW5hPSIiIG5vcm1hbD0iIiBub25lPSIiIHJn Yj0iIiB5YWhlaT0iIiBtaWNyb3NvZnQ9IiIgYmFja2dyb3VuZC1jb2xvcjo9IiIgZm9udC1zdHJl dGNoOj0iIiBmb250LXNpemUtYWRqdXN0Oj0iIiB3aGl0ZS1zcGFjZTo9IiIgd29yZC1zcGFjaW5n Oj0iIiBsZXR0ZXItc3BhY2luZzo9IiIgdGV4dC1pbmRlbnQ6PSIiIHRleHQtdHJhbnNmb3JtOj0i IiBjb2xvcjo9IiI+PEZPTlQgc2l6ZT0iNCI+PC9GT05UPiZuYnNwOzwvRElWPgo8RElWIHZlcmRh bmE9IiIgbm9ybWFsPSIiIG5vbmU9IiIgcmdiPSIiIHlhaGVpPSIiIG1pY3Jvc29mdD0iIiBiYWNr Z3JvdW5kLWNvbG9yOj0iIiBmb250LXN0cmV0Y2g6PSIiIGZvbnQtc2l6ZS1hZGp1c3Q6PSIiIHdo aXRlLXNwYWNlOj0iIiB3b3JkLXNwYWNpbmc6PSIiIGxldHRlci1zcGFjaW5nOj0iIiB0ZXh0LWlu ZGVudDo9IiIgdGV4dC10cmFuc2Zvcm06PSIiIGNvbG9yOj0iIj48Rk9OVCBzaXplPSI0Ij5OaW5n Ym8gQ2hhbm5lbCBFbGVjdHJvbWVjaGFuaWNhbCBDby4gTHRkPC9GT05UPjwvRElWPgo8RElWIHN0 eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBURVhULVRSQU5TRk9STTogbm9uZTsgV09SRC1TUEFD SU5HOiAwcHg7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxNHB4LzIzcHggQXJpYWw7IExFVFRF Ui1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRF WFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEZPTlQgZmFj ZT0iSGVsdmV0aWNhLCBNaWNyb3NvZnQgWWFoZWksIHZlcmRhbmEiPjxTUEFOPgo8RElWPgo8RElW PjxGT05UIHNpemU9IjQiIGZhY2U9IkhlbHZldGljYSwgTWljcm9zb2Z0IFlhaGVpLCB2ZXJkYW5h Ij48U1BBTj5Sb29tIDE1MTIsTW9yZ2FuIEludGVybmF0aW9uYWwgQnVsZGluZyBDLDwvU1BBTj48 L0ZPTlQ+PC9ESVY+CjxESVY+PEZPTlQgc2l6ZT0iNCI+PEZPTlQgZmFjZT0iSGVsdmV0aWNhLCBN aWNyb3NvZnQgWWFoZWksIHZlcmRhbmEiPjxTUEFOPlRhaWhlIFJvYWQsPC9TUEFOPjwvRk9OVD48 U1BBTiB2ZXJkYW5hPSIiIHlhaGVpPSIiIG1pY3Jvc29mdD0iIj5CZWlsdW4sIE5pbmdibywgWmhl amlhbmcgMzAwMDEyLDxTUEFOIGNsYXNzPSJBcHBsZS1jb252ZXJ0ZWQtc3BhY2UiPiZuYnNwOzwv U1BBTj48L1NQQU4+PFNQQU4gdmVyZGFuYT0iIiB5YWhlaT0iIiBtaWNyb3NvZnQ9IiI+Q2hpbmE8 L1NQQU4+PC9GT05UPjwvRElWPgo8RElWIHZlcmRhbmE9IiIgeWFoZWk9IiIgbWljcm9zb2Z0PSIi PjxGT05UIHNpemU9IjQiPlRlbDogMDA4NiA1NzQgODY4MDI2ODggJm5ic3A7ICZuYnNwOyZuYnNw O0ZheDogMDA4NiA1NzQ4NjgwMjc4ODwvRk9OVD48L0RJVj48L0RJVj4KPERJViB2ZXJkYW5hPSIi IHlhaGVpPSIiIG1pY3Jvc29mdD0iIj48Rk9OVCBzaXplPSI0Ij5Ta3lwZTpjaGFubmVsLW5pbmE8 L0ZPTlQ+PC9ESVY+PC9TUEFOPjwvRk9OVD48L0RJVj48L1NQQU4+PC9TUEFOPjxCUj48QlI+PC9E SVY+ ------=_Part_20860_1934128085.1423449642760-- From 3tFjYVAoJA3MnRqgfgYXmzXdRZc.TfdoWjfjj.jXZ.Tfd@trix.bounces.google.com Mon Feb 9 00:50:34 2015 Return-Path: <3tFjYVAoJA3MnRqgfgYXmzXdRZc.TfdoWjfjj.jXZ.Tfd@trix.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 828627F88 for ; Mon, 9 Feb 2015 00:50:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 543C38F8033 for ; Sun, 8 Feb 2015 22:50:31 -0800 (PST) X-ASG-Debug-ID: 1423464628-04bdf06a599b880001-NocioJ Received: from mail-pa0-f71.google.com (mail-pa0-f71.google.com [209.85.220.71]) by cuda.sgi.com with ESMTP id LFPafk617IsiNZE0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Feb 2015 22:50:29 -0800 (PST) X-Barracuda-Envelope-From: 3tFjYVAoJA3MnRqgfgYXmzXdRZc.TfdoWjfjj.jXZ.Tfd@trix.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.220.71 X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.220.71] Received: by mail-pa0-f71.google.com with SMTP id kx10so62239417pab.2 for ; Sun, 08 Feb 2015 22:50:28 -0800 (PST) X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.220.71] X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.220.71] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:message-id:date:subject:from:to:content-type; bh=jauwD8oBomOwWWtmpRwBafJbBG9h5lW2zBmUpmKhK3E=; b=BabAf2gZiWmWfs/AxDo3TogZeKJvvBbi6pmvoGVNG5QZ5g4LhKvnrQyGZk1gpnKW9Q zIbU8XSBKcpfzFx6ucTMO9kh1nHREsf04ycLD0TZkI1uW9Xo52rdX5X9xoAyrQ1+NdHy eNYrQD2/aL1UhX02HVNykBYIkEYobTjiNjC1mtYP6nmHPGAzKltjavmTcpcrVFEJ3djg uc3eeOXMlE2PTzRVHS19cNIueRgYgx/twZWZ37Z4c4YTrg/DO3QZjwt2MAJ2HWPcrOO6 kHYNtE2TEG0uH9M4ZB7J10ggc1KtcPKux0rVcXFEsnYxo+GHl+DjaNQlIKRqFvxe/39A 5CQg== MIME-Version: 1.0 X-Received: by 10.66.141.144 with SMTP id ro16mt19991559pab.6.1423464628727; Sun, 08 Feb 2015 22:50:28 -0800 (PST) X-No-Auto-Attachment: 1 Message-ID: <001a1133316c8bb5db050ea22fa9@google.com> Date: Mon, 09 Feb 2015 06:50:28 +0000 Subject: =?GB2312?B?INb3tq/Kvc3iw7O/zbuny9HL97+qt6LPtc2zo6zIw8T6srs=?= =?GB2312?B?1NrOqsO709C/zbuntvi3s8TVo6E=?= From: wazpophgv8@gmail.com X-ASG-Orig-Subj: =?GB2312?B?INb3tq/Kvc3iw7O/zbuny9HL97+qt6LPtc2zo6zIw8T6srs=?= =?GB2312?B?1NrOqsO709C/zbuntvi3s8TVo6E=?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a1133316c8e029f050ea22ffc X-Barracuda-Connect: mail-pa0-f71.google.com[209.85.220.71] X-Barracuda-Start-Time: 1423464629 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15068 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1133316c8e029f050ea22ffc Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 zeLDs7/Nu6fL0cv30+u/qreiz7XNs8jtvP6w79b6xPq94r720tTPws7KzOKjug0KMaGi1bm74c22 18q436Oss8m9u7v6wsq1zaOoyO28/r/Jy9HL98irx/IyMDC24Lj2ufq80qOswO3C28nPwLTLtcir x/LIzrrODQrSu7j2v827p7a8v8nS1LTTILulwarN+MnPy9HL97W9o6kNCjKhokIyQtDpvNnRr8XM tuCjrMi6t6LRr8XMtuCjrL/Nu6fWysG/tc2jqNK7ttTSu7+qt6KjrL/Nu6fWysG/uN+jqQ0KM6Gi y9HL99L9x+ajrLvG0rMgyta5pL+qt6K/zbun0KfCyrXNo6jDv8zs19S2r8vRy/e8uM3yv827p9PK z+SjrMXksbi6o83iDQrTyrz+t/7O8cb3w7/M7NfUtq+3oiDLzby4zfLTyrz+o6kNCjShokIyQizV ubvhu/3A27/Nu6fW3Mbas6SjrNK1zvHUsdf4tci/zbunuaTX97v9vKvQ1LXNo6jDv8zstrzT0LTz wb/Rrw0KxcyjrL/J0tTM4bjf0rXO8dSxtcS4+iC1pbv9vKvQ1KOszOG439K1vKiho6OpDQoNCsjn ufvE+rbUztLDx7XEsvrGt9LUvLC3/s7xuNDQy8iko6y7ttOtxPq72Li008q8/rvyvNPO0lFRz+rM uKGjDQoNCs/qz7jI7bz+0MXPosfr18nRrw0KDQpRUdfJ0a86IDI1MzU1ODgzMDgNCrXnu7DXydGv o7oxMzYtNzAyMC0wNjE1DQoNCrzTUVG687/J1NrP38D708O588u+svrGt7nYvPy0yqOs1rG909Hd yr7L0cv30Ke5+w0KDQoNCg0KDQoNCg0KDQoNCs7S0tHR+8frxPrM7tC0se21pSDOtMP8w/u1xLHt taWhoyDSqszu0LS0y7HttaWjrMfrt8POyqO6DQpodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jt cy9kLzFscjM5TDdCRGZfY1BnWlJTNEg2dFlNNFFJSm1vTWRDV0UtSENETXgxRGZnL3ZpZXdmb3Jt P2M9MCZ3PTEmdXNwPW1haWxfZm9ybV9saW5rDQo= --001a1133316c8e029f050ea22ffc Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: quoted-printable

=CD=E2=C3=B3=BF=CD=BB=A7=CB=D1= =CB=F7=D3=EB=BF=AA=B7=A2=CF=B5=CD=B3=C8=ED=BC=FE=B0=EF=D6=FA=C4=FA=BD=E2=BE= =F6=D2=D4=CF=C2=CE=CA=CC=E2=A3=BA

1=A1=A2=D5=B9=BB=E1=CD=B6=D7=CA=B8=DF= =A3=AC=B3=C9=BD=BB=BB=FA=C2=CA=B5=CD=A3=A8=C8=ED=BC=FE=BF=C9=CB=D1=CB=F7=C8= =AB=C7=F2200=B6=E0=B8=F6=B9=FA=BC=D2=A3=AC=C0=ED=C2=DB=C9=CF=C0=B4=CB=B5=C8= =AB=C7=F2=C8=CE=BA=CE=D2=BB=B8=F6=BF=CD=BB=A7=B6=BC=BF=C9=D2=D4=B4=D3 =BB= =A5=C1=AA=CD=F8=C9=CF=CB=D1=CB=F7=B5=BD=A3=A9

2=A1=A2B2B=D0=E9=BC=D9=D1= =AF=C5=CC=B6=E0=A3=AC=C8=BA=B7=A2=D1=AF=C5=CC=B6=E0=A3=AC=BF=CD=BB=A7=D6=CA= =C1=BF=B5=CD=A3=A8=D2=BB=B6=D4=D2=BB=BF=AA=B7=A2=A3=AC=BF=CD=BB=A7=D6=CA=C1= =BF=B8=DF=A3=A9

3=A1=A2=CB=D1=CB=F7=D2=FD=C7=E6=A3=AC=BB=C6=D2=B3 =CA=D6= =B9=A4=BF=AA=B7=A2=BF=CD=BB=A7=D0=A7=C2=CA=B5=CD=A3=A8=C3=BF=CC=EC=D7=D4=B6= =AF=CB=D1=CB=F7=BC=B8=CD=F2=BF=CD=BB=A7=D3=CA=CF=E4=A3=AC=C5=E4=B1=B8=BA=A3= =CD=E2=D3=CA=BC=FE=B7=FE=CE=F1=C6=F7=C3=BF=CC=EC=D7=D4=B6=AF=B7=A2 =CB=CD= =BC=B8=CD=F2=D3=CA=BC=FE=A3=A9

4=A1=A2B2B,=D5=B9=BB=E1=BB=FD=C0=DB=BF=CD= =BB=A7=D6=DC=C6=DA=B3=A4=A3=AC=D2=B5=CE=F1=D4=B1=D7=F8=B5=C8=BF=CD=BB=A7=B9= =A4=D7=F7=BB=FD=BC=AB=D0=D4=B5=CD=A3=A8=C3=BF=CC=EC=B6=BC=D3=D0=B4=F3=C1=BF= =D1=AF=C5=CC=A3=AC=BF=C9=D2=D4=CC=E1=B8=DF=D2=B5=CE=F1=D4=B1=B5=C4=B8=FA = =B5=A5=BB=FD=BC=AB=D0=D4=A3=AC=CC=E1=B8=DF=D2=B5=BC=A8=A1=A3=A3=A9


= =C8=E7=B9=FB=C4=FA=B6=D4=CE=D2=C3=C7=B5=C4=B2=FA=C6=B7=D2=D4=BC=B0=B7=FE=CE= =F1=B8=D0=D0=CB=C8=A4=A3=AC=BB=B6=D3=AD=C4=FA=BB=D8=B8=B4=D3=CA=BC=FE=BB=F2= =BC=D3=CE=D2QQ=CF=EA=CC=B8=A1=A3


=CF=EA=CF=B8=C8=ED=BC=FE=D0=C5=CF=A2= =C7=EB=D7=C9=D1=AF

QQ=D7=C9=D1=AF: 2535588308

=B5=E7=BB= =B0=D7=C9=D1=AF=A3=BA136-7020-0615

=BC=D3QQ=BA=F3= =BF=C9=D4=DA=CF=DF=C0=FB=D3=C3=B9=F3=CB=BE=B2=FA=C6=B7=B9=D8=BC=FC=B4=CA=A3= =AC=D6=B1=BD=D3=D1=DD=CA=BE=CB=D1=CB=F7=D0=A7=B9=FB

=

=C8=E7=B9=FB=C4=FA=D4=DA=B2=E9=BF=B4=BB=F2=CC=E1=BD=BB=B4=CB=B1=ED=B5=A5=CA= =B1=D3=F6=B5=BD=CE=CA=CC=E2=A3=AC=C7=EB=D4=DA=CF=DF=CC=EE=D0=B4=A1=A3

=CE=B4=C3=FC=C3=FB= =B5=C4=B1=ED=B5=A5

= =BC=BC=CA=F5=CC=E1=B9=A9=A3=BA
3D"Google
=
=B4=CB=C4=DA=C8=DD=B2=BB=CA=C7= =D3=C9 Google =CB=F9=B4=B4=BD=A8=A3=ACGoogle =B2=BB=B6=D4=C6=E4=D7=F7=C8=CE= =BA=CE=B5=A3=B1=A3=A1=A3
=BE=D9=B1=A8=C0=C4=D3=C3=D0=D0=CE=AA - =B7=FE=CE=F1=CC= =F5=BF=EE - =C6=E4= =CB=FB=CC=F5=BF=EE

<= /html> --001a1133316c8e029f050ea22ffc-- From bonbons@linux-vserver.org Mon Feb 9 02:47:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2854B7F8B for ; Mon, 9 Feb 2015 02:47:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EABDD304077 for ; Mon, 9 Feb 2015 00:47:05 -0800 (PST) X-ASG-Debug-ID: 1423471621-04bdf06a59a2ab0001-NocioJ Received: from smtprelay.restena.lu (smtprelay.restena.lu [158.64.1.62]) by cuda.sgi.com with ESMTP id KYv3PwroYx8AlQLl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 00:47:03 -0800 (PST) X-Barracuda-Envelope-From: bonbons@linux-vserver.org X-Barracuda-Apparent-Source-IP: 158.64.1.62 Received: from pluto.restena.lu (pluto.restena.lu [IPv6:2001:a18:1:8::156]) by smtprelay.restena.lu (Postfix) with ESMTPS id 4DE38411D9; Mon, 9 Feb 2015 09:47:01 +0100 (CET) Date: Mon, 9 Feb 2015 09:47:01 +0100 From: Bruno =?UTF-8?B?UHLDqW1vbnQ=?= To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150209094701.6b1d480d@pluto.restena.lu> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault In-Reply-To: <20150205221516.GT4251@dastard> References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> <20150205151007.7c954c01@pluto.restena.lu> <20150205221516.GT4251@dastard> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtprelay.restena.lu[158.64.1.62] X-Barracuda-Start-Time: 1423471622 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On Fri, 6 Feb 2015 09:15:16 +1100 Dave Chinner wrote: > On Thu, Feb 05, 2015 at 03:10:07PM +0100, Bruno Pr=C3=A9mont wrote: > > Hi Dave, > >=20 > > New crash, new trace, this time on 3.18.2. > > It looks like this time a NULL dereference happened prior to touched me= mory poison being detected. > >=20 > > Once again it's during normal system operation (no mount/umount activit= y) >=20 > Can you rebuild the kernel with CONFIG_XFS_WARN=3Dy and see if that > throws any interesting messages into logs? Will try and see > However: >=20 > > [1900390.261491] =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=3D=3D=3D=3D=3D=3D > > [1900390.272989] BUG task_struct (Tainted: G D W ): Poison ove= rwritten > > [1900390.283021] ------------------------------------------------------= ----------------------- > > [1900390.283021]=20 > > [1900390.297056] INFO: 0xffff880213d651b3-0xffff880213d651b3. First byt= e 0x6d instead of 0x6b > > [1900390.309044] INFO: Slab 0xffffea00084f5800 objects=3D16 used=3D16 f= p=3D0x (null) flags=3D0x8000000000004080 > > [1900390.323087] INFO: Object 0xffff880213d64ba0 @offset=3D19360 fp=3D0= xffff880213d61e40 > > [1900390.323087]=20 > > [1900390.336988] Bytes b4 ffff880213d64b90: 60 2d d6 13 02 88 ff ff 5a = 5a 5a 5a 5a 5a 5a 5a `-......ZZZZZZZZ > > [1900390.350988] Object ffff880213d64ba0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b= 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > [1900390.364943] Object ffff880213d64bb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b= 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > .... > > [1900391.674636] Object ffff880213d651b0: 6b 6b 6b 6d 6b 6b 6b 6b 6b 6b= 6b 6b 6b 6b 6b 6b kkkmkkkkkkkkkkkk > ^^ >=20 > There's a single bit that has been flipped in the task_struct slab. > So more than just XFS is seeing memory corruption - this is in core > kernel structure slab caches. I'm not sure, either, how XFS could > cause corruption in this slab. >=20 > So, I'd be checking all the previous memory corruptions to see if > they are single bit errors, and if there is any pattern to the > addresses at which they occur. The above bit flip makes me think > "hardware issue" and everything else stems from that... System has ECC RAM so faulty RAM looks less probable (no complaint seen by kernel nor recorded by firmware). All previous crashes for which I have some logs were dereference after free but not attempt to allocate memory from a modified poison in free slabs. Though what does that single bit represent in that area if it was used/modified after free? As I have seen some other servers mysteriously crash after months of uptime (or sometime only weeks) I think a kernel issue/race condition is more likely though I have no traces or other info that would help here. As systems receive newer kernels I'm enabling netconsole to be able to capture kernel message to be able to analyze future such crashes. Cheers, Bruno > Cheers, >=20 > Dave. From bfoster@redhat.com Mon Feb 9 07:09:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 725D17F8D for ; Mon, 9 Feb 2015 07:09:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6137F304032 for ; Mon, 9 Feb 2015 05:09:32 -0800 (PST) X-ASG-Debug-ID: 1423487370-04cbb01163bb160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2ogLSl4RkCE075xy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 05:09:31 -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 (8.14.4/8.14.4) with ESMTP id t19D9TLU028236 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 08:09:29 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19D9QGk022429 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 08:09:28 -0500 Date: Mon, 9 Feb 2015 08:09:26 -0500 From: Brian Foster To: Dave Chinner Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150209130926.GA18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208213502.GA4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423487370 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 08:35:02AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: > > These 2 patches provide information about which filesystem > > hit the error... > > If we are going to touch every one of these macros, then can we > rename them to something a little shorter like XFS_CORRUPT_GOTO() > and XFS_CORRUPT_RETURN() at the same time? That will make the code a > little less eye-bleedy where there are lots of these statements, > and make formatting of complex checks a bit easier, too... > XFS_CORRUPT_DOSOMETHING() jumps out to me as indicate corruption if the logic statement evaluates as true rather than false. The latter (e.g., assert-like logic) is how they work today, so that could be a bit confusing to somebody who isn't already familiar with how these macros work. Unfortunately, nothing shorter than the current naming immediately comes to mind... :/ We could kill the XFS_ prefix I suppose or even invert the logic of the calls, but that's certainly a more significant change. Thoughts? Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From chris@cdsroofing.com Mon Feb 9 08:30:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 430037F90 for ; Mon, 9 Feb 2015 08:30:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6318AC002 for ; Mon, 9 Feb 2015 06:30:14 -0800 (PST) X-ASG-Debug-ID: 1423492212-04cb6c6b09c4570001-NocioJ Received: from cpanel63.fastdnsservers.com (cpanel63.fastdnsservers.com [216.51.232.63]) by cuda.sgi.com with ESMTP id 7s0MR9kDzI5M2ZqL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 06:30:12 -0800 (PST) X-Barracuda-Envelope-From: chris@cdsroofing.com X-Barracuda-Apparent-Source-IP: 216.51.232.63 Received: from 58-97-44-134.static.asianet.co.th ([58.97.44.134]:11510 helo=[61.90.148.19]) by cpanel63.fastdnsservers.com with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.84) (envelope-from ) id 1YKpLj-001p28-Fm; Mon, 09 Feb 2015 08:30:07 -0600 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Private Placement To: Peter C X-ASG-Orig-Subj: Private Placement From: "Peter C" Date: Mon, 09 Feb 2015 21:30:26 +0700 Reply-To: peter.ce@aol.com X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cpanel63.fastdnsservers.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - cdsroofing.com X-Get-Message-Sender-Via: cpanel63.fastdnsservers.com: authenticated_id: chris@cdsroofing.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: cpanel63.fastdnsservers.com[216.51.232.63] X-Barracuda-Start-Time: 1423492212 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.34 X-Barracuda-Spam-Status: No, SCORE=0.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA298e, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15075 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.20 BSF_SC7_SA298e Custom Rule SA298e Message-Id: <20150209143014.3C22412961A5@cuda.sgi.com> Hello, I have a proposal for you.It has to with investing in your Company. kindly = get back to me with a reconfirmation of your company name, area of special= ization, address and your position in the Company. Upon your response to my= persona Email address peter_cheng@nhig-hk.org , I shall forward you com= prehensive details. Best Regard. Peter C From bfoster@redhat.com Mon Feb 9 09:15:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0BB767F90 for ; Mon, 9 Feb 2015 09:15:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C2F048F8074 for ; Mon, 9 Feb 2015 07:15:11 -0800 (PST) X-ASG-Debug-ID: 1423494909-04bdf06a5adcb90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id urTjWMqqvlg68aD4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 07:15:10 -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 (8.14.4/8.14.4) with ESMTP id t19FF6EB026972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 10:15:07 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19FF3Bd009709 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 10:15:05 -0500 Date: Mon, 9 Feb 2015 10:15:02 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150209151502.GB18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> <20150206231615.GQ12722@dastard> <20150208160600.GB2927@bfoster.bfoster> <20150208215710.GC4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208215710.GC4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423494910 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 08:57:10AM +1100, Dave Chinner wrote: > On Sun, Feb 08, 2015 at 11:06:01AM -0500, Brian Foster wrote: > > On Sat, Feb 07, 2015 at 10:16:15AM +1100, Dave Chinner wrote: > > > On Fri, Feb 06, 2015 at 02:52:51PM -0500, Brian Foster wrote: > > > > The inode btrees track 64 inodes per record, regardless of inode size. > > > > Thus, inode chunks on disk vary in size depending on the size of the > > > > inodes. This creates a contiguous allocation requirement for new inode > > > > chunks that can be difficult to satisfy on an aged and fragmented (free > > > > space) filesystem. > > > > > > > > The inode record freecount currently uses 4 bytes on disk to track the > > > > free inode count. With a maximum freecount value of 64, only one byte is > > > > required. Convert the freecount field to a single byte and use two of > > > > the remaining 3 higher order bytes left for the hole mask field. Use > > > > the final leftover byte for the total count field. > > > > > > > > The hole mask field tracks holes in the chunks of physical space that > > > > the inode record refers to. This facilitates the sparse allocation of > > > > inode chunks when contiguous chunks are not available and allows the > > > > inode btrees to identify what portions of the chunk contain valid > > > > inodes. The total count field contains the total number of valid inodes > > > > referred to by the record. This can also be deduced from the hole mask. > > > > The count field provides clarity and redundancy for internal record > > > > verification. > > > > > > > > Note that both fields are initialized to zero to maintain backwards > > > > compatibility with existing filesystems (e.g., the higher order bytes of > > > > freecount are always 0). Tracking holes means that the hole mask is > > > > initialized to zero and thus remains "valid" in accordance with a > > > > non-sparse inode fs when no sparse chunks are physically allocated. > > > > Update the inode record management functions to handle the new fields > > > > and initialize to zero. > > > > > > > > [XXX: The count field breaks backwards compatibility with !sparseinode > > > > fs. Should we reconsider the addition of total count or the idea of > > > > converting back and forth between sparse inode fs with a feature bit?] > > > > > > > > Signed-off-by: Brian Foster > > > > --- > > > > fs/xfs/libxfs/xfs_format.h | 8 ++++++-- > > > > fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- > > > > fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- > > > > 3 files changed, 19 insertions(+), 5 deletions(-) > > > > > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > > > index 26e5d92..6c2f1be 100644 > > > > --- a/fs/xfs/libxfs/xfs_format.h > > > > +++ b/fs/xfs/libxfs/xfs_format.h > > > > @@ -1295,13 +1295,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) > > > > */ > > > > typedef struct xfs_inobt_rec { > > > > __be32 ir_startino; /* starting inode number */ > > > > - __be32 ir_freecount; /* count of free inodes (set bits) */ > > > > + __be16 ir_holemask; /* hole mask for sparse chunks */ > > > > + __u8 ir_count; /* total inode count */ > > > > + __u8 ir_freecount; /* count of free inodes (set bits) */ > > > > __be64 ir_free; /* free inode mask */ > > > > } xfs_inobt_rec_t; > > > > > > I think I'd prefer to see a union here so that we explicitly state > > > what the difference in the on-disk format is. i.e. similar to how we > > > express the difference in long and short btree block headers. > > > > > > struct xfs_inobt_rec { > > > __be32 ir_startino; /* starting inode number */ > > > __be32 ir_freecount; /* count of free inodes (set bits) */ > > > union { > > > struct { > > > __be32 ir_freecount; > > > } f; > > > struct { > > > __be16 ir_holemask; /* hole mask for sparse chunks */ > > > __u8 ir_count; /* total inode count */ > > > __u8 ir_freecount; /* count of free inodes (set bits) */ > > > } sp; > > > } > > > __be64 ir_free; /* free inode mask */ > > > }; > > > > > > This will prevent us from using the wrong method of > > > referencing/modifying the record because we now need to be explicit > > > in how we modify it... > > > > > > > I agree in principle. This is definitely explicit in that there are two > > variants of this structure that must be handled in a particular way. > > That said, 'sparse' and 'full' aren't quite logical differentiators > > given that we now have the ir_count field and that it is used whenever > > sparse inode support is enabled. In other words, a sparse enabled fs' > > always uses the 'sp' variant of the inobt record, regardless of whether > > the record happens to sparse. > > Sure, that's fine for the in memory code, but we've always been > explicit about the disk format and marshalling to/from it, > especially in the cases where the structure on disk can have > multiple formats. > Right, this makes sense... > > > > @@ -82,7 +84,9 @@ xfs_inobt_update( > > > > union xfs_btree_rec rec; > > > > > > > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > > > > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > > > > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > > > > + rec.inobt.ir_count = irec->ir_count; > > > > + rec.inobt.ir_freecount = irec->ir_freecount; > > > > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > > > > return xfs_btree_update(cur, &rec); > > > > } > > > > > > Hmmm - perhaps a similar set of helpers for sparse inode enabled > > > filesystems > > > > > > > We could do that for the insert/update helpers, but note again the > > separate helpers would not split along the lines of sparse vs full > > chunks. Even if we were to change the design such that they do, that > > would have th effect of complicating some of the subsequent code. For > > I suspect it might, but I really don't like the idea of writing > fields that don't actually exist (and hence are always zero) in > the on-disk format to disk. See, for example, the v5 superblock > field writes are conditional in xfs_sb_to_disk, the v3 inode field > writes are conditional in xfs_dinode_to_disk, etc. > Indeed. The point here is just that a v1/v2 differentiation might be more relevant than full vs. sparse. As it is, a sparse inode enabled fs uses all of the fields (e.g., ir_count == 64 on a full chunk). So this is more about providing clean backwards compatibility than deciding between two different "allocation types," so to speak. Beyond that, I'm more just probing for a clean use of the new on-disk format distinction. The references above actually use the associated feature checks in a single helper as opposed to a separate one, and that seems a bit more clean an approach to me. > > example, the merge/update code currently has no reason to care about > > whether it has created a full chunk out of multiple sparse chunks. This > > would require more code to make that distinction simply to pick the > > correct api, for something that can easily be done with a simple generic > > helper. The same goes for things like the finobt, where now > > lookup/update/insert has to make distinctions depending on the type of > > inode record. > > That was another thing that wasn't clear to me - does the finobt > record format change on disk? I don't think it does, as it only > holds a free count and a free inode bitmask, so it doesn't care > which bits of the chunk are allocated or not.... > No, it shouldn't change the format. But if we have a separate set of inobt helpers, it has to use one or the other depending on the type of record holding the inode that is freed or allocated. > > An alternate approach could be to stick with the generic helpers, but > > try and tweak them to use the appropriate on-disk format depending on > > the record. Then again, how can one really identify one from the other > > in the lookup or _get_rec() scenarios? > > Solving these problem was exactly why I suggested different helpers > - the btree ops structure that is chosen for the cursor is in a > place where we know what format we are using, and that avoids > needing "if (xfs_sb_version...)" checks in the helpers to determine > what format we need to use. > Hmm, I'm not sure I follow the train of thought here. The examples above use exactly that kind of logic within the helper. Further, some of the inobt helpers (e.g., lookup, insert_rec() shown below) use the in-core record, so there really is no separate format at that level. > > > > @@ -118,6 +124,8 @@ xfs_inobt_insert_rec( > > > > xfs_inofree_t free, > > > > int *stat) > > > > { > > > > + cur->bc_rec.i.ir_holemask = 0; > > > > + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > > > > cur->bc_rec.i.ir_freecount = freecount; > > > > cur->bc_rec.i.ir_free = free; > > > > return xfs_btree_insert(cur, stat); > > > > > > That would make this sort of thing very clear - this doesn't look > > > like it would work for a sparse chunk record... > > > > Right... but this is just a plumbing patch and effectively a placeholder > > for the subsequent patches that implement the mechanism. I suppose the > > api could have been pulled back sooner into this patch, but I'd rather > > not reshuffle things just for that intermediate state. That context > > probably wasn't quite clear to me at the time. > > > > Before I go one way or another here with regard to the on-disk data > > structure, care to take a look at the subsequent patch(es) that use > > these helpers? Patch 10 in particular pretty much sums up how these > > helpers are used for sparse inode record management. > > Yup, I'll get to it. > Thanks. I've made a quick pass and most of it makes sense save some of the helper business we're discussing here. I can start into some of the higher level refactoring, try to incorporate the on-disk record format union as clean as I can and we can move forward using the code of the next version, if that's easier. ;) > > FWIW, comments on the generic bitmap stuff is also appreciated as that's > > another area I'm not totally convinved is done right. :) > > Why use the generic bitmap stuff rather than the existing XFS code? > If that's just an in-memory change to the free mask processing, then > it can be done separately to the sparse inode functionality, and > probably should be done first in the series.... > http://oss.sgi.com/archives/xfs/2014-07/msg00380.html Last comment in that mail. ;) To be honest, I liked the original code better because it didn't require the bitmap_to_u64() helper hack and ports directly to userspace (so far I've managed to get away with dropping that stuff entirely in userspace). Alternatively, I've done significantly more testing with the latest code than the initial version so I'd rather not change it back unless a real need arises. Brian > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Mon Feb 9 09:20:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D9AA77F90 for ; Mon, 9 Feb 2015 09:20:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B79038F8073 for ; Mon, 9 Feb 2015 07:20:15 -0800 (PST) X-ASG-Debug-ID: 1423495213-04cb6c6b0bd8bc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id j8dgAgntHrZl9beK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 07:20:14 -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 (8.14.4/8.14.4) with ESMTP id t19FKAZm022041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 10:20:11 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19FK7JY014343 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 10:20:09 -0500 Date: Mon, 9 Feb 2015 10:20:07 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure Message-ID: <20150209152007.GD18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 10/18] xfs: allocate sparse inode chunks on full chunk allocation failure References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-11-git-send-email-bfoster@redhat.com> <20150209012519.GK4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209012519.GK4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423495213 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 12:25:19PM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:57PM -0500, Brian Foster wrote: > > xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode > > chunk. If all else fails, reduce the allocation to the minimum sparse > > granularity and attempt to allocate a sparse inode chunk. > > > > If sparse chunk allocation succeeds, check whether an inobt record > > already exists that can track the chunk. If so, inherit and update the > > existing record. Otherwise, insert a new record for the sparse chunk. > > > > Update xfs_inobt_insert_rec() to take the holemask as a parameter and > > set the associated field on disk. Create the xfs_inobt_update_insert() > > helper to handle the sparse chunk allocation case - insert or update an > > existing record depending on whether it already exists. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_ialloc.c | 397 +++++++++++++++++++++++++++++++++++++++++++-- > > fs/xfs/xfs_trace.h | 47 ++++++ > > 2 files changed, 426 insertions(+), 18 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > > index fc001d9..090d114 100644 > > --- a/fs/xfs/libxfs/xfs_ialloc.c > > +++ b/fs/xfs/libxfs/xfs_ialloc.c > > @@ -122,12 +122,16 @@ xfs_inobt_get_rec( > > STATIC int > > xfs_inobt_insert_rec( > > struct xfs_btree_cur *cur, > > + __uint16_t holemask, > > + __uint8_t count, > > __int32_t freecount, > > xfs_inofree_t free, > > int *stat) > > { > > - cur->bc_rec.i.ir_holemask = 0; > > - cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ > > + ASSERT(count == 0 || xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)); > > + > > + cur->bc_rec.i.ir_holemask = holemask; > > + cur->bc_rec.i.ir_count = count; > > cur->bc_rec.i.ir_freecount = freecount; > > cur->bc_rec.i.ir_free = free; > > return xfs_btree_insert(cur, stat); > > Ok, so I'd definitely prefer two separate helpers here so that we > don't need asserts or validity checking.... > I think that's doable, but goes back to my earlier concern. For one, this uses the in-core record so I'm not sure what the difference would be beyond function signature and asserts. Second, this complicates callers like xfs_difree_finobt(). Which one should it use? > > @@ -151,6 +155,19 @@ xfs_inobt_insert( > > xfs_agino_t thisino; > > int i; > > int error; > > + uint8_t count; > > + > > + /* > > + * Only set ir_count in the inobt record if the sparse inodes feature is > > + * enabled. If disabled, we must maintain backwards compatibility with > > + * the older inobt record format where the current count and holemask > > + * fields map to the higher order bytes of freecount and thus must be > > + * zeroed. > > + */ > > + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) > > + count = XFS_INODES_PER_CHUNK; > > + else > > + count = 0; > > I'd strongly suggest that we pass the holemask, count and freecount > from the caller, for reasons that will become obvious later. > > > @@ -164,7 +181,7 @@ xfs_inobt_insert( > > } > > ASSERT(i == 0); > > > > - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, > > + error = xfs_inobt_insert_rec(cur, 0, count, XFS_INODES_PER_CHUNK, > > XFS_INOBT_ALL_FREE, &i); > > if (error) { > > xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); > > And this hunk would become: > > if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { > error = xfs_inobt_insert_sprec(cur, holemask, count, > freecount, &i); > holemask, > else > error = xfs_inobt_insert_rec(cur, count, > freecount, &i); > Ok, but as alluded to previously with regard to the union discussion, I find the naming a little confusing. I see now that you refer to the record format as sparse whereas I refer to the record content as (potentially) sparse, so that clears up a bit. ;) I guess I could get used to that. Thoughts on a v1/v2 naming scheme? Would we expect the new format to become ubiquitous eventually? > > @@ -174,8 +191,58 @@ xfs_inobt_insert( > > } > > > > xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); > > + return 0; > > +} > > > > +/* > > + * Update or insert a new record based on a sparse inode chunk allocation. > > + * > > + * If a record already exists, the new record is an updated version of that > > + * record based on a merge of sparse inode chunks. Update the record in place. > > + * Otherwise, insert a new record in the tree. Note that the record to insert > > + * must already have been aligned and merged, if necessary. > > + */ > > +STATIC int > > +xfs_inobt_update_insert( > > + struct xfs_mount *mp, > > + struct xfs_trans *tp, > > + struct xfs_buf *agbp, > > + struct xfs_inobt_rec_incore *rec, > > + xfs_btnum_t btnum) > > +{ > > + struct xfs_btree_cur *cur; > > + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > > + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); > > + int i; > > + int error; > > + > > + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); > > + > > + error = xfs_inobt_lookup(cur, rec->ir_startino, XFS_LOOKUP_EQ, &i); > > + if (error) > > + goto error; > > + if (i == 1) { > > + /* found a record, update it with the merged record */ > > + error = xfs_inobt_update(cur, rec); > > + if (error) > > + goto error; > > + goto out; > > + } > > + > > + /* no existing record, insert a new one */ > > + error = xfs_inobt_insert_rec(cur, rec->ir_holemask, rec->ir_count, > > + rec->ir_freecount, rec->ir_free, &i); > > + if (error) > > + goto error; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > > + > > +out: > > + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); > > return 0; > > + > > +error: > > + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); > > + return error; > > } > > I think that the way you've factored out the sparse inode record > update code can do with some work. I'll come back to this. > > > @@ -358,6 +453,183 @@ xfs_ialloc_inode_init( > > } > > > > /* > > + * Align a record for a recently allocated sparse chunk. The input is a record > > + * that describes the unaligned chunk. The record is aligned such that it is fit > > + * for insertion (or merge) into the on-disk inode btrees. > > + */ > > +STATIC void > > +xfs_align_sparse_rec( > > + struct xfs_mount *mp, > > + struct xfs_inobt_rec_incore *rec) > > +{ > > + xfs_agblock_t agbno; > > + xfs_agblock_t mod; > > + int offset; > > + uint16_t allocmask; > > + > > + agbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); > > + mod = agbno % mp->m_sb.sb_inoalignmt; > > + if (!mod) > > + return; > > + > > + /* calculate the inode offset and align startino */ > > + offset = mod << mp->m_sb.sb_inopblog; > > + rec->ir_startino -= offset; > > + > > + /* > > + * Since startino has been aligned down, we have to left shift > > + * ir_holemask such that it continues to represent the same physical > > + * inodes as the unaligned record. The unaligned record by definition > > + * tracks the allocated inodes with the lowest order bits. > > + * > > + * ir_holemask is inverted before the shift such that set bits represent > > + * allocated inodes. This makes it safe for the bit-shift to introduce > > + * zeroes in the lower order bits without corrupting the record. > > + * > > + * Note that no change is required for ir_count, ir_freecount or > > + * ir_free. The count values are not affected by alignment and ir_free > > + * is initialized to 1s for all inodes, sparse or otherwise. > > + */ > > + allocmask = ~rec->ir_holemask; > > + allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; > > + rec->ir_holemask = ~allocmask; > > +} > > I don't understand why the holemask would need changing. I would > have expected this to be done before the hole mask has been placed > inside the record. Indeed, putting it into the record first means we > have to deal with inversions and jump through other hoops. > Yes, the interface was designed around the implementation in v2 and was further enhanced to handle left or right merges. The latter was not part of a release of this code, but was implemented such that the merged record bits were abstracted from record insertion/update. The implementation was simplified a great deal with the alignment changes we discussed on irc, but the interface mostly remained as a remnant of the more complex implementation. > static void > xfs_align_sparse_ino( > struct xfs_mount *mp, > xfs_agino_t *startino, > uint16_t *allocmask) > { > agbno = XFS_AGINO_TO_AGBNO(mp, *startino); > mod = agbno % mp->m_sb.sb_inoalignmt; > if (!mod) > return; > > offset = mod << mp->m_sb.sb_inopblog; > *startino -= offset; > *allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; > } > > And then place the result in the irec.... > > > +/* > > + * Determine whether a sparse inode records can be merged. The inode ranges > > + * must match and there must be no allocation overlap between the records. > > + */ > > Hmmm - src + target is not great for an operation where both records > are a source. Perhaps be explict in the comment? e.g. > Another remnant of the old implementation where the src/tgt had more significance. > /* > * Determine whether the source inode record can be merged into a > * target record. Both records must be sparse, the inode ranges > * must match and there must be no allocation overlap between the > * records. > */ > > > +STATIC bool > > +__xfs_inobt_can_merge( > > + struct xfs_inobt_rec_incore *trec, /* tgt record */ > > + struct xfs_inobt_rec_incore *srec) /* src record */ > > If we detect overlap, isn't that an indication of corruption? > Yeah. > > +{ > > + DECLARE_BITMAP(talloc, 64); > > + DECLARE_BITMAP(salloc, 64); > > + DECLARE_BITMAP(tmp, 64); > > + > > + /* records must cover the same inode range */ > > + if (trec->ir_startino != srec->ir_startino) > > + return false; > > + > > + /* both records must be sparse */ > > + if (!xfs_inobt_issparse(trec->ir_holemask) || > > + !xfs_inobt_issparse(srec->ir_holemask)) > > + return false; > > + > > + /* can't exceed capacity of a full record */ > > + if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK) > > + return false; > > probably also need to check that both records have inodes allocated > in them. ir_count == 0 is indicative of a corrupt record, right? > Yeah, good point. > > + > > + /* verify there is no allocation overlap */ > > + xfs_inobt_ialloc_bitmap(talloc, trec); > > + xfs_inobt_ialloc_bitmap(salloc, srec); > > + > > + bitmap_and(tmp, salloc, talloc, 64); > > + if (!bitmap_empty(tmp, 64)) > > + return false; > > And if one has an ir_count of zero, the bitmap will always be > zero.... > This is based on holemask which is indirectly checked by the issparse() checks above. The ir_count check still makes sense, regardless. > > +/* > > + * Merge two sparse inode records. The caller must call __xfs_inobt_can_merge() > > + * to ensure the merge is valid. > > + */ > > same thing about src/target here. > Ok. > > +STATIC void > > +__xfs_inobt_rec_merge( > > + struct xfs_inobt_rec_incore *trec, /* target */ > > + struct xfs_inobt_rec_incore *srec) /* src */ > > +{ > > + ASSERT(trec->ir_startino == srec->ir_startino); > > + > > + /* combine the counts */ > > + trec->ir_count += srec->ir_count; > > + trec->ir_freecount += srec->ir_freecount; > > + > > + /* merge the holemask */ > > + trec->ir_holemask &= srec->ir_holemask; > > Comments in this function are not very useful. Please remind me: > does the holemask use bit value of 1 as allocated or as a hole? > My head is full of allocmask stuff and so I can't tell if a merge > should use |= or &= to get the correct value. > Ok. > > + /* merge the free mask */ > > + trec->ir_free &= srec->ir_free; > > Same here. > > > +} > > + > > +/* > > + * Determine whether a newly allocated sparse inode chunk record overlaps with > > + * an existing sparse record in the inobt. When sparse inode chunks are enabled, > > + * all inode chunk alignment is increased from cluster size to physical inode > > + * chunk size. This means that the smallest, non-zero gap between two inode > > + * chunks is at least one full inode chunk. When a sparse inode chunk is > > + * allocated, the containing record is also aligned in this manner such that > > + * future sparse allocations within that same range all align to the same record > > + * startino. This alignment policy supports the ability to merge sparse chunks > > + * into complete chunks over time. > > + * > > + * Given an newly allocated/aligned sparse inode record, look up whether a > > + * sparse record already exists at this startino. If so, merge the two records > > + * and return the merged record in nrec. > > + * > > + * An error is returned if records overlap but a merge is not possible. Given > > + * the alignment constraints described above, this should never happen and thus > > + * is treated as fs corruption. > > + */ > > +STATIC int > > +xfs_inobt_rec_merge( > > + struct xfs_mount *mp, > > + struct xfs_trans *tp, > > + struct xfs_buf *agbp, > > + xfs_btnum_t btnum, > > + struct xfs_inobt_rec_incore *nrec) /* in/out: new/merged rec. */ > > +{ > > + struct xfs_btree_cur *cur; > > + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > > + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); > > + int error; > > + int i; > > + struct xfs_inobt_rec_incore rec; > > + > > + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); > > + > > + /* the new record is pre-aligned so we know where to look */ > > + error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); > > + if (error) > > + goto error; > > + /* if nothing there, we're done */ > > + if (i == 0) > > + goto out; > > + > > + error = xfs_inobt_get_rec(cur, &rec, &i); > > + if (error) > > + goto error; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > > + ASSERT(rec.ir_startino == nrec->ir_startino); > > XFS_WANT_CORRUPTED_GOTO() is better than an assert here. On a debug > kernel, it will still assert, but on a production kernel it will > trigger a corruption error rather than potentially propagating a > corruption further. > Indeed. > > + /* > > + * This should never happen. If we have coexisting records that cannot > > + * merge, something is seriously wrong. > > + */ > > + if (!__xfs_inobt_can_merge(nrec, &rec)) { > > + error = -EFSCORRUPTED; > > + goto error; > > + } > > Ah, so it is a corruption issue if merges can't occur. ;) > > XFS_WANT_CORRUPTED_GOTO(!__xfs_inobt_can_merge(nrec, &rec)); > > > @@ -514,6 +828,65 @@ xfs_ialloc_ag_alloc( > > * Convert the results. > > */ > > newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); > > + > > + if (xfs_inobt_issparse(~allocmask)) { > > + /* > > + * We've allocated a sparse chunk... > > + */ > > + rec.ir_startino = newino; > > + rec.ir_holemask = ~allocmask; > > + rec.ir_count = newlen; > > + rec.ir_freecount = newlen; > > + rec.ir_free = XFS_INOBT_ALL_FREE; > > + > > + /* align record and update newino for agi_newino */ > > + xfs_align_sparse_rec(args.mp, &rec); > > + newino = rec.ir_startino; > > See my earlier comments about aligning before putting stuff into > the record, especially as you are having to pull modified > information straight back out of the record. > > > > + error = xfs_inobt_rec_merge(args.mp, tp, agbp, XFS_BTNUM_INO, > > + &rec); > > + if (!error) > > + error = xfs_inobt_rec_check_count(args.mp, &rec); > > + if (error == -EFSCORRUPTED) { > > + xfs_alert(args.mp, > > + "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u", > > + XFS_AGINO_TO_INO(args.mp, agno, > > + rec.ir_startino), > > + rec.ir_holemask, rec.ir_count); > > + xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE); > > + } > > + if (error) > > + return error; > > + > > + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, > > + XFS_BTNUM_INO); > > + if (error) > > + return error; > > + > > + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { > > + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, > > + XFS_BTNUM_FINO); > > + if (error) > > + return error; > > + } > > I think this needs to become a helper function, and the > implementation refactored. The reason I say this is that the > xfs_inobt_rec_merge() function already looks up the record that is > to be updated, and if it exists if calculates the merged record > value. If then drops all that state and returns the merged record. > > Then we call xfs_inobt_update_insert() to determine if we have to > update the existing record with the merged record (i.e. build all > the state again), and then call xfs_inobt_update() on that record. > > Essentially, if xfs_inobt_rec_merge() determines we have a merge > candidate, we should do the btree update there immediately, as well > as fix up the finobt record. > This also sort of derives from the previous implementation where the merge could have adjusted the startino of the record via left and right searching, etc. Perhaps we can use a 'merged' parameter or something of that nature here to identify whether the record was merged and updated. Note that a merge to the inobt does not guarantee a merge to the finobt, however. An insert is required if the existing record had no free inodes. That was part of the reason for the update or insert helper. Given that, I'm not totally sure we can refactor in exactly this fashion, but I'll give it a try and see what falls out. > If we aren't doing a record merge and update, then it's just an > insert operation, and we can use the modified xfs_inobt_insert() > function I mentioned earlier to pass the partial chunk record > information for insertion. Perhaps even just pass the irec > structure... > In general, I think creating the irec asap and passing that around as necessary (for shifting/merging/updates/etc.) is probably cleaner than sending around all the individual values. Brian > > + } else { > > + /* full chunk - insert new records to both btrees */ > > + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, > > + XFS_BTNUM_INO); > > + if (error) > > + return error; > > + > > + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { > > + error = xfs_inobt_insert(args.mp, tp, agbp, newino, > > + newlen, XFS_BTNUM_FINO); > > + if (error) > > + return error; > > + } > > And this could pass an irec that indicates a full inode chunk rather > than just the subset of inofmration needed to describe a full inode > chunk. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Mon Feb 9 09:20:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 326D27F90 for ; Mon, 9 Feb 2015 09:20:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F36CD8F8073 for ; Mon, 9 Feb 2015 07:20:49 -0800 (PST) X-ASG-Debug-ID: 1423495248-04cb6c6b0bd8cc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6qtSGlKrnNdtLbTT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 07:20:49 -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 (8.14.4/8.14.4) with ESMTP id t19FKkp7020804 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 10:20:47 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19FKiA4018245 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 10:20:46 -0500 Date: Mon, 9 Feb 2015 10:20:44 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode Message-ID: <20150209152044.GE18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 11/18] xfs: randomly do sparse inode allocations in DEBUG mode References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-12-git-send-email-bfoster@redhat.com> <20150208230232.GH4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208230232.GH4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423495248 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 10:02:32AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:58PM -0500, Brian Foster wrote: > > Sparse inode allocations generally only occur when full inode chunk > > allocation fails. This requires some level of filesystem space usage and > > fragmentation. > > > > For filesystems formatted with sparse inode chunks enabled, do random > > sparse inode chunk allocs when compiled in DEBUG mode to increase test > > coverage. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_ialloc.c | 19 +++++++++++++++++-- > > 1 file changed, 17 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > > index 090d114..3e5d3eb 100644 > > --- a/fs/xfs/libxfs/xfs_ialloc.c > > +++ b/fs/xfs/libxfs/xfs_ialloc.c > > @@ -652,9 +652,18 @@ xfs_ialloc_ag_alloc( > > > > struct xfs_perag *pag; > > > > +#ifdef DEBUG > > + int do_sparse = 0; > > + > > + /* randomly do sparse inode allocations */ > > + if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb)) > > + do_sparse = prandom_u32() & 1; > > +#endif > > + > > Bit ugly with all the ifdefs. If you define the do_sparse variable > outside the ifdef, then the rest of the code other than this check > doesn't need ifdefs. > Ok. > > memset(&args, 0, sizeof(args)); > > args.tp = tp; > > args.mp = tp->t_mountp; > > + args.fsbno = NULLFSBLOCK; > > > > /* > > * Locking will ensure that we don't have two callers in here > > @@ -675,6 +684,10 @@ xfs_ialloc_ag_alloc( > > agno = be32_to_cpu(agi->agi_seqno); > > args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + > > args.mp->m_ialloc_blks; > > +#ifdef DEBUG > > + if (do_sparse) > > + goto sparse_alloc; > > +#endif > > if (likely(newino != NULLAGINO && > > (args.agbno < be32_to_cpu(agi->agi_length)))) { > > args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); > > @@ -713,8 +726,7 @@ xfs_ialloc_ag_alloc( > > * subsequent requests. > > */ > > args.minalignslop = 0; > > - } else > > - args.fsbno = NULLFSBLOCK; > > + } > > > > if (unlikely(args.fsbno == NULLFSBLOCK)) { > > /* > > @@ -769,6 +781,9 @@ xfs_ialloc_ag_alloc( > > * Finally, try a sparse allocation if the filesystem supports it and > > * the sparse allocation length is smaller than a full chunk. > > */ > > +#ifdef DEBUG > > +sparse_alloc: > > +#endif > > if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && > > args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && > > args.fsbno == NULLFSBLOCK) { > > The label can go after the if() statement, right? We've already > guaranteed all those other parameters are true, though I suspect > there's a case where that m_ialloc_min_blks < m_ialloc_blks will > fail: block size larger than inode chunk size (e.g. 64k block size, 512 > byte inodes) so that would result in the code above failing to > allocate any inode chunks at all... > Hmm, yeah I added that blks comparison recently simply to prevent another allocation attempt on such systems where the block size is >= the chunk size. This changes behavior of such systems either way, but debug mode has that effect regardless I suppose. We hit a codepath that we wouldn't normally hit in that large bsize configuration, but it's debug mode and the alignment/size of the allocation should be equivalent to the original allocation code so I think it should be fine to move the label. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Mon Feb 9 10:04:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67C447F96 for ; Mon, 9 Feb 2015 10:04:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05CA2AC001 for ; Mon, 9 Feb 2015 08:04:17 -0800 (PST) X-ASG-Debug-ID: 1423497856-04bdf06a5be2750001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QOALhUFBfo0snaFp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 08:04:16 -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 (8.14.4/8.14.4) with ESMTP id t19G4DIQ011166 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 11:04:15 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19FFLsa030390 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 10:15:23 -0500 Date: Mon, 9 Feb 2015 10:15:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap Message-ID: <20150209151521.GC18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 08/18] xfs: helpers to convert holemask to/from generic bitmap References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-9-git-send-email-bfoster@redhat.com> <20150208235448.GI4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208235448.GI4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423497856 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 10:54:48AM +1100, Dave Chinner wrote: > On Fri, Feb 06, 2015 at 02:52:55PM -0500, Brian Foster wrote: > > The inobt record holemask field is a condensed data type designed to fit > > into the existing on-disk record and is zero based (allocated regions > > are set to 0, sparse regions are set to 1) to provide backwards > > compatibility. This makes the type somewhat complex for use in higher > > level inode manipulations such as individual inode allocation, etc. > > > > Rather than foist the complexity of dealing with this field to every bit > > of logic that requires inode granular information, create the > > xfs_inobt_ialloc_bitmap() helper to convert the holemask to an inode > > allocation bitmap. The inode allocation bitmap is inode granularity > > similar to the inobt record free mask and indicates which inodes of the > > chunk are physically allocated on disk, irrespective of whether the > > inode is considered allocated or free by the filesystem. The generic > > bitmap type requires the use of generic kernel bitmap APIs. > > > > The bitmap_to_u64() helper is provided to convert the bitmap back to a > > native 64-bit type (for native bitwise operations). This is required > > because the generic bitmap code represents a bitmap as an array of > > unsigned long in a little endian style (though each array value is cpu > > order). To ensure compatibility with various word sizes and endianness', > > bitmap_to_u64() exports the bitmap to little endian and swaps back to > > cpu byte order. > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_ialloc.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 69 insertions(+) > > > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > > index 72ade0e..fc001d9 100644 > > --- a/fs/xfs/libxfs/xfs_ialloc.c > > +++ b/fs/xfs/libxfs/xfs_ialloc.c > > @@ -39,6 +39,8 @@ > > #include "xfs_icache.h" > > #include "xfs_trace.h" > > > > +STATIC void > > +xfs_inobt_ialloc_bitmap(unsigned long *, struct xfs_inobt_rec_incore *); > > xfs_inobt_irec_to_allocmap() seems more appropriate for what it does. > I'd also suggest it should be in xfs_ialloc_btree.c, too. > Ok. > > /* > > * Allocation group level functions. > > @@ -739,6 +741,73 @@ xfs_ialloc_get_rec( > > return 0; > > } > > > > +static inline uint64_t > > +bitmap_to_u64( > > + const unsigned long *bitmap, > > + int nbits) > > +{ > > + __le64 lebitmap; > > + > > + ASSERT(nbits <= 64); > > + > > + /* > > + * The bitmap format depends on the native word size. E.g., bit 0 could > > + * land in the middle of the 64 bits on a big endian 32-bit arch (see > > + * arch/powerpc/include/asm/bitops.h). To handle this, export the bitmap > > + * as 64-bit little endian and convert back to native byte order. > > + */ > > + bitmap_copy_le(&lebitmap, bitmap, nbits); > > + return le64_to_cpu(lebitmap); > > +} > > Ok, so this is for doing logic operations on the bitmap, such as > inverting or masking out a bunch of bits? > Yes, generally to convert to inode granularity for whatever operations require it (e.g., find a "real" free inode from ir_free). > The first use of this function is xfs_inobt_first_free_inode(), and > the other use is in xfs_difree_inobt() to build the mask of inodes > in the chunk that need to be freed, and in both those cases they do > > xfs_inobt_ialloc_bitmap(alloc, rec) > allocmask = bitmap_to_u64(alloc, 64); > > and the local stack bitmap is otherwise unused. So, wouldn't a > helper like: > > /* > * Return a host format mask of all the allocated inodes in the > * chunk. The bitmap format depends on the native word size (e.g. > * see arch/powerpc/include/asm/bitops.h) and so we have to marshall > * the bitmap through a defined endian conversion so that we can > * perform host native 64 bit logic operations on the resultant > * allocation mask. > * > * A bit value of 1 means the inode is allocated, a value of 0 means it > * is free. > */ > u64 > xfs_inobt_irec_to_allocmask( > struct xfs_inobt_rec_incore *irec) > { > DECLARE_BITMAP(allocmap, 64), > __le64 lebitmap; > > xfs_inobt_rec_to_allocmap(&allocmap, irec); > bitmap_copy_le(&lebitmap, allocmap, 64); > return le64_to_cpu(lebitmap); > } > Yeah, I went back and forth with doing the conversion within the original helper. We ultimately end up with a couple more callers that do use the generic bitmap, but this could be helpful to those that don't. > > + > > +/* > > + * Convert the inode record holemask to an inode allocation bitmap. The inode > > + * allocation bitmap is inode granularity and specifies whether an inode is > > + * physically allocated on disk (not whether the inode is considered allocated > > + * or free by the fs). > > + * > > + * We have to be careful with regard to byte order and word size since the > > + * generic bitmap code uses primitive types. > > " a bit value of 1 means the inode is allocated, a value of 0 means > it is free" > Ok. > > + */ > > +STATIC void > > +xfs_inobt_ialloc_bitmap( > > + unsigned long *allocbmap, > > + struct xfs_inobt_rec_incore *rec) > > +{ > > + int nextbit; > > + DECLARE_BITMAP(holemask, 16); > > + > > + bitmap_zero(allocbmap, 64); > > + > > + /* > > + * bitmaps are represented as an array of unsigned long (each in cpu > > + * byte order). ir_holemask is only 16 bits, so direct assignment is > > + * safe. > > + */ > > + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); > > BUILD_BUG_ON(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); > > i.e. if we come across a platform where this fails, break the build > rather than waiting for the unlikely event of someone running a > debug kernel on that platform... > I assume the logic has to be inverted, but otherwise that's probably a better idea. Thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@sandeen.net Mon Feb 9 10:42:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 144927F98 for ; Mon, 9 Feb 2015 10:42:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 973C5AC001 for ; Mon, 9 Feb 2015 08:42:46 -0800 (PST) X-ASG-Debug-ID: 1423500164-04cbb01165dad80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id B3nEulSAVOQo2XXm for ; Mon, 09 Feb 2015 08:42:44 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BD26B602D53B; Mon, 9 Feb 2015 10:42:43 -0600 (CST) Message-ID: <54D8E383.4020906@sandeen.net> Date: Mon, 09 Feb 2015 10:42:43 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* In-Reply-To: <20150209130926.GA18336@laptop.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1423500164 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15077 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/9/15 7:09 AM, Brian Foster wrote: > On Mon, Feb 09, 2015 at 08:35:02AM +1100, Dave Chinner wrote: >> On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: >>> These 2 patches provide information about which filesystem >>> hit the error... >> >> If we are going to touch every one of these macros, then can we >> rename them to something a little shorter like XFS_CORRUPT_GOTO() >> and XFS_CORRUPT_RETURN() at the same time? That will make the code a >> little less eye-bleedy where there are lots of these statements, >> and make formatting of complex checks a bit easier, too... >> > > XFS_CORRUPT_DOSOMETHING() jumps out to me as indicate corruption if the > logic statement evaluates as true rather than false. The latter (e.g., > assert-like logic) is how they work today, so that could be a bit > confusing to somebody who isn't already familiar with how these macros > work. > > Unfortunately, nothing shorter than the current naming immediately comes > to mind... :/ We could kill the XFS_ prefix I suppose or even invert the > logic of the calls, but that's certainly a more significant change. > Thoughts? Right, so today it's XFS_WANT_CORRUPTED_RETURN(thing_that_should_be_true) and I agree, that's always felt a bit odd. Dave suggests XFS_CORRUPT_RETURN(thing_that_should_be_true) I guess the "WANT" was supposed to imply that the argument is the test that we "want" to be true? :) I'm not super excited about inverting every test, but we could ... XFS_CORRUPT_RETURN_IF_NOT(test) would be explicit, at least. Or XFS_CORRUPT_RETURN_UNLESS(test). I can't think of a nice short name that conveys more meaning, either, but I'm not really sure that it's critical to change it at this point. -Eric From bfoster@redhat.com Mon Feb 9 12:18:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5EF657F9F for ; Mon, 9 Feb 2015 12:18:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D9BB8F804C for ; Mon, 9 Feb 2015 10:18:54 -0800 (PST) X-ASG-Debug-ID: 1423505933-04cb6c6b09e6b40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0CZJoiBWBZpVcdLS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 10:18:53 -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 (8.14.4/8.14.4) with ESMTP id t19IIofq012907 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 13:18:50 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19IIl15013735 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 13:18:49 -0500 Date: Mon, 9 Feb 2015 13:18:47 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inodes are new until the dentry cache is set up Message-ID: <20150209181846.GF18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: inodes are new until the dentry cache is set up References: <1423083409-28362-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083409-28362-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423505933 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 07:56:49AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Al Viro noticed a generic set of issues to do with filehandle lookup > racing with dentry cache setup. They involve a filehandle lookup > occurring while an inode is being created and the filehandle lookup > racing with the dentry creation for the real file. This can lead to > multiple dentries for the one path being instantiated. There are a > host of other issues around this same set of paths. > > The underlying cause is that file handle lookup only waits on inode > cache instantiation rather than full dentry cache instantiation. XFS > is mostly immune to the problems discovered due to it's own internal > inode cache, but there are a couple of corner cases where races can > happen. > > We currently clear the XFS_INEW flag when the inode is fully set up > after insertion into the cache. Newly allocated inodes are inserted > locked and so aren't usable until the allocation transaction > commits. This, however, occurs before the dentry and security > information is fully initialised and hence the inode is unlocked and > available for lookups to find too early. > > To solve the problem, only clear the XFS_INEW flag for newly created > inodes once the dentry is fully instantiated. This means lookups > will retry until the XFS_INEW flag is removed from the inode and > hence avoids the race conditions in questions. > > THis also means that xfs_create(), xfs_create_tmpfile() and > xfs_symlink() need to finish the setup of the inode in their error > paths if we had allocated the inode but failed later in the creation > process. xfs_symlink(), in particular, needed a lot of help to make > it's error handling match that of xfs_create(). > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_icache.c | 4 ++-- > fs/xfs/xfs_inode.c | 22 ++++++++++++-------- > fs/xfs/xfs_inode.h | 22 ++++++++++++++++++++ > fs/xfs/xfs_iops.c | 24 +++++++++------------- > fs/xfs/xfs_iops.h | 2 -- > fs/xfs/xfs_qm.c | 13 ++++++++---- > fs/xfs/xfs_symlink.c | 58 ++++++++++++++++++++++++++++++---------------------- > 7 files changed, 90 insertions(+), 55 deletions(-) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index 9771b7e..76a9f27 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -439,11 +439,11 @@ again: > *ipp = ip; > > /* > - * If we have a real type for an on-disk inode, we can set ops(&unlock) > + * If we have a real type for an on-disk inode, we can setup the inode > * now. If it's a new inode being created, xfs_ialloc will handle it. > */ > if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) > - xfs_setup_inode(ip); > + xfs_setup_existing_inode(ip); > return 0; > > out_error_or_again: > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index daafa1f..d0414f3 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -818,7 +818,7 @@ xfs_ialloc( > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > xfs_trans_log_inode(tp, ip, flags); > > - /* now that we have an i_mode we can setup inode ops and unlock */ > + /* now that we have an i_mode we can setup the inode structure */ > xfs_setup_inode(ip); > > *ipp = ip; > @@ -1235,12 +1235,14 @@ xfs_create( > xfs_trans_cancel(tp, cancel_flags); > out_release_inode: > /* > - * Wait until after the current transaction is aborted to > - * release the inode. This prevents recursive transactions > - * and deadlocks from xfs_inactive. > + * Wait until after the current transaction is aborted to finish the > + * setup of the inode and release the inode. This prevents recursive > + * transactions and deadlocks from xfs_inactive. > */ > - if (ip) > + if (ip) { > + xfs_finish_inode_setup(ip); > IRELE(ip); > + } > > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > @@ -1345,12 +1347,14 @@ xfs_create_tmpfile( > xfs_trans_cancel(tp, cancel_flags); > out_release_inode: > /* > - * Wait until after the current transaction is aborted to > - * release the inode. This prevents recursive transactions > - * and deadlocks from xfs_inactive. > + * Wait until after the current transaction is aborted to finish the > + * setup of the inode and release the inode. This prevents recursive > + * transactions and deadlocks from xfs_inactive. > */ > - if (ip) > + if (ip) { > + xfs_finish_inode_setup(ip); > IRELE(ip); > + } > > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 86cd6b3..8e82b41 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -390,6 +390,28 @@ int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); > int xfs_iozero(struct xfs_inode *, loff_t, size_t); > > > +/* from xfs_iops.c */ > +/* > + * When setting up a newly allocated inode, we need to call > + * xfs_finish_inode_setup() once the inode is fully instantiated at > + * the VFS level to prevent the rest of the world seeing the inode > + * 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); > + barrier(); > + unlock_new_inode(VFS_I(ip)); > +} > + > +static inline void xfs_setup_existing_inode(struct xfs_inode *ip) > +{ > + xfs_setup_inode(ip); > + xfs_finish_inode_setup(ip); > +} > + > #define IHOLD(ip) \ > do { \ > ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index ce80eeb..8be5bb5 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -186,6 +186,8 @@ xfs_generic_create( > else > d_instantiate(dentry, inode); > > + xfs_finish_inode_setup(ip); > + > out_free_acl: > if (default_acl) > posix_acl_release(default_acl); > @@ -194,6 +196,7 @@ xfs_generic_create( > return error; > > out_cleanup_inode: > + xfs_finish_inode_setup(ip); > if (!tmpfile) > xfs_cleanup_inode(dir, inode, dentry); > iput(inode); > @@ -366,9 +369,11 @@ xfs_vn_symlink( > goto out_cleanup_inode; > > d_instantiate(dentry, inode); > + xfs_finish_inode_setup(cip); > return 0; > > out_cleanup_inode: > + xfs_finish_inode_setup(cip); > xfs_cleanup_inode(dir, inode, dentry); > iput(inode); > out: > @@ -1231,16 +1236,12 @@ xfs_diflags_to_iflags( > } > > /* > - * Initialize the Linux inode, set up the operation vectors and > - * unlock the 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 inode. > + * Initialize the Linux inode and set up the operation vectors. > * > - * We are always called with an uninitialised linux inode here. > - * We need to initialise the necessary fields and take a reference > - * on it. > + * 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 > + * inode. These callers have different criteria for clearing XFS_INEW, so leave > + * it up to the caller to deal with unlocking the inode appropriately. > */ > void > xfs_setup_inode( > @@ -1327,9 +1328,4 @@ xfs_setup_inode( > inode_has_no_xattr(inode); > cache_no_acl(inode); > } > - > - xfs_iflags_clear(ip, XFS_INEW); > - barrier(); > - > - unlock_new_inode(inode); > } > diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h > index 1c34e43..d4bcc29 100644 > --- a/fs/xfs/xfs_iops.h > +++ b/fs/xfs/xfs_iops.h > @@ -25,8 +25,6 @@ extern const struct file_operations xfs_dir_file_operations; > > extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); > > -extern void xfs_setup_inode(struct xfs_inode *); > - > /* > * Internal setattr interfaces. > */ > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > index 3e81862..1f9e23c 100644 > --- a/fs/xfs/xfs_qm.c > +++ b/fs/xfs/xfs_qm.c > @@ -719,6 +719,7 @@ xfs_qm_qino_alloc( > xfs_trans_t *tp; > int error; > int committed; > + bool need_alloc = true; > > *ip = NULL; > /* > @@ -747,6 +748,7 @@ xfs_qm_qino_alloc( > return error; > mp->m_sb.sb_gquotino = NULLFSINO; > mp->m_sb.sb_pquotino = NULLFSINO; > + need_alloc = false; > } > } > > @@ -758,7 +760,7 @@ xfs_qm_qino_alloc( > return error; > } > > - if (!*ip) { > + if (need_alloc) { > error = xfs_dir_ialloc(&tp, NULL, S_IFREG, 1, 0, 0, 1, ip, > &committed); > if (error) { > @@ -794,11 +796,14 @@ xfs_qm_qino_alloc( > spin_unlock(&mp->m_sb_lock); > xfs_log_sb(tp); > > - if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + if (error) { > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > xfs_alert(mp, "%s failed (error %d)!", __func__, error); > - return error; > } > - return 0; > + if (need_alloc) > + xfs_finish_inode_setup(*ip); > + return error; > } > > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 25791df..3df411e 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -177,7 +177,7 @@ xfs_symlink( > int pathlen; > struct xfs_bmap_free free_list; > xfs_fsblock_t first_block; > - bool unlock_dp_on_error = false; > + bool unlock_dp_on_error = false; > uint cancel_flags; > int committed; > xfs_fileoff_t first_fsb; > @@ -221,7 +221,7 @@ xfs_symlink( > XFS_QMOPT_QUOTALL | XFS_QMOPT_INHERIT, > &udqp, &gdqp, &pdqp); > if (error) > - goto std_return; > + return error; > > tp = xfs_trans_alloc(mp, XFS_TRANS_SYMLINK); > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > @@ -241,7 +241,7 @@ xfs_symlink( > } > if (error) { > cancel_flags = 0; > - goto error_return; > + goto out_trans_cancel; > } > > xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); > @@ -252,7 +252,7 @@ xfs_symlink( > */ > if (dp->i_d.di_flags & XFS_DIFLAG_NOSYMLINKS) { > error = -EPERM; > - goto error_return; > + goto out_trans_cancel; > } > > /* > @@ -261,7 +261,7 @@ xfs_symlink( > error = xfs_trans_reserve_quota(tp, mp, udqp, gdqp, > pdqp, resblks, 1, 0); > if (error) > - goto error_return; > + goto out_trans_cancel; > > /* > * Check for ability to enter directory entry, if no space reserved. > @@ -269,7 +269,7 @@ xfs_symlink( > if (!resblks) { > error = xfs_dir_canenter(tp, dp, link_name); > if (error) > - goto error_return; > + goto out_trans_cancel; > } > /* > * Initialize the bmap freelist prior to calling either > @@ -282,15 +282,14 @@ xfs_symlink( > */ > error = xfs_dir_ialloc(&tp, dp, S_IFLNK | (mode & ~S_IFMT), 1, 0, > prid, resblks > 0, &ip, NULL); > - if (error) { > - if (error == -ENOSPC) > - goto error_return; > - goto error1; > - } > + if (error) > + goto out_trans_cancel; > > /* > - * An error after we've joined dp to the transaction will result in the > - * transaction cancel unlocking dp so don't do it explicitly in the > + * Now we join the directory inode to the transaction. We do not do it > + * earlier because xfs_dir_ialloc might commit the previous transaction > + * (and release all the locks). An error from here on will result in > + * the transaction cancel unlocking dp so don't do it explicitly in the > * error path. > */ > xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > @@ -330,7 +329,7 @@ xfs_symlink( > XFS_BMAPI_METADATA, &first_block, resblks, > mval, &nmaps, &free_list); > if (error) > - goto error2; > + goto out_bmap_cancel; > > if (resblks) > resblks -= fs_blocks; > @@ -348,7 +347,7 @@ xfs_symlink( > BTOBB(byte_cnt), 0); > if (!bp) { > error = -ENOMEM; > - goto error2; > + goto out_bmap_cancel; > } > bp->b_ops = &xfs_symlink_buf_ops; > > @@ -378,7 +377,7 @@ xfs_symlink( > error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, > &first_block, &free_list, resblks); > if (error) > - goto error2; > + goto out_bmap_cancel; > xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); > > @@ -392,10 +391,13 @@ xfs_symlink( > } > > error = xfs_bmap_finish(&tp, &free_list, &committed); > - if (error) { > - goto error2; > - } > + if (error) > + goto out_bmap_cancel; > + > error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + if (error) > + goto out_release_inode; > + > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > xfs_qm_dqrele(pdqp); > @@ -403,20 +405,28 @@ xfs_symlink( > *ipp = ip; > return 0; > > - error2: > - IRELE(ip); > - error1: > +out_bmap_cancel: > xfs_bmap_cancel(&free_list); > cancel_flags |= XFS_TRANS_ABORT; > - error_return: > +out_trans_cancel: > xfs_trans_cancel(tp, cancel_flags); > +out_release_inode: > + /* > + * Wait until after the current transaction is aborted to finish the > + * setup of the inode and release the inode. This prevents recursive > + * transactions and deadlocks from xfs_inactive. > + */ > + if (ip) { > + xfs_finish_inode_setup(ip); > + IRELE(ip); > + } > + > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > xfs_qm_dqrele(pdqp); > > if (unlock_dp_on_error) > xfs_iunlock(dp, XFS_ILOCK_EXCL); > - std_return: > return error; > } > > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 12:25:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 12DA97F9F for ; Mon, 9 Feb 2015 12:25:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 01E8E8F804C for ; Mon, 9 Feb 2015 10:25:45 -0800 (PST) X-ASG-Debug-ID: 1423506343-04cb6c6b0ce7270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Zelwo7xhgQyGPs9N (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 10:25: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 (8.14.4/8.14.4) with ESMTP id t19IPg1D016471 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 13:25:42 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19IPdi1017477 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 13:25:41 -0500 Date: Mon, 9 Feb 2015 13:25:38 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, y@disappointment.disaster Subject: Re: [PATCH] xfs: only trace buffer items if they exist Message-ID: <20150209182538.GG18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: only trace buffer items if they exist References: <1423198008-30748-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423198008-30748-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423506344 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Feb 06, 2015 at 03:46:48PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The commit 2d3d0c5 ("xfs: lobotomise xfs_trans_read_buf_map()") left > a landmine in the tracing code: trace_xfs_trans_buf_read() is now > call on all buffers that are read through this interface rather than > just buffers in transactions. For buffers outside transaction > context, bp->b_fspriv is null, and so the buf log item tracing > functions cannot be called. This causes a NULL pointer dereference > in the trace_xfs_trans_buf_read() function when tracing is turned > on. > > Signed-off-by: Dave Chinner > --- Ah, I hit this a week or so ago and completely forgot to dig into it. Thanks! Reviewed-by: Brian Foster > fs/xfs/xfs_trans_buf.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 0a4d4ab..7579841 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -327,9 +327,10 @@ xfs_trans_read_buf_map( > return -EIO; > } > > - if (tp) > + if (tp) { > _xfs_trans_bjoin(tp, bp, 1); > - trace_xfs_trans_read_buf(bp->b_fspriv); > + trace_xfs_trans_read_buf(bp->b_fspriv); > + } > *bpp = bp; > return 0; > > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfields@fieldses.org Mon Feb 9 14:12:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 13A3E7F9F for ; Mon, 9 Feb 2015 14:12:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1269AC006 for ; Mon, 9 Feb 2015 12:12:00 -0800 (PST) X-ASG-Debug-ID: 1423512714-04bdf06a5bf0f70001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id MUAwxLZx1GqqgjSr for ; Mon, 09 Feb 2015 12:11:55 -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 4B7B035CE; Mon, 9 Feb 2015 15:11:54 -0500 (EST) Date: Mon, 9 Feb 2015 15:11:54 -0500 From: "J. Bruce Fields" To: Jeff Layton Cc: Christoph Hellwig , Dave Chinner , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150209201154.GA27746@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150208090942.51e99687@tlielax.poochiereds.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1423512714 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 08, 2015 at 09:09:42AM -0500, Jeff Layton wrote: > On Sun, 8 Feb 2015 14:34:35 +0100 > Christoph Hellwig wrote: > > > On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > > > You'd basically just be pulling my tree (Christoph's is just my nfsd > > > tree with his patches on top, and I've been testing with exactly that > > > locally, just putting off pushing it out till we decide this.) > > > > > > So anyway, fine with me if you want to just pull that into the xfs tree. > > > Mine's ready whenever, so if I send my pull pretty soon after the merge > > > window and you send it a little later then we still keep the property > > > that Linus's merge still has a diffstat only in our respective areas. > > > > > > (OK, it's a little more complicated because I've got the same > > > arrangement with jlayton, so the order is jlayton's lock pull, then my > > > nfsd pull, then your xfs pull. Is this getting too complicated? > > > jlayton and I are both ready to so and I think it'd work.) > > > > > > I'm also fine with duplicating those few patches, or whatever. > > > > Maybe the better idea is to pull the xfs tree in the nfsd tree, but > > that would require Dave sending an early pull request so that the > > nfsd pull doesn't get delayed. > > > > Or we just defer the pnfsd merge. While I tried to get it in in time > > for 3.20 all the delays during review mean we're really late no and should > > punt it to 3.21. > > FWIW, I plan to send a pull request for the locking changes as soon as > the merge window opens. Hopefully that won't be an issue for long... This includes Christoph's branch (all but the final xfs commits): git://linux-nfs.org/~bfields/linux.git for-3.20 That's what I intend to submit. Hope that's OK. Then it's up to Dave whether he wants to pull that in and include the xfs patches. Worst case we end up with not-yet-usable pnfs code in 3.20, which wouldn't be ideal but shouldn't cause any serious problem either. --b. From bfoster@redhat.com Mon Feb 9 14:31:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F255B7FA0 for ; Mon, 9 Feb 2015 14:31:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5101304039 for ; Mon, 9 Feb 2015 12:31:20 -0800 (PST) X-ASG-Debug-ID: 1423513878-04bdf06a5cf1640001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gAetCGp25hcHTwOO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31:19 -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 (8.14.4/8.14.4) with ESMTP id t19KVHO6010671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:17 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVESn002035 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:16 -0500 Date: Mon, 9 Feb 2015 15:31:14 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: introduce mmap/truncate lock Message-ID: <20150209203114.GH18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: introduce mmap/truncate lock References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513879 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:14AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Right now we cannot serialise mmap against truncate or hole punch > sanely. ->page_mkwrite is not able to take locks that the read IO > path normally takes (i.e. the inode iolock) because that could > result in lock inversions (read - iolock - page fault - page_mkwrite > - iolock) and so we cannot use an IO path lock to serialise page > write faults against truncate operations. > > Instead, introduce a new lock that is used *only* in the > ->page_mkwrite path that is the equivalent of the iolock. The lock > ordering in a page fault is i_mmaplock -> page lock -> i_ilock, > and so in truncate we can i_iolock -> i_mmaplock and so lock out > new write faults during the process of truncation. > > Because i_mmap_lock is outside the page lock, we can hold it across > all the same operations we hold the i_iolock for. The only > difference is that we never hold the i_mmaplock in the normal IO > path and so do not ever have the possibility that we can page fault > inside it. Hence there are no recursion issues on the i_mmap_lock > and so we can use it to serialise page fault IO against inode > modification operations that affect the IO path. > > This patch introduces the i_mmaplock infrastructure, lockdep > annotations and initialisation/destruction code. Use of the new lock > will be in subsequent patches. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_inode.c | 128 ++++++++++++++++++++++++++++++++++++++++------------- > fs/xfs/xfs_inode.h | 29 +++++++++--- > fs/xfs/xfs_super.c | 2 + > 3 files changed, 121 insertions(+), 38 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index d0414f3..bf2d2c7 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -117,24 +117,34 @@ xfs_ilock_attr_map_shared( > } > > /* > - * The xfs inode contains 2 locks: a multi-reader lock called the > - * i_iolock and a multi-reader lock called the i_lock. This routine > - * allows either or both of the locks to be obtained. > + * The xfs inode contains 3 multi-reader locks: the i_iolock the i_mmap_lock and > + * the i_lock. This routine allows various combinations of the locks to be > + * obtained. > * > - * The 2 locks should always be ordered so that the IO lock is > - * obtained first in order to prevent deadlock. > + * The 3 locks should always be ordered so that the IO lock is obtained first, > + * the mmap lock second and the ilock last in order to prevent deadlock. > * > - * ip -- the inode being locked > - * lock_flags -- this parameter indicates the inode's locks > - * to be locked. It can be: > - * XFS_IOLOCK_SHARED, > - * XFS_IOLOCK_EXCL, > - * XFS_ILOCK_SHARED, > - * XFS_ILOCK_EXCL, > - * XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED, > - * XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL, > - * XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED, > - * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL > + * Basic locking order: > + * > + * i_iolock -> i_mmap_lock -> page_lock -> i_ilock > + * > + * mmap_sem locking order: > + * > + * i_iolock -> page lock -> mmap_sem > + * mmap_sem -> i_mmap_lock -> page_lock > + * > + * The result of the differenced in mmap_sem locking order mean that we cannot The difference in mmap_sem locking order means ... > + * hold the i_mmap_lock over syscall based read(2)/write(2) based IO. These > + * IO paths can fault in pages during copy in/out (for buffered IO) or require > + * the mmap_sem in get_user_pages() to map the user pages into the kernel > + * address space for direct IO. Similarly the i_iolock cannot be taken inside a > + * page fault because page faults already hold the mmap_sem. > + * > + * Hence to serialise fully against both syscall and mmap based IO, we need to > + * take both the i_iolock and the i_mmap_lock. These locks should *only* be both > + * taken in places where we need to invalidate the page cache in a race > + * free manner (e.g. truncate, hole punch and other extent manipulation > + * functions). > */ > void > xfs_ilock( > @@ -150,6 +160,8 @@ xfs_ilock( > */ > ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != > (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); > + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != > + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > @@ -159,6 +171,11 @@ xfs_ilock( > else if (lock_flags & XFS_IOLOCK_SHARED) > mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); > > + if (lock_flags & XFS_MMAPLOCK_EXCL) > + mrupdate_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags)); > + else if (lock_flags & XFS_MMAPLOCK_SHARED) > + mraccess_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags)); > + > if (lock_flags & XFS_ILOCK_EXCL) > mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); > else if (lock_flags & XFS_ILOCK_SHARED) > @@ -191,6 +208,8 @@ xfs_ilock_nowait( > */ > ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != > (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); > + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != > + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > @@ -202,21 +221,35 @@ xfs_ilock_nowait( > if (!mrtryaccess(&ip->i_iolock)) > goto out; > } > + > + if (lock_flags & XFS_MMAPLOCK_EXCL) { > + if (!mrtryupdate(&ip->i_mmaplock)) > + goto out_undo_iolock; > + } else if (lock_flags & XFS_MMAPLOCK_SHARED) { > + if (!mrtryaccess(&ip->i_mmaplock)) > + goto out_undo_iolock; > + } > + > if (lock_flags & XFS_ILOCK_EXCL) { > if (!mrtryupdate(&ip->i_lock)) > - goto out_undo_iolock; > + goto out_undo_mmaplock; > } else if (lock_flags & XFS_ILOCK_SHARED) { > if (!mrtryaccess(&ip->i_lock)) > - goto out_undo_iolock; > + goto out_undo_mmaplock; > } > return 1; > > - out_undo_iolock: > +out_undo_mmaplock: > + if (lock_flags & XFS_MMAPLOCK_EXCL) > + mrunlock_excl(&ip->i_mmaplock); > + else if (lock_flags & XFS_MMAPLOCK_SHARED) > + mrunlock_shared(&ip->i_mmaplock); > +out_undo_iolock: > if (lock_flags & XFS_IOLOCK_EXCL) > mrunlock_excl(&ip->i_iolock); > else if (lock_flags & XFS_IOLOCK_SHARED) > mrunlock_shared(&ip->i_iolock); > - out: > +out: > return 0; > } > > @@ -244,6 +277,8 @@ xfs_iunlock( > */ > ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != > (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); > + ASSERT((lock_flags & (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)) != > + (XFS_MMAPLOCK_SHARED | XFS_MMAPLOCK_EXCL)); > ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != > (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); > ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); > @@ -254,6 +289,11 @@ xfs_iunlock( > else if (lock_flags & XFS_IOLOCK_SHARED) > mrunlock_shared(&ip->i_iolock); > > + if (lock_flags & XFS_MMAPLOCK_EXCL) > + mrunlock_excl(&ip->i_mmaplock); > + else if (lock_flags & XFS_MMAPLOCK_SHARED) > + mrunlock_shared(&ip->i_mmaplock); > + > if (lock_flags & XFS_ILOCK_EXCL) > mrunlock_excl(&ip->i_lock); > else if (lock_flags & XFS_ILOCK_SHARED) > @@ -271,11 +311,14 @@ xfs_ilock_demote( > xfs_inode_t *ip, > uint lock_flags) > { > - ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); > - ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); > + ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)); > + ASSERT((lock_flags & > + ~(XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); > > if (lock_flags & XFS_ILOCK_EXCL) > mrdemote(&ip->i_lock); > + if (lock_flags & XFS_MMAPLOCK_EXCL) > + mrdemote(&ip->i_mmaplock); > if (lock_flags & XFS_IOLOCK_EXCL) > mrdemote(&ip->i_iolock); > > @@ -294,6 +337,12 @@ xfs_isilocked( > return rwsem_is_locked(&ip->i_lock.mr_lock); > } > > + if (lock_flags & (XFS_MMAPLOCK_EXCL|XFS_MMAPLOCK_SHARED)) { > + if (!(lock_flags & XFS_MMAPLOCK_SHARED)) > + return !!ip->i_mmaplock.mr_writer; > + return rwsem_is_locked(&ip->i_mmaplock.mr_lock); > + } > + > if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { > if (!(lock_flags & XFS_IOLOCK_SHARED)) > return !!ip->i_iolock.mr_writer; > @@ -314,14 +363,27 @@ int xfs_lock_delays; > #endif > > /* > - * Bump the subclass so xfs_lock_inodes() acquires each lock with > - * a different value > + * Bump the subclass so xfs_lock_inodes() acquires each lock with a different > + * value. This shouldn't be called for page fault locking, but we also need to > + * ensure we don't overrun the number of lockdep subclasses for the iolock or > + * mmaplock as that is limited to 12 by the mmap lock lockdep annotations. > */ I'm not really familiar with lockdep here but I take that the asserts below are intended to check for overflow of values set in one bit range to another. Those look Ok to me from that perspective, but I don't follow the comment above. Where does the limit of 12 come from? That and the comment nit above aside, the rest looks Ok to me: Reviewed-by: Brian Foster > static inline int > xfs_lock_inumorder(int lock_mode, int subclass) > { > - if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) > + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { > + ASSERT(subclass + XFS_LOCK_INUMORDER < > + (1 << (XFS_MMAPLOCK_SHIFT - XFS_IOLOCK_SHIFT))); > lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT; > + } > + > + if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) { > + ASSERT(subclass + XFS_LOCK_INUMORDER < > + (1 << (XFS_ILOCK_SHIFT - XFS_MMAPLOCK_SHIFT))); > + lock_mode |= (subclass + XFS_LOCK_INUMORDER) << > + XFS_MMAPLOCK_SHIFT; > + } > + > if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) > lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT; > > @@ -440,10 +502,10 @@ again: > } > > /* > - * xfs_lock_two_inodes() can only be used to lock one type of lock > - * at a time - the iolock or the ilock, but not both at once. If > - * we lock both at once, lockdep will report false positives saying > - * we have violated locking orders. > + * xfs_lock_two_inodes() can only be used to lock one type of lock at a time - > + * the iolock, the mmaplock or the ilock, but not more than one at a time. If we > + * lock more than one at a time, lockdep will report false positives saying we > + * have violated locking orders. > */ > void > xfs_lock_two_inodes( > @@ -455,8 +517,12 @@ xfs_lock_two_inodes( > int attempts = 0; > xfs_log_item_t *lp; > > - if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) > - ASSERT((lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) == 0); > + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { > + ASSERT(!(lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL))); > + ASSERT(!(lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))); > + } else if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) > + ASSERT(!(lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL))); > + > ASSERT(ip0->i_ino != ip1->i_ino); > > if (ip0->i_ino > ip1->i_ino) { > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 8e82b41..56967dd 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -56,6 +56,7 @@ typedef struct xfs_inode { > struct xfs_inode_log_item *i_itemp; /* logging information */ > mrlock_t i_lock; /* inode lock */ > mrlock_t i_iolock; /* inode IO lock */ > + mrlock_t i_mmaplock; /* inode mmap IO lock */ > atomic_t i_pincount; /* inode pin count */ > spinlock_t i_flags_lock; /* inode i_flags lock */ > /* Miscellaneous state. */ > @@ -263,15 +264,20 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) > #define XFS_IOLOCK_SHARED (1<<1) > #define XFS_ILOCK_EXCL (1<<2) > #define XFS_ILOCK_SHARED (1<<3) > +#define XFS_MMAPLOCK_EXCL (1<<4) > +#define XFS_MMAPLOCK_SHARED (1<<5) > > #define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ > - | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) > + | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED \ > + | XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED) > > #define XFS_LOCK_FLAGS \ > { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ > { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ > { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ > - { XFS_ILOCK_SHARED, "ILOCK_SHARED" } > + { XFS_ILOCK_SHARED, "ILOCK_SHARED" }, \ > + { XFS_MMAPLOCK_EXCL, "MMAPLOCK_EXCL" }, \ > + { XFS_MMAPLOCK_SHARED, "MMAPLOCK_SHARED" } > > > /* > @@ -302,17 +308,26 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) > #define XFS_IOLOCK_SHIFT 16 > #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) > > +#define XFS_MMAPLOCK_SHIFT 20 > + > #define XFS_ILOCK_SHIFT 24 > #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) > #define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) > #define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) > > -#define XFS_IOLOCK_DEP_MASK 0x00ff0000 > +#define XFS_IOLOCK_DEP_MASK 0x000f0000 > +#define XFS_MMAPLOCK_DEP_MASK 0x00f00000 > #define XFS_ILOCK_DEP_MASK 0xff000000 > -#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK) > - > -#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) > -#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) > +#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | \ > + XFS_MMAPLOCK_DEP_MASK | \ > + XFS_ILOCK_DEP_MASK) > + > +#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) \ > + >> XFS_IOLOCK_SHIFT) > +#define XFS_MMAPLOCK_DEP(flags) (((flags) & XFS_MMAPLOCK_DEP_MASK) \ > + >> XFS_MMAPLOCK_SHIFT) > +#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) \ > + >> XFS_ILOCK_SHIFT) > > /* > * For multiple groups support: if S_ISGID bit is set in the parent > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index afd6bae..40d2ac5 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -986,6 +986,8 @@ xfs_fs_inode_init_once( > atomic_set(&ip->i_pincount, 0); > spin_lock_init(&ip->i_flags_lock); > > + mrlock_init(&ip->i_mmaplock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, > + "xfsino", ip->i_ino); > mrlock_init(&ip->i_lock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, > "xfsino", ip->i_ino); > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 14:31:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4BA97FA6 for ; Mon, 9 Feb 2015 14:31:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42739AC004 for ; Mon, 9 Feb 2015 12:31:31 -0800 (PST) X-ASG-Debug-ID: 1423513886-04cbb01162e5e60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tL8kTgooI4AdKI0z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31:27 -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 (8.14.4/8.14.4) with ESMTP id t19KVPau005545 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:25 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVMsD003732 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:24 -0500 Date: Mon, 9 Feb 2015 15:31:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: use i_mmaplock on read faults Message-ID: <20150209203121.GI18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: use i_mmaplock on read faults References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:15AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Take the i_mmaplock over read page faults. These come through the > ->fault callout, so we need to wrap the generic implementation > with the i_mmaplock. While there, add tracepoints for the read > fault as it passes through XFS. > > This gives us a lock order of mmap_sem -> i_mmaplock -> page_lock > -> i_lock. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 28 +++++++++++++++++++++++++++- > fs/xfs/xfs_trace.h | 2 ++ > 2 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 712d312..6cc1b7d 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -1369,6 +1369,32 @@ xfs_file_llseek( > } > } > > +/* > + * Locking for serialisation of IO during page faults. This results in a lock > + * ordering of: > + * > + * mmap_sem (MM) > + * i_mmap_lock (XFS - truncate serialisation) > + * page_lock (MM) > + * i_lock (XFS - extent map serialisation) > + */ > +STATIC int > +xfs_filemap_fault( > + struct vm_area_struct *vma, > + struct vm_fault *vmf) > +{ > + struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host); > + int error; > + > + trace_xfs_filemap_fault(ip); > + > + xfs_ilock(ip, XFS_MMAPLOCK_SHARED); > + error = filemap_fault(vma, vmf); > + xfs_iunlock(ip, XFS_MMAPLOCK_SHARED); > + > + return error; > +} > + > const struct file_operations xfs_file_operations = { > .llseek = xfs_file_llseek, > .read = new_sync_read, > @@ -1401,7 +1427,7 @@ const struct file_operations xfs_dir_file_operations = { > }; > > static const struct vm_operations_struct xfs_file_vm_ops = { > - .fault = filemap_fault, > + .fault = xfs_filemap_fault, > .map_pages = filemap_map_pages, > .page_mkwrite = xfs_vm_page_mkwrite, > .remap_pages = generic_file_remap_pages, > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 51372e3..c496153 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -685,6 +685,8 @@ DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); > DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); > DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); > > +DEFINE_INODE_EVENT(xfs_filemap_fault); > + > DECLARE_EVENT_CLASS(xfs_iref_class, > TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), > TP_ARGS(ip, caller_ip), > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 14:31:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5A967FA0 for ; Mon, 9 Feb 2015 14:31:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7011D304032 for ; Mon, 9 Feb 2015 12:31:36 -0800 (PST) X-ASG-Debug-ID: 1423513894-04bdf06a5bf1660001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B01ntABtVsUhigFi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31:35 -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 (8.14.4/8.14.4) with ESMTP id t19KVWgl016106 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:32 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVTK2027084 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:31 -0500 Date: Mon, 9 Feb 2015 15:31:28 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: use i_mmaplock on write faults Message-ID: <20150209203128.GJ18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: use i_mmaplock on write faults References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513895 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:16AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Take the i_mmaplock over write page faults. These come through the > ->page_mkwrite callout, so we need to wrap that calls with the > i_mmaplock. > > This gives us a lock order of mmap_sem -> i_mmaplock -> page_lock > -> i_lock. > > Also, move the page_mkwrite wrapper to the same region of xfs_file.c > as the read fault wrappers and add a tracepoint. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 39 ++++++++++++++++++++++++--------------- > fs/xfs/xfs_trace.h | 1 + > 2 files changed, 25 insertions(+), 15 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 6cc1b7d..2bb25fd 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -981,20 +981,6 @@ xfs_file_mmap( > } > > /* > - * mmap()d file has taken write protection fault and is being made > - * writable. We can set the page state up correctly for a writable > - * page, which means we can do correct delalloc accounting (ENOSPC > - * checking!) and unwritten extent mapping. > - */ > -STATIC int > -xfs_vm_page_mkwrite( > - struct vm_area_struct *vma, > - struct vm_fault *vmf) > -{ > - return block_page_mkwrite(vma, vmf, xfs_get_blocks); > -} > - > -/* > * This type is designed to indicate the type of offset we would like > * to search from page cache for xfs_seek_hole_data(). > */ > @@ -1395,6 +1381,29 @@ xfs_filemap_fault( > return error; > } > > +/* > + * mmap()d file has taken write protection fault and is being made writable. We > + * can set the page state up correctly for a writable page, which means we can > + * do correct delalloc accounting (ENOSPC checking!) and unwritten extent > + * mapping. > + */ > +STATIC int > +xfs_filemap_page_mkwrite( > + struct vm_area_struct *vma, > + struct vm_fault *vmf) > +{ > + struct xfs_inode *ip = XFS_I(vma->vm_file->f_mapping->host); > + int error; > + > + trace_xfs_filemap_page_mkwrite(ip); > + > + xfs_ilock(ip, XFS_MMAPLOCK_SHARED); > + error = block_page_mkwrite(vma, vmf, xfs_get_blocks); > + xfs_iunlock(ip, XFS_MMAPLOCK_SHARED); > + > + return error; > +} > + > const struct file_operations xfs_file_operations = { > .llseek = xfs_file_llseek, > .read = new_sync_read, > @@ -1429,6 +1438,6 @@ const struct file_operations xfs_dir_file_operations = { > static const struct vm_operations_struct xfs_file_vm_ops = { > .fault = xfs_filemap_fault, > .map_pages = filemap_map_pages, > - .page_mkwrite = xfs_vm_page_mkwrite, > + .page_mkwrite = xfs_filemap_page_mkwrite, > .remap_pages = generic_file_remap_pages, > }; > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index c496153..b1e059b 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -686,6 +686,7 @@ DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); > DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); > > DEFINE_INODE_EVENT(xfs_filemap_fault); > +DEFINE_INODE_EVENT(xfs_filemap_page_mkwrite); > > DECLARE_EVENT_CLASS(xfs_iref_class, > TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 14:31:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F1897FAE for ; Mon, 9 Feb 2015 14:31:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1E3F38F8087 for ; Mon, 9 Feb 2015 12:31:43 -0800 (PST) X-ASG-Debug-ID: 1423513901-04cbb01164e5e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7xgEN2nQVe5mBqnJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVdko010502 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:40 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVban000633 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:39 -0500 Date: Mon, 9 Feb 2015 15:31:36 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: take i_mmap_lock on extent manipulation operations Message-ID: <20150209203136.GK18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: take i_mmap_lock on extent manipulation operations References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513902 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:17AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Now we have the i_mmap_lock being held across the page fault IO > path, we now add extent manipulation operation exclusion by adding > the lock to the paths that directly modify extent maps. This > includes truncate, hole punching and other fallocate based > operations. The operations will now take both the i_iolock and the > i_mmaplock in exclusive mode, thereby ensuring that all IO and page > faults block without holding any page locks while the extent > manipulation is in progress. > > This gives us the lock order during truncate of i_iolock -> > i_mmaplock -> page_lock -> i_lock, hence providing the same > lock order as the iolock provides the normal IO path without > involving the mmap_sem. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 4 ++-- > fs/xfs/xfs_ioctl.c | 4 ++-- > fs/xfs/xfs_iops.c | 5 +++-- > 3 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 2bb25fd..76bf14a 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -830,7 +830,7 @@ xfs_file_fallocate( > FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > return -EOPNOTSUPP; > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > if (mode & FALLOC_FL_PUNCH_HOLE) { > error = xfs_free_file_space(ip, offset, len); > if (error) > @@ -894,7 +894,7 @@ xfs_file_fallocate( > } > > out_unlock: > - xfs_iunlock(ip, XFS_IOLOCK_EXCL); > + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > return error; > } > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index b88ab92..972fa13 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -636,7 +636,7 @@ xfs_ioc_space( > if (error) > return error; > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > > switch (bf->l_whence) { > case 0: /*SEEK_SET*/ > @@ -725,7 +725,7 @@ xfs_ioc_space( > error = xfs_update_prealloc_flags(ip, flags); > > out_unlock: > - xfs_iunlock(ip, XFS_IOLOCK_EXCL); > + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > mnt_drop_write_file(filp); > return error; > } > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 8be5bb5..0362b65 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -769,6 +769,7 @@ xfs_setattr_size( > return error; > > ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL)); > ASSERT(S_ISREG(ip->i_d.di_mode)); > ASSERT((iattr->ia_valid & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| > ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0); > @@ -984,9 +985,9 @@ xfs_vn_setattr( > int error; > > if (iattr->ia_valid & ATTR_SIZE) { > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_ilock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > error = xfs_setattr_size(ip, iattr); > - xfs_iunlock(ip, XFS_IOLOCK_EXCL); > + xfs_iunlock(ip, XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL); > } else { > error = xfs_setattr_nonsize(ip, iattr, 0); > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 14:31:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E169D7FA0 for ; Mon, 9 Feb 2015 14:31:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D11158F804B for ; Mon, 9 Feb 2015 12:31:50 -0800 (PST) X-ASG-Debug-ID: 1423513909-04cbb01162e5e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id di6cc2HDs1AKCRB4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31:50 -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 (8.14.4/8.14.4) with ESMTP id t19KVk1r016182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:47 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVh2Z027367 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:46 -0500 Date: Mon, 9 Feb 2015 15:31:43 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: xfs_setattr_size no longer races with page faults Message-ID: <20150209203143.GL18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: xfs_setattr_size no longer races with page faults References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513909 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:18AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Now that truncate locks out new page faults, we no longer need to do > special writeback hacks in truncate to work around potential races > between page faults, page cache truncation and file size updates to > ensure we get write page faults for extending truncates on sub-page > block size filesystems. Hence we can remove the code in > xfs_setattr_size() that handles this and update the comments around > the code tha thandles page cache truncate and size updates to > reflect the new reality. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_iops.c | 56 ++++++++++++++----------------------------------------- > 1 file changed, 14 insertions(+), 42 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 0362b65..6a77ea9 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -842,55 +842,27 @@ xfs_setattr_size( > inode_dio_wait(inode); > > /* > - * Do all the page cache truncate work outside the transaction context > - * as the "lock" order is page lock->log space reservation. i.e. > - * locking pages inside the transaction can ABBA deadlock with > - * writeback. We have to do the VFS inode size update before we truncate > - * the pagecache, however, to avoid racing with page faults beyond the > - * new EOF they are not serialised against truncate operations except by > - * page locks and size updates. > + * 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 > + * drop the XFS_MMAP_EXCL lock after the extent manipulations are > + * complete. The truncate_setsize() call also cleans partial EOF page > + * PTEs on extending truncates and hence ensures sub-page block size > + * filesystems are correctly handled, too. > * > - * Hence we are in a situation where a truncate can fail with ENOMEM > - * from xfs_trans_reserve(), but having already truncated the in-memory > - * version of the file (i.e. made user visible changes). There's not > - * much we can do about this, except to hope that the caller sees ENOMEM > - * and retries the truncate operation. > + * We have to do all the page cache truncate work outside the > + * transaction context as the "lock" order is page lock->log space > + * reservation as defined by extent allocation in the writeback path. > + * Hence a truncate can fail with ENOMEM from xfs_trans_reserve(), but > + * having already truncated the in-memory version of the file (i.e. made > + * user visible changes). There's not much we can do about this, except > + * to hope that the caller sees ENOMEM and retries the truncate > + * operation. > */ > error = block_truncate_page(inode->i_mapping, newsize, xfs_get_blocks); > if (error) > return error; > truncate_setsize(inode, newsize); > > - /* > - * The "we can't serialise against page faults" pain gets worse. > - * > - * If the file is mapped then we have to clean the page at the old EOF > - * when extending the file. Extending the file can expose changes the > - * underlying page mapping (e.g. from beyond EOF to a hole or > - * unwritten), and so on the next attempt to write to that page we need > - * to remap it for write. i.e. we need .page_mkwrite() to be called. > - * Hence we need to clean the page to clean the pte and so a new write > - * fault will be triggered appropriately. > - * > - * If we do it before we change the inode size, then we can race with a > - * page fault that maps the page with exactly the same problem. If we do > - * it after we change the file size, then a new page fault can come in > - * and allocate space before we've run the rest of the truncate > - * transaction. That's kinda grotesque, but it's better than have data > - * over a hole, and so that's the lesser evil that has been chosen here. > - * > - * The real solution, however, is to have some mechanism for locking out > - * page faults while a truncate is in progress. > - */ > - if (newsize > oldsize && mapping_mapped(VFS_I(ip)->i_mapping)) { > - error = filemap_write_and_wait_range( > - VFS_I(ip)->i_mapping, > - round_down(oldsize, PAGE_CACHE_SIZE), > - round_up(oldsize, PAGE_CACHE_SIZE) - 1); > - if (error) > - return error; > - } > - > tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_SIZE); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > if (error) > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Feb 9 14:31:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2570A7FB6 for ; Mon, 9 Feb 2015 14:31:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DDA6C8F8087 for ; Mon, 9 Feb 2015 12:31:56 -0800 (PST) X-ASG-Debug-ID: 1423513915-04bdf06a5bf1680001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hZfFlXygXzbrZsnt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 12:31:55 -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 (8.14.4/8.14.4) with ESMTP id t19KVrec017236 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 15:31:54 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19KVo4r030003 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 15:31:52 -0500 Date: Mon, 9 Feb 2015 15:31:50 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: lock out page faults from extent swap operations Message-ID: <20150209203150.GM18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: lock out page faults from extent swap operations References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423513915 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 05, 2015 at 08:04:19AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Extent swap operations are another extent manipulation operation > that we need to ensure does not race against mmap page faults. The > current code returns if the file is mapped prior to the swap being > done, but it could potentially race against new page faults while > the swap is in progress. Hence we should use the XFS_MMAPLOCK_EXCL > for this operation, too. > > While there, fix the error path handling that can result in double > unlocks of the inodes when cancelling the swapext transaction. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_bmap_util.c | 31 +++++++++++++++---------------- > 1 file changed, 15 insertions(+), 16 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 22a5dcb..7efa23e 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1599,13 +1599,6 @@ xfs_swap_extent_flush( > /* Verify O_DIRECT for ftmp */ > if (VFS_I(ip)->i_mapping->nrpages) > return -EINVAL; > - > - /* > - * Don't try to swap extents on mmap()d files because we can't lock > - * out races against page faults safely. > - */ > - if (mapping_mapped(VFS_I(ip)->i_mapping)) > - return -EBUSY; > return 0; > } > > @@ -1633,13 +1626,14 @@ xfs_swap_extents( > } > > /* > - * Lock up the inodes against other IO and truncate to begin with. > - * Then we can ensure the inodes are flushed and have no page cache > - * safely. Once we have done this we can take the ilocks and do the rest > - * of the checks. > + * Lock the inodes against other IO, page faults and truncate to > + * begin with. Then we can ensure the inodes are flushed and have no > + * page cache safely. Once we have done this we can take the ilocks and > + * do the rest of the checks. > */ > - lock_flags = XFS_IOLOCK_EXCL; > + lock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; > xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); > + xfs_lock_two_inodes(ip, tip, XFS_MMAPLOCK_EXCL); > > /* Verify that both files have the same format */ > if ((ip->i_d.di_mode & S_IFMT) != (tip->i_d.di_mode & S_IFMT)) { > @@ -1666,8 +1660,16 @@ xfs_swap_extents( > xfs_trans_cancel(tp, 0); > goto out_unlock; > } > + > + /* > + * Lock and join the inodes to the tansaction so that transaction commit > + * or cancel will unlock the inodes from this point onwards. > + */ > xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); > lock_flags |= XFS_ILOCK_EXCL; > + xfs_trans_ijoin(tp, ip, lock_flags); > + xfs_trans_ijoin(tp, tip, lock_flags); > + > > /* Verify all data are being swapped */ > if (sxp->sx_offset != 0 || > @@ -1720,9 +1722,6 @@ xfs_swap_extents( > goto out_trans_cancel; > } > > - xfs_trans_ijoin(tp, ip, lock_flags); > - xfs_trans_ijoin(tp, tip, lock_flags); > - > /* > * Before we've swapped the forks, lets set the owners of the forks > * appropriately. We have to do this as we are demand paging the btree > @@ -1856,5 +1855,5 @@ out_unlock: > > out_trans_cancel: > xfs_trans_cancel(tp, 0); > - goto out_unlock; > + goto out; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From dy1@a.surgerypatch.com Mon Feb 9 15:01:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=FREEMAIL_FROM, HTML_IMAGE_ONLY_16,HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY, T_FRT_BELOW2,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C5A687FA9 for ; Mon, 9 Feb 2015 15:01:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89A38304039 for ; Mon, 9 Feb 2015 13:01:06 -0800 (PST) X-ASG-Debug-ID: 1423515663-04bdf06a59f1e50001-NocioJ Received: from a.surgerypatch.com ([118.193.165.68]) by cuda.sgi.com with ESMTP id DiHojXk4pULeRxry for ; Mon, 09 Feb 2015 13:01:04 -0800 (PST) X-Barracuda-Envelope-From: dy1@a.surgerypatch.com X-Barracuda-Apparent-Source-IP: 118.193.165.68 Received: from osvybdg (unknown [113.110.230.0]) by a.surgerypatch.com (Postfix) with ESMTPA id 5925410E81 for ; Tue, 10 Feb 2015 03:03:49 +0800 (CST) Date: Tue, 10 Feb 2015 03:03:50 +0800 From: "Emily" Reply-To: lilidatech@gmail.com To: "xfs" Subject: tempered glass screen protection for OnePlus One 2015/2/10 3:03:50 Message-ID: <201502100303500746789@a.surgerypatch.com> X-ASG-Orig-Subj: tempered glass screen protection for OnePlus One 2015/2/10 3:03:50 X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/html; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[118.193.165.68] X-Barracuda-Start-Time: 1423515663 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.78 X-Barracuda-Spam-Status: No, SCORE=1.78 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_ONLY_16, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15087 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS PGhlYWQ+DQogICAgPHRpdGxlPjwvdGl0bGU+DQogICAgPG1ldGEgY29udGVudD0idGV4dC9odG1s OyBjaGFyc2V0PWdiMjMxMiIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPg0KICAgIDxzdHls ZT48L3N0eWxlPg0KICA8L2hlYWQ+DQogIDxib2R5IGJnY29sb3I9IiNmZmZmZmYiPg0KICAgIDxk aXY+PGZvbnQgY29sb3I9IiNmZmZmZmYiIHNpemU9IjEiPnhmc0Bvc3Muc2dpLmNvbTwvZm9udD48 L2Rpdj4NCiAgICA8ZGl2PiZuYnNwOzwvZGl2Pg0KICAgIDxkaXY+RGVhciw8YnIgLz5Hb29kIG1v cm5pbmchPGJyIC8+UGxlYXNlIHNlZSBvdXIgcHJvZHVjdCB0ZW1wZXJlZCBnbGFzcyBzY3JlZW4g cHJvdGVjdG9yLjwvZGl2Pg0KICAgIDxkaXY+Jm5ic3A7PC9kaXY+DQogICAgPGRpdj48aW1nIGJv cmRlcj0iMCIgaHNwYWNlPSIwIiBhbHQ9IiIgYWxpZ249ImJhc2VsaW5lIiBzcmM9Imh0dHA6Ly93 dzEuc2luYWltZy5jbi9tdzY5MC8wMDV4cVo1VWd3MWVvYWRwMjZheWhqMzBnbzA4Y3E0cS5qcGci IC8+PC9kaXY+DQogICAgPGRpdj4mbmJzcDs8L2Rpdj4NCiAgICA8ZGl2PkNvbXBhcmVkIHdpdGgg dHJhZGl0aW9uYWwgUEVUIGRpc3BsYXkgcHJvdGVjdG9ycywgdGhlIHRlbXBlcmVkIGdsYXNzIHNj cmVlbiBwcm90ZWN0b3IgaGFzIGFkdmFudGFnZXMgYXMgYmVsbG93OiBhbnRpLXNob2NrLCBoaWdo IHNjcmF0Y2ggcmVzaXN0YW5jZSwmbmJzcDtlYXN5IHRvdWNoIGV0Yy48L2Rpdj4NCiAgICA8ZGl2 PiZuYnNwOzwvZGl2Pg0KICAgIDxkaXY+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMCIgYWx0PSIi IGFsaWduPSJiYXNlbGluZSIgc3JjPSJodHRwOi8vd3c0LnNpbmFpbWcuY24vbXc2OTAvMDA1eHFa NVVndzFlb2Fkc2phdm5vajMwZ28wN2RqdG4uanBnIiAvPjwvZGl2Pg0KICAgIDxkaXY+PGJyIC8+ T3VyIGNvbXBhbnkgc3BlY2lhbGl6ZSBpbiBtYW51ZmFjdHVyaW5nIHRlbXBlcmVkIGdsYXNzIHNj cmVlbiBwcm90ZWN0b3IgZm9yJm5ic3A7bW9iaWxlIHBob25lIGFuZCB0YWJsZXQgaW4gQ2hpbmEs IGhvcGUgdGhlIGdvb2QgcXVhbGl0eSBhbmQgZ29vZCBwcmljZSBjYW4gZ2V0IHlvdXIgbGlrZXMu IDwvZGl2Pg0KICAgIDxkaXY+Jm5ic3A7PC9kaXY+DQogICAgPGRpdj5Mb29raW5nIGZvcndhcmQg dG8geW91ciByZXBseS48L2Rpdj4NCiAgICA8ZGl2PiZuYnNwOzwvZGl2Pg0KICAgIDxkaXY+VGhh bmtzIGFuZCBiZXN0IHdpc2hlcyw8YnIgLz5FbWlseTxiciAvPkludGVybmF0aW9uYWwgRGVwdC48 YnIgLz5TaGVuemhlbiBMaWxpZGEgVGVjaG5vbG9neSBDby4sIEx0ZC48YnIgLz5FbWFpbDogPGEg aHJlZj0ibWFpbHRvOmxpbGlkYXRlY2hAZ21haWwuY29tIj5saWxpZGF0ZWNoQGdtYWlsLmNvbTwv YT48YnIgLz5Ta3lwZTogZW1pbHl3aXNod2VsbDxiciAvPjwvZGl2Pg0KICAgIDxkaXY+DQogICAg ICA8ZGl2PiZuYnNwOzwvZGl2Pg0KICAgICAgPGRpdj48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgc2l6 ZT0iMSI+MzowMzo1MDwvZm9udD48L2Rpdj4NCiAgICA8L2Rpdj4NCiAgPC9ib2R5Pg== From david@fromorbit.com Mon Feb 9 15:17:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA3767FAB for ; Mon, 9 Feb 2015 15:17:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8BEF304032 for ; Mon, 9 Feb 2015 13:17:50 -0800 (PST) X-ASG-Debug-ID: 1423516666-04cb6c6b09ebf70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8RImZhHksGcJJtpN for ; Mon, 09 Feb 2015 13:17:47 -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: AhMLAJgj2VR5LPv2PGdsb2JhbABcgwaBLIIzg3mpeQEBAQEBAQaUWYNeBAICgR1EAQEBAQEBBQEBAQE4O4QMAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIJQfKQgELIBiFbIl0B4QqBZhGgRmDA4JGg16IMYQkKjGCQgEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 07:47:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKviC-0005ee-Fj; Tue, 10 Feb 2015 08:17:44 +1100 Date: Tue, 10 Feb 2015 08:17:44 +1100 From: Dave Chinner To: Brian Foster Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150209211744.GT12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209130926.GA18336@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423516666 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15087 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 09, 2015 at 08:09:26AM -0500, Brian Foster wrote: > On Mon, Feb 09, 2015 at 08:35:02AM +1100, Dave Chinner wrote: > > On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: > > > These 2 patches provide information about which filesystem > > > hit the error... > > > > If we are going to touch every one of these macros, then can we > > rename them to something a little shorter like XFS_CORRUPT_GOTO() > > and XFS_CORRUPT_RETURN() at the same time? That will make the code a > > little less eye-bleedy where there are lots of these statements, > > and make formatting of complex checks a bit easier, too... > > > > XFS_CORRUPT_DOSOMETHING() jumps out to me as indicate corruption if the > logic statement evaluates as true rather than false. The latter (e.g., > assert-like logic) is how they work today, so that could be a bit > confusing to somebody who isn't already familiar with how these macros > work. Someone not familiar with XFS conventions is already going to get caught by "should be true" logic of these statements anyway as the logic is the opposite of BUG_ON() and WARN_ON(). i.e. BUG_ON(1) will kill the kernel, while ASSERT(1) indicates everything is fine. I suggested shortening the macro because it makes the code that uses it extensively shouty and hard to read because it splits logic statements across lines regularly (e.g __xfs_dir3_data_check). I want to use this more extensively in verifiers to give better corruption detection reporting, but the current macro will make the verifier code rather ugly. Hence my suggestion to make it shorter, neater and a little less shouty... > Unfortunately, nothing shorter than the current naming immediately comes > to mind... :/ We could kill the XFS_ prefix I suppose or even invert the > logic of the calls, but that's certainly a more significant change. > Thoughts? No logic changes, please. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfactor973@gmail.com Mon Feb 9 15:24:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 4D3417FAB for ; Mon, 9 Feb 2015 15:24:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 128C3304032 for ; Mon, 9 Feb 2015 13:24:18 -0800 (PST) X-ASG-Debug-ID: 1423517055-04bdf06a5af24e0001-NocioJ Received: from mail-ig0-f172.google.com (mail-ig0-f172.google.com [209.85.213.172]) by cuda.sgi.com with ESMTP id DHrYgzAdMS5AoDYK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 09 Feb 2015 13:24:16 -0800 (PST) X-Barracuda-Envelope-From: xfactor973@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.172] Received: by mail-ig0-f172.google.com with SMTP id l13so19388007iga.5 for ; Mon, 09 Feb 2015 13:24:15 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=6WXeroEdqperZBoI4uOFtLnGHj0f0DdE/wyEnyxD/fc=; b=fDRzz4aJipfVki1et3V6DF0SR1ce0orzTqgHdRxBtKin9CGLqw8lu6QU2kge/SILar 0y59GwOJ4wM5FcNGcHH9W62ZZfk+0R5VZ87hIi1iYlagVNi2duaFwXgj0S71Z5A/rlZ7 9krZtVAhGc2vrLHu9w8xO0DWwCh/Fd9zgyZTpHIfdPZ0z3PCEzMNUkbH0+bIIROjwjAV 2lCUxJ/v3Q7PjG7MsqiFsFjlzw2hcDARNzMagOrHXz/fBexqG7lEl3gKIaydhRur/uKS THUIxSkxmT/0nt09LBcr4TjM4zWQOozS3bFNbAIAESPfsBBuhlgAG0X4K70H0a5kM94f WGdQ== MIME-Version: 1.0 X-Received: by 10.50.93.70 with SMTP id cs6mr19317124igb.6.1423517055485; Mon, 09 Feb 2015 13:24:15 -0800 (PST) Received: by 10.50.86.135 with HTTP; Mon, 9 Feb 2015 13:24:15 -0800 (PST) Date: Mon, 9 Feb 2015 13:24:15 -0800 Message-ID: Subject: XFS umount with IO errors seems to lead to memory corruption From: Chris Holcombe X-ASG-Orig-Subj: XFS umount with IO errors seems to lead to memory corruption To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ig0-f172.google.com[209.85.213.172] X-Barracuda-Start-Time: 1423517056 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15087 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, http://www.spinics.net/lists/linux-xfs/msg00061.html Back in Dec 2013 you responded to this message saying that you would take a look at it. Was a fix for this ever issued? I'm seeing very similar stacktraces: Feb 7 00:27:32 node008-cont001 kernel: [83405.490909] INFO: task umount:29224 blocked for more than 120 seconds. Feb 7 00:27:32 node008-cont001 kernel: [83405.498645] Tainted: G W 3.13.0-39-generic #66-Ubuntu Feb 7 00:27:32 node008-cont001 kernel: [83405.506273] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Feb 7 00:27:32 node008-cont001 kernel: [83405.515244] umount D ffff880c4fc34480 0 29224 29221 0x00000082 Feb 7 00:27:32 node008-cont001 kernel: [83405.515253] ffff880201211db0 0000000000000086 ffff880c39cb1800 ffff880201211fd8 Feb 7 00:27:32 node008-cont001 kernel: [83405.515260] 0000000000014480 0000000000014480 ffff880c39cb1800 ffff880c33386480 Feb 7 00:27:32 node008-cont001 kernel: [83405.515267] ffff880c395e4bc8 ffff880c333864c0 ffff880c333864e8 ffff880c33386490 Feb 7 00:27:32 node008-cont001 kernel: [83405.515274] Call Trace: Feb 7 00:27:32 node008-cont001 kernel: [83405.515298] [] schedule+0x29/0x70 Feb 7 00:27:32 node008-cont001 kernel: [83405.515384] [] xfs_ail_push_all_sync+0xa9/0xe0 [xfs] Feb 7 00:27:32 node008-cont001 kernel: [83405.515396] [] ? prepare_to_wait_event+0x100/0x100 Feb 7 00:27:32 node008-cont001 kernel: [83405.515438] [] xfs_log_quiesce+0x33/0x70 [xfs] Feb 7 00:27:32 node008-cont001 kernel: [83405.515479] [] xfs_log_unmount+0x12/0x30 [xfs] Feb 7 00:27:32 node008-cont001 kernel: [83405.515510] [] xfs_unmountfs+0xc6/0x150 [xfs] Feb 7 00:27:32 node008-cont001 kernel: [83405.515541] [] xfs_fs_put_super+0x21/0x60 [xfs] Feb 7 00:27:32 node008-cont001 kernel: [83405.515550] [] generic_shutdown_super+0x72/0xf0 Feb 7 00:27:32 node008-cont001 kernel: [83405.515557] [] kill_block_super+0x27/0x70 Feb 7 00:27:32 node008-cont001 kernel: [83405.515565] [] deactivate_locked_super+0x3d/0x60 Feb 7 00:27:32 node008-cont001 kernel: [83405.515572] [] deactivate_super+0x46/0x60 Feb 7 00:27:32 node008-cont001 kernel: [83405.515578] [] mntput_no_expire+0xd6/0x170 Feb 7 00:27:32 node008-cont001 kernel: [83405.515584] [] SyS_umount+0x8e/0x100 Feb 7 00:27:32 node008-cont001 kernel: [83405.515591] [] system_call_fastpath+0x1a/0x1f These type of errors are showing up in the logs: Feb 7 00:27:34 node008-cont001 kernel: [83407.466853] XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 ... Feb 7 00:27:39 node008-cont001 kernel: [83412.510982] XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 Feb 7 00:27:44 node008-cont001 kernel: [83417.555152] XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 ... Feb 7 00:27:54 node008-cont001 kernel: [83427.643428] XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 Feb 7 00:27:57 node008-cont001 kernel: [83429.879442] XFS:: 568 callbacks suppressed Feb 7 00:27:57 node008-cont001 kernel: [83429.879450] XFS (dm-8): Detected failing async write on buffer block 0x0. Retrying async write. Feb 7 00:27:57 node008-cont001 kernel: [83429.879450] Feb 7 00:27:57 node008-cont001 kernel: [83429.931438] XFS (dm-8): Detected failing async write on buffer block 0x0. Retrying async write. Feb 7 00:27:57 node008-cont001 kernel: [83429.931438] Feb 7 00:27:57 node008-cont001 kernel: [83429.983444] XFS (dm-8): Detected failing async write on buffer block 0x0. Retrying async write. Feb 7 00:27:57 node008-cont001 kernel: [83429.983444] Thanks for the help! Chris From david@fromorbit.com Mon Feb 9 15:24:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 01BB27FB4 for ; Mon, 9 Feb 2015 15:24:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4A578F80C5 for ; Mon, 9 Feb 2015 13:24:24 -0800 (PST) X-ASG-Debug-ID: 1423517062-04cb6c6b09ec0c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id iHQQVGTylk9SdN7Y for ; Mon, 09 Feb 2015 13:24:22 -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: AhEUAMgk2VR5LPv2PGdsb2JhbABcgwaBLIIzg3mpeQEBAQEBAQaYNwICAQECgR1EAQEBAQEBBQEBAQE4O4QMAQEBAwEyASMjBQsIAxgJJQ8FJQMHGhOIJQfKSQEBAQcCAR8YhWyJQTMHhCoFhVKSdJJxgiEfgWQqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 07:54:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKvoa-0005f8-P4; Tue, 10 Feb 2015 08:24:20 +1100 Date: Tue, 10 Feb 2015 08:24:20 +1100 From: Dave Chinner To: Bruno =?iso-8859-1?Q?Pr=E9mont?= Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150209212420.GU12722@dastard> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> <20150205151007.7c954c01@pluto.restena.lu> <20150205221516.GT4251@dastard> <20150209094701.6b1d480d@pluto.restena.lu> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20150209094701.6b1d480d@pluto.restena.lu> 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: 1423517062 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15087 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 09, 2015 at 09:47:01AM +0100, Bruno Prmont wrote: > Hi Dave, > > On Fri, 6 Feb 2015 09:15:16 +1100 Dave Chinner wrote: > > On Thu, Feb 05, 2015 at 03:10:07PM +0100, Bruno Prmont wrote: > > > Hi Dave, > > > > > > New crash, new trace, this time on 3.18.2. > > > It looks like this time a NULL dereference happened prior to touched memory poison being detected. > > > > > > Once again it's during normal system operation (no mount/umount activity) > > > > Can you rebuild the kernel with CONFIG_XFS_WARN=y and see if that > > throws any interesting messages into logs? > > Will try and see > > > However: > > > > > [1900390.261491] ============================================================================= > > > [1900390.272989] BUG task_struct (Tainted: G D W ): Poison overwritten > > > [1900390.283021] ----------------------------------------------------------------------------- > > > [1900390.283021] > > > [1900390.297056] INFO: 0xffff880213d651b3-0xffff880213d651b3. First byte 0x6d instead of 0x6b > > > [1900390.309044] INFO: Slab 0xffffea00084f5800 objects=16 used=16 fp=0x (null) flags=0x8000000000004080 > > > [1900390.323087] INFO: Object 0xffff880213d64ba0 @offset=19360 fp=0xffff880213d61e40 > > > [1900390.323087] > > > [1900390.336988] Bytes b4 ffff880213d64b90: 60 2d d6 13 02 88 ff ff 5a 5a 5a 5a 5a 5a 5a 5a `-......ZZZZZZZZ > > > [1900390.350988] Object ffff880213d64ba0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > > [1900390.364943] Object ffff880213d64bb0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > .... > > > [1900391.674636] Object ffff880213d651b0: 6b 6b 6b 6d 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkmkkkkkkkkkkkk > > ^^ > > > > There's a single bit that has been flipped in the task_struct slab. > > So more than just XFS is seeing memory corruption - this is in core > > kernel structure slab caches. I'm not sure, either, how XFS could > > cause corruption in this slab. > > > > So, I'd be checking all the previous memory corruptions to see if > > they are single bit errors, and if there is any pattern to the > > addresses at which they occur. The above bit flip makes me think > > "hardware issue" and everything else stems from that... > > System has ECC RAM so faulty RAM looks less probable (no complaint seen > by kernel nor recorded by firmware). Sure, but that's not the only hardware in the memory path so single bit errors can occur elsewhere as data moved across the bus of sits in cpu caches. and if you're not using an IOMMU then it could even be hardware writing to memory incorrectly... > All previous crashes for which I have some logs were dereference after > free but not attempt to allocate memory from a modified poison in free > slabs. > > Though what does that single bit represent in that area if it was > used/modified after free? It means that there's either a use after free, or you have a hardware problem. being in the task struct slab, if it's a use after free then it's unlikely to be an XFS problem. FWIW, can you post the output of "grep PARAVIRT "? Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Feb 9 15:44:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 625A67FB2 for ; Mon, 9 Feb 2015 15:44:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3106B8F80C8 for ; Mon, 9 Feb 2015 13:44:05 -0800 (PST) X-ASG-Debug-ID: 1423518244-04cb6c6b0cec6d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YKyCNqv5aYDl1qWf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 13:44:04 -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 (8.14.4/8.14.4) with ESMTP id t19Li2XH011576 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 9 Feb 2015 16:44:02 -0500 Received: from laptop.bfoster (vpn-58-159.rdu2.redhat.com [10.10.58.159]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t19Li0ru017869 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 9 Feb 2015 16:44:02 -0500 Date: Mon, 9 Feb 2015 16:43:59 -0500 From: Brian Foster To: Dave Chinner Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150209214359.GN18336@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> <20150209211744.GT12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209211744.GT12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423518244 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Feb 10, 2015 at 08:17:44AM +1100, Dave Chinner wrote: > On Mon, Feb 09, 2015 at 08:09:26AM -0500, Brian Foster wrote: > > On Mon, Feb 09, 2015 at 08:35:02AM +1100, Dave Chinner wrote: > > > On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: > > > > These 2 patches provide information about which filesystem > > > > hit the error... > > > > > > If we are going to touch every one of these macros, then can we > > > rename them to something a little shorter like XFS_CORRUPT_GOTO() > > > and XFS_CORRUPT_RETURN() at the same time? That will make the code a > > > little less eye-bleedy where there are lots of these statements, > > > and make formatting of complex checks a bit easier, too... > > > > > > > XFS_CORRUPT_DOSOMETHING() jumps out to me as indicate corruption if the > > logic statement evaluates as true rather than false. The latter (e.g., > > assert-like logic) is how they work today, so that could be a bit > > confusing to somebody who isn't already familiar with how these macros > > work. > > Someone not familiar with XFS conventions is already going to get > caught by "should be true" logic of these statements anyway as the > logic is the opposite of BUG_ON() and WARN_ON(). i.e. BUG_ON(1) > will kill the kernel, while ASSERT(1) indicates everything is fine. > BUG_ON() and ASSERT() are self-explanatory, the latter being a pretty standard/common thing ('man assert'). As Eric mentioned, the WANT bit of the macro is what suggests assert-like semantics. > I suggested shortening the macro because it makes the code that uses > it extensively shouty and hard to read because it splits logic > statements across lines regularly (e.g __xfs_dir3_data_check). I > want to use this more extensively in verifiers to give better > corruption detection reporting, but the current macro will make the > verifier code rather ugly. Hence my suggestion to make it shorter, > neater and a little less shouty... > Sure, but ASSERT_CORRUPT_RET() is the same length as the example above. ASSERT_CORRUPT_GOTO() is only a few chars longer than the associated example. We could still use WANT over ASSERT I suppose to shorten it up further. Either of those are at least still self-explanatory in my opinion. Brian > > Unfortunately, nothing shorter than the current naming immediately comes > > to mind... :/ We could kill the XFS_ prefix I suppose or even invert the > > logic of the calls, but that's certainly a more significant change. > > Thoughts? > > No logic changes, please. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Mon Feb 9 15:48:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 93FCC7FB2 for ; Mon, 9 Feb 2015 15:48:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14CBFAC002 for ; Mon, 9 Feb 2015 13:48:20 -0800 (PST) X-ASG-Debug-ID: 1423518497-04cb6c6b0cec800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cUUkEeWatRb4QVFG for ; Mon, 09 Feb 2015 13:48:17 -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: Ai8LAKMq2VR5LPv2PGdsb2JhbABSCoMGUlqCM61mDAEBAQEBAQaSTIVrBAICgR1EAQEBAQEBBQEBAQE4O4QMAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTiCUHDspwAQEIAiAYhWyECoNdgTELAQFPB4QqBY04hTOFW4EZixuGPYJUgVAqMQGBCoE3AQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 08:18:16 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKwBk-0005hb-09; Tue, 10 Feb 2015 08:48:16 +1100 Date: Tue, 10 Feb 2015 08:48:15 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150209214815.GV12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> <20150206231615.GQ12722@dastard> <20150208160600.GB2927@bfoster.bfoster> <20150208215710.GC4251@dastard> <20150209151502.GB18336@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209151502.GB18336@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423518497 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 09, 2015 at 10:15:02AM -0500, Brian Foster wrote: > On Mon, Feb 09, 2015 at 08:57:10AM +1100, Dave Chinner wrote: > > On Sun, Feb 08, 2015 at 11:06:01AM -0500, Brian Foster wrote: > > > > > @@ -82,7 +84,9 @@ xfs_inobt_update( > > > > > union xfs_btree_rec rec; > > > > > > > > > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > > > > > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > > > > > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > > > > > + rec.inobt.ir_count = irec->ir_count; > > > > > + rec.inobt.ir_freecount = irec->ir_freecount; > > > > > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > > > > > return xfs_btree_update(cur, &rec); > > > > > } > > > > > > > > Hmmm - perhaps a similar set of helpers for sparse inode enabled > > > > filesystems > > > > > > > > > > We could do that for the insert/update helpers, but note again the > > > separate helpers would not split along the lines of sparse vs full > > > chunks. Even if we were to change the design such that they do, that > > > would have th effect of complicating some of the subsequent code. For > > > > I suspect it might, but I really don't like the idea of writing > > fields that don't actually exist (and hence are always zero) in > > the on-disk format to disk. See, for example, the v5 superblock > > field writes are conditional in xfs_sb_to_disk, the v3 inode field > > writes are conditional in xfs_dinode_to_disk, etc. > > > > Indeed. The point here is just that a v1/v2 differentiation might be > more relevant than full vs. sparse. As it is, a sparse inode enabled fs > uses all of the fields (e.g., ir_count == 64 on a full chunk). So this > is more about providing clean backwards compatibility than deciding > between two different "allocation types," so to speak. > > Beyond that, I'm more just probing for a clean use of the new on-disk > format distinction. The references above actually use the associated > feature checks in a single helper as opposed to a separate one, and that > seems a bit more clean an approach to me. BUt that's because those object have enough information internally to determine what the correct action to take is. An inobt record doesn't have the internal information to say whay format it is supposed to be in. Hence we need to enforce the use of the correct marshalling logic in some way... > > > example, the merge/update code currently has no reason to care about > > > whether it has created a full chunk out of multiple sparse chunks. This > > > would require more code to make that distinction simply to pick the > > > correct api, for something that can easily be done with a simple generic > > > helper. The same goes for things like the finobt, where now > > > lookup/update/insert has to make distinctions depending on the type of > > > inode record. > > > > That was another thing that wasn't clear to me - does the finobt > > record format change on disk? I don't think it does, as it only > > holds a free count and a free inode bitmask, so it doesn't care > > which bits of the chunk are allocated or not.... > > > > No, it shouldn't change the format. But if we have a separate set of > inobt helpers, it has to use one or the other depending on the type of > record holding the inode that is freed or allocated. Ok, so we now have 3 instances of inode btrees that use the current format, and one that uses the new sparse record format. (i.e. existing inobt, existing finobt and sparse inode enable finobt vs sparse inode inobt). That really, to me, says we need clear demarcation.... > > > An alternate approach could be to stick with the generic helpers, but > > > try and tweak them to use the appropriate on-disk format depending on > > > the record. Then again, how can one really identify one from the other > > > in the lookup or _get_rec() scenarios? > > > > Solving these problem was exactly why I suggested different helpers > > - the btree ops structure that is chosen for the cursor is in a > > place where we know what format we are using, and that avoids > > needing "if (xfs_sb_version...)" checks in the helpers to determine > > what format we need to use. > > > > Hmm, I'm not sure I follow the train of thought here. The examples above > use exactly that kind of logic within the helper. Further, some of the They use internal object state (i.e. inode version number, superblock flag field in sb being translated) to make that decision. the inobt changes use external structure state to do the conversion... > > > Before I go one way or another here with regard to the on-disk data > > > structure, care to take a look at the subsequent patch(es) that use > > > these helpers? Patch 10 in particular pretty much sums up how these > > > helpers are used for sparse inode record management. > > > > Yup, I'll get to it. > > > > Thanks. I've made a quick pass and most of it makes sense save some of > the helper business we're discussing here. I can start into some of the > higher level refactoring, try to incorporate the on-disk record format > union as clean as I can and we can move forward using the code of the > next version, if that's easier. ;) Yup, that's fine - refactoring the code might make a difference ;) > > > FWIW, comments on the generic bitmap stuff is also appreciated as that's > > > another area I'm not totally convinved is done right. :) > > > > Why use the generic bitmap stuff rather than the existing XFS code? > > If that's just an in-memory change to the free mask processing, then > > it can be done separately to the sparse inode functionality, and > > probably should be done first in the series.... > > > > http://oss.sgi.com/archives/xfs/2014-07/msg00380.html > > Last comment in that mail. ;) To be honest, I liked the original code > better because it didn't require the bitmap_to_u64() helper hack and I didn't realise there were arch-specific warts in the generic bitmap code. > ports directly to userspace (so far I've managed to get away with > dropping that stuff entirely in userspace). Alternatively, I've done > significantly more testing with the latest code than the initial version > so I'd rather not change it back unless a real need arises. Well, either way I'd like to avoid nasty conversions if it can be avoided. Perhaps look at the in-memory bitmaps being held in LE format (i.e. __le64) and using the primitives in include/asm-generic/bitops/le.h to manipulate them (i.e find_next_zero_bit_le() and friends)? Maybe that would avoid all the problems of architectural layout of the bitmap fields and hence make conversion simple (i.e. just a le64_to_cpu() call?) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 9 15:58:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B0997FB6 for ; Mon, 9 Feb 2015 15:58:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05483AC007 for ; Mon, 9 Feb 2015 13:58:30 -0800 (PST) X-ASG-Debug-ID: 1423519108-04bdf06a5cf3070001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id w1u8XdGuS1Cwcz6T for ; Mon, 09 Feb 2015 13:58:28 -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: AhELAPgs2VR5LPv2PGdsb2JhbABcgwaBLIIzg3mpeQEBAQEBAQaUWYNeBAICgR1EAQEBAQEBBQEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gsyw4BCyAYhWyJdAeEKgWYRoEZhUmDXogxhCQqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 08:28:27 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKwLb-0005iP-3U; Tue, 10 Feb 2015 08:58:27 +1100 Date: Tue, 10 Feb 2015 08:58:27 +1100 From: Dave Chinner To: Brian Foster Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150209215827.GW12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> <20150209211744.GT12722@dastard> <20150209214359.GN18336@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209214359.GN18336@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423519108 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 09, 2015 at 04:43:59PM -0500, Brian Foster wrote: > On Tue, Feb 10, 2015 at 08:17:44AM +1100, Dave Chinner wrote: > > On Mon, Feb 09, 2015 at 08:09:26AM -0500, Brian Foster wrote: > > > On Mon, Feb 09, 2015 at 08:35:02AM +1100, Dave Chinner wrote: > > > > On Fri, Feb 06, 2015 at 04:22:04PM -0600, Eric Sandeen wrote: > > > > > These 2 patches provide information about which filesystem > > > > > hit the error... > > > > > > > > If we are going to touch every one of these macros, then can we > > > > rename them to something a little shorter like XFS_CORRUPT_GOTO() > > > > and XFS_CORRUPT_RETURN() at the same time? That will make the code a > > > > little less eye-bleedy where there are lots of these statements, > > > > and make formatting of complex checks a bit easier, too... > > > > > > > > > > XFS_CORRUPT_DOSOMETHING() jumps out to me as indicate corruption if the > > > logic statement evaluates as true rather than false. The latter (e.g., > > > assert-like logic) is how they work today, so that could be a bit > > > confusing to somebody who isn't already familiar with how these macros > > > work. > > > > Someone not familiar with XFS conventions is already going to get > > caught by "should be true" logic of these statements anyway as the > > logic is the opposite of BUG_ON() and WARN_ON(). i.e. BUG_ON(1) > > will kill the kernel, while ASSERT(1) indicates everything is fine. > > > > BUG_ON() and ASSERT() are self-explanatory, the latter being a pretty > standard/common thing ('man assert'). As Eric mentioned, the WANT bit of > the macro is what suggests assert-like semantics. > > > I suggested shortening the macro because it makes the code that uses > > it extensively shouty and hard to read because it splits logic > > statements across lines regularly (e.g __xfs_dir3_data_check). I > > want to use this more extensively in verifiers to give better > > corruption detection reporting, but the current macro will make the > > verifier code rather ugly. Hence my suggestion to make it shorter, > > neater and a little less shouty... > > > > Sure, but ASSERT_CORRUPT_RET() is the same length as the example above. > ASSERT_CORRUPT_GOTO() is only a few chars longer than the associated > example. We could still use WANT over ASSERT I suppose to shorten it up > further. Either of those are at least still self-explanatory in my > opinion. Thinking on it a bit further, the XFS_WANT_CORRUPTED macros have an internal ASSERT in them, so they are effectively an ASSERT statement. I could live with those names, especially as ASSERT is something that can be compiled into production kernels via CONFIG_XFS_WARN=y to turn them into error messages... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 9 16:18:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1615B7F54 for ; Mon, 9 Feb 2015 16:18:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA8CE8F8033 for ; Mon, 9 Feb 2015 14:18:39 -0800 (PST) X-ASG-Debug-ID: 1423520317-04cbb01164e81e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4LSTyI20wTZiSkdZ for ; Mon, 09 Feb 2015 14:18:37 -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: Am4UAKox2VR5LPv2PGdsb2JhbABcgwZSWoIzrWYMAQEBAQEBBpJCCoVrAgIBAQKBHUQBAQEBAQEFAQEBATg7hAwBAQEDAQECNxwjBQsIAw4KCSUPBRQRAwcaE4glBw7LNQEBAQEGAQEBAR4YhWyJdAeEKgWWKIIeknGCJByBZCoxAYJBAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 08:48:30 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKwez-0005kd-6C; Tue, 10 Feb 2015 09:18:29 +1100 Date: Tue, 10 Feb 2015 09:18:29 +1100 From: Dave Chinner To: Chris Holcombe Cc: xfs@oss.sgi.com Subject: Re: XFS umount with IO errors seems to lead to memory corruption Message-ID: <20150209221829.GX12722@dastard> X-ASG-Orig-Subj: Re: XFS umount with IO errors seems to lead to memory corruption References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423520317 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 09, 2015 at 01:24:15PM -0800, Chris Holcombe wrote: > Hi Dave, > > http://www.spinics.net/lists/linux-xfs/msg00061.html > Back in Dec 2013 you responded to this message saying that you would > take a look at it. Was a fix for this ever issued? Yes, it's been fixed, but that's not you problem. > I'm seeing very > similar stacktraces: > > INFO: task umount:29224 blocked for more than 120 seconds. > Tainted: G W 3.13.0-39-generic #66-Ubuntu > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > umount D ffff880c4fc34480 0 29224 29221 0x00000082 > ffff880201211db0 0000000000000086 ffff880c39cb1800 ffff880201211fd8 > 0000000000014480 0000000000014480 ffff880c39cb1800 ffff880c33386480 > ffff880c395e4bc8 ffff880c333864c0 ffff880c333864e8 ffff880c33386490 > Call Trace: > > [] schedule+0x29/0x70 > [] xfs_ail_push_all_sync+0xa9/0xe0 [xfs] > [] ? prepare_to_wait_event+0x100/0x100 > [] xfs_log_quiesce+0x33/0x70 [xfs] > [] xfs_log_unmount+0x12/0x30 [xfs] > [] xfs_unmountfs+0xc6/0x150 [xfs] > [] xfs_fs_put_super+0x21/0x60 [xfs] > [] generic_shutdown_super+0x72/0xf0 > [] kill_block_super+0x27/0x70 > [] deactivate_locked_super+0x3d/0x60 > [] deactivate_super+0x46/0x60 > [] mntput_no_expire+0xd6/0x170 > [] SyS_umount+0x8e/0x100 > [] system_call_fastpath+0x1a/0x1f That's XFS hung waiting for IO to complete during unmount. > These type of errors are showing up in the logs: > > XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 Error 19 = ENODEV. You pulled the drive out before you tried to unmount? > XFS (dm-8): Detected failing async write on buffer block 0x0. Retrying async write. Which means it's detecting that the write is failing, but the higher level has been told to keep trying until all metadata has been flushed. We probably need to tweak this slightly.... Eric - this is another case where transient vs permanent error is somewhat squishy, and treating ENODEV as a permanent error would solve this issue (i.e. trigger a shutdown). Did you start doing anything in this area? AFAICT a ENODEV error on Linux is a permanent error because if you replug the device it will come back as a different device and the ENODEV onteh removed device will still persist. However, I'm not sure what dm-multipath ends up doing in this case - it's supposed to hide the same devices coming and going, so maybe it won't trigger this error at all... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Feb 9 16:25:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 342D829DF8 for ; Mon, 9 Feb 2015 16:25:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89353AC004 for ; Mon, 9 Feb 2015 14:25:58 -0800 (PST) X-ASG-Debug-ID: 1423520756-04cb6c6b0ced490001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2RYJufbG1WD1TSCN for ; Mon, 09 Feb 2015 14:25:56 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3A22560DB35D; Mon, 9 Feb 2015 16:25:56 -0600 (CST) Message-ID: <54D933F3.4090709@sandeen.net> Date: Mon, 09 Feb 2015 16:25:55 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , Chris Holcombe CC: xfs@oss.sgi.com Subject: Re: XFS umount with IO errors seems to lead to memory corruption References: <20150209221829.GX12722@dastard> X-ASG-Orig-Subj: Re: XFS umount with IO errors seems to lead to memory corruption In-Reply-To: <20150209221829.GX12722@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1423520756 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15088 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/9/15 4:18 PM, Dave Chinner wrote: > On Mon, Feb 09, 2015 at 01:24:15PM -0800, Chris Holcombe wrote: >> Hi Dave, >> >> http://www.spinics.net/lists/linux-xfs/msg00061.html >> Back in Dec 2013 you responded to this message saying that you would >> take a look at it. Was a fix for this ever issued? > > Yes, it's been fixed, but that's not you problem. > >> I'm seeing very >> similar stacktraces: >> >> INFO: task umount:29224 blocked for more than 120 seconds. >> Tainted: G W 3.13.0-39-generic #66-Ubuntu >> "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. >> umount D ffff880c4fc34480 0 29224 29221 0x00000082 >> ffff880201211db0 0000000000000086 ffff880c39cb1800 ffff880201211fd8 >> 0000000000014480 0000000000014480 ffff880c39cb1800 ffff880c33386480 >> ffff880c395e4bc8 ffff880c333864c0 ffff880c333864e8 ffff880c33386490 >> Call Trace: >> >> [] schedule+0x29/0x70 >> [] xfs_ail_push_all_sync+0xa9/0xe0 [xfs] >> [] ? prepare_to_wait_event+0x100/0x100 >> [] xfs_log_quiesce+0x33/0x70 [xfs] >> [] xfs_log_unmount+0x12/0x30 [xfs] >> [] xfs_unmountfs+0xc6/0x150 [xfs] >> [] xfs_fs_put_super+0x21/0x60 [xfs] >> [] generic_shutdown_super+0x72/0xf0 >> [] kill_block_super+0x27/0x70 >> [] deactivate_locked_super+0x3d/0x60 >> [] deactivate_super+0x46/0x60 >> [] mntput_no_expire+0xd6/0x170 >> [] SyS_umount+0x8e/0x100 >> [] system_call_fastpath+0x1a/0x1f > > That's XFS hung waiting for IO to complete during unmount. > >> These type of errors are showing up in the logs: >> >> XFS (dm-8): metadata I/O error: block 0x0 ("xfs_buf_iodone_callbacks") error 19 numblks 1 > > Error 19 = ENODEV. > > You pulled the drive out before you tried to unmount? > >> XFS (dm-8): Detected failing async write on buffer block 0x0. Retrying async write. > > Which means it's detecting that the write is failing, but the higher > level has been told to keep trying until all metadata has been > flushed. We probably need to tweak this slightly.... > > Eric - this is another case where transient vs permanent error is > somewhat squishy, and treating ENODEV as a permanent error would > solve this issue (i.e. trigger a shutdown). Did you start doing > anything in this area? that's (probably) a little more clear, enodev is unlikely to be transparently resolved. Even if it comes back, there's no mechanism to see that it came back with the same name, right? ... > AFAICT a ENODEV error on Linux is a permanent error because if you > replug the device it will come back as a different device and the > ENODEV onteh removed device will still persist. yes, right. :) > However, I'm not > sure what dm-multipath ends up doing in this case - it's supposed to > hide the same devices coming and going, so maybe it won't trigger > this error at all... Anyway, I had started a hack of accumulating consecutive failed IOs but didn't go too far yet, the initial try didn't do what I expected and I haven't gotten back to iet yet... -Eric > Cheers, > > Dave. > From sandeen@sandeen.net Mon Feb 9 18:00:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 724E17F77 for ; Mon, 9 Feb 2015 18:00:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EDAFAC003 for ; Mon, 9 Feb 2015 16:00:45 -0800 (PST) X-ASG-Debug-ID: 1423526444-04cb6c6b0aef2a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id a8Y2QxjIiN64VBjw for ; Mon, 09 Feb 2015 16:00:44 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5F0F9602D76B; Mon, 9 Feb 2015 18:00:43 -0600 (CST) Message-ID: <54D94A2A.8020906@sandeen.net> Date: Mon, 09 Feb 2015 18:00:42 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , Brian Foster CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> <20150209211744.GT12722@dastard> <20150209214359.GN18336@laptop.bfoster> <20150209215827.GW12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* In-Reply-To: <20150209215827.GW12722@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1423526444 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15091 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/9/15 3:58 PM, Dave Chinner wrote: > On Mon, Feb 09, 2015 at 04:43:59PM -0500, Brian Foster wrote: >> On Tue, Feb 10, 2015 at 08:17:44AM +1100, Dave Chinner wrote: ... >> Sure, but ASSERT_CORRUPT_RET() is the same length as the example above. >> ASSERT_CORRUPT_GOTO() is only a few chars longer than the associated >> example. We could still use WANT over ASSERT I suppose to shorten it up >> further. Either of those are at least still self-explanatory in my >> opinion. > > Thinking on it a bit further, the XFS_WANT_CORRUPTED macros have an > internal ASSERT in them, so they are effectively an ASSERT > statement. I could live with those names, especially as ASSERT is > something that can be compiled into production kernels via > CONFIG_XFS_WARN=y to turn them into error messages... Sooooo you all want "ASSERT_CORRUPTED_RET / ASSERT_CORRUPTED_GOTO" ? In a light mauve? ;) -Eric > Cheers, > > Dave. > From david@fromorbit.com Mon Feb 9 18:04:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E22937F77 for ; Mon, 9 Feb 2015 18:04:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71143AC004 for ; Mon, 9 Feb 2015 16:04:29 -0800 (PST) X-ASG-Debug-ID: 1423526665-04cbb01162eaec0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id A2G6PB9L7FI0z6wK for ; Mon, 09 Feb 2015 16:04:26 -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: AmsUAEdK2VR5LPv2PGdsb2JhbABcgwZSWoIzg3mpbgwBAQEBAQEGkkSFcwICAQECgRxEAQEBAQEBBQEBAQE4O4QNAQU6HCMQCAMYCSUPBSUDBxoTiCzNEgEBAQcCAR8YhWyJdAeEKgWSa4IRg0qBGY4agz6EJCoxgkIBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 10:34:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKyJT-0005zF-6q; Tue, 10 Feb 2015 11:04:23 +1100 Date: Tue, 10 Feb 2015 11:04:23 +1100 From: Dave Chinner To: "J. Bruce Fields" Cc: Jeff Layton , Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150210000423.GY12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> <20150209201154.GA27746@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209201154.GA27746@fieldses.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: 1423526665 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15091 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Feb 09, 2015 at 03:11:54PM -0500, J. Bruce Fields wrote: > On Sun, Feb 08, 2015 at 09:09:42AM -0500, Jeff Layton wrote: > > On Sun, 8 Feb 2015 14:34:35 +0100 > > Christoph Hellwig wrote: > > > > > On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > > > > You'd basically just be pulling my tree (Christoph's is just my nfsd > > > > tree with his patches on top, and I've been testing with exactly that > > > > locally, just putting off pushing it out till we decide this.) > > > > > > > > So anyway, fine with me if you want to just pull that into the xfs tree. > > > > Mine's ready whenever, so if I send my pull pretty soon after the merge > > > > window and you send it a little later then we still keep the property > > > > that Linus's merge still has a diffstat only in our respective areas. > > > > > > > > (OK, it's a little more complicated because I've got the same > > > > arrangement with jlayton, so the order is jlayton's lock pull, then my > > > > nfsd pull, then your xfs pull. Is this getting too complicated? > > > > jlayton and I are both ready to so and I think it'd work.) > > > > > > > > I'm also fine with duplicating those few patches, or whatever. > > > > > > Maybe the better idea is to pull the xfs tree in the nfsd tree, but > > > that would require Dave sending an early pull request so that the > > > nfsd pull doesn't get delayed. > > > > > > Or we just defer the pnfsd merge. While I tried to get it in in time > > > for 3.20 all the delays during review mean we're really late no and should > > > punt it to 3.21. > > > > FWIW, I plan to send a pull request for the locking changes as soon as > > the merge window opens. Hopefully that won't be an issue for long... > > This includes Christoph's branch (all but the final xfs commits): > > git://linux-nfs.org/~bfields/linux.git for-3.20 > > That's what I intend to submit. Hope that's OK. Then it's up to Dave > whether he wants to pull that in and include the xfs patches. I'm about to send a pull request to Linus for the current XFS tree. Once that is merged, I'll pull in the remaining xfs-pnfs patches and send another pull request to Linus after the NFS tree is merged. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 9 18:34:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C11FB7FB4 for ; Mon, 9 Feb 2015 18:34:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 414BFAC002 for ; Mon, 9 Feb 2015 16:34:40 -0800 (PST) X-ASG-Debug-ID: 1423528473-04cb6c6b0aefdf0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id thERVi7YnDjdqZmx for ; Mon, 09 Feb 2015 16:34:34 -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: AuwOAItR2VR5LPv2PGdsb2JhbABcgwZSWoIzg3mpcQwBAQEBAQEGkkCFcwQCgR9EAQEBAQEBBQEBAQE4O4RNHCMYJDQFJQMHLYgszUAYhWyJc4QxBYVSjRmFW4EZgwOIGIY9hCQqMYJCAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 11:04:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YKyme-00062F-7B; Tue, 10 Feb 2015 11:34:32 +1100 Date: Tue, 10 Feb 2015 11:34:32 +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] xfs: updates for 3.20-rc1 Message-ID: <20150210003432.GZ12722@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: updates for 3.20-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: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423528473 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15091 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 current XFS updates from the tree below? It's a relatively small set of changes, mainly refactoring and bug fixes, with a few small feature additions. The tag below describes the changes in more detail. There is one very recent commit in the tree - I found a regression introduced in 3.19-rc1 on friday, and didn't get it reviewed in time for the final 3.19 release. Everything else has soaked in linux-next for at least a week. FYI, I'll also be sending a second pull request later in the merge window for the XFS side of the PNFS block layout server support that is in Bruce's tree. We didn't get our git trees in a pile quickly enough once review was completed to merge stable commits between the trees, so once the new PNFS server code is merged I'll send the XFS changes that implement the new NFS server interfaces. -Dave. The following changes since commit 97bf6af1f928216fd6c5a66e8a57bfa95a659672: Linux 3.19-rc1 (2014-12-20 17:08:50 -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-3.20-rc1 for you to fetch changes up to bad962662dbc60e76ec1baae34af56b1ba2dfa5f: Merge branch 'xfs-misc-fixes-for-3.20-4' into for-next (2015-02-10 09:24:25 +1100) ---------------------------------------------------------------- xfs: update for 3.20-rc1 This update contains: o RENAME_EXCHANGE support o Rework of the superblock logging infrastructure o Rework of the XFS_IOCTL_SETXATTR implementation - enables use inside user namespaces - fixes inconsistencies setting extent size hints o fixes for missing buffer type annotations used in log recovery o more consolidation of libxfs headers o preparation patches for block based PNFS support o miscellaneous bug fixes and cleanups ---------------------------------------------------------------- Brian Foster (2): xfs: initialize log buf I/O completion wq on log alloc xfs: remove incorrect error negation in attr_multi ioctl Carlos Maiolino (2): xfs: Make xfs_vn_rename compliant with renameat2() syscall xfs: Add support to RENAME_EXCHANGE flag Christoph Hellwig (4): xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten xfs: factor out a xfs_update_prealloc_flags() helper xfs: don't allocate an ioend for direct I/O completions xfs: growfs should use synchronous transactions Dave Chinner (28): Merge branch 'xfs-misc-fixes-for-3.20-1' into for-next xfs: move xfs_fs.h to libxfs xfs: move xfs_types.h to libxfs xfs: move struct xfs_bmalloca to libxfs xfs: move xfs_bmap_finish prototype xfs: remove deprecated sysctls Merge branch 'xfs-misc-fixes-for-3.20-2' into for-next xfs: remove bitfield based superblock updates xfs: consolidate superblock logging functions xfs: sanitise sb_bad_features2 handling Merge branch 'xfs-sb-logging-rework' into for-next xfs: ensure buffer types are set correctly xfs: inode unlink does not set AGI buffer type xfs: set buf types when converting extent formats xfs: set superblock buffer type correctly Merge branch 'xfs-buf-type-fixes' into for-next Merge branch 'xfs-misc-fixes-for-3.20-3' into for-next xfs: FSX_NONBLOCK is not used xfs: separate xflags from xfs_ioctl_setattr xfs: factor out xfs_ioctl_setattr transaciton preamble xfs: disaggregate xfs_ioctl_setattr xfs: kill xfs_ioctl_setattr behaviour mask xfs: XFS_IOCTL_SETXATTR can run in user namespaces xfs: factor extsize hint checking out of xfs_ioctl_setattr xfs: factor projid hint checking out of xfs_ioctl_setattr Merge branch 'xfs-ioctl-setattr-cleanup' into for-next xfs: only trace buffer items if they exist Merge branch 'xfs-misc-fixes-for-3.20-4' into for-next Eric Sandeen (3): xfs: remove extra newlines from xfs messages xfs: fix panic_mask documentation xfs: report proper f_files in statfs if we overshoot imaxpct Iustin Pop (1): xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Jan Kara (1): xfs: Keep sb_bad_features2 consistent with sb_features2 Nicholas Mc Guire (1): xfs: fix implicit bool to int conversion Wang, Yalin (1): xfs: change kmem_free to use generic kvfree() kbuild test robot (1): xfs: xfs_ioctl_setattr_check_projid can be static Documentation/filesystems/xfs.txt | 22 +- fs/xfs/kmem.c | 10 - fs/xfs/kmem.h | 5 +- fs/xfs/libxfs/xfs_attr_leaf.c | 2 +- fs/xfs/libxfs/xfs_bmap.c | 20 +- fs/xfs/libxfs/xfs_bmap.h | 33 +++ fs/xfs/libxfs/xfs_format.h | 24 +- fs/xfs/{ => libxfs}/xfs_fs.h | 0 fs/xfs/libxfs/xfs_sb.c | 320 ++++++++++------------- fs/xfs/libxfs/xfs_sb.h | 11 +- fs/xfs/libxfs/xfs_shared.h | 33 ++- fs/xfs/libxfs/xfs_symlink_remote.c | 2 + fs/xfs/libxfs/xfs_trans_resv.c | 14 - fs/xfs/libxfs/xfs_trans_resv.h | 1 - fs/xfs/{ => libxfs}/xfs_types.h | 0 fs/xfs/xfs_aops.c | 149 +++++------ fs/xfs/xfs_aops.h | 3 - fs/xfs/xfs_bmap_util.h | 37 +-- fs/xfs/xfs_buf_item.c | 6 +- fs/xfs/xfs_dquot.h | 2 +- fs/xfs/xfs_file.c | 64 +++-- fs/xfs/xfs_fsops.c | 34 +-- fs/xfs/xfs_inode.c | 136 +++++++++- fs/xfs/xfs_inode.h | 11 +- fs/xfs/xfs_ioctl.c | 501 +++++++++++++++++------------------- fs/xfs/xfs_ioctl32.c | 2 +- fs/xfs/xfs_iomap.c | 2 +- fs/xfs/xfs_iomap.h | 2 +- fs/xfs/xfs_iops.c | 21 +- fs/xfs/xfs_log.c | 28 +- fs/xfs/xfs_mount.c | 107 ++------ fs/xfs/xfs_mount.h | 5 +- fs/xfs/xfs_qm.c | 43 +--- fs/xfs/xfs_qm.h | 1 - fs/xfs/xfs_qm_syscalls.c | 14 +- fs/xfs/xfs_super.c | 20 +- fs/xfs/xfs_sysctl.c | 18 -- fs/xfs/xfs_trans.c | 1 + fs/xfs/xfs_trans_buf.c | 5 +- 39 files changed, 817 insertions(+), 892 deletions(-) rename fs/xfs/{ => libxfs}/xfs_fs.h (100%) rename fs/xfs/{ => libxfs}/xfs_types.h (100%) -- Dave Chinner david@fromorbit.com From pxome@qbon.com Mon Feb 9 22:49:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=DEAR_SOMETHING, HTML_IMAGE_ONLY_12,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D122C7F83 for ; Mon, 9 Feb 2015 22:49:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33746AC003 for ; Mon, 9 Feb 2015 20:49:25 -0800 (PST) X-ASG-Debug-ID: 1423543723-04cbb01162ef930001-NocioJ Received: from wocp.com ([23.228.108.199]) by cuda.sgi.com with ESMTP id KCEDEJOQNPdVju2N for ; Mon, 09 Feb 2015 20:48:44 -0800 (PST) X-Barracuda-Envelope-From: pxome@qbon.com X-Barracuda-Apparent-Source-IP: 23.228.108.199 Received: from 8SC3ZQDAFABDN6J ([127.0.0.1]) by localhost via TCP with ESMTPA; Tue, 10 Feb 2015 12:46:47 +0800 Disposition-Notification-To: roland@e-ablepower.com MIME-Version: 1.0 From: Roland Sender: Roland To: xfs@oss.sgi.com Reply-To: Roland Date: 10 Feb 2015 12:46:47 +0800 Subject: =?utf-8?B?QVc6TEVEIHBhbmVsIGxpZ2h0IHhmcw==?= Content-Type: multipart/mixed; boundary=--boundary_180925_bd299dde-f30d-44d8-b335-68cec6f6064f X-ASG-Orig-Subj: =?utf-8?B?QVc6TEVEIHBhbmVsIGxpZ2h0IHhmcw==?= X-Barracuda-Connect: UNKNOWN[23.228.108.199] X-Barracuda-Start-Time: 1423543723 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_ONLY_12, HTML_MESSAGE, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15096 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.63 HTML_IMAGE_ONLY_12 BODY: HTML: images with 800-1200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20150210044925.8EE5F106C1E4@cuda.sgi.com> ----boundary_180925_bd299dde-f30d-44d8-b335-68cec6f6064f Content-Type: multipart/alternative; boundary=--boundary_180924_be0a0a08-a797-4da3-8ad3-af452dc29a61 ----boundary_180924_be0a0a08-a797-4da3-8ad3-af452dc29a61 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 DQpEZWFyIFNpciwNCiZuYnNwOw0KV2l0aCBzdW5ueSBncmVldGluZyENCiZuYnNwOyZuYnNw Ow0KDQpXZSZuYnNwO2FyZSBkaXJlY3QgbWFuZmFjdHVyZXIgb2YgTEVEIHBhbmVsIGxpZ2h0 Jm5ic3A7d2l0aCZuYnNwO3dob2xlc2FsZSBwcmljZSZuYnNwO2luIENoaW5hLg0KT3VyIHBy b2R1Y3RzIGhhdmUgcmVjZWl2ZWQgYW4gZXhjZWxsZW5jZSBzYWxlcyBpbiBFdXJvcGUgaW4g cGFzdCB5ZWFycy4NCkhvcGUgdG8gZXN0YWJsaXNoIGNvb3BlcmF0aW9uIHdpdGggeW91Lg0K SWYgeW91IGludGVyZXN0ZWQgLHBscyZuYnNwO2F0Jm5ic3A7dXMgLg0KJm5ic3A7DQpCZXN0 IHJlZ2FyZHMsDQoNCg0KJm5ic3A7DQpJZiBkaXN0dXJiICxwbHMgVW5zdWJzY3JpYmU= ----boundary_180924_be0a0a08-a797-4da3-8ad3-af452dc29a61 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PFNQQU4gc3R5bGU9IkZPTlQtRkFNSUxZOiAnQXJpYWwnOyBGT05ULVNJWkU6IDEycHQ7IG1z by1zcGFjZXJ1bjogJ3llcyciPg0KPERJVj48Rk9OVCBjb2xvcj0jMDAwMDAwPkRlYXIgU2ly LDwvRk9OVD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPldpdGggc3VubnkgZ3Jl ZXRpbmchPC9ESVY+DQo8RElWPiZuYnNwOyZuYnNwOzwvRElWPg0KPERJVj48Rk9OVCBjb2xv cj0jMDAwMDAwPjwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDAwMD5XZSZu YnNwO2FyZSBkaXJlY3QgbWFuZmFjdHVyZXIgb2YgPC9GT05UPjxGT05UIGNvbG9yPSMwMDAw MDA+PEZPTlQgY29sb3I9IzAwMDAwMD5MRUQgcGFuZWwgbGlnaHQ8L0ZPTlQ+PEZPTlQgY29s b3I9IzAwMDAwMD4mbmJzcDs8L0ZPTlQ+PC9GT05UPjxGT05UIGNvbG9yPSMwMDAwMDA+d2l0 aCZuYnNwO3dob2xlc2FsZSBwcmljZSZuYnNwO2luIENoaW5hLjwvRk9OVD48L0RJVj4NCjxE SVY+T3VyIHByb2R1Y3RzIGhhdmUgcmVjZWl2ZWQgYW4gZXhjZWxsZW5jZSBzYWxlcyBpbiBF dXJvcGUgaW4gcGFzdCB5ZWFycy48L0RJVj4NCjxESVY+SG9wZSB0byBlc3RhYmxpc2ggY29v cGVyYXRpb24gd2l0aCB5b3UuPC9ESVY+DQo8RElWPklmIHlvdSBpbnRlcmVzdGVkICxwbHMm bmJzcDthdCZuYnNwO3VzIC48L0RJVj4NCjxESVY+Jm5ic3A7PElNRyBzcmM9ImNpZDowQGxv Y2FsaG9zdCI+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPSMwMDAwMDA+QmVzdCByZWdhcmRz LDwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgY29sb3I9IzAwMDA4Yj48L0ZPTlQ+DQo8RElW PjxGT05UIGNvbG9yPWJsYWNrPjxJTUcgc3JjPSJjaWQ6MUBsb2NhbGhvc3QiPjwvRk9OVD48 L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+PC9ESVY+DQo8RElWPjxGT05UIGNvbG9yPWJsYWNr PklmIGRpc3R1cmIgLHBscyA8QSBocmVmPSJtYWlsdG86cm9sYW5kZWFibGVwb3dlckAxNjMu Y29tIj48Rk9OVCBzaXplPTI+VW5zdWJzY3JpYmU8L0ZPTlQ+PC9BPjwvRElWPjwvRk9OVD48 L1NQQU4+PCEtLUVuZEZyYWdtZW50LS0+ ----boundary_180924_be0a0a08-a797-4da3-8ad3-af452dc29a61-- ----boundary_180925_bd299dde-f30d-44d8-b335-68cec6f6064f Content-Type: multipart/mixed; boundary=--boundary_180926_62abb588-3fb6-4be2-83ed-e5a1263214e4 ----boundary_180926_62abb588-3fb6-4be2-83ed-e5a1263214e4 Content-Type: image/jpeg; name=2.jpg Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: <0@localhost> /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9 PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhC Y2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wAAR CABqAPADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0CikqrqkrwaXdzRNteOF2U+hCkg0AW6K5 65urjTkAa5luUltZJWViodCqg5BA4BzjkdcVPJrE6ztGlqjILgWys0uCWKBskY6dvWgDaorn n8RS+SXSzUmOF5pQZcY2OVYDjnocdKlOtzL5sTwRLOjqEXezBwykjGFJzgHt2oA3KidZC2Vk 2j025rno9duHea8jh3QCzjnaJ5MbOX3Y45PHt0p663LBJNGqPcSSXEvlghjtRQvHAJ7+lAG8 FlH/AC0B+q0pdl++hx6rzVC/kvJ9Nhls0ljZiryRjCybMcgZ4DdOvvVT+2WjtGazQ3K29uZ5 WnfY+MsNvT72VbP0oA2N5kw0LqQOoP8AnipFO4enqKyn1JSdwh2v9qS3DBufmVWz/wCPdPaq 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 ----boundary_180926_62abb588-3fb6-4be2-83ed-e5a1263214e4 Content-Type: image/png; name=Eable.png Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: <1@localhost> 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 ----boundary_180926_62abb588-3fb6-4be2-83ed-e5a1263214e4-- ----boundary_180925_bd299dde-f30d-44d8-b335-68cec6f6064f-- From bonbons@linux-vserver.org Tue Feb 10 01:05:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D67437FBA for ; Tue, 10 Feb 2015 01:05:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C10E18F804B for ; Mon, 9 Feb 2015 23:05:56 -0800 (PST) X-ASG-Debug-ID: 1423551949-04cb6c6b0af5c70001-NocioJ Received: from smtprelay.restena.lu (smtprelay.restena.lu [158.64.1.62]) by cuda.sgi.com with ESMTP id 8g009DlY8I9cnXTQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Feb 2015 23:05:50 -0800 (PST) X-Barracuda-Envelope-From: bonbons@linux-vserver.org X-Barracuda-Apparent-Source-IP: 158.64.1.62 Received: from pluto.restena.lu (pluto.restena.lu [IPv6:2001:a18:1:8::156]) by smtprelay.restena.lu (Postfix) with ESMTPS id E880940CD9; Tue, 10 Feb 2015 08:05:48 +0100 (CET) Date: Tue, 10 Feb 2015 08:05:47 +0100 From: Bruno =?UTF-8?B?UHLDqW1vbnQ=?= To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150210080547.730f6180@pluto.restena.lu> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault In-Reply-To: <20150209212420.GU12722@dastard> References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> <20150205151007.7c954c01@pluto.restena.lu> <20150205221516.GT4251@dastard> <20150209094701.6b1d480d@pluto.restena.lu> <20150209212420.GU12722@dastard> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="MP_/pW.H5clZB7S4pRnX9NM/EUn" X-Barracuda-Connect: smtprelay.restena.lu[158.64.1.62] X-Barracuda-Start-Time: 1423551950 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15098 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --MP_/pW.H5clZB7S4pRnX9NM/EUn Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi Dave, On Tue, 10 Feb 2015 08:24:20 +1100 Dave Chinner wrote: > On Mon, Feb 09, 2015 at 09:47:01AM +0100, Bruno Pr=C3=A9mont wrote: > > On Fri, 6 Feb 2015 09:15:16 +1100 Dave Chinner wrote: > > > On Thu, Feb 05, 2015 at 03:10:07PM +0100, Bruno Pr=C3=A9mont wrote: > > > > New crash, new trace, this time on 3.18.2. > > > > It looks like this time a NULL dereference happened prior to touche= d memory poison being detected. > > > >=20 > > > > Once again it's during normal system operation (no mount/umount act= ivity) > > >=20 > > > Can you rebuild the kernel with CONFIG_XFS_WARN=3Dy and see if that > > > throws any interesting messages into logs? > >=20 > > Will try and see > >=20 > > > However: > > >=20 > > > > [1900390.261491] =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=3D=3D=3D=3D=3D=3D > > > > [1900390.272989] BUG task_struct (Tainted: G D W ): Poison= overwritten > > > > [1900390.283021] --------------------------------------------------= --------------------------- > > > > [1900390.283021]=20 > > > > [1900390.297056] INFO: 0xffff880213d651b3-0xffff880213d651b3. First= byte 0x6d instead of 0x6b > > > > [1900390.309044] INFO: Slab 0xffffea00084f5800 objects=3D16 used=3D= 16 fp=3D0x (null) flags=3D0x8000000000004080 > > > > [1900390.323087] INFO: Object 0xffff880213d64ba0 @offset=3D19360 fp= =3D0xffff880213d61e40 > > > > [1900390.323087]=20 > > > > [1900390.336988] Bytes b4 ffff880213d64b90: 60 2d d6 13 02 88 ff ff= 5a 5a 5a 5a 5a 5a 5a 5a `-......ZZZZZZZZ > > > > [1900390.350988] Object ffff880213d64ba0: 6b 6b 6b 6b 6b 6b 6b 6b 6= b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > > > [1900390.364943] Object ffff880213d64bb0: 6b 6b 6b 6b 6b 6b 6b 6b 6= b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > > .... > > > > [1900391.674636] Object ffff880213d651b0: 6b 6b 6b 6d 6b 6b 6b 6b 6= b 6b 6b 6b 6b 6b 6b 6b kkkmkkkkkkkkkkkk > > > ^^ > > >=20 > > > There's a single bit that has been flipped in the task_struct slab. > > > So more than just XFS is seeing memory corruption - this is in core > > > kernel structure slab caches. I'm not sure, either, how XFS could > > > cause corruption in this slab. > > >=20 > > > So, I'd be checking all the previous memory corruptions to see if > > > they are single bit errors, and if there is any pattern to the > > > addresses at which they occur. The above bit flip makes me think > > > "hardware issue" and everything else stems from that... > >=20 > > System has ECC RAM so faulty RAM looks less probable (no complaint seen > > by kernel nor recorded by firmware). >=20 > Sure, but that's not the only hardware in the memory path so single > bit errors can occur elsewhere as data moved across the bus of sits > in cpu caches. and if you're not using an IOMMU then it could even > be hardware writing to memory incorrectly... >=20 > > All previous crashes for which I have some logs were dereference after > > free but not attempt to allocate memory from a modified poison in free > > slabs. > >=20 > > Though what does that single bit represent in that area if it was > > used/modified after free? >=20 > It means that there's either a use after free, or you have a > hardware problem. being in the task struct slab, if it's a use after > free then it's unlikely to be an XFS problem. I mean what field does the affected byte/bit belong to in task_struct in order to see if it could be some write-after-free (of a task_struct) or not. > FWIW, can you post the output of "grep PARAVIRT file>"? grep does not find any match (full config, prior to enabling XFS_WARN attached). Cheers, Bruno --MP_/pW.H5clZB7S4pRnX9NM/EUn Content-Type: application/octet-stream; name=xfs.config Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=xfs.config IwojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULgojIExpbnV4L3g4 NiAzLjE4LjEgS2VybmVsIENvbmZpZ3VyYXRpb24KIwpDT05GSUdfNjRCSVQ9eQpDT05GSUdfWDg2 XzY0PXkKQ09ORklHX1g4Nj15CkNPTkZJR19JTlNUUlVDVElPTl9ERUNPREVSPXkKQ09ORklHX1BF UkZfRVZFTlRTX0lOVEVMX1VOQ09SRT15CkNPTkZJR19PVVRQVVRfRk9STUFUPSJlbGY2NC14ODYt NjQiCkNPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29u ZmlnIgpDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15 CkNPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CkNPTkZJR19NTVU9eQpDT05GSUdfTkVF RF9ETUFfTUFQX1NUQVRFPXkKQ09ORklHX05FRURfU0dfRE1BX0xFTkdUSD15CkNPTkZJR19HRU5F UklDX0lTQV9ETUE9eQpDT05GSUdfR0VORVJJQ19CVUc9eQpDT05GSUdfR0VORVJJQ19CVUdfUkVM QVRJVkVfUE9JTlRFUlM9eQpDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKQ09ORklHX0FSQ0hfTUFZ X0hBVkVfUENfRkRDPXkKQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKQ09ORklHX0dF TkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKQ09ORklHX0FSQ0hfSEFTX0NQVV9SRUxBWD15CkNPTkZJ R19BUkNIX0hBU19DQUNIRV9MSU5FX1NJWkU9eQpDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FS RUE9eQpDT05GSUdfTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LPXkKQ09ORklHX05FRURf UEVSX0NQVV9QQUdFX0ZJUlNUX0NIVU5LPXkKQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lC TEU9eQpDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKQ09ORklHX0FSQ0hfV0FOVF9IVUdF X1BNRF9TSEFSRT15CkNPTkZJR19BUkNIX1dBTlRfR0VORVJBTF9IVUdFVExCPXkKQ09ORklHX1pP TkVfRE1BMzI9eQpDT05GSUdfQVVESVRfQVJDSD15CkNPTkZJR19BUkNIX1NVUFBPUlRTX09QVElN SVpFRF9JTkxJTklORz15CkNPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CkNP TkZJR19IQVZFX0lOVEVMX1RYVD15CkNPTkZJR19YODZfNjRfU01QPXkKQ09ORklHX1g4Nl9IVD15 CkNPTkZJR19BUkNIX0hXRUlHSFRfQ0ZMQUdTPSItZmNhbGwtc2F2ZWQtcmRpIC1mY2FsbC1zYXZl ZC1yc2kgLWZjYWxsLXNhdmVkLXJkeCAtZmNhbGwtc2F2ZWQtcmN4IC1mY2FsbC1zYXZlZC1yOCAt ZmNhbGwtc2F2ZWQtcjkgLWZjYWxsLXNhdmVkLXIxMCAtZmNhbGwtc2F2ZWQtcjExIgpDT05GSUdf QVJDSF9TVVBQT1JUU19VUFJPQkVTPXkKQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU09eQpDT05GSUdf REVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpDT05G SUdfSVJRX1dPUks9eQpDT05GSUdfQlVJTERUSU1FX0VYVEFCTEVfU09SVD15CgojCiMgR2VuZXJh bCBzZXR1cAojCkNPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKQ09ORklHX0NST1NTX0NPTVBJ TEU9IiIKIyBDT05GSUdfQ09NUElMRV9URVNUIGlzIG5vdCBzZXQKQ09ORklHX0xPQ0FMVkVSU0lP Tj0iLXg4Nl82NCIKIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldApDT05GSUdf SEFWRV9LRVJORUxfR1pJUD15CkNPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CkNPTkZJR19IQVZF X0tFUk5FTF9MWk1BPXkKQ09ORklHX0hBVkVfS0VSTkVMX1haPXkKQ09ORklHX0hBVkVfS0VSTkVM X0xaTz15CkNPTkZJR19IQVZFX0tFUk5FTF9MWjQ9eQpDT05GSUdfS0VSTkVMX0daSVA9eQojIENP TkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAojIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qg c2V0CiMgQ09ORklHX0tFUk5FTF9YWiBpcyBub3Qgc2V0CiMgQ09ORklHX0tFUk5FTF9MWk8gaXMg bm90IHNldAojIENPTkZJR19LRVJORUxfTFo0IGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRfSE9T VE5BTUU9Iihub25lKSIKQ09ORklHX1NXQVA9eQpDT05GSUdfU1lTVklQQz15CkNPTkZJR19TWVNW SVBDX1NZU0NUTD15CkNPTkZJR19QT1NJWF9NUVVFVUU9eQpDT05GSUdfUE9TSVhfTVFVRVVFX1NZ U0NUTD15CiMgQ09ORklHX0NST1NTX01FTU9SWV9BVFRBQ0ggaXMgbm90IHNldApDT05GSUdfRkhB TkRMRT15CiMgQ09ORklHX1VTRUxJQiBpcyBub3Qgc2V0CiMgQ09ORklHX0FVRElUIGlzIG5vdCBz ZXQKQ09ORklHX0hBVkVfQVJDSF9BVURJVFNZU0NBTEw9eQoKIwojIElSUSBzdWJzeXN0ZW0KIwpD T05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQpDT05GSUdfR0VORVJJQ19JUlFfU0hPVz15CkNPTkZJ R19HRU5FUklDX0lSUV9MRUdBQ1lfQUxMT0NfSFdJUlE9eQpDT05GSUdfR0VORVJJQ19QRU5ESU5H X0lSUT15CkNPTkZJR19JUlFfRE9NQUlOPXkKQ09ORklHX0lSUV9GT1JDRURfVEhSRUFESU5HPXkK Q09ORklHX1NQQVJTRV9JUlE9eQpDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0c9eQpDT05GSUdf QVJDSF9DTE9DS1NPVVJDRV9EQVRBPXkKQ09ORklHX0NMT0NLU09VUkNFX1ZBTElEQVRFX0xBU1Rf Q1lDTEU9eQpDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKQ09ORklHX0dFTkVSSUNfQ0xP Q0tFVkVOVFM9eQpDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CkNPTkZJR19HRU5F UklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CkNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX01J Tl9BREpVU1Q9eQpDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CgojCiMgVGltZXJzIHN1YnN5 c3RlbQojCkNPTkZJR19USUNLX09ORVNIT1Q9eQpDT05GSUdfTk9fSFpfQ09NTU9OPXkKIyBDT05G SUdfSFpfUEVSSU9ESUMgaXMgbm90IHNldApDT05GSUdfTk9fSFpfSURMRT15CiMgQ09ORklHX05P X0haX0ZVTEwgaXMgbm90IHNldApDT05GSUdfTk9fSFo9eQpDT05GSUdfSElHSF9SRVNfVElNRVJT PXkKCiMKIyBDUFUvVGFzayB0aW1lIGFuZCBzdGF0cyBhY2NvdW50aW5nCiMKQ09ORklHX1RJQ0tf Q1BVX0FDQ09VTlRJTkc9eQojIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HX0dFTiBpcyBub3Qg c2V0CiMgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgaXMgbm90IHNldAojIENPTkZJR19CU0Rf UFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKCiMK IyBSQ1UgU3Vic3lzdGVtCiMKQ09ORklHX1RSRUVfUkNVPXkKIyBDT05GSUdfUFJFRU1QVF9SQ1Ug aXMgbm90IHNldApDT05GSUdfVEFTS1NfUkNVPXkKQ09ORklHX1JDVV9TVEFMTF9DT01NT049eQoj IENPTkZJR19SQ1VfVVNFUl9RUyBpcyBub3Qgc2V0CkNPTkZJR19SQ1VfRkFOT1VUPTY0CkNPTkZJ R19SQ1VfRkFOT1VUX0xFQUY9MTYKIyBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCBpcyBub3Qgc2V0 CiMgQ09ORklHX1JDVV9GQVNUX05PX0haIGlzIG5vdCBzZXQKIyBDT05GSUdfVFJFRV9SQ1VfVFJB Q0UgaXMgbm90IHNldAojIENPTkZJR19SQ1VfTk9DQl9DUFUgaXMgbm90IHNldApDT05GSUdfQlVJ TERfQklOMkM9eQpDT05GSUdfSUtDT05GSUc9eQpDT05GSUdfSUtDT05GSUdfUFJPQz15CkNPTkZJ R19MT0dfQlVGX1NISUZUPTE3CkNPTkZJR19MT0dfQ1BVX01BWF9CVUZfU0hJRlQ9MTIKQ09ORklH X0hBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0s9eQpDT05GSUdfQVJDSF9TVVBQT1JUU19OVU1BX0JB TEFOQ0lORz15CkNPTkZJR19BUkNIX1NVUFBPUlRTX0lOVDEyOD15CkNPTkZJR19DR1JPVVBTPXkK IyBDT05GSUdfQ0dST1VQX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0dST1VQX0ZSRUVaRVIg aXMgbm90IHNldAojIENPTkZJR19DR1JPVVBfREVWSUNFIGlzIG5vdCBzZXQKQ09ORklHX0NQVVNF VFM9eQojIENPTkZJR19QUk9DX1BJRF9DUFVTRVQgaXMgbm90IHNldApDT05GSUdfQ0dST1VQX0NQ VUFDQ1Q9eQpDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlM9eQpDT05GSUdfTUVNQ0c9eQojIENPTkZJ R19NRU1DR19TV0FQIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVNQ0dfS01FTSBpcyBub3Qgc2V0CiMg Q09ORklHX0NHUk9VUF9QRVJGIGlzIG5vdCBzZXQKQ09ORklHX0NHUk9VUF9TQ0hFRD15CkNPTkZJ R19GQUlSX0dST1VQX1NDSEVEPXkKQ09ORklHX0NGU19CQU5EV0lEVEg9eQojIENPTkZJR19SVF9H Uk9VUF9TQ0hFRCBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19DR1JPVVAgaXMgbm90IHNldAojIENP TkZJR19DSEVDS1BPSU5UX1JFU1RPUkUgaXMgbm90IHNldApDT05GSUdfTkFNRVNQQUNFUz15CkNP TkZJR19VVFNfTlM9eQpDT05GSUdfSVBDX05TPXkKIyBDT05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0 CkNPTkZJR19QSURfTlM9eQpDT05GSUdfTkVUX05TPXkKIyBDT05GSUdfU0NIRURfQVVUT0dST1VQ IGlzIG5vdCBzZXQKIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CiMgQ09ORklH X1JFTEFZIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKQ09ORklHX0lOSVRSQU1G U19TT1VSQ0U9Ii9kYXRhL2tlcm5lbC9pbml0cmQ2NC1ocC5jcGlvIgpDT05GSUdfSU5JVFJBTUZT X1JPT1RfVUlEPTAKQ09ORklHX0lOSVRSQU1GU19ST09UX0dJRD0wCkNPTkZJR19SRF9HWklQPXkK Q09ORklHX1JEX0JaSVAyPXkKQ09ORklHX1JEX0xaTUE9eQpDT05GSUdfUkRfWFo9eQpDT05GSUdf UkRfTFpPPXkKQ09ORklHX1JEX0xaND15CiMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlz IG5vdCBzZXQKQ09ORklHX1NZU0NUTD15CkNPTkZJR19BTk9OX0lOT0RFUz15CkNPTkZJR19IQVZF X1VJRDE2PXkKQ09ORklHX1NZU0NUTF9FWENFUFRJT05fVFJBQ0U9eQpDT05GSUdfSEFWRV9QQ1NQ S1JfUExBVEZPUk09eQpDT05GSUdfQlBGPXkKIyBDT05GSUdfRVhQRVJUIGlzIG5vdCBzZXQKQ09O RklHX1VJRDE2PXkKQ09ORklHX1NHRVRNQVNLX1NZU0NBTEw9eQpDT05GSUdfU1lTRlNfU1lTQ0FM TD15CiMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKQ09ORklHX0tBTExTWU1TPXkK IyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKQ09ORklHX1BSSU5USz15CkNPTkZJR19C VUc9eQpDT05GSUdfRUxGX0NPUkU9eQpDT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKQ09ORklHX0JB U0VfRlVMTD15CkNPTkZJR19GVVRFWD15CkNPTkZJR19FUE9MTD15CkNPTkZJR19TSUdOQUxGRD15 CkNPTkZJR19USU1FUkZEPXkKQ09ORklHX0VWRU5URkQ9eQojIENPTkZJR19CUEZfU1lTQ0FMTCBp cyBub3Qgc2V0CkNPTkZJR19TSE1FTT15CkNPTkZJR19BSU89eQpDT05GSUdfQURWSVNFX1NZU0NB TExTPXkKQ09ORklHX1BDSV9RVUlSS1M9eQojIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CkNP TkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKCiMKIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFu ZCBDb3VudGVycwojCkNPTkZJR19QRVJGX0VWRU5UUz15CiMgQ09ORklHX0RFQlVHX1BFUkZfVVNF X1ZNQUxMT0MgaXMgbm90IHNldApDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQpDT05GSUdfU0xV Ql9ERUJVRz15CiMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAojIENPTkZJR19TTEFCIGlz IG5vdCBzZXQKQ09ORklHX1NMVUI9eQpDT05GSUdfU0xVQl9DUFVfUEFSVElBTD15CiMgQ09ORklH X1BST0ZJTElORyBpcyBub3Qgc2V0CkNPTkZJR19IQVZFX09QUk9GSUxFPXkKQ09ORklHX09QUk9G SUxFX05NSV9USU1FUj15CiMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAojIENPTkZJR19KVU1Q X0xBQkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfVVBST0JFUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hB VkVfNjRCSVRfQUxJR05FRF9BQ0NFU1MgaXMgbm90IHNldApDT05GSUdfSEFWRV9FRkZJQ0lFTlRf VU5BTElHTkVEX0FDQ0VTUz15CkNPTkZJR19BUkNIX1VTRV9CVUlMVElOX0JTV0FQPXkKQ09ORklH X0hBVkVfSU9SRU1BUF9QUk9UPXkKQ09ORklHX0hBVkVfS1BST0JFUz15CkNPTkZJR19IQVZFX0tS RVRQUk9CRVM9eQpDT05GSUdfSEFWRV9PUFRQUk9CRVM9eQpDT05GSUdfSEFWRV9LUFJPQkVTX09O X0ZUUkFDRT15CkNPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKQ09ORklHX0hBVkVfRE1BX0FU VFJTPXkKQ09ORklHX0hBVkVfRE1BX0NPTlRJR1VPVVM9eQpDT05GSUdfR0VORVJJQ19TTVBfSURM RV9USFJFQUQ9eQpDT05GSUdfSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJPXkKQ09ORklH X0hBVkVfRE1BX0FQSV9ERUJVRz15CkNPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQ9eQpDT05GSUdf SEFWRV9NSVhFRF9CUkVBS1BPSU5UU19SRUdTPXkKQ09ORklHX0hBVkVfVVNFUl9SRVRVUk5fTk9U SUZJRVI9eQpDT05GSUdfSEFWRV9QRVJGX0VWRU5UU19OTUk9eQpDT05GSUdfSEFWRV9QRVJGX1JF R1M9eQpDT05GSUdfSEFWRV9QRVJGX1VTRVJfU1RBQ0tfRFVNUD15CkNPTkZJR19IQVZFX0FSQ0hf SlVNUF9MQUJFTD15CkNPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRz15CkNPTkZJR19I QVZFX0FMSUdORURfU1RSVUNUX1BBR0U9eQpDT05GSUdfSEFWRV9DTVBYQ0hHX0xPQ0FMPXkKQ09O RklHX0hBVkVfQ01QWENIR19ET1VCTEU9eQpDT05GSUdfQVJDSF9XQU5UX0NPTVBBVF9JUENfUEFS U0VfVkVSU0lPTj15CkNPTkZJR19BUkNIX1dBTlRfT0xEX0NPTVBBVF9JUEM9eQpDT05GSUdfSEFW RV9BUkNIX1NFQ0NPTVBfRklMVEVSPXkKQ09ORklHX0hBVkVfQ0NfU1RBQ0tQUk9URUNUT1I9eQpD T05GSUdfQ0NfU1RBQ0tQUk9URUNUT1I9eQojIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUl9OT05F IGlzIG5vdCBzZXQKQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX1JFR1VMQVI9eQojIENPTkZJR19D Q19TVEFDS1BST1RFQ1RPUl9TVFJPTkcgaXMgbm90IHNldApDT05GSUdfSEFWRV9DT05URVhUX1RS QUNLSU5HPXkKQ09ORklHX0hBVkVfVklSVF9DUFVfQUNDT1VOVElOR19HRU49eQpDT05GSUdfSEFW RV9JUlFfVElNRV9BQ0NPVU5USU5HPXkKQ09ORklHX0hBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdF UEFHRT15CkNPTkZJR19IQVZFX0FSQ0hfU09GVF9ESVJUWT15CkNPTkZJR19NT0RVTEVTX1VTRV9F TEZfUkVMQT15CkNPTkZJR19IQVZFX0lSUV9FWElUX09OX0lSUV9TVEFDSz15CkNPTkZJR19PTERf U0lHU1VTUEVORDM9eQpDT05GSUdfQ09NUEFUX09MRF9TSUdBQ1RJT049eQoKIwojIEdDT1YtYmFz ZWQga2VybmVsIHByb2ZpbGluZwojCiMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQg aXMgbm90IHNldApDT05GSUdfU0xBQklORk89eQpDT05GSUdfUlRfTVVURVhFUz15CkNPTkZJR19C QVNFX1NNQUxMPTAKQ09ORklHX01PRFVMRVM9eQojIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBp cyBub3Qgc2V0CkNPTkZJR19NT0RVTEVfVU5MT0FEPXkKIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VO TE9BRCBpcyBub3Qgc2V0CkNPTkZJR19NT0RWRVJTSU9OUz15CkNPTkZJR19NT0RVTEVfU1JDVkVS U0lPTl9BTEw9eQojIENPTkZJR19NT0RVTEVfU0lHIGlzIG5vdCBzZXQKIyBDT05GSUdfTU9EVUxF X0NPTVBSRVNTIGlzIG5vdCBzZXQKQ09ORklHX1NUT1BfTUFDSElORT15CkNPTkZJR19CTE9DSz15 CkNPTkZJR19CTEtfREVWX0JTRz15CkNPTkZJR19CTEtfREVWX0JTR0xJQj15CkNPTkZJR19CTEtf REVWX0lOVEVHUklUWT15CiMgQ09ORklHX0JMS19DTURMSU5FX1BBUlNFUiBpcyBub3Qgc2V0Cgoj CiMgUGFydGl0aW9uIFR5cGVzCiMKQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiMgQ09ORklH X0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0FJWF9QQVJUSVRJT04gaXMgbm90 IHNldAojIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfQU1JR0FfUEFS VElUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIyBD T05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CkNPTkZJR19NU0RPU19QQVJUSVRJT049eQoj IENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfTUlOSVhfU1VCUEFSVElU SU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQK IyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfTERNX1BBUlRJ VElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAojIENPTkZJ R19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBu b3Qgc2V0CiMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CkNPTkZJR19FRklfUEFS VElUSU9OPXkKIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0NN RExJTkVfUEFSVElUSU9OIGlzIG5vdCBzZXQKQ09ORklHX0JMT0NLX0NPTVBBVD15CgojCiMgSU8g U2NoZWR1bGVycwojCkNPTkZJR19JT1NDSEVEX05PT1A9eQpDT05GSUdfSU9TQ0hFRF9ERUFETElO RT15CkNPTkZJR19JT1NDSEVEX0NGUT15CiMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90 IHNldApDT05GSUdfREVGQVVMVF9DRlE9eQojIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNl dApDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCkNPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tf SVJRPXkKQ09ORklHX0lOTElORV9SRUFEX1VOTE9DSz15CkNPTkZJR19JTkxJTkVfUkVBRF9VTkxP Q0tfSVJRPXkKQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0s9eQpDT05GSUdfSU5MSU5FX1dSSVRF X1VOTE9DS19JUlE9eQpDT05GSUdfQVJDSF9TVVBQT1JUU19BVE9NSUNfUk1XPXkKQ09ORklHX01V VEVYX1NQSU5fT05fT1dORVI9eQpDT05GSUdfUldTRU1fU1BJTl9PTl9PV05FUj15CkNPTkZJR19B UkNIX1VTRV9RVUVVRV9SV0xPQ0s9eQpDT05GSUdfUVVFVUVfUldMT0NLPXkKIyBDT05GSUdfRlJF RVpFUiBpcyBub3Qgc2V0CgojCiMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiMKQ09ORklH X1pPTkVfRE1BPXkKQ09ORklHX1NNUD15CkNPTkZJR19YODZfRkVBVFVSRV9OQU1FUz15CkNPTkZJ R19YODZfTVBQQVJTRT15CiMgQ09ORklHX1g4Nl9FWFRFTkRFRF9QTEFURk9STSBpcyBub3Qgc2V0 CiMgQ09ORklHX1g4Nl9JTlRFTF9MUFNTIGlzIG5vdCBzZXQKIyBDT05GSUdfSU9TRl9NQkkgaXMg bm90IHNldApDT05GSUdfWDg2X1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFPXkKQ09ORklHX1NDSEVE X09NSVRfRlJBTUVfUE9JTlRFUj15CiMgQ09ORklHX0hZUEVSVklTT1JfR1VFU1QgaXMgbm90IHNl dApDT05GSUdfTk9fQk9PVE1FTT15CiMgQ09ORklHX01FTVRFU1QgaXMgbm90IHNldAojIENPTkZJ R19NSzggaXMgbm90IHNldAojIENPTkZJR19NUFNDIGlzIG5vdCBzZXQKQ09ORklHX01DT1JFMj15 CiMgQ09ORklHX01BVE9NIGlzIG5vdCBzZXQKIyBDT05GSUdfR0VORVJJQ19DUFUgaXMgbm90IHNl dApDT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9TSElGVD02CkNPTkZJR19YODZfTDFfQ0FDSEVf U0hJRlQ9NgpDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKQ09ORklHX1g4Nl9VU0VfUFBST19D SEVDS1NVTT15CkNPTkZJR19YODZfUDZfTk9QPXkKQ09ORklHX1g4Nl9UU0M9eQpDT05GSUdfWDg2 X0NNUFhDSEc2ND15CkNPTkZJR19YODZfQ01PVj15CkNPTkZJR19YODZfTUlOSU1VTV9DUFVfRkFN SUxZPTY0CkNPTkZJR19YODZfREVCVUdDVExNU1I9eQpDT05GSUdfQ1BVX1NVUF9JTlRFTD15CkNP TkZJR19DUFVfU1VQX0FNRD15CkNPTkZJR19DUFVfU1VQX0NFTlRBVVI9eQpDT05GSUdfSFBFVF9U SU1FUj15CkNPTkZJR19IUEVUX0VNVUxBVEVfUlRDPXkKQ09ORklHX0RNST15CkNPTkZJR19HQVJU X0lPTU1VPXkKIyBDT05GSUdfQ0FMR0FSWV9JT01NVSBpcyBub3Qgc2V0CkNPTkZJR19TV0lPVExC PXkKQ09ORklHX0lPTU1VX0hFTFBFUj15CiMgQ09ORklHX01BWFNNUCBpcyBub3Qgc2V0CkNPTkZJ R19OUl9DUFVTPTgKIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBzZXQKQ09ORklHX1NDSEVEX01D PXkKQ09ORklHX1BSRUVNUFRfTk9ORT15CiMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5v dCBzZXQKIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkNPTkZJR19YODZfTE9DQUxfQVBJQz15 CkNPTkZJR19YODZfSU9fQVBJQz15CiMgQ09ORklHX1g4Nl9SRVJPVVRFX0ZPUl9CUk9LRU5fQk9P VF9JUlFTIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9NQ0U9eQpDT05GSUdfWDg2X01DRV9JTlRFTD15 CiMgQ09ORklHX1g4Nl9NQ0VfQU1EIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9NQ0VfVEhSRVNIT0xE PXkKIyBDT05GSUdfWDg2X01DRV9JTkpFQ1QgaXMgbm90IHNldApDT05GSUdfWDg2X1RIRVJNQUxf VkVDVE9SPXkKQ09ORklHX1g4Nl8xNkJJVD15CkNPTkZJR19YODZfRVNQRklYNjQ9eQojIENPTkZJ R19JOEsgaXMgbm90IHNldApDT05GSUdfTUlDUk9DT0RFPXkKQ09ORklHX01JQ1JPQ09ERV9JTlRF TD15CiMgQ09ORklHX01JQ1JPQ09ERV9BTUQgaXMgbm90IHNldApDT05GSUdfTUlDUk9DT0RFX09M RF9JTlRFUkZBQ0U9eQpDT05GSUdfTUlDUk9DT0RFX0lOVEVMX0VBUkxZPXkKIyBDT05GSUdfTUlD Uk9DT0RFX0FNRF9FQVJMWSBpcyBub3Qgc2V0CkNPTkZJR19NSUNST0NPREVfRUFSTFk9eQpDT05G SUdfWDg2X01TUj15CkNPTkZJR19YODZfQ1BVSUQ9eQpDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82 NEJJVD15CkNPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQ9eQpDT05GSUdfRElSRUNUX0dCUEFH RVM9eQojIENPTkZJR19OVU1BIGlzIG5vdCBzZXQKQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJM RT15CkNPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUPXkKQ09ORklHX0FSQ0hfU0VMRUNUX01F TU9SWV9NT0RFTD15CkNPTkZJR19JTExFR0FMX1BPSU5URVJfVkFMVUU9MHhkZWFkMDAwMDAwMDAw MDAwCkNPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKQ09ORklHX1NQQVJTRU1FTV9NQU5VQUw9 eQpDT05GSUdfU1BBUlNFTUVNPXkKQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQpDT05GSUdf U1BBUlNFTUVNX0VYVFJFTUU9eQpDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFPXkKQ09O RklHX1NQQVJTRU1FTV9BTExPQ19NRU1fTUFQX1RPR0VUSEVSPXkKQ09ORklHX1NQQVJTRU1FTV9W TUVNTUFQPXkKQ09ORklHX0hBVkVfTUVNQkxPQ0s9eQpDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RF X01BUD15CkNPTkZJR19BUkNIX0RJU0NBUkRfTUVNQkxPQ0s9eQojIENPTkZJR19IQVZFX0JPT1RN RU1fSU5GT19OT0RFIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVNT1JZX0hPVFBMVUcgaXMgbm90IHNl dApDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQK Q09ORklHX0FSQ0hfRU5BQkxFX1NQTElUX1BNRF9QVExPQ0s9eQpDT05GSUdfQ09NUEFDVElPTj15 CkNPTkZJR19NSUdSQVRJT049eQpDT05GSUdfUEhZU19BRERSX1RfNjRCSVQ9eQpDT05GSUdfWk9O RV9ETUFfRkxBRz0xCkNPTkZJR19CT1VOQ0U9eQpDT05GSUdfVklSVF9UT19CVVM9eQpDT05GSUdf TU1VX05PVElGSUVSPXkKIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRfTU1B UF9NSU5fQUREUj00MDk2CkNPTkZJR19BUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFPXkKIyBD T05GSUdfTUVNT1JZX0ZBSUxVUkUgaXMgbm90IHNldApDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBB R0U9eQpDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTPXkKIyBDT05GSUdfVFJBTlNQ QVJFTlRfSFVHRVBBR0VfTUFEVklTRSBpcyBub3Qgc2V0CiMgQ09ORklHX0NMRUFOQ0FDSEUgaXMg bm90IHNldAojIENPTkZJR19GUk9OVFNXQVAgaXMgbm90IHNldAojIENPTkZJR19DTUEgaXMgbm90 IHNldAojIENPTkZJR19aUE9PTCBpcyBub3Qgc2V0CiMgQ09ORklHX1pCVUQgaXMgbm90IHNldAoj IENPTkZJR19aU01BTExPQyBpcyBub3Qgc2V0CkNPTkZJR19HRU5FUklDX0VBUkxZX0lPUkVNQVA9 eQojIENPTkZJR19YODZfQ0hFQ0tfQklPU19DT1JSVVBUSU9OIGlzIG5vdCBzZXQKQ09ORklHX1g4 Nl9SRVNFUlZFX0xPVz02NApDT05GSUdfTVRSUj15CiMgQ09ORklHX01UUlJfU0FOSVRJWkVSIGlz IG5vdCBzZXQKQ09ORklHX1g4Nl9QQVQ9eQpDT05GSUdfQVJDSF9VU0VTX1BHX1VOQ0FDSEVEPXkK Q09ORklHX0FSQ0hfUkFORE9NPXkKQ09ORklHX1g4Nl9TTUFQPXkKIyBDT05GSUdfRUZJIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CkNPTkZJR19IWl8xMDA9eQojIENPTkZJ R19IWl8yNTAgaXMgbm90IHNldAojIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAojIENPTkZJR19I Wl8xMDAwIGlzIG5vdCBzZXQKQ09ORklHX0haPTEwMApDT05GSUdfU0NIRURfSFJUSUNLPXkKQ09O RklHX0tFWEVDPXkKQ09ORklHX0tFWEVDX0ZJTEU9eQojIENPTkZJR19LRVhFQ19WRVJJRllfU0lH IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CkNPTkZJR19QSFlTSUNB TF9TVEFSVD0weDEwMDAwMDAKIyBDT05GSUdfUkVMT0NBVEFCTEUgaXMgbm90IHNldApDT05GSUdf UEhZU0lDQUxfQUxJR049MHgxMDAwMDAwCiMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQK IyBDT05GSUdfQ09NUEFUX1ZEU08gaXMgbm90IHNldApDT05GSUdfQ01ETElORV9CT09MPXkKQ09O RklHX0NNRExJTkU9InZnYT1ub3JtYWwgc2x1Yl9kZWJ1Zz1aUCBkcm1fa21zX2hlbHBlci5lZGlk X2Zpcm13YXJlPVZHQS0xOmVkaWQvaHB0ZnQ3NjAwLmJpbiBjb25zb2xlPXR0eVMxLDExNTIwMCBj b25zb2xlPXR0eTAiCiMgQ09ORklHX0NNRExJTkVfT1ZFUlJJREUgaXMgbm90IHNldApDT05GSUdf QVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQoKIwojIFBvd2VyIG1hbmFnZW1lbnQgYW5kIEFD UEkgb3B0aW9ucwojCiMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAojIENPTkZJR19ISUJFUk5B VElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldApDT05GSUdfQUNQ ST15CkNPTkZJR19BQ1BJX0xFR0FDWV9UQUJMRVNfTE9PS1VQPXkKQ09ORklHX0FSQ0hfTUlHSFRf SEFWRV9BQ1BJX1BEQz15CiMgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSIGlzIG5vdCBzZXQKIyBD T05GSUdfQUNQSV9FQ19ERUJVR0ZTIGlzIG5vdCBzZXQKQ09ORklHX0FDUElfQUM9eQojIENPTkZJ R19BQ1BJX0JBVFRFUlkgaXMgbm90IHNldApDT05GSUdfQUNQSV9CVVRUT049eQpDT05GSUdfQUNQ SV9WSURFTz15CkNPTkZJR19BQ1BJX0ZBTj15CkNPTkZJR19BQ1BJX0RPQ0s9eQpDT05GSUdfQUNQ SV9QUk9DRVNTT1I9eQpDT05GSUdfQUNQSV9JUE1JPXkKIyBDT05GSUdfQUNQSV9QUk9DRVNTT1Jf QUdHUkVHQVRPUiBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX1RIRVJNQUw9eQojIENPTkZJR19BQ1BJ X0NVU1RPTV9EU0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNQSV9JTklUUkRfVEFCTEVfT1ZFUlJJ REUgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNQ SV9QQ0lfU0xPVCBpcyBub3Qgc2V0CkNPTkZJR19YODZfUE1fVElNRVI9eQojIENPTkZJR19BQ1BJ X0NPTlRBSU5FUiBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfU0JTIGlzIG5vdCBzZXQKQ09ORklH X0FDUElfSEVEPW0KIyBDT05GSUdfQUNQSV9SRURVQ0VEX0hBUkRXQVJFX09OTFkgaXMgbm90IHNl dApDT05GSUdfSEFWRV9BQ1BJX0FQRUk9eQpDT05GSUdfSEFWRV9BQ1BJX0FQRUlfTk1JPXkKQ09O RklHX0FDUElfQVBFST15CiMgQ09ORklHX0FDUElfQVBFSV9HSEVTIGlzIG5vdCBzZXQKIyBDT05G SUdfQUNQSV9BUEVJX1BDSUVBRVIgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0FQRUlfRVJTVF9E RUJVRyBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX0VYVExPRz15CiMgQ09ORklHX1NGSSBpcyBub3Qg c2V0CgojCiMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCiMKQ09ORklHX0NQVV9GUkVRPXkKQ09ORklH X0NQVV9GUkVRX0dPVl9DT01NT049eQpDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CiMgQ09ORklHX0NQ VV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CkNPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dP Vl9QRVJGT1JNQU5DRT15CiMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBp cyBub3Qgc2V0CiMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX09OREVNQU5EIGlzIG5vdCBz ZXQKIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQK Q09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CiMgQ09ORklHX0NQVV9GUkVRX0dPVl9Q T1dFUlNBVkUgaXMgbm90IHNldApDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CkNPTkZJ R19DUFVfRlJFUV9HT1ZfT05ERU1BTkQ9eQojIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFU SVZFIGlzIG5vdCBzZXQKCiMKIyB4ODYgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMKIwoj IENPTkZJR19YODZfSU5URUxfUFNUQVRFIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9QQ0NfQ1BVRlJF UT1tCkNPTkZJR19YODZfQUNQSV9DUFVGUkVRPXkKIyBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9D UEIgaXMgbm90IHNldAojIENPTkZJR19YODZfUE9XRVJOT1dfSzggaXMgbm90IHNldAojIENPTkZJ R19YODZfQU1EX0ZSRVFfU0VOU0lUSVZJVFkgaXMgbm90IHNldAojIENPTkZJR19YODZfU1BFRURT VEVQX0NFTlRSSU5PIGlzIG5vdCBzZXQKIyBDT05GSUdfWDg2X1A0X0NMT0NLTU9EIGlzIG5vdCBz ZXQKCiMKIyBzaGFyZWQgb3B0aW9ucwojCiMgQ09ORklHX1g4Nl9TUEVFRFNURVBfTElCIGlzIG5v dCBzZXQKCiMKIyBDUFUgSWRsZQojCkNPTkZJR19DUFVfSURMRT15CkNPTkZJR19DUFVfSURMRV9H T1ZfTEFEREVSPXkKQ09ORklHX0NQVV9JRExFX0dPVl9NRU5VPXkKIyBDT05GSUdfQVJDSF9ORUVE U19DUFVfSURMRV9DT1VQTEVEIGlzIG5vdCBzZXQKQ09ORklHX0lOVEVMX0lETEU9eQoKIwojIE1l bW9yeSBwb3dlciBzYXZpbmdzCiMKIyBDT05GSUdfSTczMDBfSURMRSBpcyBub3Qgc2V0CgojCiMg QnVzIG9wdGlvbnMgKFBDSSBldGMuKQojCkNPTkZJR19QQ0k9eQpDT05GSUdfUENJX0RJUkVDVD15 CkNPTkZJR19QQ0lfTU1DT05GSUc9eQpDT05GSUdfUENJX0RPTUFJTlM9eQpDT05GSUdfUENJRVBP UlRCVVM9eQpDT05GSUdfUENJRUFFUj15CiMgQ09ORklHX1BDSUVfRUNSQyBpcyBub3Qgc2V0CiMg Q09ORklHX1BDSUVBRVJfSU5KRUNUIGlzIG5vdCBzZXQKQ09ORklHX1BDSUVBU1BNPXkKIyBDT05G SUdfUENJRUFTUE1fREVCVUcgaXMgbm90IHNldApDT05GSUdfUENJRUFTUE1fREVGQVVMVD15CiMg Q09ORklHX1BDSUVBU1BNX1BPV0VSU0FWRSBpcyBub3Qgc2V0CiMgQ09ORklHX1BDSUVBU1BNX1BF UkZPUk1BTkNFIGlzIG5vdCBzZXQKQ09ORklHX1BDSV9NU0k9eQojIENPTkZJR19QQ0lfREVCVUcg aXMgbm90IHNldAojIENPTkZJR19QQ0lfUkVBTExPQ19FTkFCTEVfQVVUTyBpcyBub3Qgc2V0CiMg Q09ORklHX1BDSV9TVFVCIGlzIG5vdCBzZXQKIyBDT05GSUdfSFRfSVJRIGlzIG5vdCBzZXQKIyBD T05GSUdfUENJX0lPViBpcyBub3Qgc2V0CiMgQ09ORklHX1BDSV9QUkkgaXMgbm90IHNldAojIENP TkZJR19QQ0lfUEFTSUQgaXMgbm90IHNldApDT05GSUdfUENJX0lPQVBJQz15CkNPTkZJR19QQ0lf TEFCRUw9eQoKIwojIFBDSSBob3N0IGNvbnRyb2xsZXIgZHJpdmVycwojCkNPTkZJR19JU0FfRE1B X0FQST15CkNPTkZJR19BTURfTkI9eQojIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAojIENPTkZJ R19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CiMgQ09ORklHX1JBUElESU8gaXMgbm90IHNldAojIENP TkZJR19YODZfU1lTRkIgaXMgbm90IHNldAoKIwojIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIC8g RW11bGF0aW9ucwojCkNPTkZJR19CSU5GTVRfRUxGPXkKQ09ORklHX0NPTVBBVF9CSU5GTVRfRUxG PXkKQ09ORklHX0FSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFPXkKIyBDT05GSUdfQ09SRV9E VU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldApDT05GSUdfQklORk1UX1NDUklQVD15 CiMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CiMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5v dCBzZXQKQ09ORklHX0NPUkVEVU1QPXkKQ09ORklHX0lBMzJfRU1VTEFUSU9OPXkKIyBDT05GSUdf SUEzMl9BT1VUIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9YMzI9eQpDT05GSUdfQ09NUEFUPXkKQ09O RklHX0NPTVBBVF9GT1JfVTY0X0FMSUdOTUVOVD15CkNPTkZJR19TWVNWSVBDX0NPTVBBVD15CkNP TkZJR19YODZfREVWX0RNQV9PUFM9eQpDT05GSUdfUE1DX0FUT009eQpDT05GSUdfTkVUPXkKCiMK IyBOZXR3b3JraW5nIG9wdGlvbnMKIwpDT05GSUdfUEFDS0VUPXkKIyBDT05GSUdfUEFDS0VUX0RJ QUcgaXMgbm90IHNldApDT05GSUdfVU5JWD15CkNPTkZJR19VTklYX0RJQUc9eQojIENPTkZJR19Y RlJNX1VTRVIgaXMgbm90IHNldAojIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKQ09ORklHX0lO RVQ9eQojIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApDT05GSUdfSVBfQURWQU5DRURf Uk9VVEVSPXkKIyBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMgaXMgbm90IHNldApDT05GSUdfSVBf TVVMVElQTEVfVEFCTEVTPXkKIyBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIIGlzIG5vdCBzZXQK IyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CiMgQ09ORklHX0lQX1BOUCBpcyBu b3Qgc2V0CiMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX0lQR1JFX0RF TVVYIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX0lQX1RVTk5FTCBpcyBub3Qgc2V0CkNPTkZJR19T WU5fQ09PS0lFUz15CiMgQ09ORklHX05FVF9VRFBfVFVOTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdf TkVUX0ZPVSBpcyBub3Qgc2V0CiMgQ09ORklHX0dFTkVWRSBpcyBub3Qgc2V0CiMgQ09ORklHX0lO RVRfQUggaXMgbm90IHNldAojIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CiMgQ09ORklHX0lO RVRfSVBDT01QIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0 CiMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVF9YRlJNX01PREVf VFJBTlNQT1JUIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5v dCBzZXQKIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CkNPTkZJR19JTkVU X0xSTz15CiMgQ09ORklHX0lORVRfRElBRyBpcyBub3Qgc2V0CiMgQ09ORklHX1RDUF9DT05HX0FE VkFOQ0VEIGlzIG5vdCBzZXQKQ09ORklHX1RDUF9DT05HX0NVQklDPXkKQ09ORklHX0RFRkFVTFRf VENQX0NPTkc9ImN1YmljIgpDT05GSUdfVENQX01ENVNJRz15CkNPTkZJR19JUFY2PXkKIyBDT05G SUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CiMgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19E QUQgaXMgbm90IHNldAojIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lORVQ2 X0VTUCBpcyBub3Qgc2V0CiMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CiMgQ09ORklH X0lQVjZfTUlQNiBpcyBub3Qgc2V0CiMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBz ZXQKIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVDZfWEZSTV9N T0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUwg aXMgbm90IHNldAojIENPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CiMgQ09O RklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CiMgQ09ORklH X0lQVjZfU0lUIGlzIG5vdCBzZXQKIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAojIENP TkZJR19JUFY2X0dSRSBpcyBub3Qgc2V0CkNPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15CkNP TkZJR19JUFY2X1NVQlRSRUVTPXkKIyBDT05GSUdfSVBWNl9NUk9VVEUgaXMgbm90IHNldAojIENP TkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldApDT05GSUdfTkVUX1BUUF9DTEFTU0lGWT15 CiMgQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElORyBpcyBub3Qgc2V0CkNPTkZJR19ORVRG SUxURVI9eQojIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldApDT05GSUdfTkVURklM VEVSX0FEVkFOQ0VEPXkKCiMKIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCiMKQ09ORklH X05FVEZJTFRFUl9ORVRMSU5LPXkKQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0FDQ1Q9eQojIENP TkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRSBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxURVJf TkVUTElOS19MT0c9eQpDT05GSUdfTkZfQ09OTlRSQUNLPXkKQ09ORklHX05GX0xPR19DT01NT049 eQpDT05GSUdfTkZfQ09OTlRSQUNLX01BUks9eQojIENPTkZJR19ORl9DT05OVFJBQ0tfWk9ORVMg aXMgbm90IHNldAojIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ0ZTIGlzIG5vdCBzZXQKQ09ORklH X05GX0NPTk5UUkFDS19FVkVOVFM9eQpDT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVPVVQ9eQpDT05G SUdfTkZfQ09OTlRSQUNLX1RJTUVTVEFNUD15CiMgQ09ORklHX05GX0NUX1BST1RPX0RDQ1AgaXMg bm90IHNldAojIENPTkZJR19ORl9DVF9QUk9UT19TQ1RQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkZf Q1RfUFJPVE9fVURQTElURSBpcyBub3Qgc2V0CiMgQ09ORklHX05GX0NPTk5UUkFDS19BTUFOREEg aXMgbm90IHNldApDT05GSUdfTkZfQ09OTlRSQUNLX0ZUUD15CiMgQ09ORklHX05GX0NPTk5UUkFD S19IMzIzIGlzIG5vdCBzZXQKIyBDT05GSUdfTkZfQ09OTlRSQUNLX0lSQyBpcyBub3Qgc2V0CiMg Q09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TIGlzIG5vdCBzZXQKIyBDT05GSUdfTkZfQ09O TlRSQUNLX1NOTVAgaXMgbm90IHNldAojIENPTkZJR19ORl9DT05OVFJBQ0tfUFBUUCBpcyBub3Qg c2V0CiMgQ09ORklHX05GX0NPTk5UUkFDS19TQU5FIGlzIG5vdCBzZXQKIyBDT05GSUdfTkZfQ09O TlRSQUNLX1NJUCBpcyBub3Qgc2V0CiMgQ09ORklHX05GX0NPTk5UUkFDS19URlRQIGlzIG5vdCBz ZXQKQ09ORklHX05GX0NUX05FVExJTks9eQpDT05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPXkK IyBDT05GSUdfTkZfVEFCTEVTIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPXkK CiMKIyBYdGFibGVzIGNvbWJpbmVkIG1vZHVsZXMKIwojIENPTkZJR19ORVRGSUxURVJfWFRfTUFS SyBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxURVJfWFRfQ09OTk1BUks9eQoKIwojIFh0YWJsZXMg dGFyZ2V0cwojCiMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkgaXMgbm90IHNl dApDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSz15CkNPTkZJR19ORVRGSUxURVJf WFRfVEFSR0VUX0NUPXkKIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ITUFSSyBpcyBub3Qg c2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJTUVSIGlzIG5vdCBzZXQKQ09O RklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTE9HPXkKIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdF VF9NQVJLIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9eQojIENP TkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAojIENPTkZJR19ORVRG SUxURVJfWFRfVEFSR0VUX05PVFJBQ0sgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJfWFRf VEFSR0VUX1JBVEVFU1QgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RF RSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UgaXMgbm90IHNl dAojIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RDUE1TUyBpcyBub3Qgc2V0CgojCiMgWHRh YmxlcyBtYXRjaGVzCiMKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9BRERSVFlQRT15CiMgQ09O RklHX05FVEZJTFRFUl9YVF9NQVRDSF9CUEYgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJf WFRfTUFUQ0hfQ0dST1VQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NM VVNURVIgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9eQpDT05G SUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5CWVRFUz15CiMgQ09ORklHX05FVEZJTFRFUl9YVF9N QVRDSF9DT05OTEFCRUwgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5M SU1JVD15CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9eQpDT05GSUdfTkVURklM VEVSX1hUX01BVENIX0NPTk5UUkFDSz15CiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DUFUg aXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCBpcyBub3Qgc2V0CiMg Q09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ERVZHUk9VUCBpcyBub3Qgc2V0CiMgQ09ORklHX05F VEZJTFRFUl9YVF9NQVRDSF9EU0NQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01B VENIX0VDTiBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1AgaXMgbm90 IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD15CkNPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfSEVMUEVSPXkKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hMIGlzIG5v dCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQQ09NUCBpcyBub3Qgc2V0CkNPTkZJ R19ORVRGSUxURVJfWFRfTUFUQ0hfSVBSQU5HRT15CiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRD SF9MMlRQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCBpcyBu b3Qgc2V0CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9eQojIENPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfTUFDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01B UksgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD15CiMgQ09O RklHX05FVEZJTFRFUl9YVF9NQVRDSF9ORkFDQ1QgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfT1NGIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05F Uj15CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT15CiMgQ09ORklHX05FVEZJTFRF Ul9YVF9NQVRDSF9RVU9UQSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9S QVRFRVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNIGlzIG5v dCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9eQojIENPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfU0NUUCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9T T0NLRVQgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFPXkKIyBDT05G SUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQyBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJ TFRFUl9YVF9NQVRDSF9TVFJJTkcgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJfWFRfTUFU Q0hfVENQTVNTIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FPXkKQ09O RklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9eQojIENPTkZJR19JUF9TRVQgaXMgbm90IHNldAoj IENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CgojCiMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9u CiMKQ09ORklHX05GX0RFRlJBR19JUFY0PXkKQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PXkKIyBD T05GSUdfTkZfTE9HX0FSUCBpcyBub3Qgc2V0CkNPTkZJR19ORl9MT0dfSVBWND15CkNPTkZJR19O Rl9SRUpFQ1RfSVBWND15CiMgQ09ORklHX05GX05BVF9JUFY0IGlzIG5vdCBzZXQKQ09ORklHX0lQ X05GX0lQVEFCTEVTPXkKIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUggaXMgbm90IHNldAojIENPTkZJ R19JUF9ORl9NQVRDSF9FQ04gaXMgbm90IHNldApDT05GSUdfSVBfTkZfTUFUQ0hfUlBGSUxURVI9 eQojIENPTkZJR19JUF9ORl9NQVRDSF9UVEwgaXMgbm90IHNldApDT05GSUdfSVBfTkZfRklMVEVS PXkKQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9eQojIENPTkZJR19JUF9ORl9UQVJHRVRfU1lO UFJPWFkgaXMgbm90IHNldAojIENPTkZJR19JUF9ORl9OQVQgaXMgbm90IHNldAojIENPTkZJR19J UF9ORl9NQU5HTEUgaXMgbm90IHNldApDT05GSUdfSVBfTkZfUkFXPXkKIyBDT05GSUdfSVBfTkZf QVJQVEFCTEVTIGlzIG5vdCBzZXQKCiMKIyBJUHY2OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgoj CkNPTkZJR19ORl9ERUZSQUdfSVBWNj15CkNPTkZJR19ORl9DT05OVFJBQ0tfSVBWNj15CkNPTkZJ R19ORl9SRUpFQ1RfSVBWNj15CkNPTkZJR19ORl9MT0dfSVBWNj15CiMgQ09ORklHX05GX05BVF9J UFY2IGlzIG5vdCBzZXQKQ09ORklHX0lQNl9ORl9JUFRBQkxFUz15CiMgQ09ORklHX0lQNl9ORl9N QVRDSF9BSCBpcyBub3Qgc2V0CkNPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQ9eQpDT05GSUdfSVA2 X05GX01BVENIX0ZSQUc9eQojIENPTkZJR19JUDZfTkZfTUFUQ0hfT1BUUyBpcyBub3Qgc2V0CiMg Q09ORklHX0lQNl9ORl9NQVRDSF9ITCBpcyBub3Qgc2V0CiMgQ09ORklHX0lQNl9ORl9NQVRDSF9J UFY2SEVBREVSIGlzIG5vdCBzZXQKIyBDT05GSUdfSVA2X05GX01BVENIX01IIGlzIG5vdCBzZXQK Q09ORklHX0lQNl9ORl9NQVRDSF9SUEZJTFRFUj15CiMgQ09ORklHX0lQNl9ORl9NQVRDSF9SVCBp cyBub3Qgc2V0CkNPTkZJR19JUDZfTkZfRklMVEVSPXkKQ09ORklHX0lQNl9ORl9UQVJHRVRfUkVK RUNUPXkKIyBDT05GSUdfSVA2X05GX1RBUkdFVF9TWU5QUk9YWSBpcyBub3Qgc2V0CiMgQ09ORklH X0lQNl9ORl9NQU5HTEUgaXMgbm90IHNldApDT05GSUdfSVA2X05GX1JBVz15CiMgQ09ORklHX0lQ Nl9ORl9OQVQgaXMgbm90IHNldAojIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKIyBDT05GSUdf SVBfU0NUUCBpcyBub3Qgc2V0CiMgQ09ORklHX1JEUyBpcyBub3Qgc2V0CiMgQ09ORklHX1RJUEMg aXMgbm90IHNldAojIENPTkZJR19BVE0gaXMgbm90IHNldAojIENPTkZJR19MMlRQIGlzIG5vdCBz ZXQKIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfTkVUX0RTQT15CiMgQ09O RklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAojIENPTkZJR19ERUNORVQgaXMgbm90IHNldAojIENP TkZJR19MTEMyIGlzIG5vdCBzZXQKIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRB TEsgaXMgbm90IHNldAojIENPTkZJR19YMjUgaXMgbm90IHNldAojIENPTkZJR19MQVBCIGlzIG5v dCBzZXQKIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKIyBDT05GSUdfNkxPV1BBTiBpcyBub3Qg c2V0CiMgQ09ORklHX0lFRUU4MDIxNTQgaXMgbm90IHNldAojIENPTkZJR19ORVRfU0NIRUQgaXMg bm90IHNldAojIENPTkZJR19EQ0IgaXMgbm90IHNldAojIENPTkZJR19CQVRNQU5fQURWIGlzIG5v dCBzZXQKIyBDT05GSUdfT1BFTlZTV0lUQ0ggaXMgbm90IHNldAojIENPTkZJR19WU09DS0VUUyBp cyBub3Qgc2V0CiMgQ09ORklHX05FVExJTktfTU1BUCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVExJ TktfRElBRyBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9NUExTX0dTTyBpcyBub3Qgc2V0CiMgQ09O RklHX0hTUiBpcyBub3Qgc2V0CkNPTkZJR19SUFM9eQpDT05GSUdfUkZTX0FDQ0VMPXkKQ09ORklH X1hQUz15CkNPTkZJR19DR1JPVVBfTkVUX1BSSU89eQojIENPTkZJR19DR1JPVVBfTkVUX0NMQVNT SUQgaXMgbm90IHNldApDT05GSUdfTkVUX1JYX0JVU1lfUE9MTD15CkNPTkZJR19CUUw9eQojIENP TkZJR19CUEZfSklUIGlzIG5vdCBzZXQKQ09ORklHX05FVF9GTE9XX0xJTUlUPXkKCiMKIyBOZXR3 b3JrIHRlc3RpbmcKIwojIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKIyBDT05GSUdfSEFN UkFESU8gaXMgbm90IHNldAojIENPTkZJR19DQU4gaXMgbm90IHNldAojIENPTkZJR19JUkRBIGlz IG5vdCBzZXQKIyBDT05GSUdfQlQgaXMgbm90IHNldAojIENPTkZJR19BRl9SWFJQQyBpcyBub3Qg c2V0CkNPTkZJR19GSUJfUlVMRVM9eQojIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CiMgQ09O RklHX1dJTUFYIGlzIG5vdCBzZXQKIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKIyBDT05GSUdf TkVUXzlQIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0FJRiBpcyBub3Qgc2V0CiMgQ09ORklHX0NFUEhf TElCIGlzIG5vdCBzZXQKIyBDT05GSUdfTkZDIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfQlBGX0pJ VD15CgojCiMgRGV2aWNlIERyaXZlcnMKIwoKIwojIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKIwoj IENPTkZJR19VRVZFTlRfSEVMUEVSIGlzIG5vdCBzZXQKQ09ORklHX0RFVlRNUEZTPXkKQ09ORklH X0RFVlRNUEZTX01PVU5UPXkKQ09ORklHX1NUQU5EQUxPTkU9eQpDT05GSUdfUFJFVkVOVF9GSVJN V0FSRV9CVUlMRD15CkNPTkZJR19GV19MT0FERVI9eQpDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVM PXkKQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSJibngyL2JueDItbWlwcy0wOS02LjIuMWIuZncgYm54 Mi9ibngyLW1pcHMtMDYtNi4yLjMuZncgcWwyMTAwX2Z3LmJpbiBxbDIyMDBfZncuYmluIHFsMjMw MF9mdy5iaW4gcWwyMzIyX2Z3LmJpbiBxbDI0MDBfZncuYmluIHFsMjUwMF9mdy5iaW4gZWRpZC9o cHRmdDc2MDAuYmluIgpDT05GSUdfRVhUUkFfRklSTVdBUkVfRElSPSIvZGF0YS9rZXJuZWwvbGlu dXgtZnctZ2l0IgojIENPTkZJR19GV19MT0FERVJfVVNFUl9IRUxQRVJfRkFMTEJBQ0sgaXMgbm90 IHNldApDT05GSUdfQUxMT1dfREVWX0NPUkVEVU1QPXkKIyBDT05GSUdfREVCVUdfRFJJVkVSIGlz IG5vdCBzZXQKIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfU1lTX0hZ UEVSVklTT1IgaXMgbm90IHNldAojIENPTkZJR19HRU5FUklDX0NQVV9ERVZJQ0VTIGlzIG5vdCBz ZXQKQ09ORklHX0dFTkVSSUNfQ1BVX0FVVE9QUk9CRT15CkNPTkZJR19ETUFfU0hBUkVEX0JVRkZF Uj15CiMgQ09ORklHX0ZFTkNFX1RSQUNFIGlzIG5vdCBzZXQKCiMKIyBCdXMgZGV2aWNlcwojCkNP TkZJR19DT05ORUNUT1I9eQpDT05GSUdfUFJPQ19FVkVOVFM9eQojIENPTkZJR19NVEQgaXMgbm90 IHNldApDT05GSUdfQVJDSF9NSUdIVF9IQVZFX1BDX1BBUlBPUlQ9eQojIENPTkZJR19QQVJQT1JU IGlzIG5vdCBzZXQKQ09ORklHX1BOUD15CiMgQ09ORklHX1BOUF9ERUJVR19NRVNTQUdFUyBpcyBu b3Qgc2V0CgojCiMgUHJvdG9jb2xzCiMKQ09ORklHX1BOUEFDUEk9eQpDT05GSUdfQkxLX0RFVj15 CiMgQ09ORklHX0JMS19ERVZfTlVMTF9CTEsgaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX0ZE IGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9QQ0lFU1NEX01USVAzMlhYIGlzIG5vdCBzZXQK Q09ORklHX0JMS19DUFFfQ0lTU19EQT15CiMgQ09ORklHX0NJU1NfU0NTSV9UQVBFIGlzIG5vdCBz ZXQKIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX1VN RU0gaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldApDT05G SUdfQkxLX0RFVl9MT09QPXkKQ09ORklHX0JMS19ERVZfTE9PUF9NSU5fQ09VTlQ9OAojIENPTkZJ R19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX0RSQkQgaXMg bm90IHNldAojIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZf TlZNRSBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZfU0tEIGlzIG5vdCBzZXQKIyBDT05GSUdf QkxLX0RFVl9TWDggaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CiMg Q09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAojIENPTkZJR19BVEFfT1ZFUl9FVEggaXMg bm90IHNldAojIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9S QkQgaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX1JTWFggaXMgbm90IHNldAoKIwojIE1pc2Mg ZGV2aWNlcwojCiMgQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEIGlzIG5vdCBzZXQKIyBDT05GSUdf QUQ1MjVYX0RQT1QgaXMgbm90IHNldAojIENPTkZJR19EVU1NWV9JUlEgaXMgbm90IHNldAojIENP TkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CiMgQ09O RklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKIyBD T05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CiMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBp cyBub3Qgc2V0CkNPTkZJR19IUF9JTE89eQojIENPTkZJR19BUERTOTgwMkFMUyBpcyBub3Qgc2V0 CiMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKIyBDT05GSUdfSVNMMjkwMjAgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0JI MTc4MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQkgxNzcwIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19BUERTOTkwWCBpcyBub3Qgc2V0CiMgQ09ORklHX0hNQzYzNTIgaXMgbm90IHNl dAojIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAojIENPTkZJR19CTVAwODVfSTJDIGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX1NXSVRDSF9GU0E5NDgwIGlzIG5vdCBzZXQKIyBDT05GSUdfU1JBTSBp cyBub3Qgc2V0CiMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CgojCiMgRUVQUk9NIHN1cHBvcnQK IwojIENPTkZJR19FRVBST01fQVQyNCBpcyBub3Qgc2V0CiMgQ09ORklHX0VFUFJPTV9MRUdBQ1kg aXMgbm90IHNldAojIENPTkZJR19FRVBST01fTUFYNjg3NSBpcyBub3Qgc2V0CiMgQ09ORklHX0VF UFJPTV85M0NYNiBpcyBub3Qgc2V0CiMgQ09ORklHX0NCNzEwX0NPUkUgaXMgbm90IHNldAoKIwoj IFRleGFzIEluc3RydW1lbnRzIHNoYXJlZCB0cmFuc3BvcnQgbGluZSBkaXNjaXBsaW5lCiMKIyBD T05GSUdfU0VOU09SU19MSVMzX0kyQyBpcyBub3Qgc2V0CgojCiMgQWx0ZXJhIEZQR0EgZmlybXdh cmUgZG93bmxvYWQgbW9kdWxlCiMKIyBDT05GSUdfQUxURVJBX1NUQVBMIGlzIG5vdCBzZXQKIyBD T05GSUdfSU5URUxfTUVJIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5URUxfTUVJX01FIGlzIG5vdCBz ZXQKIyBDT05GSUdfSU5URUxfTUVJX1RYRSBpcyBub3Qgc2V0CiMgQ09ORklHX1ZNV0FSRV9WTUNJ IGlzIG5vdCBzZXQKCiMKIyBJbnRlbCBNSUMgQnVzIERyaXZlcgojCiMgQ09ORklHX0lOVEVMX01J Q19CVVMgaXMgbm90IHNldAoKIwojIEludGVsIE1JQyBIb3N0IERyaXZlcgojCgojCiMgSW50ZWwg TUlDIENhcmQgRHJpdmVyCiMKIyBDT05GSUdfR0VOV1FFIGlzIG5vdCBzZXQKIyBDT05GSUdfRUNI TyBpcyBub3Qgc2V0CiMgQ09ORklHX0NYTF9CQVNFIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfSURF PXkKIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKCiMKIyBTQ1NJIGRldmljZSBzdXBwb3J0CiMKQ09O RklHX1NDU0lfTU9EPXkKIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CkNPTkZJR19TQ1NJ PXkKQ09ORklHX1NDU0lfRE1BPXkKQ09ORklHX1NDU0lfTkVUTElOSz15CiMgQ09ORklHX1NDU0lf TVFfREVGQVVMVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0Cgoj CiMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKIwpDT05GSUdfQkxLX0RF Vl9TRD15CkNPTkZJR19DSFJfREVWX1NUPXkKIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBz ZXQKQ09ORklHX0JMS19ERVZfU1I9eQpDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQpDT05GSUdf Q0hSX0RFVl9TRz15CiMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NT SV9DT05TVEFOVFMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldApD T05GSUdfU0NTSV9TQ0FOX0FTWU5DPXkKCiMKIyBTQ1NJIFRyYW5zcG9ydHMKIwpDT05GSUdfU0NT SV9TUElfQVRUUlM9eQpDT05GSUdfU0NTSV9GQ19BVFRSUz15CkNPTkZJR19TQ1NJX0lTQ1NJX0FU VFJTPXkKIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1NB U19MSUJTQVMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CkNP TkZJR19TQ1NJX0xPV0xFVkVMPXkKIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKIyBDT05G SUdfSVNDU0lfQk9PVF9TWVNGUyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0kg aXMgbm90IHNldAojIENPTkZJR19TQ1NJX0NYR0I0X0lTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdf U0NTSV9CTlgyX0lTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdfQkUySVNDU0kgaXMgbm90IHNldAoj IENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CkNPTkZJR19TQ1NJX0hQU0E9 eQojIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAojIENPTkZJR19TQ1NJXzNXX1NBUyBp cyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FB Q1JBSUQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAojIENPTkZJ R19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNl dAojIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9NVlVNSSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQURW QU5TWVMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CiMgQ09ORklH X1NDU0lfRVNBUzJSIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVHQVJBSURfTkVXR0VOIGlzIG5vdCBz ZXQKIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVHQVJBSURf U0FTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9NUFQyU0FTIGlzIG5vdCBzZXQKIyBDT05GSUdf U0NTSV9NUFQzU0FTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9VRlNIQ0QgaXMgbm90IHNldAoj IENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQlVTTE9HSUMgaXMg bm90IHNldAojIENPTkZJR19WTVdBUkVfUFZTQ1NJIGlzIG5vdCBzZXQKQ09ORklHX0xJQkZDPXkK IyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90 IHNldAojIENPTkZJR19TQ1NJX0VBVEEgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0ZVVFVSRV9E T01BSU4gaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAojIENPTkZJR19T Q1NJX0lTQ0kgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CiMgQ09ORklH X1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQK IyBDT05GSUdfU0NTSV9TVEVYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBp cyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9RTE9H SUNfMTI4MCBpcyBub3Qgc2V0CkNPTkZJR19TQ1NJX1FMQV9GQz15CiMgQ09ORklHX1NDU0lfUUxB X0lTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKIyBDT05GSUdf U0NTSV9EQzM5NXggaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CiMg Q09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1BNQ1JBSUQgaXMgbm90 IHNldAojIENPTkZJR19TQ1NJX1BNODAwMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQkZBX0ZD IGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9DSEVMU0lPX0ZDT0UgaXMgbm90IHNldApDT05GSUdf U0NTSV9ESD15CkNPTkZJR19TQ1NJX0RIX1JEQUM9eQojIENPTkZJR19TQ1NJX0RIX0hQX1NXIGlz IG5vdCBzZXQKIyBDT05GSUdfU0NTSV9ESF9FTUMgaXMgbm90IHNldApDT05GSUdfU0NTSV9ESF9B TFVBPXkKIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQ09ORklHX0FUQT15 CiMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CkNPTkZJR19BVEFfVkVSQk9TRV9F UlJPUj15CkNPTkZJR19BVEFfQUNQST15CiMgQ09ORklHX1NBVEFfUE1QIGlzIG5vdCBzZXQKCiMK IyBDb250cm9sbGVycyB3aXRoIG5vbi1TRkYgbmF0aXZlIGludGVyZmFjZQojCkNPTkZJR19TQVRB X0FIQ0k9eQojIENPTkZJR19TQVRBX0FIQ0lfUExBVEZPUk0gaXMgbm90IHNldAojIENPTkZJR19T QVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9BQ0FSRF9BSENJIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CkNPTkZJR19BVEFfU0ZGPXkKCiMKIyBT RkYgY29udHJvbGxlcnMgd2l0aCBjdXN0b20gRE1BIGludGVyZmFjZQojCiMgQ09ORklHX1BEQ19B RE1BIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CiMgQ09ORklHX1NB VEFfU1g0IGlzIG5vdCBzZXQKQ09ORklHX0FUQV9CTURNQT15CgojCiMgU0FUQSBTRkYgY29udHJv bGxlcnMgd2l0aCBCTURNQQojCkNPTkZJR19BVEFfUElJWD15CiMgQ09ORklHX1NBVEFfTVYgaXMg bm90IHNldAojIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9QUk9NSVNF IGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAojIENPTkZJR19TQVRBX1NJ UyBpcyBub3Qgc2V0CiMgQ09ORklHX1NBVEFfU1ZXIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9V TEkgaXMgbm90IHNldAojIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NBVEFf VklURVNTRSBpcyBub3Qgc2V0CgojCiMgUEFUQSBTRkYgY29udHJvbGxlcnMgd2l0aCBCTURNQQoj CiMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNl dAojIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9BVElJWFAgaXMg bm90IHNldAojIENPTkZJR19QQVRBX0FUUDg2N1ggaXMgbm90IHNldAojIENPTkZJR19QQVRBX0NN RDY0WCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CiMgQ09ORklH X1BBVEFfRUZBUiBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfSFBUMzY2IGlzIG5vdCBzZXQKIyBD T05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAojIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90 IHNldAojIENPTkZJR19QQVRBX0hQVDNYMyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfSVQ4MjEz IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAojIENPTkZJR19QQVRB X0pNSUNST04gaXMgbm90IHNldAojIENPTkZJR19QQVRBX01BUlZFTEwgaXMgbm90IHNldAojIENP TkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAojIENPTkZJR19QQVRBX05JTkpBMzIgaXMgbm90 IHNldAojIENPTkZJR19QQVRBX05TODc0MTUgaXMgbm90IHNldAojIENPTkZJR19QQVRBX09MRFBJ SVggaXMgbm90IHNldAojIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAojIENPTkZJR19Q QVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQK IyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9SREMgaXMgbm90 IHNldAojIENPTkZJR19QQVRBX1NDSCBpcyBub3Qgc2V0CkNPTkZJR19QQVRBX1NFUlZFUldPUktT PXkKIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAojIENPTkZJR19QQVRBX1NJUyBpcyBu b3Qgc2V0CiMgQ09ORklHX1BBVEFfVE9TSElCQSBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfVFJJ RkxFWCBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFU QV9XSU5CT05EIGlzIG5vdCBzZXQKCiMKIyBQSU8tb25seSBTRkYgY29udHJvbGxlcnMKIwojIENP TkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAojIENPTkZJR19QQVRBX01QSUlYIGlzIG5v dCBzZXQKIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9PUFRJ IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAoKIwojIEdlbmVyaWMg ZmFsbGJhY2sgLyBsZWdhY3kgZHJpdmVycwojCkNPTkZJR19QQVRBX0FDUEk9eQojIENPTkZJR19B VEFfR0VORVJJQyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBVEFfTEVHQUNZIGlzIG5vdCBzZXQKQ09O RklHX01EPXkKQ09ORklHX0JMS19ERVZfTUQ9eQojIENPTkZJR19NRF9BVVRPREVURUNUIGlzIG5v dCBzZXQKIyBDT05GSUdfTURfTElORUFSIGlzIG5vdCBzZXQKIyBDT05GSUdfTURfUkFJRDAgaXMg bm90IHNldApDT05GSUdfTURfUkFJRDE9eQojIENPTkZJR19NRF9SQUlEMTAgaXMgbm90IHNldAoj IENPTkZJR19NRF9SQUlENDU2IGlzIG5vdCBzZXQKIyBDT05GSUdfTURfTVVMVElQQVRIIGlzIG5v dCBzZXQKIyBDT05GSUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKIyBDT05GSUdfQkNBQ0hFIGlzIG5v dCBzZXQKQ09ORklHX0JMS19ERVZfRE1fQlVJTFRJTj15CkNPTkZJR19CTEtfREVWX0RNPXkKIyBD T05GSUdfRE1fREVCVUcgaXMgbm90IHNldApDT05GSUdfRE1fQ1JZUFQ9eQojIENPTkZJR19ETV9T TkFQU0hPVCBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HIGlzIG5vdCBz ZXQKIyBDT05GSUdfRE1fQ0FDSEUgaXMgbm90IHNldAojIENPTkZJR19ETV9FUkEgaXMgbm90IHNl dAojIENPTkZJR19ETV9NSVJST1IgaXMgbm90IHNldAojIENPTkZJR19ETV9SQUlEIGlzIG5vdCBz ZXQKIyBDT05GSUdfRE1fWkVSTyBpcyBub3Qgc2V0CkNPTkZJR19ETV9NVUxUSVBBVEg9eQojIENP TkZJR19ETV9NVUxUSVBBVEhfUUwgaXMgbm90IHNldAojIENPTkZJR19ETV9NVUxUSVBBVEhfU1Qg aXMgbm90IHNldAojIENPTkZJR19ETV9ERUxBWSBpcyBub3Qgc2V0CkNPTkZJR19ETV9VRVZFTlQ9 eQojIENPTkZJR19ETV9GTEFLRVkgaXMgbm90IHNldAojIENPTkZJR19ETV9WRVJJVFkgaXMgbm90 IHNldAojIENPTkZJR19ETV9TV0lUQ0ggaXMgbm90IHNldAojIENPTkZJR19UQVJHRVRfQ09SRSBp cyBub3Qgc2V0CkNPTkZJR19GVVNJT049eQpDT05GSUdfRlVTSU9OX1NQST15CiMgQ09ORklHX0ZV U0lPTl9GQyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldApDT05GSUdf RlVTSU9OX01BWF9TR0U9MTI4CiMgQ09ORklHX0ZVU0lPTl9DVEwgaXMgbm90IHNldAojIENPTkZJ R19GVVNJT05fTE9HR0lORyBpcyBub3Qgc2V0CgojCiMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3Vw cG9ydAojCiMgQ09ORklHX0ZJUkVXSVJFIGlzIG5vdCBzZXQKIyBDT05GSUdfRklSRVdJUkVfTk9T WSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CiMgQ09ORklHX01BQ0lOVE9TSF9E UklWRVJTIGlzIG5vdCBzZXQKQ09ORklHX05FVERFVklDRVM9eQpDT05GSUdfTkVUX0NPUkU9eQoj IENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAojIENP TkZJR19FUVVBTElaRVIgaXMgbm90IHNldAojIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAojIENP TkZJR19ORVRfVEVBTSBpcyBub3Qgc2V0CiMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldAojIENP TkZJR19WWExBTiBpcyBub3Qgc2V0CkNPTkZJR19ORVRDT05TT0xFPXkKQ09ORklHX05FVENPTlNP TEVfRFlOQU1JQz15CkNPTkZJR19ORVRQT0xMPXkKQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9 eQojIENPTkZJR19UVU4gaXMgbm90IHNldAojIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKIyBDT05G SUdfTkxNT04gaXMgbm90IHNldAojIENPTkZJR19BUkNORVQgaXMgbm90IHNldAoKIwojIENBSUYg dHJhbnNwb3J0IGRyaXZlcnMKIwoKIwojIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUg ZHJpdmVycwojCiMgQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYIGlzIG5vdCBzZXQKIyBDT05GSUdf TkVUX0RTQV9NVjg4RTYwNjAgaXMgbm90IHNldAojIENPTkZJR19ORVRfRFNBX01WODhFNlhYWF9O RUVEX1BQVSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9EU0FfTVY4OEU2MTMxIGlzIG5vdCBzZXQK IyBDT05GSUdfTkVUX0RTQV9NVjg4RTYxMjNfNjFfNjUgaXMgbm90IHNldAojIENPTkZJR19ORVRf RFNBX01WODhFNjE3MSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9EU0FfQkNNX1NGMiBpcyBub3Qg c2V0CkNPTkZJR19FVEhFUk5FVD15CiMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0 CiMgQ09ORklHX05FVF9WRU5ET1JfQURBUFRFQyBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5E T1JfQUdFUkUgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0FMVEVPTiBpcyBub3Qgc2V0 CiMgQ09ORklHX0FMVEVSQV9UU0UgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0FNRCBp cyBub3Qgc2V0CiMgQ09ORklHX05FVF9YR0VORSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5E T1JfQVJDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9BVEhFUk9TIGlzIG5vdCBzZXQK Q09ORklHX05FVF9WRU5ET1JfQlJPQURDT009eQojIENPTkZJR19CNDQgaXMgbm90IHNldApDT05G SUdfQk5YMj15CiMgQ09ORklHX0NOSUMgaXMgbm90IHNldApDT05GSUdfVElHT04zPXkKIyBDT05G SUdfQk5YMlggaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0JST0NBREUgaXMgbm90IHNl dAojIENPTkZJR19ORVRfVkVORE9SX0NIRUxTSU8gaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVO RE9SX0NJU0NPIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1hfRUNBVCBpcyBub3Qgc2V0CiMgQ09ORklH X0RORVQgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0RFQyBpcyBub3Qgc2V0CiMgQ09O RklHX05FVF9WRU5ET1JfRExJTksgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0VNVUxF WCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfRVhBUiBpcyBub3Qgc2V0CiMgQ09ORklH X05FVF9WRU5ET1JfSFAgaXMgbm90IHNldApDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15CiMgQ09O RklHX0UxMDAgaXMgbm90IHNldApDT05GSUdfRTEwMDA9eQpDT05GSUdfRTEwMDBFPXkKIyBDT05G SUdfSUdCIGlzIG5vdCBzZXQKIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAojIENPTkZJR19JWEdC IGlzIG5vdCBzZXQKIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAojIENPTkZJR19JWEdCRVZGIGlz IG5vdCBzZXQKIyBDT05GSUdfSTQwRSBpcyBub3Qgc2V0CiMgQ09ORklHX0k0MEVWRiBpcyBub3Qg c2V0CiMgQ09ORklHX0ZNMTBLIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9JODI1WFgg aXMgbm90IHNldAojIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAojIENPTkZJR19KTUUgaXMgbm90 IHNldAojIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAojIENPTkZJR19ORVRf VkVORE9SX01FTExBTk9YIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMg bm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX01ZUkkgaXMgbm90IHNldAojIENPTkZJR19GRUFM TlggaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX05BVFNFTUkgaXMgbm90IHNldAojIENP TkZJR19ORVRfVkVORE9SX05WSURJQSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfT0tJ IGlzIG5vdCBzZXQKIyBDT05GSUdfRVRIT0MgaXMgbm90IHNldAojIENPTkZJR19ORVRfUEFDS0VU X0VOR0lORSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfUUxPR0lDIGlzIG5vdCBzZXQK IyBDT05GSUdfTkVUX1ZFTkRPUl9RVUFMQ09NTSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5E T1JfUkVBTFRFSyBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfUkRDIGlzIG5vdCBzZXQK IyBDT05GSUdfTkVUX1ZFTkRPUl9TQU1TVU5HIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRP Ul9TRUVRIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TSUxBTiBpcyBub3Qgc2V0CiMg Q09ORklHX05FVF9WRU5ET1JfU0lTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQK IyBDT05GSUdfTkVUX1ZFTkRPUl9TTVNDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9T VE1JQ1JPIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TVU4gaXMgbm90IHNldAojIENP TkZJR19ORVRfVkVORE9SX1RFSFVUSSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfVEkg aXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX05F VF9WRU5ET1JfV0laTkVUIGlzIG5vdCBzZXQKIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiMgQ09O RklHX0hJUFBJIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1NCMTAwMCBpcyBub3Qgc2V0CkNPTkZJ R19QSFlMSUI9eQoKIwojIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKIwojIENPTkZJR19BVDgwM1hf UEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfQU1EX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklHX01BUlZF TExfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAojIENPTkZJ R19RU0VNSV9QSFkgaXMgbm90IHNldAojIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKIyBDT05G SUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQK IyBDT05GSUdfU01TQ19QSFkgaXMgbm90IHNldApDT05GSUdfQlJPQURDT01fUEhZPXkKIyBDT05G SUdfQkNNN1hYWF9QSFkgaXMgbm90IHNldApDT05GSUdfQkNNODdYWF9QSFk9eQojIENPTkZJR19J Q1BMVVNfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAojIENP TkZJR19OQVRJT05BTF9QSFkgaXMgbm90IHNldAojIENPTkZJR19TVEUxMFhQIGlzIG5vdCBzZXQK IyBDT05GSUdfTFNJX0VUMTAxMUNfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfTUlDUkVMX1BIWSBp cyBub3Qgc2V0CiMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklHX01ESU9fQklU QkFORyBpcyBub3Qgc2V0CiMgQ09ORklHX01ESU9fQkNNX1VOSU1BQyBpcyBub3Qgc2V0CiMgQ09O RklHX1BQUCBpcyBub3Qgc2V0CiMgQ09ORklHX1NMSVAgaXMgbm90IHNldAojIENPTkZJR19VU0Jf TkVUX0RSSVZFUlMgaXMgbm90IHNldAojIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKCiMKIyBFbmFi bGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCiMK IyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKIyBDT05GSUdfVk1YTkVUMyBpcyBub3Qgc2V0CiMgQ09O RklHX0lTRE4gaXMgbm90IHNldAoKIwojIElucHV0IGRldmljZSBzdXBwb3J0CiMKQ09ORklHX0lO UFVUPXkKIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVU X1BPTExERVYgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9TUEFSU0VLTUFQIGlzIG5vdCBzZXQK IyBDT05GSUdfSU5QVVRfTUFUUklYS01BUCBpcyBub3Qgc2V0CgojCiMgVXNlcmxhbmQgaW50ZXJm YWNlcwojCkNPTkZJR19JTlBVVF9NT1VTRURFVj15CkNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FV WD15CkNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD04MDAKQ09ORklHX0lOUFVUX01PVVNF REVWX1NDUkVFTl9ZPTYwMAojIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldApDT05GSUdf SU5QVVRfRVZERVY9eQojIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CgojCiMgSW5wdXQg RGV2aWNlIERyaXZlcnMKIwpDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQojIENPTkZJR19LRVlCT0FS RF9BRFA1NTg4IGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OSBpcyBub3Qgc2V0 CkNPTkZJR19LRVlCT0FSRF9BVEtCRD15CiMgQ09ORklHX0tFWUJPQVJEX1FUMTA3MCBpcyBub3Qg c2V0CiMgQ09ORklHX0tFWUJPQVJEX1FUMjE2MCBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJE X0xLS0JEIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfVENBNjQxNiBpcyBub3Qgc2V0CiMg Q09ORklHX0tFWUJPQVJEX1RDQTg0MTggaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9MTTgz MzMgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKIyBDT05G SUdfS0VZQk9BUkRfTUNTIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfTVBSMTIxIGlzIG5v dCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9B UkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90 IHNldAojIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FS RF9YVEtCRCBpcyBub3Qgc2V0CkNPTkZJR19JTlBVVF9NT1VTRT15CkNPTkZJR19NT1VTRV9QUzI9 eQpDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQpDT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15CkNP TkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKQ09ORklHX01PVVNFX1BTMl9DWVBSRVNTPXkKQ09O RklHX01PVVNFX1BTMl9MSUZFQk9PSz15CkNPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CiMg Q09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1BTMl9T RU5URUxJQyBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0 CiMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX0FQUExFVE9V Q0ggaXMgbm90IHNldAojIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKIyBDT05GSUdf TU9VU0VfQ1lBUEEgaXMgbm90IHNldAojIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQK IyBDT05GSUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1NZ TkFQVElDU19VU0IgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0 CiMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX1RPVUNIU0NS RUVOIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CgojCiMgSGFyZHdh cmUgSS9PIHBvcnRzCiMKQ09ORklHX1NFUklPPXkKQ09ORklHX0FSQ0hfTUlHSFRfSEFWRV9QQ19T RVJJTz15CkNPTkZJR19TRVJJT19JODA0Mj15CiMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90 IHNldAojIENPTkZJR19TRVJJT19DVDgyQzcxMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklPX1BD SVBTMiBpcyBub3Qgc2V0CkNPTkZJR19TRVJJT19MSUJQUzI9eQojIENPTkZJR19TRVJJT19SQVcg aXMgbm90IHNldAojIENPTkZJR19TRVJJT19BTFRFUkFfUFMyIGlzIG5vdCBzZXQKIyBDT05GSUdf U0VSSU9fUFMyTVVMVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklPX0FSQ19QUzIgaXMgbm90IHNl dAojIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CgojCiMgQ2hhcmFjdGVyIGRldmljZXMKIwpD T05GSUdfVFRZPXkKQ09ORklHX1ZUPXkKQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKQ09O RklHX1ZUX0NPTlNPTEU9eQpDT05GSUdfSFdfQ09OU09MRT15CkNPTkZJR19WVF9IV19DT05TT0xF X0JJTkRJTkc9eQpDT05GSUdfVU5JWDk4X1BUWVM9eQpDT05GSUdfREVWUFRTX01VTFRJUExFX0lO U1RBTkNFUz15CiMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFM X05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKIyBDT05G SUdfTl9HU00gaXMgbm90IHNldAojIENPTkZJR19UUkFDRV9TSU5LIGlzIG5vdCBzZXQKIyBDT05G SUdfREVWS01FTSBpcyBub3Qgc2V0CgojCiMgU2VyaWFsIGRyaXZlcnMKIwpDT05GSUdfU0VSSUFM X0VBUkxZQ09OPXkKQ09ORklHX1NFUklBTF84MjUwPXkKIyBDT05GSUdfU0VSSUFMXzgyNTBfREVQ UkVDQVRFRF9PUFRJT05TIGlzIG5vdCBzZXQKQ09ORklHX1NFUklBTF84MjUwX1BOUD15CkNPTkZJ R19TRVJJQUxfODI1MF9DT05TT0xFPXkKQ09ORklHX1NFUklBTF84MjUwX0RNQT15CkNPTkZJR19T RVJJQUxfODI1MF9QQ0k9eQpDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NApDT05GSUdfU0VS SUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CiMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlz IG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMXzgyNTBfRFcgaXMgbm90IHNldAojIENPTkZJR19TRVJJ QUxfODI1MF9GSU5URUsgaXMgbm90IHNldAoKIwojIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBv cnQKIwojIENPTkZJR19TRVJJQUxfTUZEX0hTVSBpcyBub3Qgc2V0CkNPTkZJR19TRVJJQUxfQ09S RT15CkNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NFUklBTF9TQ0NOWFAgaXMgbm90IHNldAojIENPTkZJR19TRVJJQUxf U0MxNklTN1hYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMX0FMVEVSQV9KVEFHVUFSVCBpcyBu b3Qgc2V0CiMgQ09ORklHX1NFUklBTF9BTFRFUkFfVUFSVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NF UklBTF9BUkMgaXMgbm90IHNldAojIENPTkZJR19TRVJJQUxfUlAyIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VSSUFMX0ZTTF9MUFVBUlQgaXMgbm90IHNldApDT05GSUdfSVBNSV9IQU5ETEVSPXkKIyBD T05GSUdfSVBNSV9QQU5JQ19FVkVOVCBpcyBub3Qgc2V0CkNPTkZJR19JUE1JX0RFVklDRV9JTlRF UkZBQ0U9eQpDT05GSUdfSVBNSV9TST15CiMgQ09ORklHX0lQTUlfU0lfUFJPQkVfREVGQVVMVFMg aXMgbm90IHNldApDT05GSUdfSVBNSV9XQVRDSERPRz15CkNPTkZJR19JUE1JX1BPV0VST0ZGPXkK IyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKQ09ORklHX05WUkFNPW0KIyBDT05GSUdfUjM5 NjQgaXMgbm90IHNldAojIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiMgQ09ORklHX01XQVZF IGlzIG5vdCBzZXQKIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CkNPTkZJR19IUEVUPXkK Q09ORklHX0hQRVRfTU1BUD15CkNPTkZJR19IUEVUX01NQVBfREVGQVVMVD15CiMgQ09ORklHX0hB TkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CiMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAojIENP TkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CkNPTkZJR19ERVZQT1JUPXkKIyBDT05GSUdfWElMTFlC VVMgaXMgbm90IHNldAoKIwojIEkyQyBzdXBwb3J0CiMKQ09ORklHX0kyQz15CkNPTkZJR19BQ1BJ X0kyQ19PUFJFR0lPTj15CkNPTkZJR19JMkNfQk9BUkRJTkZPPXkKQ09ORklHX0kyQ19DT01QQVQ9 eQojIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19NVVggaXMgbm90 IHNldApDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKQ09ORklHX0kyQ19BTEdPQklUPXkKCiMKIyBJ MkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKIwoKIwojIFBDIFNNQnVzIGhvc3QgY29udHJvbGxlciBk cml2ZXJzCiMKIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAojIENPTkZJR19JMkNfQUxJ MTU2MyBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKIyBDT05GSUdf STJDX0FNRDc1NiBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKIyBD T05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAojIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0CiMg Q09ORklHX0kyQ19JU01UIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQK IyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAojIENPTkZJR19JMkNfU0lTNTU5NSBpcyBu b3Qgc2V0CiMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAojIENPTkZJR19JMkNfU0lTOTZY IGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19WSUFQ Uk8gaXMgbm90IHNldAoKIwojIEFDUEkgZHJpdmVycwojCiMgQ09ORklHX0kyQ19TQ01JIGlzIG5v dCBzZXQKCiMKIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0 ZW0tb24tY2hpcCkKIwojIENPTkZJR19JMkNfREVTSUdOV0FSRV9QQ0kgaXMgbm90IHNldAojIENP TkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBu b3Qgc2V0CiMgQ09ORklHX0kyQ19QWEFfUENJIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1NJTVRF QyBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19YSUxJTlggaXMgbm90IHNldAoKIwojIEV4dGVybmFs IEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKIwojIENPTkZJR19JMkNfRElPTEFOX1UyQyBpcyBu b3Qgc2V0CiMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJD X1JPQk9URlVaWl9PU0lGIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBz ZXQKIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKCiMKIyBPdGhlciBJMkMvU01CdXMg YnVzIGRyaXZlcnMKIwojIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19E RUJVR19DT1JFIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAoj IENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQK IyBDT05GSUdfU1BNSSBpcyBub3Qgc2V0CiMgQ09ORklHX0hTSSBpcyBub3Qgc2V0CgojCiMgUFBT IHN1cHBvcnQKIwpDT05GSUdfUFBTPXkKIyBDT05GSUdfUFBTX0RFQlVHIGlzIG5vdCBzZXQKCiMK IyBQUFMgY2xpZW50cyBzdXBwb3J0CiMKIyBDT05GSUdfUFBTX0NMSUVOVF9LVElNRVIgaXMgbm90 IHNldAojIENPTkZJR19QUFNfQ0xJRU5UX0xESVNDIGlzIG5vdCBzZXQKIyBDT05GSUdfUFBTX0NM SUVOVF9HUElPIGlzIG5vdCBzZXQKCiMKIyBQUFMgZ2VuZXJhdG9ycyBzdXBwb3J0CiMKCiMKIyBQ VFAgY2xvY2sgc3VwcG9ydAojCkNPTkZJR19QVFBfMTU4OF9DTE9DSz15CgojCiMgRW5hYmxlIFBI WUxJQiBhbmQgTkVUV09SS19QSFlfVElNRVNUQU1QSU5HIHRvIHNlZSB0aGUgYWRkaXRpb25hbCBj bG9ja3MuCiMKQ09ORklHX0FSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCPXkKIyBDT05GSUdfR1BJ T0xJQiBpcyBub3Qgc2V0CiMgQ09ORklHX1cxIGlzIG5vdCBzZXQKQ09ORklHX1BPV0VSX1NVUFBM WT15CiMgQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX1BEQV9Q T1dFUiBpcyBub3Qgc2V0CiMgQ09ORklHX1RFU1RfUE9XRVIgaXMgbm90IHNldAojIENPTkZJR19C QVRURVJZX0RTMjc4MCBpcyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfRFMyNzgxIGlzIG5vdCBz ZXQKIyBDT05GSUdfQkFUVEVSWV9EUzI3ODIgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX1NC UyBpcyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfQlEyN3gwMCBpcyBub3Qgc2V0CiMgQ09ORklH X0JBVFRFUllfTUFYMTcwNDAgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX01BWDE3MDQyIGlz IG5vdCBzZXQKIyBDT05GSUdfQ0hBUkdFUl9NQVg4OTAzIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0hB UkdFUl9MUDg3MjcgaXMgbm90IHNldAojIENPTkZJR19DSEFSR0VSX0JRMjQxNVggaXMgbm90IHNl dAojIENPTkZJR19DSEFSR0VSX1NNQjM0NyBpcyBub3Qgc2V0CiMgQ09ORklHX1BPV0VSX1JFU0VU IGlzIG5vdCBzZXQKIyBDT05GSUdfUE9XRVJfQVZTIGlzIG5vdCBzZXQKQ09ORklHX0hXTU9OPXkK IyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBp cyBub3Qgc2V0CgojCiMgTmF0aXZlIGRyaXZlcnMKIwojIENPTkZJR19TRU5TT1JTX0FCSVRVR1VS VSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVMyBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfQUQ3NDE0IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMg bm90IHNldAojIENPTkZJR19TRU5TT1JTX0FETTEwMjEgaXMgbm90IHNldAojIENPTkZJR19TRU5T T1JTX0FETTEwMjUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX0FETTEwMjkgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FE TTEwMzEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX0FEVDc0MTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEVDc0MTEg aXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEVDc0NjIgaXMgbm90IHNldAojIENPTkZJR19T RU5TT1JTX0FEVDc0NzAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEVDc0NzUgaXMgbm90 IHNldAojIENPTkZJR19TRU5TT1JTX0FTQzc2MjEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0s4VEVNUCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSzEwVEVNUCBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfRkFNMTVIX1BPV0VSIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19B UFBMRVNNQyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRFM2MjAgaXMg bm90IHNldAojIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNP UlNfSTVLX0FNQiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0Y3 NTM3NVMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0ZTQ0hNRCBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRzc2MEEgaXMgbm90IHNldAojIENPTkZJR19TRU5T T1JTX0c3NjIgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0hJSDYxMzAgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0lCTUFFTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSUJNUEVY IGlzIG5vdCBzZXQKQ09ORklHX1NFTlNPUlNfQ09SRVRFTVA9eQojIENPTkZJR19TRU5TT1JTX0lU ODcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0pDNDIgaXMgbm90IHNldAojIENPTkZJR19T RU5TT1JTX1BPV1IxMjIwIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19MSU5FQUdFIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19MVEMyOTQ1IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09S U19MVEM0MTUxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19MVEM0MjE1IGlzIG5vdCBzZXQK IyBDT05GSUdfU0VOU09SU19MVEM0MjIyIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19MVEM0 MjQ1IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19MVEM0MjYwIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19MVEM0MjYxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19NQVgxNjA2NSBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiMgQ09ORklHX1NF TlNPUlNfTUFYMTY2OCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTUFYMTk3IGlzIG5vdCBz ZXQKIyBDT05GSUdfU0VOU09SU19NQVg2NjM5IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19N QVg2NjQyIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKIyBD T05GSUdfU0VOU09SU19NQVg2Njk3IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19IVFUyMSBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTUNQMzAyMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NF TlNPUlNfTE02MyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03MyBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBu b3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNf TE04MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05MiBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNP UlNfTE05NTIzNCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05NTI0MSBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfTE05NTI0NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfUEM4 NzM2MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfTlRDX1RIRVJNSVNUT1IgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX05D VDY2ODMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX05DVDY3NzUgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAojIENPTkZJR19QTUJVUyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfU0hUMjEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1NIVEMx IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKIyBDT05GSUdf U0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19FTUMxNDAzIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19FTUMyMTAzIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09S U19FTUM2VzIwMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X1NNU0M0N0IzOTcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1NDSDU2WFhfQ09NTU9OIGlz IG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TQ0g1NjI3IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VO U09SU19TQ0g1NjM2IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TTU02NjUgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX0FEQzEyOEQ4MTggaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0FEUzEwMTUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0FNQzY4MjEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0lOQTIw OSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSU5BMlhYIGlzIG5vdCBzZXQKIyBDT05GSUdf U0VOU09SU19USE1DNTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1RNUDEwMiBpcyBub3Qg c2V0CiMgQ09ORklHX1NFTlNPUlNfVE1QMTAzIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19U TVA0MDEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1RNUDQyMSBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfVklBX0NQVVRFTVAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1ZJQTY4 NkEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfVlQ4MjMxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09S U19XODM3OTJEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX1c4Mzc5NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVzgzTDc4 NVRTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM2MjdF SEYgaXMgbm90IHNldAoKIwojIEFDUEkgZHJpdmVycwojCiMgQ09ORklHX1NFTlNPUlNfQUNQSV9Q T1dFUiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQVRLMDExMCBpcyBub3Qgc2V0CkNPTkZJ R19USEVSTUFMPXkKQ09ORklHX1RIRVJNQUxfSFdNT049eQpDT05GSUdfVEhFUk1BTF9ERUZBVUxU X0dPVl9TVEVQX1dJU0U9eQojIENPTkZJR19USEVSTUFMX0RFRkFVTFRfR09WX0ZBSVJfU0hBUkUg aXMgbm90IHNldAojIENPTkZJR19USEVSTUFMX0RFRkFVTFRfR09WX1VTRVJfU1BBQ0UgaXMgbm90 IHNldAojIENPTkZJR19USEVSTUFMX0dPVl9GQUlSX1NIQVJFIGlzIG5vdCBzZXQKQ09ORklHX1RI RVJNQUxfR09WX1NURVBfV0lTRT15CiMgQ09ORklHX1RIRVJNQUxfR09WX0JBTkdfQkFORyBpcyBu b3Qgc2V0CkNPTkZJR19USEVSTUFMX0dPVl9VU0VSX1NQQUNFPXkKIyBDT05GSUdfVEhFUk1BTF9F TVVMQVRJT04gaXMgbm90IHNldAojIENPTkZJR19JTlRFTF9QT1dFUkNMQU1QIGlzIG5vdCBzZXQK Q09ORklHX1g4Nl9QS0dfVEVNUF9USEVSTUFMPXkKIyBDT05GSUdfSU5UMzQwWF9USEVSTUFMIGlz IG5vdCBzZXQKCiMKIyBUZXhhcyBJbnN0cnVtZW50cyB0aGVybWFsIGRyaXZlcnMKIwpDT05GSUdf V0FUQ0hET0c9eQpDT05GSUdfV0FUQ0hET0dfQ09SRT15CiMgQ09ORklHX1dBVENIRE9HX05PV0FZ T1VUIGlzIG5vdCBzZXQKCiMKIyBXYXRjaGRvZyBEZXZpY2UgRHJpdmVycwojCiMgQ09ORklHX1NP RlRfV0FUQ0hET0cgaXMgbm90IHNldAojIENPTkZJR19YSUxJTlhfV0FUQ0hET0cgaXMgbm90IHNl dAojIENPTkZJR19EV19XQVRDSERPRyBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUVVJUkVfV0RUIGlz IG5vdCBzZXQKIyBDT05GSUdfQURWQU5URUNIX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FMSU0x NTM1X1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FMSU03MTAxX1dEVCBpcyBub3Qgc2V0CiMgQ09O RklHX0Y3MTgwOEVfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfU1A1MTAwX1RDTyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NCQ19GSVRQQzJfV0FUQ0hET0cgaXMgbm90IHNldAojIENPTkZJR19FVVJPVEVD SF9XRFQgaXMgbm90IHNldAojIENPTkZJR19JQjcwMF9XRFQgaXMgbm90IHNldAojIENPTkZJR19J Qk1BU1IgaXMgbm90IHNldAojIENPTkZJR19XQUZFUl9XRFQgaXMgbm90IHNldAojIENPTkZJR19J NjMwMEVTQl9XRFQgaXMgbm90IHNldAojIENPTkZJR19JRTZYWF9XRFQgaXMgbm90IHNldAojIENP TkZJR19JVENPX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lUODcxMkZfV0RUIGlzIG5vdCBzZXQK IyBDT05GSUdfSVQ4N19XRFQgaXMgbm90IHNldApDT05GSUdfSFBfV0FUQ0hET0c9eQpDT05GSUdf SFBXRFRfTk1JX0RFQ09ESU5HPXkKIyBDT05GSUdfU0MxMjAwX1dEVCBpcyBub3Qgc2V0CiMgQ09O RklHX1BDODc0MTNfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfTlZfVENPIGlzIG5vdCBzZXQKIyBD T05GSUdfNjBYWF9XRFQgaXMgbm90IHNldAojIENPTkZJR19DUFU1X1dEVCBpcyBub3Qgc2V0CiMg Q09ORklHX1NNU0NfU0NIMzExWF9XRFQgaXMgbm90IHNldAojIENPTkZJR19TTVNDMzdCNzg3X1dE VCBpcyBub3Qgc2V0CiMgQ09ORklHX1ZJQV9XRFQgaXMgbm90IHNldAojIENPTkZJR19XODM2MjdI Rl9XRFQgaXMgbm90IHNldAojIENPTkZJR19XODM4NzdGX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklH X1c4Mzk3N0ZfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfTUFDSFpfV0RUIGlzIG5vdCBzZXQKIyBD T05GSUdfU0JDX0VQWF9DM19XQVRDSERPRyBpcyBub3Qgc2V0CgojCiMgUENJLWJhc2VkIFdhdGNo ZG9nIENhcmRzCiMKIyBDT05GSUdfUENJUENXQVRDSERPRyBpcyBub3Qgc2V0CiMgQ09ORklHX1dE VFBDSSBpcyBub3Qgc2V0CgojCiMgVVNCLWJhc2VkIFdhdGNoZG9nIENhcmRzCiMKIyBDT05GSUdf VVNCUENXQVRDSERPRyBpcyBub3Qgc2V0CkNPTkZJR19TU0JfUE9TU0lCTEU9eQoKIwojIFNvbmlj cyBTaWxpY29uIEJhY2twbGFuZQojCiMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CkNPTkZJR19CQ01B X1BPU1NJQkxFPXkKCiMKIyBCcm9hZGNvbSBzcGVjaWZpYyBBTUJBCiMKIyBDT05GSUdfQkNNQSBp cyBub3Qgc2V0CgojCiMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwojCkNPTkZJR19NRkRf Q09SRT15CiMgQ09ORklHX01GRF9BUzM3MTEgaXMgbm90IHNldAojIENPTkZJR19QTUlDX0FEUDU1 MjAgaXMgbm90IHNldAojIENPTkZJR19NRkRfQkNNNTkwWFggaXMgbm90IHNldAojIENPTkZJR19N RkRfQVhQMjBYIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX0NST1NfRUMgaXMgbm90IHNldAojIENP TkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9EQTkwNTJfSTJDIGlzIG5v dCBzZXQKIyBDT05GSUdfTUZEX0RBOTA1NSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9EQTkwNjMg aXMgbm90IHNldAojIENPTkZJR19NRkRfTUMxM1hYWF9JMkMgaXMgbm90IHNldAojIENPTkZJR19I VENfUEFTSUMzIGlzIG5vdCBzZXQKQ09ORklHX0xQQ19JQ0g9eQpDT05GSUdfTFBDX1NDSD15CiMg Q09ORklHX0lOVEVMX1NPQ19QTUlDIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX0pBTlpfQ01PRElP IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX0tFTVBMRCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF84 OFBNODAwIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEXzg4UE04MDUgaXMgbm90IHNldAojIENPTkZJ R19NRkRfODhQTTg2MFggaXMgbm90IHNldAojIENPTkZJR19NRkRfTUFYMTQ1NzcgaXMgbm90IHNl dAojIENPTkZJR19NRkRfTUFYNzc2ODYgaXMgbm90IHNldAojIENPTkZJR19NRkRfTUFYNzc2OTMg aXMgbm90IHNldAojIENPTkZJR19NRkRfTUFYODkwNyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9N QVg4OTI1IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX01BWDg5OTcgaXMgbm90IHNldAojIENPTkZJ R19NRkRfTUFYODk5OCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9NRU5GMjFCTUMgaXMgbm90IHNl dAojIENPTkZJR19NRkRfVklQRVJCT0FSRCBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9SRVRVIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1JE QzMyMVggaXMgbm90IHNldAojIENPTkZJR19NRkRfUlRTWF9QQ0kgaXMgbm90IHNldAojIENPTkZJ R19NRkRfUlRTWF9VU0IgaXMgbm90IHNldAojIENPTkZJR19NRkRfUkM1VDU4MyBpcyBub3Qgc2V0 CiMgQ09ORklHX01GRF9STjVUNjE4IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1NFQ19DT1JFIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1NJNDc2WF9DT1JFIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZE X1NNNTAxIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1NNU0MgaXMgbm90IHNldAojIENPTkZJR19B Qlg1MDBfQ09SRSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9TWVNDT04gaXMgbm90IHNldAojIENP TkZJR19NRkRfVElfQU0zMzVYX1RTQ0FEQyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9MUDM5NDMg aXMgbm90IHNldAojIENPTkZJR19NRkRfTFA4Nzg4IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1BB TE1BUyBpcyBub3Qgc2V0CiMgQ09ORklHX1RQUzYxMDVYIGlzIG5vdCBzZXQKIyBDT05GSUdfVFBT NjUwN1ggaXMgbm90IHNldAojIENPTkZJR19NRkRfVFBTNjUwOTAgaXMgbm90IHNldAojIENPTkZJ R19NRkRfVFBTNjUyMTcgaXMgbm90IHNldAojIENPTkZJR19NRkRfVFBTNjUyMTggaXMgbm90IHNl dAojIENPTkZJR19NRkRfVFBTNjU4NlggaXMgbm90IHNldAojIENPTkZJR19NRkRfVFBTODAwMzEg aXMgbm90IHNldAojIENPTkZJR19UV0w0MDMwX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19UV0w2 MDQwX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19NRkRfV0wxMjczX0NPUkUgaXMgbm90IHNldAoj IENPTkZJR19NRkRfTE0zNTMzIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1RDMzU4OVggaXMgbm90 IHNldAojIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9WWDg1NSBpcyBu b3Qgc2V0CiMgQ09ORklHX01GRF9BUklaT05BX0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9X TTg0MDAgaXMgbm90IHNldAojIENPTkZJR19NRkRfV004MzFYX0kyQyBpcyBub3Qgc2V0CiMgQ09O RklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1dNODk5NCBpcyBub3Qg c2V0CiMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CiMgQ09ORklHX01FRElBX1NVUFBPUlQg aXMgbm90IHNldAoKIwojIEdyYXBoaWNzIHN1cHBvcnQKIwpDT05GSUdfQUdQPXkKQ09ORklHX0FH UF9BTUQ2ND15CiMgQ09ORklHX0FHUF9JTlRFTCBpcyBub3Qgc2V0CiMgQ09ORklHX0FHUF9TSVMg aXMgbm90IHNldAojIENPTkZJR19BR1BfVklBIGlzIG5vdCBzZXQKQ09ORklHX1ZHQV9BUkI9eQpD T05GSUdfVkdBX0FSQl9NQVhfR1BVUz0yCiMgQ09ORklHX1ZHQV9TV0lUQ0hFUk9PIGlzIG5vdCBz ZXQKCiMKIyBEaXJlY3QgUmVuZGVyaW5nIE1hbmFnZXIKIwpDT05GSUdfRFJNPXkKQ09ORklHX0RS TV9LTVNfSEVMUEVSPXkKQ09ORklHX0RSTV9LTVNfRkJfSEVMUEVSPXkKQ09ORklHX0RSTV9MT0FE X0VESURfRklSTVdBUkU9eQpDT05GSUdfRFJNX1RUTT15CgojCiMgSTJDIGVuY29kZXIgb3IgaGVs cGVyIGNoaXBzCiMKIyBDT05GSUdfRFJNX0kyQ19DSDcwMDYgaXMgbm90IHNldAojIENPTkZJR19E Uk1fSTJDX1NJTDE2NCBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9JMkNfTlhQX1REQTk5OFggaXMg bm90IHNldAojIENPTkZJR19EUk1fUFROMzQ2MCBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9UREZY IGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX1IxMjggaXMgbm90IHNldApDT05GSUdfRFJNX1JBREVP Tj15CiMgQ09ORklHX0RSTV9SQURFT05fVU1TIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX05PVVZF QVUgaXMgbm90IHNldAojIENPTkZJR19EUk1fSTkxNSBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9N R0EgaXMgbm90IHNldAojIENPTkZJR19EUk1fU0lTIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX1ZJ QSBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9TQVZBR0UgaXMgbm90IHNldAojIENPTkZJR19EUk1f Vk1XR0ZYIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX0dNQTUwMCBpcyBub3Qgc2V0CiMgQ09ORklH X0RSTV9VREwgaXMgbm90IHNldAojIENPTkZJR19EUk1fQVNUIGlzIG5vdCBzZXQKIyBDT05GSUdf RFJNX01HQUcyMDAgaXMgbm90IHNldAojIENPTkZJR19EUk1fQ0lSUlVTX1FFTVUgaXMgbm90IHNl dAojIENPTkZJR19EUk1fUVhMIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX0JPQ0hTIGlzIG5vdCBz ZXQKCiMKIyBGcmFtZSBidWZmZXIgRGV2aWNlcwojCkNPTkZJR19GQj15CiMgQ09ORklHX0ZJUk1X QVJFX0VESUQgaXMgbm90IHNldApDT05GSUdfRkJfQ01ETElORT15CiMgQ09ORklHX0ZCX0REQyBp cyBub3Qgc2V0CiMgQ09ORklHX0ZCX0JPT1RfVkVTQV9TVVBQT1JUIGlzIG5vdCBzZXQKQ09ORklH X0ZCX0NGQl9GSUxMUkVDVD15CkNPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQpDT05GSUdfRkJfQ0ZC X0lNQUdFQkxJVD15CiMgQ09ORklHX0ZCX0NGQl9SRVZfUElYRUxTX0lOX0JZVEUgaXMgbm90IHNl dAojIENPTkZJR19GQl9TWVNfRklMTFJFQ1QgaXMgbm90IHNldAojIENPTkZJR19GQl9TWVNfQ09Q WUFSRUEgaXMgbm90IHNldAojIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKIyBD T05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAojIENPTkZJR19GQl9TWVNfRk9QUyBp cyBub3Qgc2V0CiMgQ09ORklHX0ZCX1NWR0FMSUIgaXMgbm90IHNldAojIENPTkZJR19GQl9NQUNN T0RFUyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiMgQ09ORklH X0ZCX01PREVfSEVMUEVSUyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1RJTEVCTElUVElORyBpcyBu b3Qgc2V0CgojCiMgRnJhbWUgYnVmZmVyIGhhcmR3YXJlIGRyaXZlcnMKIwojIENPTkZJR19GQl9D SVJSVVMgaXMgbm90IHNldAojIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAojIENPTkZJR19GQl9D WUJFUjIwMDAgaXMgbm90IHNldAojIENPTkZJR19GQl9BUkMgaXMgbm90IHNldAojIENPTkZJR19G Ql9BU0lMSUFOVCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0lNU1RUIGlzIG5vdCBzZXQKIyBDT05G SUdfRkJfVkdBMTYgaXMgbm90IHNldAojIENPTkZJR19GQl9VVkVTQSBpcyBub3Qgc2V0CiMgQ09O RklHX0ZCX1ZFU0EgaXMgbm90IHNldAojIENPTkZJR19GQl9ONDExIGlzIG5vdCBzZXQKIyBDT05G SUdfRkJfSEdBIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfT1BFTkNPUkVTIGlzIG5vdCBzZXQKIyBD T05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAojIENPTkZJR19GQl9OVklESUEgaXMgbm90IHNl dAojIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfSTc0MCBpcyBub3Qgc2V0 CiMgQ09ORklHX0ZCX0xFODA1NzggaXMgbm90IHNldAojIENPTkZJR19GQl9NQVRST1ggaXMgbm90 IHNldAojIENPTkZJR19GQl9SQURFT04gaXMgbm90IHNldAojIENPTkZJR19GQl9BVFkxMjggaXMg bm90IHNldAojIENPTkZJR19GQl9BVFkgaXMgbm90IHNldAojIENPTkZJR19GQl9TMyBpcyBub3Qg c2V0CiMgQ09ORklHX0ZCX1NBVkFHRSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1NJUyBpcyBub3Qg c2V0CiMgQ09ORklHX0ZCX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5v dCBzZXQKIyBDT05GSUdfRkJfS1lSTyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCXzNERlggaXMgbm90 IHNldAojIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfVlQ4NjIzIGlz IG5vdCBzZXQKIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0FSSyBp cyBub3Qgc2V0CiMgQ09ORklHX0ZCX1BNMyBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0NBUk1JTkUg aXMgbm90IHNldAojIENPTkZJR19GQl9TTVNDVUZYIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfVURM IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX01F VFJPTk9NRSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAojIENPTkZJ R19GQl9CUk9BRFNIRUVUIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQVVPX0sxOTBYIGlzIG5vdCBz ZXQKIyBDT05GSUdfRkJfU0lNUExFIGlzIG5vdCBzZXQKQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQ UE9SVD15CiMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldApDT05GSUdfQkFDS0xJ R0hUX0NMQVNTX0RFVklDRT15CiMgQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDIGlzIG5vdCBzZXQK IyBDT05GSUdfQkFDS0xJR0hUX0FQUExFIGlzIG5vdCBzZXQKIyBDT05GSUdfQkFDS0xJR0hUX1NB SEFSQSBpcyBub3Qgc2V0CiMgQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODYwIGlzIG5vdCBzZXQKIyBD T05GSUdfQkFDS0xJR0hUX0FEUDg4NzAgaXMgbm90IHNldAojIENPTkZJR19CQUNLTElHSFRfTE0z NjM5IGlzIG5vdCBzZXQKIyBDT05GSUdfQkFDS0xJR0hUX0xWNTIwN0xQIGlzIG5vdCBzZXQKIyBD T05GSUdfQkFDS0xJR0hUX0JENjEwNyBpcyBub3Qgc2V0CiMgQ09ORklHX1ZHQVNUQVRFIGlzIG5v dCBzZXQKQ09ORklHX0hETUk9eQoKIwojIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAoj CkNPTkZJR19WR0FfQ09OU09MRT15CkNPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLPXkKQ09O RklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0tfU0laRT0xMjgKQ09ORklHX0RVTU1ZX0NPTlNPTEU9 eQpDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CkNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xF X0RFVEVDVF9QUklNQVJZPXkKIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBp cyBub3Qgc2V0CkNPTkZJR19MT0dPPXkKIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBz ZXQKIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkNPTkZJR19MT0dPX0xJTlVY X0NMVVQyMjQ9eQojIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CgojCiMgSElEIHN1cHBvcnQKIwpD T05GSUdfSElEPXkKIyBDT05GSUdfSElEX0JBVFRFUllfU1RSRU5HVEggaXMgbm90IHNldAojIENP TkZJR19ISURSQVcgaXMgbm90IHNldAojIENPTkZJR19VSElEIGlzIG5vdCBzZXQKQ09ORklHX0hJ RF9HRU5FUklDPXkKCiMKIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiMKQ09ORklHX0hJRF9BNFRFQ0g9 eQojIENPTkZJR19ISURfQUNSVVggaXMgbm90IHNldApDT05GSUdfSElEX0FQUExFPXkKIyBDT05G SUdfSElEX0FQUExFSVIgaXMgbm90IHNldAojIENPTkZJR19ISURfQVVSRUFMIGlzIG5vdCBzZXQK Q09ORklHX0hJRF9CRUxLSU49eQpDT05GSUdfSElEX0NIRVJSWT15CkNPTkZJR19ISURfQ0hJQ09O WT15CkNPTkZJR19ISURfQ1lQUkVTUz15CiMgQ09ORklHX0hJRF9EUkFHT05SSVNFIGlzIG5vdCBz ZXQKIyBDT05GSUdfSElEX0VNU19GRiBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9FTEVDT00gaXMg bm90IHNldAojIENPTkZJR19ISURfRUxPIGlzIG5vdCBzZXQKQ09ORklHX0hJRF9FWktFWT15CiMg Q09ORklHX0hJRF9IT0xURUsgaXMgbm90IHNldAojIENPTkZJR19ISURfSFVJT04gaXMgbm90IHNl dAojIENPTkZJR19ISURfS0VZVE9VQ0ggaXMgbm90IHNldApDT05GSUdfSElEX0tZRT15CiMgQ09O RklHX0hJRF9VQ0xPR0lDIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1dBTFRPUCBpcyBub3Qgc2V0 CiMgQ09ORklHX0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9JQ0FERSBpcyBu b3Qgc2V0CiMgQ09ORklHX0hJRF9UV0lOSEFOIGlzIG5vdCBzZXQKQ09ORklHX0hJRF9LRU5TSU5H VE9OPXkKIyBDT05GSUdfSElEX0xDUE9XRVIgaXMgbm90IHNldAojIENPTkZJR19ISURfTEVOT1ZP IGlzIG5vdCBzZXQKQ09ORklHX0hJRF9MT0dJVEVDSD15CiMgQ09ORklHX0xPR0lURUNIX0ZGIGlz IG5vdCBzZXQKIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldAojIENPTkZJR19M T0dJRzk0MF9GRiBpcyBub3Qgc2V0CiMgQ09ORklHX0xPR0lXSEVFTFNfRkYgaXMgbm90IHNldAoj IENPTkZJR19ISURfTUFHSUNNT1VTRSBpcyBub3Qgc2V0CkNPTkZJR19ISURfTUlDUk9TT0ZUPXkK Q09ORklHX0hJRF9NT05URVJFWT15CiMgQ09ORklHX0hJRF9NVUxUSVRPVUNIIGlzIG5vdCBzZXQK IyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX09SVEVLIGlzIG5vdCBz ZXQKIyBDT05GSUdfSElEX1BBTlRIRVJMT1JEIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1BFTk1P VU5UIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1BFVEFMWU5YIGlzIG5vdCBzZXQKIyBDT05GSUdf SElEX1BJQ09MQ0QgaXMgbm90IHNldAojIENPTkZJR19ISURfUFJJTUFYIGlzIG5vdCBzZXQKIyBD T05GSUdfSElEX1JPQ0NBVCBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TQUlURUsgaXMgbm90IHNl dAojIENPTkZJR19ISURfU0FNU1VORyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TUEVFRExJTksg aXMgbm90IHNldAojIENPTkZJR19ISURfU1RFRUxTRVJJRVMgaXMgbm90IHNldAojIENPTkZJR19I SURfU1VOUExVUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9STUkgaXMgbm90IHNldAojIENPTkZJ R19ISURfR1JFRU5BU0lBIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1NNQVJUSk9ZUExVUyBpcyBu b3Qgc2V0CiMgQ09ORklHX0hJRF9USVZPIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1RPUFNFRUQg aXMgbm90IHNldAojIENPTkZJR19ISURfVEhSVVNUTUFTVEVSIGlzIG5vdCBzZXQKIyBDT05GSUdf SElEX1dBQ09NIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1hJTk1PIGlzIG5vdCBzZXQKIyBDT05G SUdfSElEX1pFUk9QTFVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1pZREFDUk9OIGlzIG5vdCBz ZXQKIyBDT05GSUdfSElEX1NFTlNPUl9IVUIgaXMgbm90IHNldAoKIwojIFVTQiBISUQgc3VwcG9y dAojCkNPTkZJR19VU0JfSElEPXkKIyBDT05GSUdfSElEX1BJRCBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9ISURERVYgaXMgbm90IHNldAoKIwojIEkyQyBISUQgc3VwcG9ydAojCiMgQ09ORklHX0ky Q19ISUQgaXMgbm90IHNldApDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CkNPTkZJR19V U0JfU1VQUE9SVD15CkNPTkZJR19VU0JfQ09NTU9OPXkKQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9 eQpDT05GSUdfVVNCPXkKQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15CgojCiMgTWlz Y2VsbGFuZW91cyBVU0Igb3B0aW9ucwojCkNPTkZJR19VU0JfREVGQVVMVF9QRVJTSVNUPXkKQ09O RklHX1VTQl9EWU5BTUlDX01JTk9SUz15CiMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNUIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX09UR19GU00gaXMgbm90IHNldAojIENPTkZJR19VU0JfTU9OIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CgojCiMgVVNCIEhvc3Qg Q29udHJvbGxlciBEcml2ZXJzCiMKIyBDT05GSUdfVVNCX0M2N1gwMF9IQ0QgaXMgbm90IHNldAoj IENPTkZJR19VU0JfWEhDSV9IQ0QgaXMgbm90IHNldApDT05GSUdfVVNCX0VIQ0lfSENEPXkKIyBD T05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAojIENPTkZJR19VU0JfRUhDSV9U VF9ORVdTQ0hFRCBpcyBub3Qgc2V0CkNPTkZJR19VU0JfRUhDSV9QQ0k9eQojIENPTkZJR19VU0Jf RUhDSV9IQ0RfUExBVEZPUk0gaXMgbm90IHNldAojIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X0lTUDE3NjBfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX0ZVU0JIMjAwX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9GT1RH MjEwX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CkNPTkZJ R19VU0JfVUhDSV9IQ0Q9eQojIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIyBDT05G SUdfVVNCX1I4QTY2NTk3X0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9IQ0RfVEVTVF9NT0RF IGlzIG5vdCBzZXQKCiMKIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKIwojIENPTkZJR19VU0Jf QUNNIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAojIENPTkZJR19V U0JfV0RNIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CgojCiMgTk9URTog VVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQojCgojCiMgYWxz byBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KIwpDT05GSUdf VVNCX1NUT1JBR0U9bQojIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TVE9SQUdFX1JFQUxURUsgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9E QVRBRkFCIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBub3Qgc2V0 CiMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9S QUdFX1VTQkFUIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBz ZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NU T1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMg bm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVT U19BVEFDQiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0VORV9VQjYyNTAgaXMgbm90 IHNldApDT05GSUdfVVNCX1VBUz1tCgojCiMgVVNCIEltYWdpbmcgZGV2aWNlcwojCiMgQ09ORklH X1VTQl9NREM4MDAgaXMgbm90IHNldAojIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAoj IENPTkZJR19VU0JJUF9DT1JFIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX01VU0JfSERSQyBpcyBu b3Qgc2V0CiMgQ09ORklHX1VTQl9EV0MzIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0RXQzIgaXMg bm90IHNldAojIENPTkZJR19VU0JfQ0hJUElERUEgaXMgbm90IHNldAoKIwojIFVTQiBwb3J0IGRy aXZlcnMKIwpDT05GSUdfVVNCX1NFUklBTD15CiMgQ09ORklHX1VTQl9TRVJJQUxfQ09OU09MRSBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfR0VORVJJQyBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TRVJJQUxfU0lNUExFIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9BSVJDQUJM RSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNiBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUxfQkVMS0lOIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9DSDM0 MSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfV0hJVEVIRUFUIGlzIG5vdCBzZXQKIyBD T05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAojIENPTkZJR19VU0Jf U0VSSUFMX0NQMjEwWCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfQ1lQUkVTU19NOCBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAojIENPTkZJR19V U0JfU0VSSUFMX0ZURElfU0lPIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfSVBBUSBpcyBub3Qgc2V0CiMgQ09ORklHX1VT Ql9TRVJJQUxfSVIgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVF9USSBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TRVJJQUxfRjgxMjMyIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4g aXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX0lQVyBpcyBub3Qgc2V0CiMgQ09ORklHX1VT Ql9TRVJJQUxfSVVVIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTiBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TRVJJQUxfS0xTSSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NU IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUxfTUVUUk8gaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX01PUzc3 MjAgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDAgaXMgbm90IHNldAojIENP TkZJR19VU0JfU0VSSUFMX01YVVBPUlQgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX05B Vk1BTiBpcyBub3Qgc2V0CkNPTkZJR19VU0JfU0VSSUFMX1BMMjMwMz15CiMgQ09ORklHX1VTQl9T RVJJQUxfT1RJNjg1OCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfUUNBVVggaXMgbm90 IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1FVQUxDT01NIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X1NFUklBTF9TUENQOFg1IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9TSUVSUkFXSVJFTEVTUyBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUxfU1lNQk9MIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NFUklBTF9USSBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKIyBDT05G SUdfVVNCX1NFUklBTF9YSVJDT00gaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX09QVElP TiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUxfT1BUSUNPTiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfWFNF TlNfTVQgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFMX1dJU0hCT05FIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX1NFUklBTF9TU1UxMDAgaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VSSUFM X1FUMiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TRVJJQUxfREVCVUcgaXMgbm90IHNldAoKIwoj IFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKIwojIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNl dAojIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAojIENPTkZJR19VU0JfQURVVFVYIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX1NFVlNFRyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9SSU81MDAg aXMgbm90IHNldAojIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X0xDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAojIENPTkZJR19VU0Jf Q1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAojIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0 CiMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0ZURElfRUxBTiBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAojIENPTkZJR19V U0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKIyBDT05G SUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lPV0FSUklPUiBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0VIU0VU X1RFU1RfRklYVFVSRSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU0lHSFRGVyBpcyBub3Qgc2V0 CiMgQ09ORklHX1VTQl9ZVVJFWCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9FWlVTQl9GWDIgaXMg bm90IHNldAojIENPTkZJR19VU0JfSFNJQ19VU0IzNTAzIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X0xJTktfTEFZRVJfVEVTVCBpcyBub3Qgc2V0CgojCiMgVVNCIFBoeXNpY2FsIExheWVyIGRyaXZl cnMKIwojIENPTkZJR19VU0JfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU1AxMzAxIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0dB REdFVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VXQiBpcyBub3Qgc2V0CiMgQ09ORklHX01NQyBpcyBu b3Qgc2V0CiMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVXX0xFRFMgaXMg bm90IHNldAojIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5GSU5J QkFORCBpcyBub3Qgc2V0CiMgQ09ORklHX0VEQUMgaXMgbm90IHNldApDT05GSUdfUlRDX0xJQj15 CkNPTkZJR19SVENfQ0xBU1M9eQpDT05GSUdfUlRDX0hDVE9TWVM9eQpDT05GSUdfUlRDX1NZU1RP SEM9eQpDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgojIENPTkZJR19SVENfREVCVUcg aXMgbm90IHNldAoKIwojIFJUQyBpbnRlcmZhY2VzCiMKQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkK Q09ORklHX1JUQ19JTlRGX1BST0M9eQpDT05GSUdfUlRDX0lOVEZfREVWPXkKIyBDT05GSUdfUlRD X0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5v dCBzZXQKCiMKIyBJMkMgUlRDIGRyaXZlcnMKIwojIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBu b3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RS Vl9EUzE2NzIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMzIzMiBpcyBub3Qgc2V0CiMg Q09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlM1QzM3 MiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qgc2V0CiMgQ09ORklH X1JUQ19EUlZfSVNMMTIwMjIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0lTTDEyMDU3IGlz IG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19E UlZfUENGMjEyNyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUENGODUyMyBpcyBub3Qgc2V0 CiMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUENG ODUwNjMgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAojIENP TkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfQlEzMksgaXMg bm90IHNldAojIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX0ZNMzEzMCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQK IyBDT05GSUdfUlRDX0RSVl9SWDgwMjUgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0VNMzAy NyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlYzMDI5QzIgaXMgbm90IHNldAoKIwojIFNQ SSBSVEMgZHJpdmVycwojCgojCiMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKIwpDT05GSUdfUlRDX0RS Vl9DTU9TPXkKIyBDT05GSUdfUlRDX0RSVl9EUzEyODYgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX0RTMTUxMSBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQK IyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMjQw NCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAojIENPTkZJ R19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5v dCBzZXQKIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJW X01TTTYyNDIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0JRNDgwMiBpcyBub3Qgc2V0CiMg Q09ORklHX1JUQ19EUlZfUlA1QzAxIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBp cyBub3Qgc2V0CgojCiMgb24tQ1BVIFJUQyBkcml2ZXJzCiMKIyBDT05GSUdfUlRDX0RSVl9YR0VO RSBpcyBub3Qgc2V0CgojCiMgSElEIFNlbnNvciBSVEMgZHJpdmVycwojCiMgQ09ORklHX1JUQ19E UlZfSElEX1NFTlNPUl9USU1FIGlzIG5vdCBzZXQKQ09ORklHX0RNQURFVklDRVM9eQojIENPTkZJ R19ETUFERVZJQ0VTX0RFQlVHIGlzIG5vdCBzZXQKCiMKIyBETUEgRGV2aWNlcwojCiMgQ09ORklH X0lOVEVMX01JRF9ETUFDIGlzIG5vdCBzZXQKQ09ORklHX0lOVEVMX0lPQVRETUE9eQojIENPTkZJ R19EV19ETUFDX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19EV19ETUFDIGlzIG5vdCBzZXQKIyBD T05GSUdfRFdfRE1BQ19QQ0kgaXMgbm90IHNldApDT05GSUdfRE1BX0VOR0lORT15CkNPTkZJR19E TUFfQUNQST15CgojCiMgRE1BIENsaWVudHMKIwojIENPTkZJR19BU1lOQ19UWF9ETUEgaXMgbm90 IHNldAojIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKQ09ORklHX0RNQV9FTkdJTkVfUkFJRD15 CkNPTkZJR19EQ0E9eQojIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKIyBDT05GSUdfVUlP IGlzIG5vdCBzZXQKIyBDT05GSUdfVkZJTyBpcyBub3Qgc2V0CiMgQ09ORklHX1ZJUlRfRFJJVkVS UyBpcyBub3Qgc2V0CgojCiMgVmlydGlvIGRyaXZlcnMKIwojIENPTkZJR19WSVJUSU9fUENJIGlz IG5vdCBzZXQKIyBDT05GSUdfVklSVElPX01NSU8gaXMgbm90IHNldAoKIwojIE1pY3Jvc29mdCBI eXBlci1WIGd1ZXN0IHN1cHBvcnQKIwojIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKQ09ORklH X1g4Nl9QTEFURk9STV9ERVZJQ0VTPXkKIyBDT05GSUdfQUNFUkhERiBpcyBub3Qgc2V0CiMgQ09O RklHX0FTVVNfTEFQVE9QIGlzIG5vdCBzZXQKIyBDT05GSUdfREVMTF9TTU84ODAwIGlzIG5vdCBz ZXQKIyBDT05GSUdfRlVKSVRTVV9MQVBUT1AgaXMgbm90IHNldAojIENPTkZJR19GVUpJVFNVX1RB QkxFVCBpcyBub3Qgc2V0CiMgQ09ORklHX0hQX0FDQ0VMIGlzIG5vdCBzZXQKIyBDT05GSUdfSFBf V0lSRUxFU1MgaXMgbm90IHNldAojIENPTkZJR19QQU5BU09OSUNfTEFQVE9QIGlzIG5vdCBzZXQK IyBDT05GSUdfVEhJTktQQURfQUNQSSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSERBUFMg aXMgbm90IHNldAojIENPTkZJR19JTlRFTF9NRU5MT1cgaXMgbm90IHNldAojIENPTkZJR19BQ1BJ X1dNSSBpcyBub3Qgc2V0CiMgQ09ORklHX1RPUFNUQVJfTEFQVE9QIGlzIG5vdCBzZXQKIyBDT05G SUdfVE9TSElCQV9CVF9SRktJTEwgaXMgbm90IHNldAojIENPTkZJR19UT1NISUJBX0hBUFMgaXMg bm90IHNldAojIENPTkZJR19BQ1BJX0NNUEMgaXMgbm90IHNldAojIENPTkZJR19JTlRFTF9JUFMg aXMgbm90IHNldAojIENPTkZJR19JQk1fUlRMIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FNU1VOR19M QVBUT1AgaXMgbm90IHNldAojIENPTkZJR19TQU1TVU5HX1ExMCBpcyBub3Qgc2V0CiMgQ09ORklH X0FQUExFX0dNVVggaXMgbm90IHNldAojIENPTkZJR19JTlRFTF9SU1QgaXMgbm90IHNldAojIENP TkZJR19JTlRFTF9TTUFSVENPTk5FQ1QgaXMgbm90IHNldAojIENPTkZJR19QVlBBTklDIGlzIG5v dCBzZXQKIyBDT05GSUdfQ0hST01FX1BMQVRGT1JNUyBpcyBub3Qgc2V0CgojCiMgU09DIChTeXN0 ZW0gT24gQ2hpcCkgc3BlY2lmaWMgRHJpdmVycwojCiMgQ09ORklHX1NPQ19USSBpcyBub3Qgc2V0 CgojCiMgSGFyZHdhcmUgU3BpbmxvY2sgZHJpdmVycwojCgojCiMgQ2xvY2sgU291cmNlIGRyaXZl cnMKIwpDT05GSUdfQ0xLRVZUX0k4MjUzPXkKQ09ORklHX0k4MjUzX0xPQ0s9eQpDT05GSUdfQ0xL QkxEX0k4MjUzPXkKIyBDT05GSUdfQVRNRUxfUElUIGlzIG5vdCBzZXQKIyBDT05GSUdfU0hfVElN RVJfQ01UIGlzIG5vdCBzZXQKIyBDT05GSUdfU0hfVElNRVJfTVRVMiBpcyBub3Qgc2V0CiMgQ09O RklHX1NIX1RJTUVSX1RNVSBpcyBub3Qgc2V0CiMgQ09ORklHX0VNX1RJTUVSX1NUSSBpcyBub3Qg c2V0CiMgQ09ORklHX01BSUxCT1ggaXMgbm90IHNldApDT05GSUdfSU9NTVVfQVBJPXkKQ09ORklH X0lPTU1VX1NVUFBPUlQ9eQojIENPTkZJR19BTURfSU9NTVUgaXMgbm90IHNldApDT05GSUdfRE1B Ul9UQUJMRT15CkNPTkZJR19JTlRFTF9JT01NVT15CkNPTkZJR19JTlRFTF9JT01NVV9ERUZBVUxU X09OPXkKQ09ORklHX0lOVEVMX0lPTU1VX0ZMT1BQWV9XQT15CiMgQ09ORklHX0lSUV9SRU1BUCBp cyBub3Qgc2V0CgojCiMgUmVtb3RlcHJvYyBkcml2ZXJzCiMKIyBDT05GSUdfU1RFX01PREVNX1JQ Uk9DIGlzIG5vdCBzZXQKCiMKIyBScG1zZyBkcml2ZXJzCiMKCiMKIyBTT0MgKFN5c3RlbSBPbiBD aGlwKSBzcGVjaWZpYyBEcml2ZXJzCiMKIyBDT05GSUdfUE1fREVWRlJFUSBpcyBub3Qgc2V0CiMg Q09ORklHX0VYVENPTiBpcyBub3Qgc2V0CiMgQ09ORklHX01FTU9SWSBpcyBub3Qgc2V0CiMgQ09O RklHX0lJTyBpcyBub3Qgc2V0CiMgQ09ORklHX05UQiBpcyBub3Qgc2V0CiMgQ09ORklHX1ZNRV9C VVMgaXMgbm90IHNldAojIENPTkZJR19QV00gaXMgbm90IHNldAojIENPTkZJR19JUEFDS19CVVMg aXMgbm90IHNldAojIENPTkZJR19SRVNFVF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIyBDT05GSUdf Rk1DIGlzIG5vdCBzZXQKCiMKIyBQSFkgU3Vic3lzdGVtCiMKIyBDT05GSUdfR0VORVJJQ19QSFkg aXMgbm90IHNldAojIENPTkZJR19CQ01fS09OQV9VU0IyX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklH X1BPV0VSQ0FQIGlzIG5vdCBzZXQKIyBDT05GSUdfTUNCIGlzIG5vdCBzZXQKQ09ORklHX1JBUz15 CiMgQ09ORklHX1RIVU5ERVJCT0xUIGlzIG5vdCBzZXQKCiMKIyBGaXJtd2FyZSBEcml2ZXJzCiMK IyBDT05GSUdfRUREIGlzIG5vdCBzZXQKQ09ORklHX0ZJUk1XQVJFX01FTU1BUD15CiMgQ09ORklH X0RFTExfUkJVIGlzIG5vdCBzZXQKIyBDT05GSUdfRENEQkFTIGlzIG5vdCBzZXQKQ09ORklHX0RN SUlEPXkKQ09ORklHX0RNSV9TWVNGUz15CkNPTkZJR19ETUlfU0NBTl9NQUNISU5FX05PTl9FRklf RkFMTEJBQ0s9eQojIENPTkZJR19JU0NTSV9JQkZUX0ZJTkQgaXMgbm90IHNldAojIENPTkZJR19H T09HTEVfRklSTVdBUkUgaXMgbm90IHNldApDT05GSUdfVUVGSV9DUEVSPXkKCiMKIyBGaWxlIHN5 c3RlbXMKIwpDT05GSUdfRENBQ0hFX1dPUkRfQUNDRVNTPXkKIyBDT05GSUdfRVhUMl9GUyBpcyBu b3Qgc2V0CiMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldApDT05GSUdfRVhUNF9GUz15CkNPTkZJ R19FWFQ0X1VTRV9GT1JfRVhUMjM9eQpDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0w9eQpDT05GSUdf RVhUNF9GU19TRUNVUklUWT15CiMgQ09ORklHX0VYVDRfREVCVUcgaXMgbm90IHNldApDT05GSUdf SkJEMj15CiMgQ09ORklHX0pCRDJfREVCVUcgaXMgbm90IHNldApDT05GSUdfRlNfTUJDQUNIRT15 CiMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBz ZXQKQ09ORklHX1hGU19GUz15CiMgQ09ORklHX1hGU19RVU9UQSBpcyBub3Qgc2V0CkNPTkZJR19Y RlNfUE9TSVhfQUNMPXkKIyBDT05GSUdfWEZTX1JUIGlzIG5vdCBzZXQKIyBDT05GSUdfWEZTX1dB Uk4gaXMgbm90IHNldAojIENPTkZJR19YRlNfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19HRlMy X0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAojIENPTkZJR19CVFJG U19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CkNPTkZJR19GU19Q T1NJWF9BQ0w9eQpDT05GSUdfRVhQT1JURlM9eQpDT05GSUdfRklMRV9MT0NLSU5HPXkKQ09ORklH X0ZTTk9USUZZPXkKIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CkNPTkZJR19JTk9USUZZX1VT RVI9eQpDT05GSUdfRkFOT1RJRlk9eQojIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiMgQ09ORklH X1FVT1RBQ1RMIGlzIG5vdCBzZXQKIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CiMgQ09O RklHX0ZVU0VfRlMgaXMgbm90IHNldAojIENPTkZJR19PVkVSTEFZX0ZTIGlzIG5vdCBzZXQKCiMK IyBDYWNoZXMKIwojIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKCiMKIyBDRC1ST00vRFZEIEZp bGVzeXN0ZW1zCiMKQ09ORklHX0lTTzk2NjBfRlM9bQpDT05GSUdfSk9MSUVUPXkKQ09ORklHX1pJ U09GUz15CkNPTkZJR19VREZfRlM9bQpDT05GSUdfVURGX05MUz15CgojCiMgRE9TL0ZBVC9OVCBG aWxlc3lzdGVtcwojCiMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfVkZBVF9G UyBpcyBub3Qgc2V0CiMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAoKIwojIFBzZXVkbyBmaWxl c3lzdGVtcwojCkNPTkZJR19QUk9DX0ZTPXkKIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0 CkNPTkZJR19QUk9DX1NZU0NUTD15CkNPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CkNPTkZJR19L RVJORlM9eQpDT05GSUdfU1lTRlM9eQpDT05GSUdfVE1QRlM9eQpDT05GSUdfVE1QRlNfUE9TSVhf QUNMPXkKQ09ORklHX1RNUEZTX1hBVFRSPXkKIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQK IyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKQ09ORklHX0NPTkZJR0ZTX0ZTPXkKQ09O RklHX01JU0NfRklMRVNZU1RFTVM9eQojIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKIyBDT05G SUdfQUZGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklH X0hGU1BMVVNfRlMgaXMgbm90IHNldAojIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKIyBDT05G SUdfQkZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdf TE9HRlMgaXMgbm90IHNldAojIENPTkZJR19DUkFNRlMgaXMgbm90IHNldApDT05GSUdfU1FVQVNI RlM9eQojIENPTkZJR19TUVVBU0hGU19GSUxFX0NBQ0hFIGlzIG5vdCBzZXQKQ09ORklHX1NRVUFT SEZTX0ZJTEVfRElSRUNUPXkKQ09ORklHX1NRVUFTSEZTX0RFQ09NUF9TSU5HTEU9eQojIENPTkZJ R19TUVVBU0hGU19ERUNPTVBfTVVMVEkgaXMgbm90IHNldAojIENPTkZJR19TUVVBU0hGU19ERUNP TVBfTVVMVElfUEVSQ1BVIGlzIG5vdCBzZXQKQ09ORklHX1NRVUFTSEZTX1hBVFRSPXkKQ09ORklH X1NRVUFTSEZTX1pMSUI9eQojIENPTkZJR19TUVVBU0hGU19MWk8gaXMgbm90IHNldAojIENPTkZJ R19TUVVBU0hGU19YWiBpcyBub3Qgc2V0CkNPTkZJR19TUVVBU0hGU180S19ERVZCTEtfU0laRT15 CiMgQ09ORklHX1NRVUFTSEZTX0VNQkVEREVEIGlzIG5vdCBzZXQKQ09ORklHX1NRVUFTSEZTX0ZS QUdNRU5UX0NBQ0hFX1NJWkU9MwojIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdf TUlOSVhfRlMgaXMgbm90IHNldAojIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdf SFBGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklH X1FOWDZGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQ09ORklH X1BTVE9SRT15CiMgQ09ORklHX1BTVE9SRV9DT05TT0xFIGlzIG5vdCBzZXQKIyBDT05GSUdfUFNU T1JFX1JBTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAojIENPTkZJR19V RlNfRlMgaXMgbm90IHNldAojIENPTkZJR19GMkZTX0ZTIGlzIG5vdCBzZXQKQ09ORklHX05FVFdP UktfRklMRVNZU1RFTVM9eQpDT05GSUdfTkZTX0ZTPW0KIyBDT05GSUdfTkZTX1YyIGlzIG5vdCBz ZXQKQ09ORklHX05GU19WMz1tCkNPTkZJR19ORlNfVjNfQUNMPXkKIyBDT05GSUdfTkZTX1Y0IGlz IG5vdCBzZXQKIyBDT05GSUdfTkZTX1NXQVAgaXMgbm90IHNldApDT05GSUdfTkZTRD1tCkNPTkZJ R19ORlNEX1YyX0FDTD15CkNPTkZJR19ORlNEX1YzPXkKQ09ORklHX05GU0RfVjNfQUNMPXkKIyBD T05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CkNPTkZJR19HUkFDRV9QRVJJT0Q9bQpDT05GSUdfTE9D S0Q9bQpDT05GSUdfTE9DS0RfVjQ9eQpDT05GSUdfTkZTX0FDTF9TVVBQT1JUPW0KQ09ORklHX05G U19DT01NT049eQpDT05GSUdfU1VOUlBDPW0KIyBDT05GSUdfU1VOUlBDX0RFQlVHIGlzIG5vdCBz ZXQKIyBDT05GSUdfQ0VQSF9GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0NJRlMgaXMgbm90IHNldAoj IENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAojIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKIyBD T05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKQ09ORklHX05MUz15CkNPTkZJR19OTFNfREVGQVVMVD0i dXRmOCIKQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQojIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3 IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzc3NSBpcyBub3Qgc2V0CkNPTkZJR19O TFNfQ09ERVBBR0VfODUwPXkKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CiMg Q09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0Vf ODU3IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CiMgQ09O RklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODYy IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CiMgQ09ORklH X05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlz IG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CiMgQ09ORklHX05M U19DT0RFUEFHRV84NjkgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2IGlzIG5v dCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19D T0RFUEFHRV85MzIgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBz ZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084 ODU5XzggaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CiMg Q09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKQ09ORklHX05MU19BU0NJST15CkNP TkZJR19OTFNfSVNPODg1OV8xPXkKIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CiMg Q09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAojIENPTkZJR19OTFNfSVNPODg1OV80IGlz IG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19J U084ODU5XzYgaXMgbm90IHNldAojIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKIyBD T05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084ODU5XzEzIGlz IG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldApDT05GSUdfTkxTX0lT Tzg4NTlfMTU9eQojIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0tP SThfVSBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfUk9NQU4gaXMgbm90IHNldAojIENPTkZJ R19OTFNfTUFDX0NFTFRJQyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfQ0VOVEVVUk8gaXMg bm90IHNldAojIENPTkZJR19OTFNfTUFDX0NST0FUSUFOIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxT X01BQ19DWVJJTExJQyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfR0FFTElDIGlzIG5vdCBz ZXQKIyBDT05GSUdfTkxTX01BQ19HUkVFSyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfSUNF TEFORCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfSU5VSVQgaXMgbm90IHNldAojIENPTkZJ R19OTFNfTUFDX1JPTUFOSUFOIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX01BQ19UVVJLSVNIIGlz IG5vdCBzZXQKQ09ORklHX05MU19VVEY4PXkKIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKCiMKIyBL ZXJuZWwgaGFja2luZwojCkNPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKCiMKIyBwcmlu dGsgYW5kIGRtZXNnIG9wdGlvbnMKIwpDT05GSUdfUFJJTlRLX1RJTUU9eQpDT05GSUdfTUVTU0FH RV9MT0dMRVZFTF9ERUZBVUxUPTUKIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNl dAoKIwojIENvbXBpbGUtdGltZSBjaGVja3MgYW5kIGNvbXBpbGVyIG9wdGlvbnMKIwojIENPTkZJ R19ERUJVR19JTkZPIGlzIG5vdCBzZXQKIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBp cyBub3Qgc2V0CiMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKQ09ORklHX0ZS QU1FX1dBUk49MjA0OAojIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiMgQ09ORklH X1JFQURBQkxFX0FTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBz ZXQKIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAojIENPTkZJR19IRUFERVJTX0NIRUNLIGlz IG5vdCBzZXQKIyBDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSCBpcyBub3Qgc2V0CkNPTkZJ R19BUkNIX1dBTlRfRlJBTUVfUE9JTlRFUlM9eQpDT05GSUdfRlJBTUVfUE9JTlRFUj15CiMgQ09O RklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CkNPTkZJR19NQUdJQ19TWVNS UT15CkNPTkZJR19NQUdJQ19TWVNSUV9ERUZBVUxUX0VOQUJMRT0weDEKQ09ORklHX0RFQlVHX0tF Uk5FTD15CgojCiMgTWVtb3J5IERlYnVnZ2luZwojCiMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBp cyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAojIENPTkZJR19TTFVC X0RFQlVHX09OIGlzIG5vdCBzZXQKIyBDT05GSUdfU0xVQl9TVEFUUyBpcyBub3Qgc2V0CkNPTkZJ R19IQVZFX0RFQlVHX0tNRU1MRUFLPXkKIyBDT05GSUdfREVCVUdfS01FTUxFQUsgaXMgbm90IHNl dAojIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX1ZN IGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfVklSVFVBTCBpcyBub3Qgc2V0CkNPTkZJR19ERUJV R19NRU1PUllfSU5JVD15CiMgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUyBpcyBub3Qgc2V0CkNP TkZJR19IQVZFX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQojIENPTkZJR19ERUJVR19TVEFDS09WRVJG TE9XIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfQVJDSF9LTUVNQ0hFQ0s9eQojIENPTkZJR19LTUVN Q0hFQ0sgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CgojCiMgRGVi dWcgTG9ja3VwcyBhbmQgSGFuZ3MKIwojIENPTkZJR19MT0NLVVBfREVURUNUT1IgaXMgbm90IHNl dApDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CkNPTkZJR19ERUZBVUxUX0hVTkdfVEFTS19USU1F T1VUPTEyMAojIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKQ09O RklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAojIENPTkZJR19QQU5JQ19PTl9P T1BTIGlzIG5vdCBzZXQKQ09ORklHX1BBTklDX09OX09PUFNfVkFMVUU9MApDT05GSUdfUEFOSUNf VElNRU9VVD02MAojIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDSEVE U1RBVFMgaXMgbm90IHNldAojIENPTkZJR19TQ0hFRF9TVEFDS19FTkRfQ0hFQ0sgaXMgbm90IHNl dAojIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CgojCiMgTG9jayBEZWJ1Z2dpbmcgKHNw aW5sb2NrcywgbXV0ZXhlcywgZXRjLi4uKQojCiMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMg bm90IHNldAojIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVH X01VVEVYRVMgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19XV19NVVRFWF9TTE9XUEFUSCBpcyBu b3Qgc2V0CiMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAojIENPTkZJR19QUk9W RV9MT0NLSU5HIGlzIG5vdCBzZXQKIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKIyBDT05G SUdfREVCVUdfQVRPTUlDX1NMRUVQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTE9DS0lOR19B UElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKIyBDT05GSUdfTE9DS19UT1JUVVJFX1RFU1QgaXMgbm90 IHNldApDT05GSUdfU1RBQ0tUUkFDRT15CiMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNl dApDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNl dAojIENPTkZJR19ERUJVR19QSV9MSVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfU0cgaXMg bm90IHNldAojIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAojIENPTkZJR19ERUJV R19DUkVERU5USUFMUyBpcyBub3Qgc2V0CgojCiMgUkNVIERlYnVnZ2luZwojCiMgQ09ORklHX1NQ QVJTRV9SQ1VfUE9JTlRFUiBpcyBub3Qgc2V0CiMgQ09ORklHX1RPUlRVUkVfVEVTVCBpcyBub3Qg c2V0CiMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldApDT05GSUdfUkNVX0NQVV9T VEFMTF9USU1FT1VUPTYwCiMgQ09ORklHX1JDVV9DUFVfU1RBTExfSU5GTyBpcyBub3Qgc2V0CiMg Q09ORklHX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZU IGlzIG5vdCBzZXQKIyBDT05GSUdfTk9USUZJRVJfRVJST1JfSU5KRUNUSU9OIGlzIG5vdCBzZXQK IyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfTEFURU5DWVRPUCBp cyBub3Qgc2V0CkNPTkZJR19BUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15 CkNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CkNPTkZJR19VU0VSX1NUQUNL VFJBQ0VfU1VQUE9SVD15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CkNPTkZJR19IQVZF X0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RF U1Q9eQpDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CkNPTkZJR19IQVZFX0RZTkFNSUNfRlRS QUNFX1dJVEhfUkVHUz15CkNPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKQ09ORklH X0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CkNPTkZJR19IQVZFX0ZFTlRSWT15CkNPTkZJR19I QVZFX0NfUkVDT1JETUNPVU5UPXkKQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiMgQ09ORklHX0ZU UkFDRSBpcyBub3Qgc2V0CgojCiMgUnVudGltZSBUZXN0aW5nCiMKIyBDT05GSUdfVEVTVF9MSVNU X1NPUlQgaXMgbm90IHNldAojIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQK IyBDT05GSUdfUkJUUkVFX1RFU1QgaXMgbm90IHNldAojIENPTkZJR19JTlRFUlZBTF9UUkVFX1RF U1QgaXMgbm90IHNldAojIENPTkZJR19QRVJDUFVfVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FU T01JQzY0X1NFTEZURVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUyBp cyBub3Qgc2V0CiMgQ09ORklHX1RFU1RfS1NUUlRPWCBpcyBub3Qgc2V0CiMgQ09ORklHX1RFU1Rf UkhBU0hUQUJMRSBpcyBub3Qgc2V0CiMgQ09ORklHX1BST1ZJREVfT0hDSTEzOTRfRE1BX0lOSVQg aXMgbm90IHNldAojIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfVEVT VF9MS00gaXMgbm90IHNldAojIENPTkZJR19URVNUX1VTRVJfQ09QWSBpcyBub3Qgc2V0CiMgQ09O RklHX1RFU1RfQlBGIGlzIG5vdCBzZXQKIyBDT05GSUdfVEVTVF9GSVJNV0FSRSBpcyBub3Qgc2V0 CiMgQ09ORklHX1RFU1RfVURFTEFZIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FNUExFUyBpcyBub3Qg c2V0CkNPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiMgQ09ORklHX0tHREIgaXMgbm90IHNldApDT05G SUdfU1RSSUNUX0RFVk1FTT15CkNPTkZJR19YODZfVkVSQk9TRV9CT09UVVA9eQpDT05GSUdfRUFS TFlfUFJJTlRLPXkKIyBDT05GSUdfRUFSTFlfUFJJTlRLX0RCR1AgaXMgbm90IHNldAojIENPTkZJ R19YODZfUFREVU1QIGlzIG5vdCBzZXQKQ09ORklHX0RFQlVHX1JPREFUQT15CiMgQ09ORklHX0RF QlVHX1JPREFUQV9URVNUIGlzIG5vdCBzZXQKQ09ORklHX0RFQlVHX1NFVF9NT0RVTEVfUk9OWD15 CiMgQ09ORklHX0RFQlVHX05YX1RFU1QgaXMgbm90IHNldApDT05GSUdfRE9VQkxFRkFVTFQ9eQoj IENPTkZJR19ERUJVR19UTEJGTFVTSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lPTU1VX0RFQlVHIGlz IG5vdCBzZXQKIyBDT05GSUdfSU9NTVVfU1RSRVNTIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfTU1J T1RSQUNFX1NVUFBPUlQ9eQpDT05GSUdfSU9fREVMQVlfVFlQRV8wWDgwPTAKQ09ORklHX0lPX0RF TEFZX1RZUEVfMFhFRD0xCkNPTkZJR19JT19ERUxBWV9UWVBFX1VERUxBWT0yCkNPTkZJR19JT19E RUxBWV9UWVBFX05PTkU9MwpDT05GSUdfSU9fREVMQVlfMFg4MD15CiMgQ09ORklHX0lPX0RFTEFZ XzBYRUQgaXMgbm90IHNldAojIENPTkZJR19JT19ERUxBWV9VREVMQVkgaXMgbm90IHNldAojIENP TkZJR19JT19ERUxBWV9OT05FIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRfSU9fREVMQVlfVFlQ RT0wCiMgQ09ORklHX0NQQV9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19PUFRJTUlaRV9JTkxJTklO Rz15CiMgQ09ORklHX0RFQlVHX05NSV9TRUxGVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX1g4Nl9E RUJVR19TVEFUSUNfQ1BVX0hBUyBpcyBub3Qgc2V0CgojCiMgU2VjdXJpdHkgb3B0aW9ucwojCiMg Q09ORklHX0tFWVMgaXMgbm90IHNldAojIENPTkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VDVVJJVFlG UyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOVEVMX1RYVCBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxU X1NFQ1VSSVRZX0RBQz15CkNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCkNPTkZJR19DUllQVE89 eQoKIwojIENyeXB0byBjb3JlIG9yIGhlbHBlcgojCkNPTkZJR19DUllQVE9fQUxHQVBJPXkKQ09O RklHX0NSWVBUT19BTEdBUEkyPXkKQ09ORklHX0NSWVBUT19BRUFEMj15CkNPTkZJR19DUllQVE9f QkxLQ0lQSEVSPXkKQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKQ09ORklHX0NSWVBUT19IQVNI PXkKQ09ORklHX0NSWVBUT19IQVNIMj15CkNPTkZJR19DUllQVE9fUk5HMj15CkNPTkZJR19DUllQ VE9fUENPTVAyPXkKQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKQ09ORklHX0NSWVBUT19NQU5BR0VS Mj15CiMgQ09ORklHX0NSWVBUT19VU0VSIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19NQU5BR0VS X0RJU0FCTEVfVEVTVFM9eQpDT05GSUdfQ1JZUFRPX0dGMTI4TVVMPXkKIyBDT05GSUdfQ1JZUFRP X05VTEwgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fUENSWVBUIGlzIG5vdCBzZXQKQ09ORklH X0NSWVBUT19XT1JLUVVFVUU9eQpDT05GSUdfQ1JZUFRPX0NSWVBURD15CiMgQ09ORklHX0NSWVBU T19NQ1JZUFREIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0FVVEhFTkMgaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fQUJMS19IRUxQRVI9 eQpDT05GSUdfQ1JZUFRPX0dMVUVfSEVMUEVSX1g4Nj15CgojCiMgQXV0aGVudGljYXRlZCBFbmNy eXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCiMKIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qg c2V0CiMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fU0VRSVYg aXMgbm90IHNldAoKIwojIEJsb2NrIG1vZGVzCiMKQ09ORklHX0NSWVBUT19DQkM9eQojIENPTkZJ R19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CiMg Q09ORklHX0NSWVBUT19FQ0IgaXMgbm90IHNldApDT05GSUdfQ1JZUFRPX0xSVz15CiMgQ09ORklH X0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19YVFM9eQoKIwojIEhhc2ggbW9k ZXMKIwojIENPTkZJR19DUllQVE9fQ01BQyBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19ITUFD IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMgbm90IHNldAojIENPTkZJR19DUllQ VE9fVk1BQyBpcyBub3Qgc2V0CgojCiMgRGlnZXN0CiMKQ09ORklHX0NSWVBUT19DUkMzMkM9eQoj IENPTkZJR19DUllQVE9fQ1JDMzJDX0lOVEVMIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NS QzMyIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NSQzMyX1BDTE1VTCBpcyBub3Qgc2V0CkNP TkZJR19DUllQVE9fQ1JDVDEwRElGPXkKIyBDT05GSUdfQ1JZUFRPX0NSQ1QxMERJRl9QQ0xNVUwg aXMgbm90IHNldAojIENPTkZJR19DUllQVE9fR0hBU0ggaXMgbm90IHNldAojIENPTkZJR19DUllQ VE9fTUQ0IGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19NRDU9eQojIENPTkZJR19DUllQVE9fTUlD SEFFTF9NSUMgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKIyBD T05GSUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMg bm90IHNldAojIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19T SEExPXkKIyBDT05GSUdfQ1JZUFRPX1NIQTFfU1NTRTMgaXMgbm90IHNldAojIENPTkZJR19DUllQ VE9fU0hBMjU2X1NTU0UzIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1NIQTUxMl9TU1NFMyBp cyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TSEExX01CIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBU T19TSEEyNTY9eQojIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZ UFRPX1RHUjE5MiBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CiMg Q09ORklHX0NSWVBUT19HSEFTSF9DTE1VTF9OSV9JTlRFTCBpcyBub3Qgc2V0CgojCiMgQ2lwaGVy cwojCkNPTkZJR19DUllQVE9fQUVTPXkKQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0PXkKQ09ORklH X0NSWVBUT19BRVNfTklfSU5URUw9eQojIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQK IyBDT05GSUdfQ1JZUFRPX0FSQzQgaXMgbm90IHNldApDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPXkK Q09ORklHX0NSWVBUT19CTE9XRklTSF9DT01NT049eQpDT05GSUdfQ1JZUFRPX0JMT1dGSVNIX1g4 Nl82ND15CiMgQ09ORklHX0NSWVBUT19DQU1FTExJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBU T19DQU1FTExJQV9YODZfNjQgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fQ0FNRUxMSUFfQUVT TklfQVZYX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DQU1FTExJQV9BRVNOSV9B VlgyX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CiMg Q09ORklHX0NSWVBUT19DQVNUNV9BVlhfWDg2XzY0IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRP X0NBU1Q2IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NBU1Q2X0FWWF9YODZfNjQgaXMgbm90 IHNldAojIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0RFUzNf RURFX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAg aXMgbm90IHNldAojIENPTkZJR19DUllQVE9fU0FMU0EyMF9YODZfNjQgaXMgbm90IHNldAojIENP TkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fU0VSUEVOVD15CkNPTkZJ R19DUllQVE9fU0VSUEVOVF9TU0UyX1g4Nl82ND15CkNPTkZJR19DUllQVE9fU0VSUEVOVF9BVlhf WDg2XzY0PXkKIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlRfQVZYMl9YODZfNjQgaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMg bm90IHNldApDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPXkKQ09ORklHX0NSWVBUT19UV09G SVNIX1g4Nl82ND15CkNPTkZJR19DUllQVE9fVFdPRklTSF9YODZfNjRfM1dBWT15CkNPTkZJR19D UllQVE9fVFdPRklTSF9BVlhfWDg2XzY0PXkKCiMKIyBDb21wcmVzc2lvbgojCiMgQ09ORklHX0NS WVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1pMSUIgaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0xaNCBpcyBub3Qg c2V0CiMgQ09ORklHX0NSWVBUT19MWjRIQyBpcyBub3Qgc2V0CgojCiMgUmFuZG9tIE51bWJlciBH ZW5lcmF0aW9uCiMKIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAojIENPTkZJ R19DUllQVE9fRFJCR19NRU5VIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hB U0ggaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVIgaXMgbm90IHNl dAojIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldApDT05GSUdfSEFWRV9LVk09eQojIENPTkZJ R19WSVJUVUFMSVpBVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90 IHNldAoKIwojIExpYnJhcnkgcm91dGluZXMKIwpDT05GSUdfQklUUkVWRVJTRT15CkNPTkZJR19H RU5FUklDX1NUUk5DUFlfRlJPTV9VU0VSPXkKQ09ORklHX0dFTkVSSUNfU1RSTkxFTl9VU0VSPXkK Q09ORklHX0dFTkVSSUNfTkVUX1VUSUxTPXkKQ09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQ9 eQpDT05GSUdfR0VORVJJQ19QQ0lfSU9NQVA9eQpDT05GSUdfR0VORVJJQ19JT01BUD15CkNPTkZJ R19HRU5FUklDX0lPPXkKQ09ORklHX0FSQ0hfVVNFX0NNUFhDSEdfTE9DS1JFRj15CkNPTkZJR19B UkNIX0hBU19GQVNUX01VTFRJUExJRVI9eQojIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApD T05GSUdfQ1JDMTY9eQpDT05GSUdfQ1JDX1QxMERJRj15CkNPTkZJR19DUkNfSVRVX1Q9bQpDT05G SUdfQ1JDMzI9eQojIENPTkZJR19DUkMzMl9TRUxGVEVTVCBpcyBub3Qgc2V0CkNPTkZJR19DUkMz Ml9TTElDRUJZOD15CiMgQ09ORklHX0NSQzMyX1NMSUNFQlk0IGlzIG5vdCBzZXQKIyBDT05GSUdf Q1JDMzJfU0FSV0FURSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSQzMyX0JJVCBpcyBub3Qgc2V0CiMg Q09ORklHX0NSQzcgaXMgbm90IHNldApDT05GSUdfTElCQ1JDMzJDPXkKIyBDT05GSUdfQ1JDOCBp cyBub3Qgc2V0CiMgQ09ORklHX0FVRElUX0FSQ0hfQ09NUEFUX0dFTkVSSUMgaXMgbm90IHNldAoj IENPTkZJR19SQU5ET00zMl9TRUxGVEVTVCBpcyBub3Qgc2V0CkNPTkZJR19aTElCX0lORkxBVEU9 eQpDT05GSUdfWkxJQl9ERUZMQVRFPXkKQ09ORklHX0xaT19ERUNPTVBSRVNTPXkKQ09ORklHX0xa NF9ERUNPTVBSRVNTPXkKQ09ORklHX1haX0RFQz15CkNPTkZJR19YWl9ERUNfWDg2PXkKQ09ORklH X1haX0RFQ19QT1dFUlBDPXkKQ09ORklHX1haX0RFQ19JQTY0PXkKQ09ORklHX1haX0RFQ19BUk09 eQpDT05GSUdfWFpfREVDX0FSTVRIVU1CPXkKQ09ORklHX1haX0RFQ19TUEFSQz15CkNPTkZJR19Y Wl9ERUNfQkNKPXkKIyBDT05GSUdfWFpfREVDX1RFU1QgaXMgbm90IHNldApDT05GSUdfREVDT01Q UkVTU19HWklQPXkKQ09ORklHX0RFQ09NUFJFU1NfQlpJUDI9eQpDT05GSUdfREVDT01QUkVTU19M Wk1BPXkKQ09ORklHX0RFQ09NUFJFU1NfWFo9eQpDT05GSUdfREVDT01QUkVTU19MWk89eQpDT05G SUdfREVDT01QUkVTU19MWjQ9eQpDT05GSUdfSU5URVJWQUxfVFJFRT15CkNPTkZJR19IQVNfSU9N RU09eQpDT05GSUdfSEFTX0lPUE9SVF9NQVA9eQpDT05GSUdfSEFTX0RNQT15CkNPTkZJR19DSEVD S19TSUdOQVRVUkU9eQpDT05GSUdfQ1BVX1JNQVA9eQpDT05GSUdfRFFMPXkKQ09ORklHX0dMT0I9 eQojIENPTkZJR19HTE9CX1NFTEZURVNUIGlzIG5vdCBzZXQKQ09ORklHX05MQVRUUj15CkNPTkZJ R19BUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkU9eQojIENPTkZJR19BVkVSQUdFIGlz IG5vdCBzZXQKIyBDT05GSUdfQ09SRElDIGlzIG5vdCBzZXQKIyBDT05GSUdfRERSIGlzIG5vdCBz ZXQKQ09ORklHX0ZPTlRfU1VQUE9SVD15CiMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKQ09ORklH X0ZPTlRfOHg4PXkKQ09ORklHX0ZPTlRfOHgxNj15CkNPTkZJR19BUkNIX0hBU19TR19DSEFJTj15 Cg== --MP_/pW.H5clZB7S4pRnX9NM/EUn-- From david@fromorbit.com Tue Feb 10 01:26:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 891927FBC for ; Tue, 10 Feb 2015 01:26:07 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0703FAC003 for ; Mon, 9 Feb 2015 23:26:06 -0800 (PST) X-ASG-Debug-ID: 1423553162-04cbb01164f1c00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JRIBwOqRCA5Etcse for ; Mon, 09 Feb 2015 23:26:03 -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: AqUmAPex2VR5LPv2PGdsb2JhbABCGoMGUlqCM4l5pAEMAQEBAQEBBoJ0j1CFbwICAQECgRxEAQEBAQEBBQEBAQE4O4QMAQEBAwEnExwjBQsIAw4HAwkMGQ8FDRgDBwIYExuHfgMJBw43xx4NC4VVAQEBAQEFAQEBAQEBHBiFbIdJgUgRAVAHCoMMgRQFhFAKeIdmhTOCEYIFBoE/gRmDA4JGg16CMYJCgz6EJCoxgQuBNwEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 17:56:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YL5Cp-0006fJ-TW; Tue, 10 Feb 2015 18:25:59 +1100 Date: Tue, 10 Feb 2015 18:25:59 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: Accounting for AGFL blocks in xfs_spaceman Message-ID: <20150210072559.GA12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Accounting for AGFL blocks in xfs_spaceman References: <54ca343a.43df440a.3c11.4474@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ca343a.43df440a.3c11.4474@mx.google.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423553162 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.10 BSF_SC0_SA085 Custom Rule SA085 On Thu, Jan 29, 2015 at 06:53:01PM +0530, Dhruvesh Rathore wrote: > > The xfs_spaceman utility previously failed to account for AGFL blocks. > Old output (Before changes). > > $ sudo xfs_spaceman -c "freesp" /media/xfs > from to extents blocks pct > 1024 2047 1 1262 0.04 > 4096 8191 1 5126 0.15 > 8192 16383 3 35344 1.05 > 32768 65535 1 43989 1.31 > 262144 524287 3 1334894 39.78 > 524288 967428 2 1934840 57.66 > > As you can see the AGFL blocks were unaccounted (4 per AG, and there > were 4 AGs in this filesystem). > > This patch is concerned with adding a new function which will walk the free > extents in AGFL and account for these AGFL blocks, while file system scanning. > > New output (After implementing this patch). > > $ uname -a > Linux dhruv-MacBookAir 3.18.0-rc7+ #3 SMP Thu Dec 25 15:29:59 IST 2014 x86_64 x86_64 x86_64 GNU/Linux > $ sudo xfs_spaceman -V > xfs_spaceman version 3.2.2 > $ sudo xfs_spaceman -c "freesp" /media/xfs > from to extents blocks pct > 1 1 16 16 0.00 > 1024 2047 1 1262 0.04 > 4096 8191 1 5126 0.15 > 8192 16383 3 35344 1.05 > 32768 65535 1 43989 1.31 > 262144 524287 3 1334894 39.78 > 524288 967428 2 1934840 57.66 > Good description, but: > ------------------------------------------------------------------------------------------- Tmhese lines confuse any utility that attempts to parse the patch. Lines starting with "---" have have special meaning to patch. They haven't come from diff or git, so you must have added them manually. That makes me think you composed this email manually from a variety of different sources. Please, learn to use git to make your changes and produce diffs that you send. git send-email is your friend - learn to use it. There's a basic howto on the xfs web site: http://xfs.org/index.php/XFS_git_howto As such, I've hacked the patch into a format I can apply - I've attached the patch generated from my git tree so you see how different it looks. > Signed-off-by: Dhruvesh Rathore > Signed-off-by: Amey Ruikar > Signed-off-by: Somdeep Dey > --- > fs/xfs/libxfs/xfs_alloc.c | 69 ++++++++++++++++ > 1 file changed, 69 insertions(+) > > --- a/fs/xfs/libxfs/xfs_alloc.c 2015-01-29 09:07:07.116439198 +0530 > +++ b/fs/xfs/libxfs/xfs_alloc.c 2015-01-29 09:06:39.664440229 +0530 > > @@ -2698,6 +2698,71 @@ > } > > > +/* > + * When we map free space we need to take into account the blocks > + * that are indexed by the AGFL. They aren't found by walking the > + * free space btrees, so we have to walk each AGFL to find them. > + */ > +static int > +xfs_alloc_agfl_freespace_map( > + struct xfs_mount *mp, > + struct xfs_agf *agf, > + struct fiemap_extent_info *fieinfo, > + xfs_agnumber_t agno, > + xfs_agblock_t sagbno, > + xfs_agblock_t eagbno) > +{ > + xfs_buf_t *agflbp; > + __be32 *agfl_bno; > + int i; > + int error = 0; > + > + error = xfs_alloc_read_agfl(mp, NULL, be32_to_cpu(agf->agf_seqno), &agflbp); Line longer than 80 columns, and the AG number we are working on is passed as a parameter to the function so there is no need to read it from the AGF. > + stray extra line. > + if (error) > + return error; > + > + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); > + > + for(i = be32_to_cpu(agf->agf_flfirst); > + i <= be32_to_cpu(agf->agf_fllast);) { Whitespace after the "for" statement, and indentation of logic inside for/if/while/etc needs to be aligned to the same column. As it is, this code doesn't work. Hint: what happens when last wraps around back to the start ofthe freelist array? last < first, and hence i > last.... Yes, I know it the code is similar to what I suggested last time I pointed out the iteration is wrong, but I'm often wrong, especially about intricate details that I've just quickly pulled a solution for off the top of my head. IOWs, don't assume what I say is correct - verifiy and test it, and then tell me I'm wrong. So, perhaps a different loop structure is appropriate? > + > + xfs_agblock_t fbno; > + xfs_extlen_t flen; > + xfs_daddr_t dbno; > + xfs_fileoff_t dlen; Trailing whitespace. > + int flags = 0; > + > + fbno = be32_to_cpu(agfl_bno[i]); > + flen = 1; > + > + /* range check - must be wholly withing requested range */ > + if (fbno < sagbno || > + (eagbno != NULLAGBLOCK && fbno + flen > eagbno)) { > + xfs_warn(mp, "10: %d/%d, %d/%d", sagbno, eagbno, fbno, flen); > + continue; Indentation: if (fbno < sagbno || (eagbno != NULLAGBLOCK && fbno + flen > eagbno)) { xfs_warn(mp, "10: %d/%d, %d/%d", sagbno, eagbno, fbno, flen); > + } > + > + /* > + * Use daddr format for all range/len calculations as that is > + * the format the range/len variables are supplied in by > + * userspace. > + */ > + > + dbno = XFS_AGB_TO_DADDR(mp, agno, fbno); > + dlen = XFS_FSB_TO_BB(mp, flen); > + > + error = -fiemap_fill_next_extent(fieinfo,BBTOB(dbno), > + BBTOB(dbno), BBTOB(dlen), flags); We don't need to negate the error any more, also whitespace after fieinfo. > + Stray whitespace in a stray line.. > + if (error) > + break; > + if (++i == XFS_AGFL_SIZE(mp)) > + i = 0; > + } > + xfs_buf_relse(agflbp); > + return error; > +} > > /* > * Map the freespace from the requested range in the requested order. > @@ -2804,6 +2869,10 @@ > } > XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > + /* Account for the free blocks in AGFL */ > + error = xfs_alloc_agfl_freespace_map(mp, XFS_BUF_TO_AGF(agbp), fieinfo, agno, sagbno, > + agno == eagno ? eagbno : NULLAGBLOCK); > + Line is much longer than 80 columns. checkpatch will catch trivial things like whitespace and line length.... Also, if there is an error, we need to handle it appropriately. Patch as applied to my tree is below. Please apply it to your tree and test it. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: Accounting for AGFL blocks in xfs_spaceman From: Dhruvesh Rathore The xfs_spaceman utility previously failed to account for AGFL blocks. Old output: $ sudo xfs_spaceman -c "freesp" /media/xfs from to extents blocks pct 1024 2047 1 1262 0.04 4096 8191 1 5126 0.15 8192 16383 3 35344 1.05 32768 65535 1 43989 1.31 262144 524287 3 1334894 39.78 524288 967428 2 1934840 57.66 As you can see the AGFL blocks were unaccounted (4 per AG, and there were 4 AGs in this filesystem). This patch adds a new function which accounts for the the free extents tracked by the AGFL. New output: $ sudo xfs_spaceman -c "freesp" /media/xfs from to extents blocks pct 1 1 16 16 0.00 1024 2047 1 1262 0.04 4096 8191 1 5126 0.15 8192 16383 3 35344 1.05 32768 65535 1 43989 1.31 262144 524287 3 1334894 39.78 524288 967428 2 1934840 57.66 [dchinner: fixed whitespace issues, agfl iteration logic, error handling] Signed-off-by: Dhruvesh Rathore Signed-off-by: Amey Ruikar Signed-off-by: Somdeep Dey --- fs/xfs/libxfs/xfs_alloc.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 1ae53ad..544c945 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2633,6 +2633,68 @@ error0: } /* + * When we map free space we need to take into account the blocks + * that are indexed by the AGFL. They aren't found by walking the + * free space btrees, so we have to walk each AGFL to find them. + */ +static int +xfs_alloc_agfl_freespace_map( + struct xfs_mount *mp, + struct xfs_agf *agf, + struct fiemap_extent_info *fieinfo, + xfs_agnumber_t agno, + xfs_agblock_t sagbno, + xfs_agblock_t eagbno) +{ + xfs_buf_t *agflbp; + __be32 *agfl_bno; + int i; + int error = 0; + + error = xfs_alloc_read_agfl(mp, NULL, agno, &agflbp); + if (error) + return error; + + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); + for (i = be32_to_cpu(agf->agf_flfirst);;) { + xfs_agblock_t fbno; + xfs_extlen_t flen; + xfs_daddr_t dbno; + xfs_fileoff_t dlen; + int flags = 0; + + fbno = be32_to_cpu(agfl_bno[i]); + flen = 1; + + /* range check - must be wholly withing requested range */ + if (fbno < sagbno || + (eagbno != NULLAGBLOCK && fbno + flen > eagbno)) { + xfs_warn(mp, "10: %d/%d, %d/%d", + sagbno, eagbno, fbno, flen); + continue; + } + + /* + * Use daddr format for all range/len calculations as that is + * the format the range/len variables are supplied in by + * userspace. + */ + dbno = XFS_AGB_TO_DADDR(mp, agno, fbno); + dlen = XFS_FSB_TO_BB(mp, flen); + error = fiemap_fill_next_extent(fieinfo, BBTOB(dbno), + BBTOB(dbno), BBTOB(dlen), flags); + if (error) + break; + if (i == be32_to_cpu(agf->agf_fllast)) + break; + if (++i == XFS_AGFL_SIZE(mp)) + i = 0; + } + xfs_buf_relse(agflbp); + return error; +} + +/* * Walk the extents in the tree given by the cursor, and dump them all into the * fieinfo. At the last extent in the tree, set the FIEMAP_EXTENT_LAST flag so * that we return only free space from this tree in a given request. @@ -2793,6 +2855,13 @@ xfs_alloc_freespace_map( goto put_agbp; } + /* Account for the free blocks in AGFL */ + error = xfs_alloc_agfl_freespace_map(mp, XFS_BUF_TO_AGF(agbp), + fieinfo, agno, sagbno, + agno == eagno ? eagbno : NULLAGBLOCK); + if (error) + goto put_agbp; + cur = xfs_allocbt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_BNO); error = xfs_alloc_lookup_ge(cur, sagbno, 1, &i); From david.grams@asmwaypoint.com Tue Feb 10 02:18:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=HTML_MESSAGE,MISSING_HEADERS 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 5A9CF7FBE for ; Tue, 10 Feb 2015 02:18:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB9F1AC003 for ; Tue, 10 Feb 2015 00:18:18 -0800 (PST) X-ASG-Debug-ID: 1423556296-04bdf06a5cfc710001-NocioJ Received: from p02c12o143.mxlogic.net (p02c12o143.mxlogic.net [208.65.145.76]) by cuda.sgi.com with ESMTP id g64tnGWVAtVDPcmn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Feb 2015 00:18:17 -0800 (PST) X-Barracuda-Envelope-From: david.grams@asmwaypoint.com X-Barracuda-Apparent-Source-IP: 208.65.145.76 Received: from unknown [4.30.106.98] (EHLO p02c12o143.mxlogic.net) by p02c12o143.mxlogic.net(mxl_mta-8.2.0-3) with ESMTP id 9ceb9d45.2b2f64606940.186085.00-512.484399.p02c12o143.mxlogic.net (envelope-from ); Tue, 10 Feb 2015 01:18:17 -0700 (MST) X-MXL-Hash: 54d9bec9270a6cbe-89f369f7d2076011a6a6baacaba9c09eda8e28bd Received: from unknown [4.30.106.98] by p02c12o143.mxlogic.net(mxl_mta-8.2.0-3) with SMTP id f6eb9d45.0.185305.00-364.483513.p02c12o143.mxlogic.net (envelope-from ); Tue, 10 Feb 2015 01:18:16 -0700 (MST) X-MXL-Hash: 54d9bec85b85ef07-7cd6c63374bf3134d80a662a642b2ea3101969f1 Received: from ASMW-HDC-MBX01.ASMW.lan ([169.254.1.232]) by ASMW-HDC-CAS02.ASMW.lan ([::1]) with mapi id 14.03.0195.001; Tue, 10 Feb 2015 02:14:41 -0600 From: David Grams CC: "inf@gov.org" Subject: Thread-Index: AdBFCHU6sJDt1hGtSN2421jMLsZtNw== X-ASG-Orig-Subj: Date: Tue, 10 Feb 2015 08:14:40 +0000 Message-ID: <60D88C3A9E50C545809885E19E278BA97DAD7046@ASMW-HDC-MBX01.ASMW.lan> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.0.1.18] Content-Type: multipart/alternative; boundary="_000_60D88C3A9E50C545809885E19E278BA97DAD7046ASMWHDCMBX01ASM_" MIME-Version: 1.0 X-AnalysisOut: [v=2.1 cv=b5Wm472x c=1 sm=1 tr=0 a=KDPjGHc5j+Zfw6Axu9qibA==] X-AnalysisOut: [:117 a=KDPjGHc5j+Zfw6Axu9qibA==:17 a=9cW_t1CCXrUA:10 a=8Fz] X-AnalysisOut: [r_lVmoLoA:10 a=BLceEmwcHowA:10 a=xqWC_Br6kY4A:10 a=bgZragf] X-AnalysisOut: [-AAAA:8 a=YlVTAMxIAAAA:8 a=0HtSIViG9nkA:10 a=UqCG9HQmAAAA:] X-AnalysisOut: [8 a=WWeFYkwwhVraKjgS4oIA:9 a=pvA44qeTxYYA:10 a=-J9vjdt6dCM] X-AnalysisOut: [A:10 a=1mLe5Y4s6lQA:10 a=PLh0vlDMQrcA:10 a=9ywJM3PoFNgA:10] X-AnalysisOut: [ a=HINwG6-LVn8A:10 a=s-dgR1TYEa2-ywpJF90A:9 a=_W_S_7VecoQA] X-AnalysisOut: [:10 a=tEwrwVWBLzUA:10 a=c8EEyKS2FzYA:10] X-Spam: [F=0.5500000000; CM=0.500; MH=0.550(2015021001); S=0.200(2014051901)] X-MAIL-FROM: X-SOURCE-IP: [4.30.106.98] X-Barracuda-Connect: p02c12o143.mxlogic.net[208.65.145.76] X-Barracuda-Start-Time: 1423556297 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.52 X-Barracuda-Spam-Status: No, SCORE=2.52 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, MISSING_SUBJECT, MISSING_SUBJECT_2, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15099 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header --_000_60D88C3A9E50C545809885E19E278BA97DAD7046ASMWHDCMBX01ASM_ Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: quoted-printable =F1 Mrs.Clany, =C5=D3=D4=D8 =D0=D2=CF=C5=CB=D4 =C9 =D7=D9 =C4=CF=CC=D6=CE= =D9 =D0=CF=CD=CF=DE=D8 =CD=CE=C5 =DA=C1=CB=CF=CE=DE=C9=D4=D8 =C9=DA-=DA=C1 = =CD=CF=C5 =DA=C4=CF=D2=CF=D7=D8=C5, =D7=D3=C5 =C4=CF=D3=D4=D5=D0=CE=CF, =D3= =D7=D1=D6=C9=D4=C5=D3=D8 =D3=CF =CD=CE=CF=CA: nelsnclay3@outlook.com --_000_60D88C3A9E50C545809885E19E278BA97DAD7046ASMWHDCMBX01ASM_ Content-Type: text/html; charset="koi8-r" Content-Transfer-Encoding: quoted-printable --_000_60D88C3A9E50C545809885E19E278BA97DAD7046ASMWHDCMBX01ASM_-- From cmaiolino@redhat.com Tue Feb 10 04:06:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6C9947FBE for ; Tue, 10 Feb 2015 04:06:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4C85E304043 for ; Tue, 10 Feb 2015 02:06:58 -0800 (PST) X-ASG-Debug-ID: 1423562814-04bdf06a5bfe850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AmeJsEq0a7UZYYk6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Feb 2015 02:06:54 -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-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1AA6psi007169 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 10 Feb 2015 05:06:52 -0500 Received: from hades.maiolino.org (dhcp-1-103.brq.redhat.com [10.34.1.103]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1AA6lhI026284 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Tue, 10 Feb 2015 05:06:50 -0500 Date: Tue, 10 Feb 2015 08:06:47 -0200 From: Carlos Maiolino To: Eric Sandeen Cc: Dave Chinner , Brian Foster , Eric Sandeen , xfs-oss Subject: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Message-ID: <20150210100647.GB1735@hades.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: pass mp to XFS_WANT_CORRUPTED_* Mail-Followup-To: Eric Sandeen , Dave Chinner , Brian Foster , Eric Sandeen , xfs-oss References: <54D53E8C.8070207@redhat.com> <20150208213502.GA4251@dastard> <20150209130926.GA18336@laptop.bfoster> <20150209211744.GT12722@dastard> <20150209214359.GN18336@laptop.bfoster> <20150209215827.GW12722@dastard> <54D94A2A.8020906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54D94A2A.8020906@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423562814 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 09, 2015 at 06:00:42PM -0600, Eric Sandeen wrote: > On 2/9/15 3:58 PM, Dave Chinner wrote: > > On Mon, Feb 09, 2015 at 04:43:59PM -0500, Brian Foster wrote: > >> On Tue, Feb 10, 2015 at 08:17:44AM +1100, Dave Chinner wrote: > > ... > > >> Sure, but ASSERT_CORRUPT_RET() is the same length as the example above. > >> ASSERT_CORRUPT_GOTO() is only a few chars longer than the associated > >> example. We could still use WANT over ASSERT I suppose to shorten it up > >> further. Either of those are at least still self-explanatory in my > >> opinion. > > > > Thinking on it a bit further, the XFS_WANT_CORRUPTED macros have an > > internal ASSERT in them, so they are effectively an ASSERT > > statement. I could live with those names, especially as ASSERT is > > something that can be compiled into production kernels via > > CONFIG_XFS_WARN=y to turn them into error messages... > > Sooooo you all want "ASSERT_CORRUPTED_RET / ASSERT_CORRUPTED_GOTO" ? > > In a light mauve? ;) > I could live with that, better a relative big macro's name than a shorter abbreviated one that you should buy a crystal ball to really understand what it means :) > -Eric > > > Cheers, > > > > Dave. > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From david@fromorbit.com Tue Feb 10 04:18:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4DB857FC3 for ; Tue, 10 Feb 2015 04:18:00 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB411AC004 for ; Tue, 10 Feb 2015 02:17:56 -0800 (PST) X-ASG-Debug-ID: 1423563474-04cbb01163f5060001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id AKlVNeWz7kI7gEy6 for ; Tue, 10 Feb 2015 02:17:54 -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: AgAVADTa2VR5LPv2PGdsb2JhbABcgwaBLIIzg3mqEQEBAQEBAQaCdJVBAgIBAQKBIEQBAQEBAQEFAQEBATg7hA0BBTocIxAIAw4KCSUPBQ0YAwcCGBOIGQMQyDANC4VVAQEBAQYCAR8YhWyHSYFGZAeDFoEUBYRQCniRNgaBP4pCgjKGA4QkKjGBAoFAAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Feb 2015 20:47:53 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YL7tA-0006zW-O1; Tue, 10 Feb 2015 21:17:52 +1100 Date: Tue, 10 Feb 2015 21:17:52 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman Message-ID: <20150210101752.GB12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman References: <54ca35b7.2786440a.6990.450d@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ca35b7.2786440a.6990.450d@mx.google.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423563474 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15101 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b On Thu, Jan 29, 2015 at 06:59:22PM +0530, Dhruvesh Rathore wrote: > > This patch is concerned with the changes to be done in kernel space code for > turning FS_IOC_FIEMAPFS present in the earlier version of xfs_spaceman > into an XFS specific ioctl called XFS_IOC_FIEMAPFS, which uses all existing > fiemap insfrastructure. > By introducing XFS_IOC_FIMEAPFS ioctl, it can be seperated from file based > fiemap commands and allows us to review it and push it as we need, making the > process much simpler. > > ---------------------------------------------------------------------------------------- > > Signed-off-by: Dhruvesh Rathore > Signed-off-by: Amey Ruikar > Signed-off-by: Somdeep Dey > --- > fs/ioctl.c | 3 ++- > include/linux/fs.h | 6 ++++++ > fs/xfs/xfs_ioctl.c | 55 +++++++++++++ > fs/xfs/xfs_fs.h | 1 + > 4 files changed, 64 insertions(+), 1 deletion(-) Ok, so this patch doesn't remove any of the now unused functionality I added to support the VFS based ioctl. What I'm going to do with this is combine it with the initial "introduce FS_IOC_FIEMAP" patch I wrote (including all it's documentation!) as the first patch of the kernel side patch series to introduced XFS_IOC_FIEMAPFS. Cheers, Dave. -- Dave Chinner david@fromorbit.com From harold2@inbox.ru Tue Feb 10 05:04:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A91587FC6 for ; Tue, 10 Feb 2015 05:04:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88E0C8F8073 for ; Tue, 10 Feb 2015 03:04:48 -0800 (PST) X-ASG-Debug-ID: 1423566285-04bdf06a5bff900001-NocioJ Received: from [93.174.116.185] ([93.174.116.185]) by cuda.sgi.com with ESMTP id aOwo6vHanEhXl9Mj for ; Tue, 10 Feb 2015 03:04:46 -0800 (PST) X-Barracuda-Envelope-From: harold2@inbox.ru X-Barracuda-Apparent-Source-IP: 93.174.116.185 Received: from [176.104.157.127] (helo=uojolcgi.uvzdiqhpkz.ru) by with esmtpa (Exim 4.69) (envelope-from ) id 1MMOBQ-1747nc-ZN for xfs@oss.sgi.com; Tue, 10 Feb 2015 14:04:46 +0300 From: =?koi8-r?B?IPbEwc7P1w==?= To: Subject: =?koi8-r?B?6c7UxdLF087ZyiDQz8TB0s/LIM7BIDggzcHS1MEuIO/eydPUydTFzA==?= =?koi8-r?B?2CDOz9fPx88g0M/Lz8zFzsnR?= Date: Tue, 10 Feb 2015 14:04:46 +0300 X-ASG-Orig-Subj: =?koi8-r?B?6c7UxdLF087ZyiDQz8TB0s/LIM7BIDggzcHS1MEuIO/eydPUydTFzA==?= =?koi8-r?B?2CDOz9fPx88g0M/Lz8zFzsnR?= MIME-Version: 1.0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 8bit X-Mailer: iyzelz-52 Message-ID: <6704574668.6ZV7YR2L198080@ulkcvkfcalk.tvujrytpzltqrb.ru> X-Barracuda-Connect: UNKNOWN[93.174.116.185] X-Barracuda-Start-Time: 1423566285 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15102 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 8 ? ! - , , , . : - . - , , , !!! - . - , . - . ! . (966) 28-2-0 From bfoster@redhat.com Tue Feb 10 06:58:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF82F7FC9 for ; Tue, 10 Feb 2015 06:58:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 915B9304053 for ; Tue, 10 Feb 2015 04:58:44 -0800 (PST) X-ASG-Debug-ID: 1423573122-04bdf06a5a113a40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id naCBrj7h5kBpSbIF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Feb 2015 04:58:43 -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 (8.14.4/8.14.4) with ESMTP id t1ACwe9d020727 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 10 Feb 2015 07:58:41 -0500 Received: from laptop.bfoster (vpn-48-232.rdu2.redhat.com [10.10.48.232]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1ACwbbD011193 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Tue, 10 Feb 2015 07:58:39 -0500 Date: Tue, 10 Feb 2015 07:58:37 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20150210125837.GA27661@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v3 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1423252385-3063-1-git-send-email-bfoster@redhat.com> <1423252385-3063-5-git-send-email-bfoster@redhat.com> <20150206231615.GQ12722@dastard> <20150208160600.GB2927@bfoster.bfoster> <20150208215710.GC4251@dastard> <20150209151502.GB18336@laptop.bfoster> <20150209214815.GV12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150209214815.GV12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423573123 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Feb 10, 2015 at 08:48:15AM +1100, Dave Chinner wrote: > On Mon, Feb 09, 2015 at 10:15:02AM -0500, Brian Foster wrote: > > On Mon, Feb 09, 2015 at 08:57:10AM +1100, Dave Chinner wrote: > > > On Sun, Feb 08, 2015 at 11:06:01AM -0500, Brian Foster wrote: > > > > > > @@ -82,7 +84,9 @@ xfs_inobt_update( > > > > > > union xfs_btree_rec rec; > > > > > > > > > > > > rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); > > > > > > - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); > > > > > > + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); > > > > > > + rec.inobt.ir_count = irec->ir_count; > > > > > > + rec.inobt.ir_freecount = irec->ir_freecount; > > > > > > rec.inobt.ir_free = cpu_to_be64(irec->ir_free); > > > > > > return xfs_btree_update(cur, &rec); > > > > > > } > > > > > > > > > > Hmmm - perhaps a similar set of helpers for sparse inode enabled > > > > > filesystems > > > > > > > > > > > > > We could do that for the insert/update helpers, but note again the > > > > separate helpers would not split along the lines of sparse vs full > > > > chunks. Even if we were to change the design such that they do, that > > > > would have th effect of complicating some of the subsequent code. For > > > > > > I suspect it might, but I really don't like the idea of writing > > > fields that don't actually exist (and hence are always zero) in > > > the on-disk format to disk. See, for example, the v5 superblock > > > field writes are conditional in xfs_sb_to_disk, the v3 inode field > > > writes are conditional in xfs_dinode_to_disk, etc. > > > > > > > Indeed. The point here is just that a v1/v2 differentiation might be > > more relevant than full vs. sparse. As it is, a sparse inode enabled fs > > uses all of the fields (e.g., ir_count == 64 on a full chunk). So this > > is more about providing clean backwards compatibility than deciding > > between two different "allocation types," so to speak. > > > > Beyond that, I'm more just probing for a clean use of the new on-disk > > format distinction. The references above actually use the associated > > feature checks in a single helper as opposed to a separate one, and that > > seems a bit more clean an approach to me. > > BUt that's because those object have enough information internally > to determine what the correct action to take is. An inobt record > doesn't have the internal information to say whay format it is > supposed to be in. Hence we need to enforce the use of the correct > marshalling logic in some way... > Sure, some structures have version information that is used to translate the in-core structure appropriately, but I don't see the existence or lack of such information as a trigger for using one pattern or another to do so. xfs_sb_to_disk(), xfs_bmdr_to_bmbt(), are a couple examples that use the same kind of pattern based on a feature bit. > > > > example, the merge/update code currently has no reason to care about > > > > whether it has created a full chunk out of multiple sparse chunks. This > > > > would require more code to make that distinction simply to pick the > > > > correct api, for something that can easily be done with a simple generic > > > > helper. The same goes for things like the finobt, where now > > > > lookup/update/insert has to make distinctions depending on the type of > > > > inode record. > > > > > > That was another thing that wasn't clear to me - does the finobt > > > record format change on disk? I don't think it does, as it only > > > holds a free count and a free inode bitmask, so it doesn't care > > > which bits of the chunk are allocated or not.... > > > > > > > No, it shouldn't change the format. But if we have a separate set of > > inobt helpers, it has to use one or the other depending on the type of > > record holding the inode that is freed or allocated. > > Ok, so we now have 3 instances of inode btrees that use the current > format, and one that uses the new sparse record format. (i.e. > existing inobt, existing finobt and sparse inode enable finobt vs > sparse inode inobt). That really, to me, says we need clear > demarcation.... > > > > > An alternate approach could be to stick with the generic helpers, but > > > > try and tweak them to use the appropriate on-disk format depending on > > > > the record. Then again, how can one really identify one from the other > > > > in the lookup or _get_rec() scenarios? > > > > > > Solving these problem was exactly why I suggested different helpers > > > - the btree ops structure that is chosen for the cursor is in a > > > place where we know what format we are using, and that avoids > > > needing "if (xfs_sb_version...)" checks in the helpers to determine > > > what format we need to use. > > > > > > > Hmm, I'm not sure I follow the train of thought here. The examples above > > use exactly that kind of logic within the helper. Further, some of the > > They use internal object state (i.e. inode version number, > superblock flag field in sb being translated) to make that decision. > the inobt changes use external structure state to do the > conversion... > > > > > Before I go one way or another here with regard to the on-disk data > > > > structure, care to take a look at the subsequent patch(es) that use > > > > these helpers? Patch 10 in particular pretty much sums up how these > > > > helpers are used for sparse inode record management. > > > > > > Yup, I'll get to it. > > > > > > > Thanks. I've made a quick pass and most of it makes sense save some of > > the helper business we're discussing here. I can start into some of the > > higher level refactoring, try to incorporate the on-disk record format > > union as clean as I can and we can move forward using the code of the > > next version, if that's easier. ;) > > Yup, that's fine - refactoring the code might make a difference ;) > > > > > FWIW, comments on the generic bitmap stuff is also appreciated as that's > > > > another area I'm not totally convinved is done right. :) > > > > > > Why use the generic bitmap stuff rather than the existing XFS code? > > > If that's just an in-memory change to the free mask processing, then > > > it can be done separately to the sparse inode functionality, and > > > probably should be done first in the series.... > > > > > > > http://oss.sgi.com/archives/xfs/2014-07/msg00380.html > > > > Last comment in that mail. ;) To be honest, I liked the original code > > better because it didn't require the bitmap_to_u64() helper hack and > > I didn't realise there were arch-specific warts in the generic > bitmap code. > > > ports directly to userspace (so far I've managed to get away with > > dropping that stuff entirely in userspace). Alternatively, I've done > > significantly more testing with the latest code than the initial version > > so I'd rather not change it back unless a real need arises. > > Well, either way I'd like to avoid nasty conversions if it can be > avoided. Perhaps look at the in-memory bitmaps being held in LE > format (i.e. __le64) and using the primitives in > include/asm-generic/bitops/le.h to manipulate them (i.e > find_next_zero_bit_le() and friends)? Maybe that would avoid all the > problems of architectural layout of the bitmap fields and hence make > conversion simple (i.e. just a le64_to_cpu() call?) > Hmm, interesting. On a quick pass, it doesn't appear to provide some of the additional functions (e.g., weight, and) beyond set/clear/test/find. I suspect that means we'd end up open coding such things, possibly introducing more cpu<->le conversions to go back and forth between native bitwise ops and the ops provided by the utility functions. I'll see how it looks with the changes suggested so far and we can consider whether it's worth converting back from there... Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Feb 10 16:14:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B15F7FB6 for ; Tue, 10 Feb 2015 16:14:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27C10AC005 for ; Tue, 10 Feb 2015 14:14:50 -0800 (PST) X-ASG-Debug-ID: 1423606484-04cbb01162129090001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 0043BTFynNPnJCi5 for ; Tue, 10 Feb 2015 14:14:45 -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: AsENAFGC2lR5LPv2PGdsb2JhbABbgwaBLIIyg3mqFQEBAQEBAQaYNQQCAoEdRAEBAQEBAQUBAQEBODuEDQEFJxMcIxAIAw4KCSUPBSUDBxoTiCzRFgEBAQcCIBiFbIlzB4QqAQSYTYEZgwOGJoR3gz6CJByBZCoxgkMBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Feb 2015 08:44:23 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YLJ4X-0008Gh-Vk; Wed, 11 Feb 2015 09:14:22 +1100 Date: Wed, 11 Feb 2015 09:14:21 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfsprogs: Addition in debug option -d of xfs_spaceman Message-ID: <20150210221421.GP4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfsprogs: Addition in debug option -d of xfs_spaceman References: <54ca34c6.4696420a.0f32.4513@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ca34c6.4696420a.0f32.4513@mx.google.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: 1423606484 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 29, 2015 at 06:55:21PM +0530, Dhruvesh Rathore wrote: > > The xfs_spaceman utility did not have a a proper title to the content > displayed using -d (debug) option. ..... > > @@ -332,20 +332,23 @@ > static int > freesp_f( > int argc, > char **argv) > { > xfs_agnumber_t agno; > > if (!init(argc, argv)) > return 0; > > + if (dumpflag) > + printf("%8s %8s %8s\n", "agno", "agbno", "len"); > + > for (agno = 0; agno < file->geom.agcount; agno++) { > if (inaglist(agno)) > scan_ag(agno); > } > if (histcount) > printhist(); Patch does not apply to the current tree. It's got stray whitespace and lines in it that are in the original source file. I've fixed this up for the moment, but please make sure your patches apply to a clean tree. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 10 16:19:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DBBF57FAB for ; Tue, 10 Feb 2015 16:19:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB00B304043 for ; Tue, 10 Feb 2015 14:19:33 -0800 (PST) X-ASG-Debug-ID: 1423606770-04cbb01164129270001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id rxUF82cos6XQPuqB for ; Tue, 10 Feb 2015 14:19:31 -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: AsENAGuD2lR5LPv2PGdsb2JhbABbgwaBLIIyg3mqFQEBAQEBAQaYNQQCAoEeRAEBAQEBAQUBAQEBODuEDQEFJxMcIxAIAw4KCSUPBSUDBxoTiCzRDwEBCAIgGIVsiXMHhCoFmE2KQog1hCQqMYJDAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Feb 2015 08:49:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YLJ9G-0008HY-Ri; Wed, 11 Feb 2015 09:19:14 +1100 Date: Wed, 11 Feb 2015 09:19:14 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfsprogs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman Message-ID: <20150210221914.GQ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfsprogs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman References: <54ca361b.6841460a.02cf.3cca@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ca361b.6841460a.02cf.3cca@mx.google.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: 1423606770 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 29, 2015 at 07:01:02PM +0530, Dhruvesh Rathore wrote: > > This patch is concerned with the changes to be done in userspace code for > turning FS_IOC_FIEMAPFS present in the earlier version of xfs_spaceman > into an XFS specific ioctl called XFS_IOC_FIEMAPFS, which uses all existing > fiemap insfrastructure. > By introducing XFS_IOC_FIMEAPFS ioctl, it can be seperated from file based > fiemap commands and allows us to review it and push it as we need, making the > process much simpler. ..... > typedef struct histent > @@ -201,9 +201,9 @@ > fiemap->fm_length = length; > fiemap->fm_extent_count = NR_EXTENTS; > > - ret = ioctl(file->fd, FS_IOC_FIEMAPFS, (unsigned long)fiemap); > + ret = xfsctl(file->name,file->fd, XFS_IOC_FIEMAPFS, (unsigned long)fiemap); > if (ret < 0) { ^ Patch hunk is corrupt: it is missing the leading whitespace to indicate "no change on this line". I've fixed it up to apply the patch. -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 10 18:28:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 742F97F50 for ; Tue, 10 Feb 2015 18:28:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F4778F8089 for ; Tue, 10 Feb 2015 16:28:45 -0800 (PST) X-ASG-Debug-ID: 1423614522-04cb6c6b0b134180001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WQW9OgNEXKcqcamt for ; Tue, 10 Feb 2015 16:28:42 -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: AtsNAO6g2lR5LPv2PGdsb2JhbABbgwZSWoIyrgIMAQEBAQEBBpJKhWsEAgKBIEQBAQEBAQEFAQEBATg7hA0BBTocIxAIAw4KCSUPBSUDBxoTiCwO0EwBAQgCIBiFbIdmgg0HhCoFknGFXIEZgwOGJoF0gwODPoQkKjEBgkIBAQE Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl2.internode.on.net with ESMTP; 11 Feb 2015 10:58:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YLLAW-0008Vs-A7; Wed, 11 Feb 2015 11:28:40 +1100 Date: Wed, 11 Feb 2015 11:28:40 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/4] xfs: xfs_spaceman utility rework Message-ID: <20150211002840.GR4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/4] xfs: xfs_spaceman utility rework References: <54ca326a.a1c4440a.6b39.422e@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ca326a.a1c4440a.6b39.422e@mx.google.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: 1423614522 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Jan 29, 2015 at 06:45:17PM +0530, Dhruvesh Rathore wrote: > > The original kernel patch that Dave wrote for xfs_spaceman implemented > FS_IOC_FIEMAPFS ioctl, here is the original fiemap extension patch: > > http://oss.sgi.com/archives/xfs/2012-10/msg00363.html > > These patches were not posted and were just forward ported to a current > 3.18-rc7+ for-next XFS tree and were pushed to the fiemapfs branch in Dave's > kernel tree at: > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git > > > The original xfs_spaceman tool that Dave wrote to call the fiemap > interface and make use of it is here: > > http://oss.sgi.com/archives/xfs/2012-10/msg00366.html > > Dave just updated it to the 3.2.2 code base and pushed it to the > spaceman branch in this tree: > > git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git These tree branches have just been updated (via rebase) with all the changes in these patches integrated. Please update your trees and review and test the updated patches. The patches have been reshuffled and reworked, so please make sure you are happy with the attributions in the commit messages for the new patches. Cheers, Dave. -- Dave Chinner david@fromorbit.com From yy@xspring.net Wed Feb 11 01:40:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C501E7F4E for ; Wed, 11 Feb 2015 01:39:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 337DEAC004 for ; Tue, 10 Feb 2015 23:39:55 -0800 (PST) X-ASG-Debug-ID: 1423640389-04cb6c6b0a1506c0001-NocioJ Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) by cuda.sgi.com with ESMTP id lNZKYdHtYoiH9fUG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Feb 2015 23:39:52 -0800 (PST) X-Barracuda-Envelope-From: yy@xspring.net X-Barracuda-Apparent-Source-IP: 54.207.19.206 X-QQ-mid: bizesmtp2t1423640384t097t188 Received: from yinyedeMacBook-Pro (unknown [59.37.125.61]) by esmtp4.qq.com (ESMTP) with SMTP id 0 for ; Wed, 11 Feb 2015 15:39:43 +0800 (CST) X-QQ-SSF: 00100000002000909122B00A0000000 X-QQ-FEAT: 3rrtyEm/zAbp2oAXXx0uZ5dkVH0PHkPEJL5eBEhzlfLfXF6oLjjkLjSK3Rxf9 tjkeRzdPizkpMfg12RWMVOTZZYia2cYG4a3lzfAXu+pgoUsCVgD12eEc7Fg4jcTmQPH0pHV 8stE2CAV4ZkHE5HZ2l/kxVeRWEJyPnnw3fHooxIVpoktu1ahYOzOEh0uh0hrKCm34Bgsv2K PK6bsp61MzCWqV3v6GzvM X-QQ-GoodBg: 0 X-FOXMAIL-CODE: foxmail_code:00015C430E76 X-GUID: 5638D944-E6C0-5247-CF98-07D1DB61FA0E From: "=?utf-8?B?eXk=?=" To: "=?utf-8?B?eGZz?=" Subject: XFS buffer IO performance is very poor Mime-Version: 1.0 X-ASG-Orig-Subj: XFS buffer IO performance is very poor Content-Type: multipart/alternative; boundary="----=_NextPart_54DB0748_7CA06F70_233190F4" Content-Transfer-Encoding: 8Bit Date: Wed, 11 Feb 2015 15:39:52 +0800 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: Foxmail_for_Mac 1.0.0 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbgbr1.qq.com[54.207.19.206] X-Barracuda-Start-Time: 1423640390 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15136 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily This is a multi-part message in MIME format. ------=_NextPart_54DB0748_7CA06F70_233190F4 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGksCkkgYW0gcnVuIHNvbWUgdGVzdCB3aXRoIGZpbyBvbiBYRlMsIGFuZCBJIGZvdW5kIHRo YXQgYnVmZmVyIElPIGlzIHZlcnkgcG9vci4gVGhlc2UgYXJlIHNvbWUgcmVzdWx0OgoKCnJl YWQoaW9wcykgd3JpdGUoaW9wcykKZGlyZWN0IElPICsgZXh0MyAxODQ4ICAxMjMyCmJ1ZmZl ciBJTyArIGV4dDMgMTk3NiAxMzE5CmRpcmVjdCBJTyArIFhGUyAxOTU0IDEzMDQKYnVmZmVy IElPICsgWEZTIDMwNyAyMDMKCgpJIGRvIG5vdCB1bmRlcnN0YW5kIHdoeSBzdWNoIGEgYmln IGRpZmZlcmVuY2XvvJ9leHQzIGlzIG11Y2ggYmV0dGVyLgpkaXJlY3QgSU8gcGFyYW1ldGVy czoKZmlvIC0tZmlsZW5hbWU9L2RhdGExL2Zpby5kYXQg4oCUZGlyZWN0PTEgLS10aHJlYWQg LS1ydz1yYW5kcncgLS1yd21peHJlYWQ9NjAgLS1pb2VuZ2luZT1saWJhaW8gLS1ydW50aW1l PTMwMCAtLWlvZGVwdGg9MSAtLXNpemU9NDBHIC0tbnVtam9icz0zMiAtbmFtZT10ZXN0X3J3 IC0tZ3JvdXBfcmVwb3J0aW5nIC0tYnM9MTZrIOKAlHRpbWVfYmFzZQoKCmJ1ZmZlciBJTyBw YXJhbWV0ZXM6CmZpbyAtLWZpbGVuYW1lPS9kYXRhMS9maW8uZGF0IC0tZGlyZWN0PTAgLS10 aHJlYWQgLS1ydz1yYW5kcncgLS1yd21peHJlYWQ9NjAgLS1pb2VuZ2luZT1saWJhaW8gLS1y dW50aW1lPTMwMCAtLWlvZGVwdGg9MSAtLXNpemU9NDBHIC0tbnVtam9icz0zMiAtbmFtZT10 ZXN0X3J3IC0tZ3JvdXBfcmVwb3J0aW5nIC0tYnM9MTZrIOKAlHRpbWVfYmFzZQoKCnRoZSBz eXN0ZW0gSSd2ZSB1c2VkIGZvciBteSB0ZXN0czoKSFcgc2VydmVyOiA0IGNvcmVzIChJbnRl bCksIDMyR0IgUkFNLCBydW5uaW5nIFJIRUwgNi41Cktlcm5lbDoyLjYuMzItNDMxLmVsNi54 ODZfNjQKc3RvcmFnZTogMTBkaXNrcyBSQUlEMSswLCBzdHJpcGUgc2l6ZTogMjU2S0IKCgpY RlMgZm9ybWF0IHBhcmFtZXRlczoKI21rZnMueGZzIC1kIHN1PTI1Nmssc3c9NSAvZGV2L3Nk YjEKI2NhdCAvcHJvYy9tb3VudHMKL2Rldi9zZGIxIC9kYXRhMSB4ZnMgcncsbm9hdGltZSxh dHRyMixkZWxheWxvZyxub2JhcnJpZXIsbG9nYnNpemU9MjU2ayxzdW5pdD01MTIsc3dpZHRo PTI1NjAsbm9xdW90YSAwIDAKI2ZkaXNrIC11bApEZXZpY2UgQm9vdCAgIFN0YXJ0ICAgICBF bmQgICBCbG9ja3MgIElkIFN5c3RlbQovZGV2L3NkYjEgICAgICAgMTI4IDI5MjkzNTYzNTkg MTQ2NDY3ODExNiAgODMgTGludXgKCgoKCiMgZmlvIC0tZmlsZW5hbWU9L2RhdGExL2Zpby5k YXQgLS1kaXJlY3Q9MCAtLXRocmVhZCAtLXJ3PXJhbmRydyAtLXJ3bWl4cmVhZD02MCAtLWlv ZW5naW5lPWxpYmFpbyAtLXJ1bnRpbWU9MzAwIC0taW9kZXB0aD0xIC0tc2l6ZT00MEcgLS1u dW1qb2JzPTMyIC1uYW1lPXRlc3RfcncgLS1ncm91cF9yZXBvcnRpbmcgLS1icz0xNmsgLS10 aW1lX2Jhc2UKdGVzdF9ydzogKGc9MCk6IHJ3PXJhbmRydywgYnM9MTZLLTE2Sy8xNkstMTZL LzE2Sy0xNkssIGlvZW5naW5lPWxpYmFpbywgaW9kZXB0aD0xCi4uLgp0ZXN0X3J3OiAoZz0w KTogcnc9cmFuZHJ3LCBicz0xNkstMTZLLzE2Sy0xNksvMTZLLTE2SywgaW9lbmdpbmU9bGli YWlvLCBpb2RlcHRoPTEKZmlvLTIuMC4xMwpTdGFydGluZyAzMiB0aHJlYWRzCkpvYnM6IDMy IChmPTMyKTogW21tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXSBbMTAwLjAlIGRv bmVdIFs1NDY2Sy8zNjQ0Sy8wSyAvc10gWzM0MSAvMjI3IC8wIGlvcHNdIFtldGEgMDBtOjAw c10KdGVzdF9ydzogKGdyb3VwaWQ9MCwgam9icz0zMik6IGVycj0gMDogcGlkPTU3MTE6IFdl ZCBGZWIgMTEgMTU6MjY6MzAgMjAxNQogcmVhZCA6IGlvPTE0NDIuMk1CLCBidz00OTIyLjNL Qi9zLCBpb3BzPTMwNyAsIHJ1bnQ9MzAwMDEwbXNlYwogIHNsYXQgKHVzZWMpOiBtaW49NyAs IG1heD0xMjUzNDUgLCBhdmc9NTc2NS41Miwgc3RkZXY9Mzc0MS42MQogIGNsYXQgKHVzZWMp OiBtaW49MCAsIG1heD0xOTIgLCBhdmc9IDIuNzIsIHN0ZGV2PSAxLjEyCiAgbGF0ICh1c2Vj KTogbWluPTcgLCBtYXg9MTI1MzQ4ICwgYXZnPTU3NzAuMDksIHN0ZGV2PTM3NDEuNjgKICBj bGF0IHBlcmNlbnRpbGVzICh1c2VjKToKICB8IDEuMDB0aD1bICAxXSwgNS4wMHRoPVsgIDJd LCAxMC4wMHRoPVsgIDJdLCAyMC4wMHRoPVsgIDJdLAogIHwgMzAuMDB0aD1bICAyXSwgNDAu MDB0aD1bICAzXSwgNTAuMDB0aD1bICAzXSwgNjAuMDB0aD1bICAzXSwKICB8IDcwLjAwdGg9 WyAgM10sIDgwLjAwdGg9WyAgM10sIDkwLjAwdGg9WyAgM10sIDk1LjAwdGg9WyAgNF0sCiAg fCA5OS4wMHRoPVsgIDRdLCA5OS41MHRoPVsgIDRdLCA5OS45MHRoPVsgIDE0XSwgOTkuOTV0 aD1bICAxNl0sCiAgfCA5OS45OXRoPVsgIDIwXQogIGJ3IChLQi9zKSA6IG1pbj0gIDE2LCBt YXg9IDY5OSwgcGVyPTMuMjIlLCBhdmc9MTU4LjM3LCBzdGRldj04NS43OQogd3JpdGU6IGlv PTk3ODczNktCLCBidz0zMjYyLjRLQi9zLCBpb3BzPTIwMyAsIHJ1bnQ9MzAwMDEwbXNlYwog IHNsYXQgKHVzZWMpOiBtaW49MTAgLCBtYXg9NTc3MDQzICwgYXZnPTE0ODIxNS45Mywgc3Rk ZXY9MTI1NjUwLjQwCiAgY2xhdCAodXNlYyk6IG1pbj0wICwgbWF4PTE5OCAsIGF2Zz0gMi41 MCwgc3RkZXY9IDEuMjYKICBsYXQgKHVzZWMpOiBtaW49MTEgLCBtYXg9NTc3MDQ4ICwgYXZn PTE0ODIyMC4yMCwgc3RkZXY9MTI1NjUwLjk0CiAgY2xhdCBwZXJjZW50aWxlcyAodXNlYyk6 CiAgfCAxLjAwdGg9WyAgMV0sIDUuMDB0aD1bICAxXSwgMTAuMDB0aD1bICAxXSwgMjAuMDB0 aD1bICAyXSwKICB8IDMwLjAwdGg9WyAgMl0sIDQwLjAwdGg9WyAgMl0sIDUwLjAwdGg9WyAg M10sIDYwLjAwdGg9WyAgM10sCiAgfCA3MC4wMHRoPVsgIDNdLCA4MC4wMHRoPVsgIDNdLCA5 MC4wMHRoPVsgIDNdLCA5NS4wMHRoPVsgIDNdLAogIHwgOTkuMDB0aD1bICA0XSwgOTkuNTB0 aD1bICA2XSwgOTkuOTB0aD1bICAxNF0sIDk5Ljk1dGg9WyAgMTRdLAogIHwgOTkuOTl0aD1b ICAxN10KICBidyAoS0IvcykgOiBtaW49ICAyNSwgbWF4PSA0NDgsIHBlcj0zLjE3JSwgYXZn PTEwMy4yOCwgc3RkZXY9NDYuNzYKICBsYXQgKHVzZWMpIDogMj02LjQwJSwgND04OC4zOSUs IDEwPTQuOTMlLCAyMD0wLjI3JSwgNTA9MC4wMSUKICBsYXQgKHVzZWMpIDogMTAwPTAuMDEl LCAyNTA9MC4wMSUKIGNwdSAgICAgOiB1c3I9MC4wMCUsIHN5cz0wLjEzJSwgY3R4PTIzODg1 MywgbWFqZj0xODQ0Njc0NDA3MzcwOTU1MTUyMCwgbWluZj0xODQ0Njc0NDA3MzcwOTI3ODM3 MQogSU8gZGVwdGhzICA6IDE9MTAwLjAlLCAyPTAuMCUsIDQ9MC4wJSwgOD0wLjAlLCAxNj0w LjAlLCAzMj0wLjAlLCA9NjQ9MC4wJQogIHN1Ym1pdCAgOiAwPTAuMCUsIDQ9MTAwLjAlLCA4 PTAuMCUsIDE2PTAuMCUsIDMyPTAuMCUsIDY0PTAuMCUsID02ND0wLjAlCiAgY29tcGxldGUg OiAwPTAuMCUsIDQ9MTAwLjAlLCA4PTAuMCUsIDE2PTAuMCUsIDMyPTAuMCUsIDY0PTAuMCUs ID02ND0wLjAlCiAgaXNzdWVkICA6IHRvdGFsPXI9OTIyOTYvdz02MTE3MS9kPTAsIHNob3J0 PXI9MC93PTAvZD0wCgoKUnVuIHN0YXR1cyBncm91cCAwIChhbGwgam9icyk6CiBSRUFEOiBp bz0xNDQyLjJNQiwgYWdncmI9NDkyMktCL3MsIG1pbmI9NDkyMktCL3MsIG1heGI9NDkyMktC L3MsIG1pbnQ9MzAwMDEwbXNlYywgbWF4dD0zMDAwMTBtc2VjCiBXUklURTogaW89OTc4NzM2 S0IsIGFnZ3JiPTMyNjJLQi9zLCBtaW5iPTMyNjJLQi9zLCBtYXhiPTMyNjJLQi9zLCBtaW50 PTMwMDAxMG1zZWMsIG1heHQ9MzAwMDEwbXNlYwoKCkRpc2sgc3RhdHMgKHJlYWQvd3JpdGUp Ogogc2RiOiBpb3M9ODk2MTYvNTUxNDEsIG1lcmdlPTAvMCwgdGlja3M9NDQyNjExLzE3MTMy NSwgaW5fcXVldWU9NjEzODIzLCB1dGlsPTk3LjA4JQ== ------=_NextPart_54DB0748_7CA06F70_233190F4 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZScsICflvq7ova/pm4Xp u5EnO2NvbG9yOiMzMzM7Ij48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5k ZSc7bWFyZ2luOjA7Ij5IaSw8L3A+PHAgc3R5bGU9ImZvbnQ6MTRweC8xLjUgJ0x1Y2lkYSBH cmFuZGUnO21hcmdpbjowOyI+SSBhbSBydW4gc29tZSB0ZXN0IHdpdGggZmlvIG9uIFhGUywg YW5kIEkgZm91bmQgdGhhdCBidWZmZXIgSU8gaXMgdmVyeSBwb29yLiBUaGVzZSBhcmUgc29t ZSByZXN1bHQ6PC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdMdWNpZGEgR3JhbmRlJztt YXJnaW46MDsiPjxicj48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxl LXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQkJPC9zcGFuPnJlYWQoaW9w cyk8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUi PgkJPC9zcGFuPndyaXRlKGlvcHMpPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBm b250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPmRpcmVjdCBJTyAr IGV4dDM8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpw cmUiPgk8L3NwYW4+MTg0OCAmbmJzcDs8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0 eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgkJPC9zcGFuPjEyMzI8c3BhbiBjbGFzcz0iQXBwbGUt dGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+PC9wPjxwIHN0eWxl PSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJn aW46IDBweDsiPmJ1ZmZlciBJTyArIGV4dDM8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4i IHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+MTk3NjxzcGFuIGNsYXNzPSJBcHBs ZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj48c3BhbiBjbGFz cz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgkJPC9zcGFuPjEz MTk8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUi Pgk8L3NwYW4+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTog J0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPmRpcmVjdCBJTyArIFhGUzxzcGFuIGNs YXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQk8L3NwYW4+ MTk1NDxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnBy ZSI+CTwvc3Bhbj48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1z cGFjZTpwcmUiPgkJPC9zcGFuPjEzMDQ8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0 eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdo dDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPmJ1 ZmZlciBJTyArIFhGUzxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRl LXNwYWNlOnByZSI+CQk8L3NwYW4+MzA3PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBz dHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPjxzcGFuIGNsYXNzPSJBcHBsZS10YWIt c3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQk8L3NwYW4+MjAzPC9wPjxwIHN0eWxl PSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJn aW46IDBweDsiPjxicj48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+SSBkbyBub3QgdW5kZXJzdGFu ZCB3aHkgc3VjaCBhIGJpZyBkaWZmZXJlbmNl77yfZXh0MyBpcyBtdWNoIGJldHRlci48L3A+ PHAgY2xhc3M9Ik1zb05vcm1hbCI+PGZvbnQgZmFjZT0iTHVjaWRhIEdyYW5kZSI+ZGlyZWN0 IElPICZuYnNwO3BhcmFtZXRlcnM6PC9mb250PjwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIj5m aW8gLS1maWxlbmFtZT0vZGF0YTEvZmlvLmRhdCDigJRkaXJlY3Q9MSAtLXRocmVhZCAtLXJ3 PXJhbmRydyAtLXJ3bWl4cmVhZD02MCAmbmJzcDstLWlvZW5naW5lPWxpYmFpbyAtLXJ1bnRp bWU9MzAwICZuYnNwOy0taW9kZXB0aD0xIC0tc2l6ZT00MEcgLS1udW1qb2JzPTMyICZuYnNw Oy1uYW1lPXRlc3RfcncgJm5ic3A7LS1ncm91cF9yZXBvcnRpbmcgLS1icz0xNmsg4oCUdGlt ZV9iYXNlJm5ic3A7PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxicj48L3A+PHAgY2xhc3M9 Ik1zb05vcm1hbCI+YnVmZmVyIElPIHBhcmFtZXRlczo8L3A+PHAgY2xhc3M9Ik1zb05vcm1h bCI+ZmlvIC0tZmlsZW5hbWU9L2RhdGExL2Zpby5kYXQgLS1kaXJlY3Q9MCAtLXRocmVhZCAt LXJ3PXJhbmRydyAtLXJ3bWl4cmVhZD02MCAmbmJzcDstLWlvZW5naW5lPWxpYmFpbyAtLXJ1 bnRpbWU9MzAwICZuYnNwOy0taW9kZXB0aD0xIC0tc2l6ZT00MEcgLS1udW1qb2JzPTMyICZu YnNwOy1uYW1lPXRlc3RfcncgJm5ic3A7LS1ncm91cF9yZXBvcnRpbmcgLS1icz0xNmsg4oCU dGltZV9iYXNlJm5ic3A7PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxicj48L3A+PHAgY2xh c3M9Ik1zb05vcm1hbCI+dGhlIHN5c3RlbSBJJ3ZlIHVzZWQgZm9yIG15IHRlc3RzOjwvcD48 cCBjbGFzcz0iTXNvTm9ybWFsIj5IVyBzZXJ2ZXI6IDQgY29yZXMgKEludGVsKSwgMzJHQiBS QU0sIHJ1bm5pbmcgUkhFTCA2LjU8L3A+PHAgY2xhc3M9Ik1zb05vcm1hbCI+S2VybmVsOiZu YnNwOzIuNi4zMi00MzEuZWw2Lng4Nl82NDwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIj5zdG9y YWdlOiAxMGRpc2tzIFJBSUQxKzAsIHN0cmlwZSBzaXplOiAyNTZLQiZuYnNwOzwvcD48cCBj bGFzcz0iTXNvTm9ybWFsIj48YnI+PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiPlhGUyBmb3Jt YXQgcGFyYW1ldGVzOjwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIj4jbWtmcy54ZnMgLWQgc3U9 MjU2ayxzdz01IC9kZXYvc2RiMTwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIj4jY2F0IC9wcm9j L21vdW50czwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIj4vZGV2L3NkYjEgL2RhdGExIHhmcyBy dyxub2F0aW1lLGF0dHIyLGRlbGF5bG9nLG5vYmFycmllcixsb2dic2l6ZT0yNTZrLHN1bml0 PTUxMixzd2lkdGg9MjU2MCxub3F1b3RhIDAgMDwvcD48ZGl2PiNmZGlzayAtdWw8L2Rpdj48 ZGl2PjxkaXY+RGV2aWNlIEJvb3QgJm5ic3A7ICZuYnNwOyAmbmJzcDtTdGFydCAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgRW5kICZuYnNwOyAmbmJzcDsgJm5ic3A7QmxvY2tzICZu YnNwOyBJZCAmbmJzcDtTeXN0ZW08L2Rpdj48ZGl2Pi9kZXYvc2RiMSAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAxMjggJm5ic3A7MjkyOTM1NjM1OSAmbmJz cDsxNDY0Njc4MTE2ICZuYnNwOyA4MyAmbmJzcDtMaW51eDwvZGl2PjwvZGl2PjxkaXY+PGJy PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGRpdj4jIGZpbyAtLWZpbGVuYW1lPS9kYXRh MS9maW8uZGF0IC0tZGlyZWN0PTAgLS10aHJlYWQgLS1ydz1yYW5kcncgLS1yd21peHJlYWQ9 NjAgJm5ic3A7LS1pb2VuZ2luZT1saWJhaW8gLS1ydW50aW1lPTMwMCAmbmJzcDstLWlvZGVw dGg9MSAtLXNpemU9NDBHIC0tbnVtam9icz0zMiAmbmJzcDstbmFtZT10ZXN0X3J3ICZuYnNw Oy0tZ3JvdXBfcmVwb3J0aW5nIC0tYnM9MTZrIC0tdGltZV9iYXNlJm5ic3A7PC9kaXY+PGRp dj50ZXN0X3J3OiAoZz0wKTogcnc9cmFuZHJ3LCBicz0xNkstMTZLLzE2Sy0xNksvMTZLLTE2 SywgaW9lbmdpbmU9bGliYWlvLCBpb2RlcHRoPTE8L2Rpdj48ZGl2Pi4uLjwvZGl2PjxkaXY+ dGVzdF9ydzogKGc9MCk6IHJ3PXJhbmRydywgYnM9MTZLLTE2Sy8xNkstMTZLLzE2Sy0xNkss IGlvZW5naW5lPWxpYmFpbywgaW9kZXB0aD0xPC9kaXY+PGRpdj5maW8tMi4wLjEzPC9kaXY+ PGRpdj5TdGFydGluZyAzMiB0aHJlYWRzPC9kaXY+PGRpdj5Kb2JzOiAzMiAoZj0zMik6IFtt bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV0gWzEwMC4wJSBkb25lXSBbNTQ2Nksv MzY0NEsvMEsgL3NdIFszNDEgLzIyNyAvMCAmbmJzcDtpb3BzXSBbZXRhIDAwbTowMHNdPC9k aXY+PGRpdj50ZXN0X3J3OiAoZ3JvdXBpZD0wLCBqb2JzPTMyKTogZXJyPSAwOiBwaWQ9NTcx MTogV2VkIEZlYiAxMSAxNToyNjozMCAyMDE1PC9kaXY+PGRpdj4mbmJzcDsgcmVhZCA6IGlv PTE0NDIuMk1CLCBidz00OTIyLjNLQi9zLCBpb3BzPTMwNyAsIHJ1bnQ9MzAwMDEwbXNlYzwv ZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBzbGF0ICh1c2VjKTogbWluPTcgLCBtYXg9MTI1MzQ1 ICwgYXZnPTU3NjUuNTIsIHN0ZGV2PTM3NDEuNjE8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg Y2xhdCAodXNlYyk6IG1pbj0wICwgbWF4PTE5MiAsIGF2Zz0gMi43Miwgc3RkZXY9IDEuMTI8 L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7bGF0ICh1c2VjKTogbWluPTcgLCBtYXg9 MTI1MzQ4ICwgYXZnPTU3NzAuMDksIHN0ZGV2PTM3NDEuNjg8L2Rpdj48ZGl2PiZuYnNwOyAm bmJzcDsgY2xhdCBwZXJjZW50aWxlcyAodXNlYyk6PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7 ICZuYnNwO3wgJm5ic3A7MS4wMHRoPVsgJm5ic3A7ICZuYnNwOzFdLCAmbmJzcDs1LjAwdGg9 WyAmbmJzcDsgJm5ic3A7Ml0sIDEwLjAwdGg9WyAmbmJzcDsgJm5ic3A7Ml0sIDIwLjAwdGg9 WyAmbmJzcDsgJm5ic3A7Ml0sPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO3wgMzAu MDB0aD1bICZuYnNwOyAmbmJzcDsyXSwgNDAuMDB0aD1bICZuYnNwOyAmbmJzcDszXSwgNTAu MDB0aD1bICZuYnNwOyAmbmJzcDszXSwgNjAuMDB0aD1bICZuYnNwOyAmbmJzcDszXSw8L2Rp dj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7fCA3MC4wMHRoPVsgJm5ic3A7ICZuYnNwOzNd LCA4MC4wMHRoPVsgJm5ic3A7ICZuYnNwOzNdLCA5MC4wMHRoPVsgJm5ic3A7ICZuYnNwOzNd LCA5NS4wMHRoPVsgJm5ic3A7ICZuYnNwOzRdLDwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAm bmJzcDt8IDk5LjAwdGg9WyAmbmJzcDsgJm5ic3A7NF0sIDk5LjUwdGg9WyAmbmJzcDsgJm5i c3A7NF0sIDk5LjkwdGg9WyAmbmJzcDsgMTRdLCA5OS45NXRoPVsgJm5ic3A7IDE2XSw8L2Rp dj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7fCA5OS45OXRoPVsgJm5ic3A7IDIwXTwvZGl2 PjxkaXY+Jm5ic3A7ICZuYnNwOyBidyAoS0IvcykgJm5ic3A7OiBtaW49ICZuYnNwOyAxNiwg bWF4PSAmbmJzcDs2OTksIHBlcj0zLjIyJSwgYXZnPTE1OC4zNywgc3RkZXY9ODUuNzk8L2Rp dj48ZGl2PiZuYnNwOyB3cml0ZTogaW89OTc4NzM2S0IsIGJ3PTMyNjIuNEtCL3MsIGlvcHM9 MjAzICwgcnVudD0zMDAwMTBtc2VjPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IHNsYXQgKHVz ZWMpOiBtaW49MTAgLCBtYXg9NTc3MDQzICwgYXZnPTE0ODIxNS45Mywgc3RkZXY9MTI1NjUw LjQwPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGNsYXQgKHVzZWMpOiBtaW49MCAsIG1heD0x OTggLCBhdmc9IDIuNTAsIHN0ZGV2PSAxLjI2PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZu YnNwO2xhdCAodXNlYyk6IG1pbj0xMSAsIG1heD01NzcwNDggLCBhdmc9MTQ4MjIwLjIwLCBz dGRldj0xMjU2NTAuOTQ8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgY2xhdCBwZXJjZW50aWxl cyAodXNlYyk6PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO3wgJm5ic3A7MS4wMHRo PVsgJm5ic3A7ICZuYnNwOzFdLCAmbmJzcDs1LjAwdGg9WyAmbmJzcDsgJm5ic3A7MV0sIDEw LjAwdGg9WyAmbmJzcDsgJm5ic3A7MV0sIDIwLjAwdGg9WyAmbmJzcDsgJm5ic3A7Ml0sPC9k aXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO3wgMzAuMDB0aD1bICZuYnNwOyAmbmJzcDsy XSwgNDAuMDB0aD1bICZuYnNwOyAmbmJzcDsyXSwgNTAuMDB0aD1bICZuYnNwOyAmbmJzcDsz XSwgNjAuMDB0aD1bICZuYnNwOyAmbmJzcDszXSw8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg Jm5ic3A7fCA3MC4wMHRoPVsgJm5ic3A7ICZuYnNwOzNdLCA4MC4wMHRoPVsgJm5ic3A7ICZu YnNwOzNdLCA5MC4wMHRoPVsgJm5ic3A7ICZuYnNwOzNdLCA5NS4wMHRoPVsgJm5ic3A7ICZu YnNwOzNdLDwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDt8IDk5LjAwdGg9WyAmbmJz cDsgJm5ic3A7NF0sIDk5LjUwdGg9WyAmbmJzcDsgJm5ic3A7Nl0sIDk5LjkwdGg9WyAmbmJz cDsgMTRdLCA5OS45NXRoPVsgJm5ic3A7IDE0XSw8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg Jm5ic3A7fCA5OS45OXRoPVsgJm5ic3A7IDE3XTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyBi dyAoS0IvcykgJm5ic3A7OiBtaW49ICZuYnNwOyAyNSwgbWF4PSAmbmJzcDs0NDgsIHBlcj0z LjE3JSwgYXZnPTEwMy4yOCwgc3RkZXY9NDYuNzY8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsg bGF0ICh1c2VjKSA6IDI9Ni40MCUsIDQ9ODguMzklLCAxMD00LjkzJSwgMjA9MC4yNyUsIDUw PTAuMDElPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGxhdCAodXNlYykgOiAxMDA9MC4wMSUs IDI1MD0wLjAxJTwvZGl2PjxkaXY+Jm5ic3A7IGNwdSAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDsgJm5ic3A7OiB1c3I9MC4wMCUsIHN5cz0wLjEzJSwgY3R4PTIzODg1MywgbWFqZj0x ODQ0Njc0NDA3MzcwOTU1MTUyMCwgbWluZj0xODQ0Njc0NDA3MzcwOTI3ODM3MTwvZGl2Pjxk aXY+Jm5ic3A7IElPIGRlcHRocyAmbmJzcDsgJm5ic3A7OiAxPTEwMC4wJSwgMj0wLjAlLCA0 PTAuMCUsIDg9MC4wJSwgMTY9MC4wJSwgMzI9MC4wJSwgJmd0Oz02ND0wLjAlPC9kaXY+PGRp dj4mbmJzcDsgJm5ic3A7ICZuYnNwO3N1Ym1pdCAmbmJzcDsgJm5ic3A7OiAwPTAuMCUsIDQ9 MTAwLjAlLCA4PTAuMCUsIDE2PTAuMCUsIDMyPTAuMCUsIDY0PTAuMCUsICZndDs9NjQ9MC4w JTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDtjb21wbGV0ZSAmbmJzcDs6IDA9MC4w JSwgND0xMDAuMCUsIDg9MC4wJSwgMTY9MC4wJSwgMzI9MC4wJSwgNjQ9MC4wJSwgJmd0Oz02 ND0wLjAlPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO2lzc3VlZCAmbmJzcDsgJm5i c3A7OiB0b3RhbD1yPTkyMjk2L3c9NjExNzEvZD0wLCBzaG9ydD1yPTAvdz0wL2Q9MDwvZGl2 PjxkaXY+PGJyPjwvZGl2PjxkaXY+UnVuIHN0YXR1cyBncm91cCAwIChhbGwgam9icyk6PC9k aXY+PGRpdj4mbmJzcDsgJm5ic3A7UkVBRDogaW89MTQ0Mi4yTUIsIGFnZ3JiPTQ5MjJLQi9z LCBtaW5iPTQ5MjJLQi9zLCBtYXhiPTQ5MjJLQi9zLCBtaW50PTMwMDAxMG1zZWMsIG1heHQ9 MzAwMDEwbXNlYzwvZGl2PjxkaXY+Jm5ic3A7IFdSSVRFOiBpbz05Nzg3MzZLQiwgYWdncmI9 MzI2MktCL3MsIG1pbmI9MzI2MktCL3MsIG1heGI9MzI2MktCL3MsIG1pbnQ9MzAwMDEwbXNl YywgbWF4dD0zMDAwMTBtc2VjPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5EaXNrIHN0YXRz IChyZWFkL3dyaXRlKTo8L2Rpdj48ZGl2PiZuYnNwOyBzZGI6IGlvcz04OTYxNi81NTE0MSwg bWVyZ2U9MC8wLCB0aWNrcz00NDI2MTEvMTcxMzI1LCBpbl9xdWV1ZT02MTM4MjMsIHV0aWw9 OTcuMDglPC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+CgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+PG86 cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVO LVVTIj48YnI+PC9zcGFuPjwvcD4KCgoKCgoKCgoKCgoKCgo8cCBzdHlsZT0iZm9udDoxNHB4 LzEuNSAnTHVjaWRhIEdyYW5kZSc7bWFyZ2luOjA7Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5 bGU9ImZvbnQtc2l6ZToxMC41cHQ7bXNvLWJpZGktZm9udC1zaXplOgoxMS4wcHQ7Zm9udC1m YW1pbHk6Q2FsaWJyaTttc28tYXNjaWktdGhlbWUtZm9udDptaW5vci1sYXRpbjttc28tZmFy ZWFzdC1mb250LWZhbWlseToK5a6L5L2TO21zby1mYXJlYXN0LXRoZW1lLWZvbnQ6bWlub3It ZmFyZWFzdDttc28taGFuc2ktdGhlbWUtZm9udDptaW5vci1sYXRpbjsKbXNvLWJpZGktZm9u dC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7O21zby1iaWRpLXRoZW1lLWZv bnQ6bWlub3ItYmlkaTsKbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVM7bXNvLWZhcmVhc3QtbGFu Z3VhZ2U6WkgtQ047bXNvLWJpZGktbGFuZ3VhZ2U6QVItU0EiPjxicj48L3NwYW4+PC9wPjxw IHN0eWxlPSJmb250OjE0cHgvMS41ICdMdWNpZGEgR3JhbmRlJzttYXJnaW46MDsiPjxicj48 L3A+PHAgc3R5bGU9ImZvbnQ6MTRweC8xLjUgJ0x1Y2lkYSBHcmFuZGUnO21hcmdpbjowOyI+ PGJyPjwvcD48L2Rpdj4= ------=_NextPart_54DB0748_7CA06F70_233190F4-- From boaz@plexistor.com Wed Feb 11 04:59:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 762927F50 for ; Wed, 11 Feb 2015 04:59:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62FE7304062 for ; Wed, 11 Feb 2015 02:59:00 -0800 (PST) X-ASG-Debug-ID: 1423652338-04cb6c6b0a19a5d0001-NocioJ Received: from mail-wi0-f171.google.com (mail-wi0-f171.google.com [209.85.212.171]) by cuda.sgi.com with ESMTP id NI0dA7zSgexndgVK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 02:58:58 -0800 (PST) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Apparent-Source-IP: 209.85.212.171 Received: by mail-wi0-f171.google.com with SMTP id hi2so11002859wib.4 for ; Wed, 11 Feb 2015 02:58:58 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :subject:content-type:content-transfer-encoding; bh=xvCtEeOKHtjXVXVAFSr7UtptqH5lNMeE4pB4PLoWS5c=; b=loGvJcQdFwdB0zLxyMB8wdOfXeyQvAn8yExW4BxvahA8aOwtIG6GZsdgokU3Hdglop qv2Zcd7DY2OTx4x6DebALwcFzjsA1mqeFoFBISHzNmsm3Bk3SEvCG6IZmHD+o191RDLx zxeCVoMaiZqr2IEGkWisrCI/kreqfu9MWSr9O9nk1zl08z84zmAVyNU5V513n7Gm9cBh NUJ8oZdlmSqIHt3orOQL6tf0LDcCNgU0nF/yQmkTUcs5oUz8RHxMelopUL53CIOuxjxU a+JR6T8+M8b6tsB3kY4gmnKep//lP59LUb04U9CZtkK2kOyDcRd0iwLMwu1MIvl7UTXX XoQw== X-Gm-Message-State: ALoCoQl2L8CcbL5AnMkbqwew4CBy/BgywIib01Y7wKfN3XOoK3luhk7QxY4vyyaa0t0Ebztekcjk X-Received: by 10.180.21.162 with SMTP id w2mr54583704wie.42.1423652338064; Wed, 11 Feb 2015 02:58:58 -0800 (PST) Received: from [10.0.0.5] ([207.232.55.62]) by mx.google.com with ESMTPSA id ha1sm22733595wib.24.2015.02.11.02.58.57 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Feb 2015 02:58:57 -0800 (PST) Message-ID: <54DB35F0.1010203@plexistor.com> Date: Wed, 11 Feb 2015 12:58:56 +0200 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com, linux-fsdevel Subject: shared/032 is broken on Fedora Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: shared/032 is broken on Fedora Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wi0-f171.google.com[209.85.212.171] X-Barracuda-Start-Time: 1423652338 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is not the proper patch just to show a working version for Fedora. But I think it now breaks the other ARCHs. What happens is that the output of ${MKFS_PROG}.* is: /usr/sbin/mkfs.bfs /usr/sbin/mkfs.btrfs /usr/sbin/mkfs.cramfs /usr/sbin/mkfs.ext2 /usr/sbin/mkfs.ext3 /usr/sbin/mkfs.ext4 ... So in Fedora sbin has moved to /usr/... and therefor the sed below fails. My sed foo is not good enough. How to support both places for sbin? Also why the "_supported_fs xfs btrfs"? So if all those other mkfs.* that are destructive to foreign filesystem, should the test not fail instead of skipped? Maybe if the maintainers of all these filesystems day in and day out running xfstests and see shared/032 failing, they might decide to fix their evil ways. Instead of skipping the test and the said maintainer just ignores it? Thanks Boaz --- diff --git a/tests/shared/032 b/tests/shared/032 index a410003..726e6b4 100755 --- a/tests/shared/032 +++ b/tests/shared/032 @@ -37,8 +37,8 @@ rm -f $seqres.full . ./common/filter # real QA test starts here -_supported_fs xfs btrfs +# _supported_fs xfs btrfs _supported_os Linux _require_scratch_nocheck _require_no_large_scratch_dev @@ -49,8 +49,7 @@ if [ "$FSTYP" == "btrfs" ]; then _notrun "Installed mkfs.btrfs does not support -f option" fi -echo "Silence is golden." -for fs in `echo ${MKFS_PROG}.* | sed -e 's/.sbin.mkfs.//g'` +for fs in `echo ${MKFS_PROG}.* | sed -e 's/.usr\/sbin.mkfs.//g'` do preop="" # for special input needs preargs="" # for any special pre-device options From dave@fromorbit.com Wed Feb 11 05:15:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 94BA37F50 for ; Wed, 11 Feb 2015 05:15:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8357C304053 for ; Wed, 11 Feb 2015 03:15:37 -0800 (PST) X-ASG-Debug-ID: 1423653333-04cb6c6b0919ac40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jg49HXSVdpRn49Uc for ; Wed, 11 Feb 2015 03:15:33 -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: AkAIACQ521R5LPv2PGdsb2JhbABbgwaBLIYrqhMBAQEBAQEGgUqWcYEoRAEBAQEBAQUBAQEBODuEOi87GGoDBy2ILKp1pl2GBIlohDwFhVSOGoV7iSyBdIZBgWcBCwEwHIFkKjGBAgSBPQEBAQ Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail06.adl6.internode.on.net with ESMTP; 11 Feb 2015 21:45:32 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YLVGU-00012W-DG for xfs@oss.sgi.com; Wed, 11 Feb 2015 22:15:30 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YLVGU-0006ae-C8 for xfs@oss.sgi.com; Wed, 11 Feb 2015 22:15:30 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Date: Wed, 11 Feb 2015 22:15:30 +1100 X-ASG-Orig-Subj: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Message-Id: <1423653330-25297-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423653333 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add a basic implementation of RENAME_WHITEOUT to the XFS rename code. The implementation options considered are documented in the code comments; the method chose was "copy ext4" because we are then bug-for-bug compatible with the implementation done by the overlayfs developers. I have a hacky renameat2 test for whiteouts copied from the existing renameat2 tests in xfstests, and this code behaves the same as ext4 in that rename test. I haven't done any testing with overlayfs, so who knows whether that explodes or not. The rename code is getting pretty spaghetti now - I'll end up spliting this patching whiteout support and cleanup, and I'll set what possible cleanups I can make that will help make the code a little more understandable.... Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 261 +++++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_iops.c | 2 +- 2 files changed, 205 insertions(+), 58 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index bf2d2c7..eef5db7 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2683,17 +2683,20 @@ xfs_remove( */ STATIC void xfs_sort_for_rename( - xfs_inode_t *dp1, /* in: old (source) directory inode */ - xfs_inode_t *dp2, /* in: new (target) directory inode */ - xfs_inode_t *ip1, /* in: inode of old entry */ - xfs_inode_t *ip2, /* in: inode of new entry, if it - already exists, NULL otherwise. */ - xfs_inode_t **i_tab,/* out: array of inode returned, sorted */ - int *num_inodes) /* out: number of inodes in array */ + struct xfs_inode *dp1, /* in: old (source) directory inode */ + struct xfs_inode *dp2, /* in: new (target) directory inode */ + struct xfs_inode *ip1, /* in: inode of old entry */ + struct xfs_inode *ip2, /* in: inode of new entry */ + struct xfs_inode *wino, /* in: whiteout inode */ + struct xfs_inode **i_tab,/* out: sorted array of inodes */ + int *num_inodes) /* out: inodes in array */ { xfs_inode_t *temp; int i, j; + ASSERT(*num_inodes == 5); + memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *)); + /* * i_tab contains a list of pointers to inodes. We initialize * the table here & we'll sort it. We will then use it to @@ -2701,20 +2704,19 @@ xfs_sort_for_rename( * * Note that the table may contain duplicates. e.g., dp1 == dp2. */ - i_tab[0] = dp1; - i_tab[1] = dp2; - i_tab[2] = ip1; - if (ip2) { - *num_inodes = 4; - i_tab[3] = ip2; - } else { - *num_inodes = 3; - i_tab[3] = NULL; - } + i = 0; + i_tab[i++] = dp1; + i_tab[i++] = dp2; + i_tab[i++] = ip1; + if (ip2) + i_tab[i++] = ip2; + if (wino) + i_tab[i++] = wino; + *num_inodes = i; /* * Sort the elements via bubble sort. (Remember, there are at - * most 4 elements to sort, so this is adequate.) + * most 5 elements to sort, so this is adequate.) */ for (i = 0; i < *num_inodes; i++) { for (j = 1; j < *num_inodes; j++) { @@ -2846,6 +2848,101 @@ out: } /* + * RENAME_WHITEOUT support. + * + * Whiteouts are used by overlayfs - it has a convention that a whiteout is a + * character device inode with a major:minor of 0:0. Somebody has to be in an + * altered state of mind to think this up, so whiteout inodes from this point at + * called "wino"s. + * + * Now, because it's not documented anywhere, here's what RENAME_WHITEOUT does + * on ext4: + +# echo bar > /mnt/scratch/bar +# ls -l /mnt/scratch +total 24 +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar +-rw-r--r-- 1 root root 4 Feb 11 20:22 foo +drwx------ 2 root root 16384 Feb 11 20:18 lost+found +# src/renameat2 -w /mnt/scratch/foo /mnt/scratch/bar +# ls -l /mnt/scratch +total 20 +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar +c--------- 1 root root 0, 0 Feb 11 20:23 foo +drwx------ 2 root root 16384 Feb 11 20:18 lost+found +# cat /mnt/scratch/bar +foo +# + + * In XFS rename terms, the operation that has been done is that source (foo) + * has been moved to the target (bar), which is like a nomal rename operation, + * but rather than the source being removed, it have been replaced with a wino. + * + * We can't allocate winos within the rename transaction due to allocation + * being a multi-commit transaction, and rename needs to be a single, atomic + * commit. Hence we have several options here, form most efficient to least + * efficient: + * + * - use DT_WHT in the target dirent and do no wino allocation. + * The main issue with this approach is that we need hooks in + * lookup to create a virtual chardev inode to present to userspace + * and in places where we might need to modify the dirent e.g. unlink. + * Overlayfs also needs to be taught about DT_WHT. Most invasive change, + * lowest overhead. + * + * - create a special wino in the root directory (e.g. a ".wino" dirent and + * then hardlink every new whiteout to it. This means we only need to + * create a single wino, and rename simply creates a hardlink to it. We + * can use DT_WHT for these, though using DT_CHR means we won't have to + * modify overlayfs, nor anything in userspace. Downside is we have to + * look up the wino up on every operation and create it if it doesn't + * exist. + * + * - copy ext4: create a special whiteout chardev inode for every whiteout. + * This is more complex than the above options because of the lack of + * atomicity between inode creation and the rename operation, requiring + * us to create a tmpfile inode and then linking it into the directory + * structure during the rename. At least with a tmpfile inode crashes + * between the create and rename doesn't leave unreferenced inodes or + * directory pollution around. + * + * By far the simplest thing to do is copy ext4. It's also the most + * inefficient way of supporting whiteouts, but as an initial implementation we + * can simply reuse existing functions and add a small amount of extra code the + * the rename operation to handle the *fifth* inode in the transaction. + * + * Hence that is what is implemented first. When we have time or need we can + * come back and implement one of the more efficient whiteout methods, but it's + * not necessary for the first implementation. + */ + +/* + * xfs_rename_get_wino() + * + * Return a referenced, unlinked, unlocked inode that that can be used as a + * whiteout in a rename transaction. + */ +static int +xfs_rename_get_wino( + struct xfs_inode *dp, + struct xfs_inode **wino) +{ + struct xfs_inode *tmpfile; + int error; + + error = xfs_create_tmpfile(dp, NULL, S_IFCHR | WHITEOUT_MODE, &tmpfile); + if (error) + return error; + + /* Satisfy xfs_bumplink that this is a real tmpfile */ + xfs_finish_inode_setup(tmpfile); + VFS_I(tmpfile)->i_state |= I_LINKABLE; + + *wino = tmpfile; + return 0; +} + +/* * xfs_rename */ int @@ -2867,40 +2964,52 @@ xfs_rename( xfs_fsblock_t first_block; int cancel_flags; int committed; - xfs_inode_t *inodes[4]; + xfs_inode_t *inodes[5]; + int num_inodes = 5; int spaceres; - int num_inodes; + struct xfs_inode *wino = NULL; trace_xfs_rename(src_dp, target_dp, src_name, target_name); + /* + * If we are doing a whiteout operation, get us the wino we will be + * placing at the target. + */ + if (flags & RENAME_WHITEOUT) { + ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE))); + error = xfs_rename_get_wino(target_dp, &wino); + if (error) + return error; + + /* setup target dirent info as whiteout */ + src_name->type = XFS_DIR3_FT_CHRDEV; + } + new_parent = (src_dp != target_dp); src_is_directory = S_ISDIR(src_ip->i_d.di_mode); - xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, + xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wino, inodes, &num_inodes); + cancel_flags = 0; xfs_bmap_init(&free_list, &first_block); tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME); - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); } - if (error) { - xfs_trans_cancel(tp, 0); - goto std_return; - } + if (error) + goto error_trans_cancel; + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; /* * Attach the dquots to the inodes */ error = xfs_qm_vop_rename_dqattach(inodes); - if (error) { - xfs_trans_cancel(tp, cancel_flags); - goto std_return; - } + if (error) + goto error_trans_cancel; /* * Lock all the participating inodes. Depending upon whether @@ -2921,6 +3030,8 @@ xfs_rename( xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); if (target_ip) xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); + if (wino) + xfs_trans_ijoin(tp, wino, XFS_ILOCK_EXCL); /* * If we are using project inheritance, we only allow renames @@ -2930,18 +3041,19 @@ xfs_rename( if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) { error = -EXDEV; - goto error_return; + goto error_trans_cancel; } /* * Handle RENAME_EXCHANGE flags */ if (flags & RENAME_EXCHANGE) { + ASSERT(!wino); error = xfs_cross_rename(tp, src_dp, src_name, src_ip, target_dp, target_name, target_ip, &free_list, &first_block, spaceres); if (error) - goto abort_return; + goto error_trans_abort; goto finish_rename; } @@ -2956,7 +3068,7 @@ xfs_rename( if (!spaceres) { error = xfs_dir_canenter(tp, target_dp, target_name); if (error) - goto error_return; + goto error_trans_cancel; } /* * If target does not exist and the rename crosses @@ -2967,9 +3079,9 @@ xfs_rename( src_ip->i_ino, &first_block, &free_list, spaceres); if (error == -ENOSPC) - goto error_return; + goto error_trans_cancel; if (error) - goto abort_return; + goto error_trans_abort; xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); @@ -2977,7 +3089,7 @@ xfs_rename( if (new_parent && src_is_directory) { error = xfs_bumplink(tp, target_dp); if (error) - goto abort_return; + goto error_trans_abort; } } else { /* target_ip != NULL */ /* @@ -2992,7 +3104,7 @@ xfs_rename( if (!(xfs_dir_isempty(target_ip)) || (target_ip->i_d.di_nlink > 2)) { error = -EEXIST; - goto error_return; + goto error_trans_cancel; } } @@ -3009,7 +3121,7 @@ xfs_rename( src_ip->i_ino, &first_block, &free_list, spaceres); if (error) - goto abort_return; + goto error_trans_abort; xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); @@ -3020,7 +3132,7 @@ xfs_rename( */ error = xfs_droplink(tp, target_ip); if (error) - goto abort_return; + goto error_trans_abort; if (src_is_directory) { /* @@ -3028,9 +3140,9 @@ xfs_rename( */ error = xfs_droplink(tp, target_ip); if (error) - goto abort_return; + goto error_trans_abort; } - } /* target_ip != NULL */ + } /* * Remove the source. @@ -3045,7 +3157,7 @@ xfs_rename( &first_block, &free_list, spaceres); ASSERT(error != -EEXIST); if (error) - goto abort_return; + goto error_trans_abort; } /* @@ -3071,13 +3183,21 @@ xfs_rename( */ error = xfs_droplink(tp, src_dp); if (error) - goto abort_return; + goto error_trans_abort; } - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, + /* + * On a whiteout, we only update the source dirent with the wino, + * otherwise we are removing it. + */ + if (wino) { + error = xfs_dir_replace(tp, src_dp, src_name, wino->i_ino, + &first_block, &free_list, spaceres); + } else + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, &first_block, &free_list, spaceres); if (error) - goto abort_return; + goto error_trans_abort; xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); @@ -3090,31 +3210,58 @@ finish_rename: * rename transaction goes to disk before returning to * the user. */ - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) xfs_trans_set_sync(tp); - } error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) { - xfs_bmap_cancel(&free_list); - xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | - XFS_TRANS_ABORT)); - goto std_return; + if (error) + goto error_trans_abort; + + /* + * Last thing we do is bump the link count on the wino. This means that + * failures all the way up to this point leave the wino on the unlinked + * list and so cleanup is a simple matter of dropping the remaining + * reference to it. If we fail here after bumping the link count, we're + * shutting down the filesystem so we'll never see the intermediate + * state on disk. + */ + if (wino) { + ASSERT(wino->i_d.di_nlink == 0); + error = xfs_bumplink(tp, wino); + if (error) + goto error_trans_abort; + error = xfs_iunlink_remove(tp, wino); + if (error) + goto error_trans_abort; + xfs_trans_log_inode(tp, wino, XFS_ILOG_CORE); + + /* + * now we have a real link, clear the "I'm a tmpfile" state + * flag from the inode so it doesn't accidentally get misused in + * future. + */ + VFS_I(wino)->i_state &= ~I_LINKABLE; } /* * trans_commit will unlock src_ip, target_ip & decrement * the vnode references. */ - return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); +out_release_wino: + if (wino) + IRELE(wino); + return error; - abort_return: + +error_trans_abort: cancel_flags |= XFS_TRANS_ABORT; - error_return: xfs_bmap_cancel(&free_list); +error_trans_cancel: xfs_trans_cancel(tp, cancel_flags); - std_return: - return error; + + /* Dropping the last reference on a tmpfile does the cleanup for us! */ + goto out_release_wino; } STATIC int diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 6a77ea9..d4442d1 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -393,7 +393,7 @@ xfs_vn_rename( struct xfs_name oname; struct xfs_name nname; - if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) return -EINVAL; /* if we are exchanging files, we need to set i_mode of both files */ -- 2.0.0 From jimjbbank@centurylink.net Wed Feb 11 05:38:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D9B807F50 for ; Wed, 11 Feb 2015 05:38:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B6438F8084 for ; Wed, 11 Feb 2015 03:38:13 -0800 (PST) X-ASG-Debug-ID: 1423654684-04bdf06a5b18d8f0002-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id xrv26h4w31CIJVAQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 03:38:11 -0800 (PST) X-Barracuda-Envelope-From: jimjbbank@centurylink.net X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=centurylink.net; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@centurylink.net; t=1423654683; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=R9jt7PU7qqp0tSFpPeEwkL7P3XA=; b=GmO2V0428DxnA9V8MIsXKt87fH0HL8xFMqGPis+HYAasNvSehSqjn6nvXzyy6Hrb xmzmwvkAHuC8Em/AoFEyeSQn3XNlEF84LgsJp/k/37lFPlIeUz21tmK0fVcZYOVW ubXYjuIZfCgv+UwpfSRJng7MaAvFgX2gk8Z5xn/OW+11NzLpvnz3m2mZhT5V80i9 6TNprG7gCmjfPzu3eOBkS9wkChF/FnBit2G9ROiTOmg9+NCePHIbSx6eAKy+E5PE xaQ7KUFch3TfFyRWoWFy+pUw4bILhHDs0ThUTOAizQkrG3+DeMdw1z6AK51fmHfc D+zpeMQgrjuASAJThoCg0w==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=FNOZNpUs c=1 sm=1 a=9cW_t1CCXrUA:10 a=FKkrIqjQGGEA:10 a=jPJDawAOAc8A:10 a=yEKiwCq5NtIA:10 a=I_5RNyk1AAAA:8 a=4iUaeoCYq0_jRT8LJq8A:9 a=QEXdDO2ut3YA:10 a=gSHtfwDzS2Auy-8E:21 a=5AVQqgFq-6UBx367:21 a=vI1dNY1eAAAA:8 a=8pVyiYs2AGwmS_nXZ9IA:9 a=_W_S_7VecoQA:10 a=oqTNY41KwZmHObj8:21 a=yTYSwXIJ_kWe_Gcs:21 a=HNR7tGgGFs_YiykZ:21 a=UDo720tNcInnqUF9S9yrCA==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: amltamJiYW5rQGNlbnR1cnlsaW5rLm5ldA== Received: from [10.40.66.4] ([10.40.66.4:49852] helo=md11.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id E8/24-01480-81F3BD45; Wed, 11 Feb 2015 06:38:00 -0500 Date: Wed, 11 Feb 2015 06:38:00 -0500 (EST) From: Bank Of Ireland Message-ID: <2114844606.1917491.1423654680023.JavaMail.root@centurylink.net> Subject: =?utf-8?Q?Account_Activation_Notice.=E2=80=8F=E2=80=8F?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?Account_Activation_Notice.=E2=80=8F=E2=80=8F?= Content-Type: multipart/alternative; boundary="----=_Part_1917490_1349559262.1423654680019" X-Originating-IP: [207.244.89.112] X-Mailer: Zimbra 7.2.2_GA_2852 (zclient/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1423654689 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.71 X-Barracuda-Spam-Status: No, SCORE=1.71 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA578_CH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15140 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH To: undisclosed-recipients:; ------=_Part_1917490_1349559262.1423654680019 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Dear customer, Please note that your online banking access expires soon. In order for this service to continue without any interruption, You are require to fill and confirm your details via the following link below: Bank Of Ireland online banking update: click here After completion of this step, your online account will then be automatically restored and you can easily do transfers and standing orders with one click. THE ADVANTAGES AT A GLANCE: - Account access around the clock- Quick access on current account- Online banking from the comfort of cell phone or PC- Flexible in every corner of the world- Clear accounting- High safety standards- Can be combined with telephone banking We are very pleased to be at your service Sincerely,Bank Of Ireland Customer Service. ------=_Part_1917490_1349559262.1423654680019 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
Dear customer, 
=

Please note that your online banking access expires soon. In order for this=20 service to continue without any interruption, You are require to fill=20 and confirm your details via the following link below:

Bank Of Ireland online banking update: click here

After completion of this step, your online account will then be automatically restored and you can easily do transfers and standing orders with one=20 click.

THE ADVANTAGES AT A GLANCE:

<= div style=3D"text-indent:0px;color:#000000;font-family:Calibri, sans-serif;= font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:nor= mal;text-align:start;text-transform:none;white-space:normal;word-spacing:0p= x;line-height:21.299999237060547px;font-size:15px;background-color:#ffffff;= ">- Account access around the clock
- Quick access on current accou= nt
- Online banking from the comfort of cell phone or PC
- = Flexible in every corner of the world
- Clear accounting
- = High safety standards
- Can be combined with telephone banking

We are very pleased to be at your service

Sincerely,
Bank Of Ireland Customer Service.
------=_Part_1917490_1349559262.1423654680019-- From boaz@plexistor.com Wed Feb 11 07:10:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C97607F50 for ; Wed, 11 Feb 2015 07:10:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 491A8AC008 for ; Wed, 11 Feb 2015 05:10:51 -0800 (PST) X-ASG-Debug-ID: 1423660247-04cb6c6b091bb0b0001-NocioJ Received: from mail-wg0-f53.google.com (mail-wg0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id 14CESkfgTkuh64Cq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 05:10:48 -0800 (PST) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wg0-f53.google.com with SMTP id x13so3294732wgg.12 for ; Wed, 11 Feb 2015 05:10: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:message-id:date:from:user-agent:mime-version:to :subject:references:in-reply-to:content-type :content-transfer-encoding; bh=oJq87djqMF45g6jKEMhETas4oR1fhcqXSA8g254GvMw=; b=cdH5oZJEBe4Zpf3r0bd2VSX46nwlq7tAbU5y+fm/S3Q3t3+6fA1x60SU4eb6z2y2ca Ean1GE/IoVKRkwH810KjbYWlqKElo4dM0gL78DPTunEuabfIoCPypOGuio+yAyjWN75c QlZCoZ3577X/2VrUC6EP29wEgbbPweR/zksAnkG/KWspOVyra5n5ZeYCxHvzIGNcA1Xa YNFILG7hchRsqvKNga9EjQSHw8GkLr/wJENZghS/Gtmkyff6tDF7pc083i+VxKpbCrYZ q+/QDwZ1XpFBGehdbCCuC8G31DSZeEjyfmuNNV+wnyBB1gr7gKY/IPh9xj5ZQez+HYsS LT9g== X-Gm-Message-State: ALoCoQnzIyytcXjLQyBGYGqNnTvb5FIMN2jYht5JDM0lSzrHzM3N4mToyEOkeaEWE1IlF2PHxW3c X-Received: by 10.180.88.234 with SMTP id bj10mr5593852wib.81.1423660246565; Wed, 11 Feb 2015 05:10:46 -0800 (PST) Received: from [10.0.0.5] ([207.232.55.62]) by mx.google.com with ESMTPSA id pp10sm1218682wjc.31.2015.02.11.05.10.45 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 11 Feb 2015 05:10:46 -0800 (PST) Message-ID: <54DB54D4.7010602@plexistor.com> Date: Wed, 11 Feb 2015 15:10:44 +0200 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel Subject: Re: shared/032 is broken on Fedora References: <54DB35F0.1010203@plexistor.com> X-ASG-Orig-Subj: Re: shared/032 is broken on Fedora In-Reply-To: <54DB35F0.1010203@plexistor.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1423660248 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address On 02/11/2015 12:58 PM, Boaz Harrosh wrote: > > This is not the proper patch just to show a working version for Fedora. But I think > it now breaks the other ARCHs. > > What happens is that the output of ${MKFS_PROG}.* is: > /usr/sbin/mkfs.bfs /usr/sbin/mkfs.btrfs /usr/sbin/mkfs.cramfs /usr/sbin/mkfs.ext2 /usr/sbin/mkfs.ext3 /usr/sbin/mkfs.ext4 ... > > So in Fedora sbin has moved to /usr/... and therefor the sed below fails. > My sed foo is not good enough. How to support both places for sbin? > > Also why the "_supported_fs xfs btrfs"? So if all those other mkfs.* that are destructive to > foreign filesystem, should the test not fail instead of skipped? > Maybe if the maintainers of all these filesystems day in and day out running xfstests and > see shared/032 failing, they might decide to fix their evil ways. Instead of skipping the > test and the said maintainer just ignores it? > I was thinking about fixing this test, say for ext4. And came to the conclusion. Should I not hack and fix the mount command? This problem is common to all filesystems. Why do we want to force all mkfs.* maintainers to link with some global library that checks all registered FSs and see existence of an FS, something like blkid. Why not link that library to the driver "mount" command, and not call the mkfs.$type in question at all unless say --force flag is supplied. This way I fix this test for all FSs past and future. (Should I send a patch?) Thanks Boaz From bfoster@redhat.com Wed Feb 11 07:35:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39BB87F37 for ; Wed, 11 Feb 2015 07:35:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8270AC004 for ; Wed, 11 Feb 2015 05:35:37 -0800 (PST) X-ASG-Debug-ID: 1423661736-04bdf06a5c1aabb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id b7BHE0l4oTCvCKEZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 05:35:36 -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 (8.14.4/8.14.4) with ESMTP id t1BDZYpA003341 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 11 Feb 2015 08:35:35 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1BDZXk7025224; Wed, 11 Feb 2015 08:35:34 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 10B2E1256B4; Wed, 11 Feb 2015 08:35:33 -0500 (EST) Date: Wed, 11 Feb 2015 08:35:33 -0500 From: Brian Foster To: yy Cc: xfs Subject: Re: XFS buffer IO performance is very poor Message-ID: <20150211133531.GA15701@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423661736 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 11, 2015 at 03:39:52PM +0800, yy wrote: > Hi, > I am run some test with fio on XFS, and I found that buffer IO is very poor. These are some result: > > > read(iops) write(iops) > direct IO + ext3 1848 1232 > buffer IO + ext3 1976 1319 > direct IO + XFS 1954 1304 > buffer IO + XFS 307 203 > > > I do not understand why such a big difference?ext3 is much better. > direct IO parameters: > fio --filename=/data1/fio.dat —direct=1 --thread --rw=randrw --rwmixread=60 --ioengine=libaio --runtime=300 --iodepth=1 --size=40G --numjobs=32 -name=test_rw --group_reporting --bs=16k —time_base > > > buffer IO parametes: > fio --filename=/data1/fio.dat --direct=0 --thread --rw=randrw --rwmixread=60 --ioengine=libaio --runtime=300 --iodepth=1 --size=40G --numjobs=32 -name=test_rw --group_reporting --bs=16k —time_base > > I just gave this fio command a whirl on a rhel6 box I have here. It looks to me that this is sending 32 parallel randrw jobs to a single file. With buffered I/O, these writes are exclusively locked whereas direct I/O is shared locked. So you aren't really exercising the filesystem or storage by pounding on the same file with 32 threads. If you use separate files for buffered I/O (e.g., remove the --filename param), you'll probably see a bump in iops. Brian > the system I've used for my tests: > HW server: 4 cores (Intel), 32GB RAM, running RHEL 6.5 > Kernel:2.6.32-431.el6.x86_64 > storage: 10disks RAID1+0, stripe size: 256KB > > > XFS format parametes: > #mkfs.xfs -d su=256k,sw=5 /dev/sdb1 > #cat /proc/mounts > /dev/sdb1 /data1 xfs rw,noatime,attr2,delaylog,nobarrier,logbsize=256k,sunit=512,swidth=2560,noquota 0 0 > #fdisk -ul > Device Boot Start End Blocks Id System > /dev/sdb1 128 2929356359 1464678116 83 Linux > > > > > # fio --filename=/data1/fio.dat --direct=0 --thread --rw=randrw --rwmixread=60 --ioengine=libaio --runtime=300 --iodepth=1 --size=40G --numjobs=32 -name=test_rw --group_reporting --bs=16k --time_base > test_rw: (g=0): rw=randrw, bs=16K-16K/16K-16K/16K-16K, ioengine=libaio, iodepth=1 > ... > test_rw: (g=0): rw=randrw, bs=16K-16K/16K-16K/16K-16K, ioengine=libaio, iodepth=1 > fio-2.0.13 > Starting 32 threads > Jobs: 32 (f=32): [mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm] [100.0% done] [5466K/3644K/0K /s] [341 /227 /0 iops] [eta 00m:00s] > test_rw: (groupid=0, jobs=32): err= 0: pid=5711: Wed Feb 11 15:26:30 2015 > read : io=1442.2MB, bw=4922.3KB/s, iops=307 , runt=300010msec > slat (usec): min=7 , max=125345 , avg=5765.52, stdev=3741.61 > clat (usec): min=0 , max=192 , avg= 2.72, stdev= 1.12 > lat (usec): min=7 , max=125348 , avg=5770.09, stdev=3741.68 > clat percentiles (usec): > | 1.00th=[ 1], 5.00th=[ 2], 10.00th=[ 2], 20.00th=[ 2], > | 30.00th=[ 2], 40.00th=[ 3], 50.00th=[ 3], 60.00th=[ 3], > | 70.00th=[ 3], 80.00th=[ 3], 90.00th=[ 3], 95.00th=[ 4], > | 99.00th=[ 4], 99.50th=[ 4], 99.90th=[ 14], 99.95th=[ 16], > | 99.99th=[ 20] > bw (KB/s) : min= 16, max= 699, per=3.22%, avg=158.37, stdev=85.79 > write: io=978736KB, bw=3262.4KB/s, iops=203 , runt=300010msec > slat (usec): min=10 , max=577043 , avg=148215.93, stdev=125650.40 > clat (usec): min=0 , max=198 , avg= 2.50, stdev= 1.26 > lat (usec): min=11 , max=577048 , avg=148220.20, stdev=125650.94 > clat percentiles (usec): > | 1.00th=[ 1], 5.00th=[ 1], 10.00th=[ 1], 20.00th=[ 2], > | 30.00th=[ 2], 40.00th=[ 2], 50.00th=[ 3], 60.00th=[ 3], > | 70.00th=[ 3], 80.00th=[ 3], 90.00th=[ 3], 95.00th=[ 3], > | 99.00th=[ 4], 99.50th=[ 6], 99.90th=[ 14], 99.95th=[ 14], > | 99.99th=[ 17] > bw (KB/s) : min= 25, max= 448, per=3.17%, avg=103.28, stdev=46.76 > lat (usec) : 2=6.40%, 4=88.39%, 10=4.93%, 20=0.27%, 50=0.01% > lat (usec) : 100=0.01%, 250=0.01% > cpu : usr=0.00%, sys=0.13%, ctx=238853, majf=18446744073709551520, minf=18446744073709278371 > IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, =64=0.0% > submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, =64=0.0% > complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, =64=0.0% > issued : total=r=92296/w=61171/d=0, short=r=0/w=0/d=0 > > > Run status group 0 (all jobs): > READ: io=1442.2MB, aggrb=4922KB/s, minb=4922KB/s, maxb=4922KB/s, mint=300010msec, maxt=300010msec > WRITE: io=978736KB, aggrb=3262KB/s, minb=3262KB/s, maxb=3262KB/s, mint=300010msec, maxt=300010msec > > > Disk stats (read/write): > sdb: ios=89616/55141, merge=0/0, ticks=442611/171325, in_queue=613823, util=97.08% > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From alexander.tsvetkov@oracle.com Wed Feb 11 07:50:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 877A97F50 for ; Wed, 11 Feb 2015 07:50:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 75ACA304062 for ; Wed, 11 Feb 2015 05:50:36 -0800 (PST) X-ASG-Debug-ID: 1423662632-04cb6c6b0a1bc3e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kxxKrYlwcfGkx45T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 05:50:33 -0800 (PST) X-Barracuda-Envelope-From: alexander.tsvetkov@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t1BDoWI0013626 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 11 Feb 2015 13:50:32 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1BDoVkH005633 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Wed, 11 Feb 2015 13:50:31 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1BDoU28024696 for ; Wed, 11 Feb 2015 13:50:30 GMT Received: from [10.162.81.93] (/10.162.81.93) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 11 Feb 2015 05:50:30 -0800 Message-ID: <54DB5E70.80607@oracle.com> Date: Wed, 11 Feb 2015 16:51:44 +0300 From: Alexander Tsvetkov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs_logprint segfault with external log Content-Type: text/plain; charset=utf-8; format=flowed X-ASG-Orig-Subj: xfs_logprint segfault with external log Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1423662633 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, I've obtained corrupted xfs log after some sanity xfs testing: "log=logfile log_size=855 dd if=/dev/zero "of=$log" bs=4096 count=$log_size loopdev=$(losetup -f) losetup $loopdev $log mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT sync umount $SCRATCH_MNT xfs_logprint -l $loopdev $SCRATCH_DEV" Test makes crc enabled xfs filesystem with the external log of minimal allowed size and then creates on this fs the small directory tree with sub directories and files of fixed depth and size with help of fdtree utility: https://computing.llnl.gov/?set=code&page=sio_downloads After that xfs_logprint stably reports bad data in log: "Oper (307): tid: eec9b0c7 len: 16 clientid: TRANS flags: none EXTENTS inode data Oper (308): tid: 41000000 len: 805306368 clientid: ERROR flags: none LOCAL attr data ============================================================================ cycle: 1 version: 2 lsn: 1,3138 tail_lsn: 1,2 length of Log Record: 32256 prev offset: 3074 num ops: 375 uuid: 39a962b7-4c0d-4e0e-8bcd-39471f93bc1d format: little endian linux h_size: 32768 ---------------------------------------------------------------------------- Oper (0): tid: eec9b0c7 len: 48 clientid: TRANS flags: none ********************************************************************** * ERROR: data block=3138 * ********************************************************************** xfs_logprint: unknown log operation type (2e00) Bad data in log" Subsequent call to "xfs_repair -n -l $loopdev $SCRATCH_DEV" passes and filesystem is mounted without errors. I've supposed the using of inappropriate log size so updated log_size to default mkfs.xfs value for this device: "log_size=2560". After that xfs_logprint core dumped with segfault (race condition): "Feb 11 13:55:42 fedora.fedora kernel: xfs_logprint[14007]: segfault at 29f16768 ip 00000000004028ed sp 00007fff61b46850 error 4 in xfs_logprint[400000+4e000]" I have the following configuration on vbox virtual machine with vdi, fixed size /dev/sdb: [root@fedora alex]# cat /etc/issue Fedora release 20 (Heisenbug) Kernel \r on an \m (\l) [root@fedora alex]# uname -ir 3.19.0-rc6 x86_64 [root@fedora alex]# mkfs.xfs -V mkfs.xfs version 3.2.2 [root@fedora alex]# xfs_logprint -V xfs_logprint version 3.2.2 [root@fedora alex]# fdisk -l /dev/sdb Disk /dev/sdb: 8 GiB, 8589934592 bytes, 16777216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes abrt data with sosreport are collected and available on request. Thanks, Alexander Tsvetkov From sandeen@sandeen.net Wed Feb 11 09:51:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 707227F54 for ; Wed, 11 Feb 2015 09:51:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D74A8F8073 for ; Wed, 11 Feb 2015 07:51:59 -0800 (PST) X-ASG-Debug-ID: 1423669917-04cbb011641a99c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id kooJPcxdnPsF5I4t for ; Wed, 11 Feb 2015 07:51:57 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id EADE86371E3F; Wed, 11 Feb 2015 09:51:54 -0600 (CST) Message-ID: <54DB7A9A.2070109@sandeen.net> Date: Wed, 11 Feb 2015 09:51:54 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Alexander Tsvetkov , xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log In-Reply-To: <54DB5E70.80607@oracle.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: 1423669917 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/11/15 7:51 AM, Alexander Tsvetkov wrote: > Hello, > > I've obtained corrupted xfs log after some sanity xfs testing: > > "log=logfile > log_size=855 > > dd if=/dev/zero "of=$log" bs=4096 count=$log_size > loopdev=$(losetup -f) > losetup $loopdev $log > > mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV > mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT > ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT > sync > umount $SCRATCH_MNT > > xfs_logprint -l $loopdev $SCRATCH_DEV" > > Test makes crc enabled xfs filesystem with the external log of minimal allowed size and then creates on this fs the small directory tree > with sub directories and files of fixed depth and size with help of fdtree utility: https://computing.llnl.gov/?set=code&page=sio_downloads > > After that xfs_logprint stably reports bad data in log: TBH, xfs_logprint has always been a little buggy in corners. It's a diagnostic/developer tool, and as such has not been made as robust as tools that users need to use every day. Still, we'd hope for no segfaults or errors. ;) > "Oper (307): tid: eec9b0c7 len: 16 clientid: TRANS flags: none > EXTENTS inode data > Oper (308): tid: 41000000 len: 805306368 clientid: ERROR flags: none > LOCAL attr data > > ============================================================================ > cycle: 1 version: 2 lsn: 1,3138 tail_lsn: 1,2 > length of Log Record: 32256 prev offset: 3074 num ops: 375 > uuid: 39a962b7-4c0d-4e0e-8bcd-39471f93bc1d format: little endian linux > h_size: 32768 > ---------------------------------------------------------------------------- > Oper (0): tid: eec9b0c7 len: 48 clientid: TRANS flags: none > ********************************************************************** > * ERROR: data block=3138 * > ********************************************************************** > > xfs_logprint: unknown log operation type (2e00) > Bad data in log" It's probably just mis-parsing something. i.e. more likely a logprint bug than an xfs bug. If you could provide an xfs_metadump of the filesystem at this point, that would probably be the simplest reproducer for us. Fixing it may not be the very highest priority, but I have dug into and fixed logprint bugs in the past. It's not very fun. ;) > Subsequent call to "xfs_repair -n -l $loopdev $SCRATCH_DEV" passes and filesystem is mounted without errors. > I've supposed the using of inappropriate log size so updated log_size to default mkfs.xfs value for this device: "log_size=2560". > After that xfs_logprint core dumped with segfault (race condition): > > "Feb 11 13:55:42 fedora.fedora kernel: xfs_logprint[14007]: segfault at 29f16768 ip 00000000004028ed sp 00007fff61b46850 error 4 in xfs_logprint[400000+4e000]" a metadump of this filesystem would be useful as well, assuming it reproduces the bug. Thanks, -Eric From adrscube@gmail.com Wed Feb 11 10:07:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E52097F54 for ; Wed, 11 Feb 2015 10:07:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B620B304059 for ; Wed, 11 Feb 2015 08:07:50 -0800 (PST) X-ASG-Debug-ID: 1423670868-04bdf06a591b9730001-NocioJ Received: from mail-pa0-f47.google.com (mail-pa0-f47.google.com [209.85.220.47]) by cuda.sgi.com with ESMTP id Bpi4SOs4GBU8q5vf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 08:07:48 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by mail-pa0-f47.google.com with SMTP id lf10so4887234pab.6 for ; Wed, 11 Feb 2015 08:07:48 -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:content-type; bh=qVMEjmuox3UBh+vYfjdIVJY07ibJf9gtB4S7cDuuClM=; b=d107TN+fQG3r2aef1J+lAMNryFhgMpD8XXkHmcfD9RpF+rn5m5daKvOkoOTQiowBWo KkfJqUBf1ia2sWVrUMX4KvRR9EAo8Ro7a6LXjV76uhSyarutRfuG9lMvdYgJvWXJcSYP E6zvhZEWMrg+vCYtKpAEaY/8Q5JHt7+fHQ+0yJH6mAjnMj3ifIcFS0IRRDJyZpuFAqE6 pDZA14cGyoZxqIUkHivMiZfEj9dPCe2znkGDZIz38kReqUryd9UYwGSXAod69dka0j70 rxGXIffHDDwR5gD00imeMwYeiHDtu0MO7q5BIK6Z6VTYk/U78I0r/NkedWuzT7wfGDJ0 Xjvg== MIME-Version: 1.0 X-Received: by 10.66.97.106 with SMTP id dz10mr999723pab.66.1423670867891; Wed, 11 Feb 2015 08:07:47 -0800 (PST) Received: by 10.70.11.33 with HTTP; Wed, 11 Feb 2015 08:07:47 -0800 (PST) In-Reply-To: <20150210072559.GA12722@dastard> References: <54ca343a.43df440a.3c11.4474@mx.google.com> <20150210072559.GA12722@dastard> Date: Wed, 11 Feb 2015 21:37:47 +0530 Message-ID: Subject: Re: [PATCH 1/4] xfs: Accounting for AGFL blocks in xfs_spaceman From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: Accounting for AGFL blocks in xfs_spaceman To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f47.google.com[209.85.220.47] X-Barracuda-Start-Time: 1423670868 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email >> + if (error) >> + return error; >> + >> + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); >> + >> + for(i = be32_to_cpu(agf->agf_flfirst); >> + i <= be32_to_cpu(agf->agf_fllast);) { > > Whitespace after the "for" statement, and indentation of logic inside > for/if/while/etc needs to be aligned to the same column. > > As it is, this code doesn't work. Hint: what happens when last wraps > around back to the start ofthe freelist array? last < first, and > hence i > last.... > > Yes, I know it the code is similar to what I suggested last time I > pointed out the iteration is wrong, but I'm often wrong, especially > about intricate details that I've just quickly pulled a solution for > off the top of my head. IOWs, don't assume what I say is correct - > verifiy and test it, and then tell me I'm wrong. > > So, perhaps a different loop structure is appropriate? We had addressed this issue in the previous code version, but changed it when a doubt was raised in the previous patch comments. We will ensure that we verify and test the feedback we receive from now on. :) > Patch as applied to my tree is below. Please apply it to your tree > and test it. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > xfs: Accounting for AGFL blocks in xfs_spaceman > > From: Dhruvesh Rathore > > The xfs_spaceman utility previously failed to account for AGFL > blocks. Old output: > > $ sudo xfs_spaceman -c "freesp" /media/xfs > from to extents blocks pct > 1024 2047 1 1262 0.04 > 4096 8191 1 5126 0.15 > 8192 16383 3 35344 1.05 > 32768 65535 1 43989 1.31 > 262144 524287 3 1334894 39.78 > 524288 967428 2 1934840 57.66 > > As you can see the AGFL blocks were unaccounted (4 per AG, and there > were 4 AGs in this filesystem). This patch adds a new function > which accounts for the the free extents tracked by the AGFL. > > New output: > > $ sudo xfs_spaceman -c "freesp" /media/xfs > from to extents blocks pct > 1 1 16 16 0.00 > 1024 2047 1 1262 0.04 > 4096 8191 1 5126 0.15 > 8192 16383 3 35344 1.05 > 32768 65535 1 43989 1.31 > 262144 524287 3 1334894 39.78 > 524288 967428 2 1934840 57.66 > > [dchinner: fixed whitespace issues, agfl iteration logic, > error handling] > > Signed-off-by: Dhruvesh Rathore > Signed-off-by: Amey Ruikar > Signed-off-by: Somdeep Dey > > --- > fs/xfs/libxfs/xfs_alloc.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 69 insertions(+) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 1ae53ad..544c945 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2633,6 +2633,68 @@ error0: > } > > /* > + * When we map free space we need to take into account the blocks > + * that are indexed by the AGFL. They aren't found by walking the > + * free space btrees, so we have to walk each AGFL to find them. > + */ > +static int > +xfs_alloc_agfl_freespace_map( > + struct xfs_mount *mp, > + struct xfs_agf *agf, > + struct fiemap_extent_info *fieinfo, > + xfs_agnumber_t agno, > + xfs_agblock_t sagbno, > + xfs_agblock_t eagbno) > +{ > + xfs_buf_t *agflbp; > + __be32 *agfl_bno; > + int i; > + int error = 0; > + > + error = xfs_alloc_read_agfl(mp, NULL, agno, &agflbp); > + if (error) > + return error; > + > + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); > + for (i = be32_to_cpu(agf->agf_flfirst);;) { > + xfs_agblock_t fbno; > + xfs_extlen_t flen; > + xfs_daddr_t dbno; > + xfs_fileoff_t dlen; > + int flags = 0; > + > + fbno = be32_to_cpu(agfl_bno[i]); > + flen = 1; > + > + /* range check - must be wholly withing requested range */ > + if (fbno < sagbno || > + (eagbno != NULLAGBLOCK && fbno + flen > eagbno)) { > + xfs_warn(mp, "10: %d/%d, %d/%d", > + sagbno, eagbno, fbno, flen); > + continue; > + } > + > + /* > + * Use daddr format for all range/len calculations as that is > + * the format the range/len variables are supplied in by > + * userspace. > + */ > + dbno = XFS_AGB_TO_DADDR(mp, agno, fbno); > + dlen = XFS_FSB_TO_BB(mp, flen); > + error = fiemap_fill_next_extent(fieinfo, BBTOB(dbno), > + BBTOB(dbno), BBTOB(dlen), flags); > + if (error) > + break; > + if (i == be32_to_cpu(agf->agf_fllast)) > + break; > + if (++i == XFS_AGFL_SIZE(mp)) > + i = 0; > + } > + xfs_buf_relse(agflbp); > + return error; > +} > + > +/* > * Walk the extents in the tree given by the cursor, and dump them all into the > * fieinfo. At the last extent in the tree, set the FIEMAP_EXTENT_LAST flag so > * that we return only free space from this tree in a given request. > @@ -2793,6 +2855,13 @@ xfs_alloc_freespace_map( > goto put_agbp; > } > > + /* Account for the free blocks in AGFL */ > + error = xfs_alloc_agfl_freespace_map(mp, XFS_BUF_TO_AGF(agbp), > + fieinfo, agno, sagbno, > + agno == eagno ? eagbno : NULLAGBLOCK); > + if (error) > + goto put_agbp; > + > cur = xfs_allocbt_init_cursor(mp, NULL, agbp, agno, > XFS_BTNUM_BNO); > error = xfs_alloc_lookup_ge(cur, sagbno, 1, &i); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs We thank you for taking the time out and working on the patches. We will apply the above reworked patch and test it, and get back to you. Regards, A-DRS From sandeen@sandeen.net Wed Feb 11 10:08:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 42CB17F54 for ; Wed, 11 Feb 2015 10:08:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5EB3AC004 for ; Wed, 11 Feb 2015 08:08:18 -0800 (PST) X-ASG-Debug-ID: 1423670896-04cbb011641ac960001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5KUv5mrattXXW0Hg for ; Wed, 11 Feb 2015 08:08:16 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 97AC26371E3F; Wed, 11 Feb 2015 10:08:16 -0600 (CST) Message-ID: <54DB7E70.3060709@sandeen.net> Date: Wed, 11 Feb 2015 10:08:16 -0600 From: Eric Sandeen MIME-Version: 1.0 To: yy , xfs Subject: Re: XFS buffer IO performance is very poor References: X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor 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: 1423670896 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/11/15 1:39 AM, yy wrote: (In addition to Brian's questions): > XFS format parametes: > > #mkfs.xfs -d su=256k,sw=5 /dev/sdb1 > > #cat /proc/mounts > > /dev/sdb1 /data1 xfs rw,noatime,attr2,delaylog,nobarrier,logbsize=256k,sunit=512,swidth=2560,noquota 0 0 > > #fdisk -ul > Device Boot Start End Blocks Id System > /dev/sdb1 128 2929356359 1464678116 83 Linux so 128*512 = 64k; your partition doesn't start on a 256k stripe unit boundary, right? Shouldn't it do so? -Eric From adrscube@gmail.com Wed Feb 11 10:09:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FB617F54 for ; Wed, 11 Feb 2015 10:09:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F012EAC005 for ; Wed, 11 Feb 2015 08:09:39 -0800 (PST) X-ASG-Debug-ID: 1423670978-04bdf06a5b1b9800001-NocioJ Received: from mail-pd0-f172.google.com (mail-pd0-f172.google.com [209.85.192.172]) by cuda.sgi.com with ESMTP id P5NZEUIMk7km9e29 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 08:09:38 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by pdbfl12 with SMTP id fl12so5247105pdb.4 for ; Wed, 11 Feb 2015 08:09:38 -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:content-type; bh=ZisTEK1BBnLx12FTIlfmeuEMK+ql9V9y4dwS9fsaH7M=; b=0dlAOSogmH+GrMtR/IqMxFD2iFX5Ap7J6EgrdjduRutztX/8VW9Y/NaCNr0m7EMh/x zjWNAEyoSbyIDKcVOA85BOu4meCvGt9mS4IFfRrn6dAk2sHIi+T5DKQZqe/2Yn4jfKv4 FWFIVg0CNTPa6K+QTHYIvX8Y5CGTil94FXZZny/1H7nndzEt/iqtXGILf9j93aRDhMdJ x/QJ1vkLp/r3oLX2uxYwHh7i5EiL2SgocrQqKf8MArydlBaNHekaM7SFjxCptfD/pTqE +jLB0X9v1JuNqnvFsbr6yW8RyLNslMjZvmk4pEKTt8ZBR8ygbMKMJju+rZAkITFIdxvl b9Qg== MIME-Version: 1.0 X-Received: by 10.68.233.232 with SMTP id tz8mr46851659pbc.166.1423670977601; Wed, 11 Feb 2015 08:09:37 -0800 (PST) Received: by 10.70.11.33 with HTTP; Wed, 11 Feb 2015 08:09:37 -0800 (PST) In-Reply-To: <20150211002840.GR4251@dastard> References: <54ca326a.a1c4440a.6b39.422e@mx.google.com> <20150211002840.GR4251@dastard> Date: Wed, 11 Feb 2015 21:39:37 +0530 Message-ID: Subject: Re: [PATCH 0/4] xfs: xfs_spaceman utility rework From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 0/4] xfs: xfs_spaceman utility rework To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f172.google.com[209.85.192.172] X-Barracuda-Start-Time: 1423670978 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 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 tree branches have just been updated (via rebase) with all the > changes in these patches integrated. Please update your trees and > review and test the updated patches. The patches have been > reshuffled and reworked, so please make sure you are happy with the > attributions in the commit messages for the new patches. > > Cheers, > > Dave. We thank you for taking the time out to review the patches sent and working on them. We will test the updated patches by updating our tress and get back to you, Regards, A-DRS From adrscube@gmail.com Wed Feb 11 10:17:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 176097F54 for ; Wed, 11 Feb 2015 10:17:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E018D304066 for ; Wed, 11 Feb 2015 08:17:11 -0800 (PST) X-ASG-Debug-ID: 1423671430-04cbb011631accf0001-NocioJ Received: from mail-pa0-f50.google.com (mail-pa0-f50.google.com [209.85.220.50]) by cuda.sgi.com with ESMTP id 87wn8MssqSe5YLQV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 08:17:10 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.50 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] Received: by mail-pa0-f50.google.com with SMTP id hz1so4896263pad.9 for ; Wed, 11 Feb 2015 08:17:09 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.50] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=1Pv3E4jWNiErfncZKd/ZP4tc5kjekEoOn1hXuFrAexU=; b=SlIf1+EJHGok4FQai1fjAYxR92i6g6r1uhgB1cJgWU/nWmaL7pZSrs557NOb6o6tLm 2YeGD3zTXSvpa19yeldqjSnojEXfy9P89IJrafsbp4FZC0B1GWljKjXkyQE1tZNEWfQj GiRikQXV7oOQ896TG339JwUI5uqMHt/RscZ1kOfCZIyn1sm2m+qw32xb3I1h/OkG8crO ktj4Wot+8VSYWnsmYebq+xRzaHL59NNgzy3WSm/31Nr7nRpssAsnotLLjSko+0NnYyh1 xNwBTOGFrtjAzghodkzs9u+BbF9WombPr6sErxjvYK5/pup4P8zkFRdii3oyxnUgl6Uu 8bMw== MIME-Version: 1.0 X-Received: by 10.66.97.106 with SMTP id dz10mr1071932pab.66.1423671429816; Wed, 11 Feb 2015 08:17:09 -0800 (PST) Received: by 10.70.11.33 with HTTP; Wed, 11 Feb 2015 08:17:09 -0800 (PST) In-Reply-To: <20150210221421.GP4251@dastard> References: <54ca34c6.4696420a.0f32.4513@mx.google.com> <20150210221421.GP4251@dastard> Date: Wed, 11 Feb 2015 21:47:09 +0530 Message-ID: Subject: Re: [PATCH 2/4] xfsprogs: Addition in debug option -d of xfs_spaceman From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 2/4] xfsprogs: Addition in debug option -d of xfs_spaceman To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f50.google.com[209.85.220.50] X-Barracuda-Start-Time: 1423671430 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 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, Feb 11, 2015 at 3:44 AM, Dave Chinner wrote: > On Thu, Jan 29, 2015 at 06:55:21PM +0530, Dhruvesh Rathore wrote: >> >> The xfs_spaceman utility did not have a a proper title to the content >> displayed using -d (debug) option. > ..... >> >> @@ -332,20 +332,23 @@ >> static int >> freesp_f( >> int argc, >> char **argv) >> { >> xfs_agnumber_t agno; >> >> if (!init(argc, argv)) >> return 0; >> >> + if (dumpflag) >> + printf("%8s %8s %8s\n", "agno", "agbno", "len"); >> + >> for (agno = 0; agno < file->geom.agcount; agno++) { >> if (inaglist(agno)) >> scan_ag(agno); >> } >> if (histcount) >> printhist(); > > Patch does not apply to the current tree. It's got stray whitespace > and lines in it that are in the original source file. > > I've fixed this up for the moment, but please make sure your > patches apply to a clean tree. > We apologize for the constant stray white space errors and will make sure to make clean patches from now on. Thank you for reworking and applying the patch to the current tree :) Regards, A-DRS From adrscube@gmail.com Wed Feb 11 10:19:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 7A1297F54 for ; Wed, 11 Feb 2015 10:19:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23E54AC004 for ; Wed, 11 Feb 2015 08:19:31 -0800 (PST) X-ASG-Debug-ID: 1423671569-04bdf06a5b1b9c40001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id ot4hXldRZzTkZoeb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 08:19:29 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by mail-pa0-f43.google.com with SMTP id fa1so4995955pad.2 for ; Wed, 11 Feb 2015 08:19:29 -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:content-type; bh=VgB7f4Ip8AZ3NGmtoPGNWRgYzB0ymgRvm/OllaXxc2E=; b=VwAsJKpNPLz0qv2h5ry57PAnIrk5NHi9ECM88oS/cxKRgzDAB6zpAfzac+1S4Mb+8I uAwMPPgzuUIFQ/6zUKrsDBGegusomy6+CN6fodNtVmmRGthT1CXrtqhEEiuoL5u5lXLV ULp5W2ctKyNLsmfUoUwaFdZxm8vGtuj4SBk9JIL1RH4M/c3N7z2oToiwFrWPql+sj0qv 2aKnCH6epM4tUZqq1iy4BJMgyuY7w+avfg2BFTYxPZupzmBxxyfUCztgbxc9fcZdcps5 jQosHrrVNqGdXFmg2R4YvQJQhbPAGp7+O7hG/TaYX3RJ4iUVnaQ4k6opbUDEQFObJM+D 71Yw== MIME-Version: 1.0 X-Received: by 10.67.23.101 with SMTP id hz5mr14373088pad.47.1423671569512; Wed, 11 Feb 2015 08:19:29 -0800 (PST) Received: by 10.70.11.33 with HTTP; Wed, 11 Feb 2015 08:19:29 -0800 (PST) In-Reply-To: <20150210101752.GB12722@dastard> References: <54ca35b7.2786440a.6990.450d@mx.google.com> <20150210101752.GB12722@dastard> Date: Wed, 11 Feb 2015 21:49:29 +0530 Message-ID: Subject: Re: [PATCH 3/4] xfs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1423671569 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15144 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b On Tue, Feb 10, 2015 at 3:47 PM, Dave Chinner wrote: > On Thu, Jan 29, 2015 at 06:59:22PM +0530, Dhruvesh Rathore wrote: >> >> This patch is concerned with the changes to be done in kernel space code for >> turning FS_IOC_FIEMAPFS present in the earlier version of xfs_spaceman >> into an XFS specific ioctl called XFS_IOC_FIEMAPFS, which uses all existing >> fiemap insfrastructure. >> By introducing XFS_IOC_FIMEAPFS ioctl, it can be seperated from file based >> fiemap commands and allows us to review it and push it as we need, making the >> process much simpler. >> >> ---------------------------------------------------------------------------------------- >> >> Signed-off-by: Dhruvesh Rathore >> Signed-off-by: Amey Ruikar >> Signed-off-by: Somdeep Dey >> --- >> fs/ioctl.c | 3 ++- >> include/linux/fs.h | 6 ++++++ >> fs/xfs/xfs_ioctl.c | 55 +++++++++++++ >> fs/xfs/xfs_fs.h | 1 + >> 4 files changed, 64 insertions(+), 1 deletion(-) > > Ok, so this patch doesn't remove any of the now unused > functionality I added to support the VFS based ioctl. > > What I'm going to do with this is combine it with the initial > "introduce FS_IOC_FIEMAP" patch I wrote (including all it's > documentation!) as the first patch of the kernel side patch series > to introduced XFS_IOC_FIEMAPFS. > Seems appropriate to us. Regards, A-DRS From adrscube@gmail.com Wed Feb 11 10:22:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CBDD7F54 for ; Wed, 11 Feb 2015 10:22:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FB478F8035 for ; Wed, 11 Feb 2015 08:22:19 -0800 (PST) X-ASG-Debug-ID: 1423671737-04bdf06a5a1b9da0001-NocioJ Received: from mail-pa0-f44.google.com (mail-pa0-f44.google.com [209.85.220.44]) by cuda.sgi.com with ESMTP id 5GJLfdJQIzfL71Ci (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Feb 2015 08:22:17 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by mail-pa0-f44.google.com with SMTP id kq14so4985586pab.3 for ; Wed, 11 Feb 2015 08:22:17 -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:content-type; bh=m67bJJT3lSICy4kpkmXowpjdx5GioAJ23EnHFA/omEk=; b=bpnFMTD0RPghERXJjVEsrx5e5vh783N1AxQRBtO5Yvsa5LVyOw/vdNFLlOvQ1myZfE Ia4w91McJKIFqqRjJSSFG/qspB+p8YWh9HgX+XqHJg+t/95HDbZQvKtkHfUofF9t6bQG 80h/rLwmRyFIMJe1Cv1u4dYOWL/zYO1hAmA/kBwYHOlCRZXFQVNYZ9Yu0MdUC+69qIHO G0Od3aWbhnDbvoBrIvuFQubRG1cn6ObRIU8htLAb0thwOgMU4mX/e5J+YOFoO86krhrp wY1OR9Uk5kedZWLloPn5z0O686rk0xKTOEViPgPrY2Q0RulnTgp8LLGLrn/Q94uUEWXG x5+Q== MIME-Version: 1.0 X-Received: by 10.67.23.101 with SMTP id hz5mr14394155pad.47.1423671737212; Wed, 11 Feb 2015 08:22:17 -0800 (PST) Received: by 10.70.11.33 with HTTP; Wed, 11 Feb 2015 08:22:17 -0800 (PST) In-Reply-To: <20150210221914.GQ4251@dastard> References: <54ca361b.6841460a.02cf.3cca@mx.google.com> <20150210221914.GQ4251@dastard> Date: Wed, 11 Feb 2015 21:52:17 +0530 Message-ID: Subject: Re: [PATCH 4/4] xfsprogs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [PATCH 4/4] xfsprogs: Adding XFS_IOC_FIEMAPFS ioctl for use in xfs_spaceman To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f44.google.com[209.85.220.44] X-Barracuda-Start-Time: 1423671737 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15145 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, Feb 11, 2015 at 3:49 AM, Dave Chinner wrote: > On Thu, Jan 29, 2015 at 07:01:02PM +0530, Dhruvesh Rathore wrote: >> >> This patch is concerned with the changes to be done in userspace code for >> turning FS_IOC_FIEMAPFS present in the earlier version of xfs_spaceman >> into an XFS specific ioctl called XFS_IOC_FIEMAPFS, which uses all existing >> fiemap insfrastructure. >> By introducing XFS_IOC_FIMEAPFS ioctl, it can be seperated from file based >> fiemap commands and allows us to review it and push it as we need, making the >> process much simpler. > ..... >> typedef struct histent >> @@ -201,9 +201,9 @@ >> fiemap->fm_length = length; >> fiemap->fm_extent_count = NR_EXTENTS; >> >> - ret = ioctl(file->fd, FS_IOC_FIEMAPFS, (unsigned long)fiemap); >> + ret = xfsctl(file->name,file->fd, XFS_IOC_FIEMAPFS, (unsigned long)fiemap); >> if (ret < 0) { > ^ > Patch hunk is corrupt: it is missing the leading whitespace to > indicate "no change on this line". > > I've fixed it up to apply the patch. > > -Dave. We again apologize for the constant white space errors. We will surely make use of the various git commands that you have mentioned to ensure that we send clean patches. Thank you for reworking and applying the patches :) Regards, A-DRS From sandeen@sandeen.net Wed Feb 11 10:50:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 856F47F54 for ; Wed, 11 Feb 2015 10:50:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 10382AC005 for ; Wed, 11 Feb 2015 08:50:57 -0800 (PST) X-ASG-Debug-ID: 1423673455-04bdf06a591bb080001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dLLuodrqkFSpjRVj for ; Wed, 11 Feb 2015 08:50:56 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B977A60DB35D; Wed, 11 Feb 2015 10:50:55 -0600 (CST) Message-ID: <54DB886D.9060201@sandeen.net> Date: Wed, 11 Feb 2015 10:50:53 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel , fstests@vger.kernel.org Subject: Re: shared/032 is broken on Fedora References: <54DB35F0.1010203@plexistor.com> X-ASG-Orig-Subj: Re: shared/032 is broken on Fedora In-Reply-To: <54DB35F0.1010203@plexistor.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: 1423673455 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- (cc: fstests list) On 2/11/15 4:58 AM, Boaz Harrosh wrote: > > This is not the proper patch just to show a working version for Fedora. But I think > it now breaks the other ARCHs. > > What happens is that the output of ${MKFS_PROG}.* is: > /usr/sbin/mkfs.bfs /usr/sbin/mkfs.btrfs /usr/sbin/mkfs.cramfs /usr/sbin/mkfs.ext2 /usr/sbin/mkfs.ext3 /usr/sbin/mkfs.ext4 ... > > So in Fedora sbin has moved to /usr/... and therefor the sed below fails. > My sed foo is not good enough. How to support both places for sbin? All we really want is the mkfs filesystem type, i.e. the ${FS} in mkfs.${FS} So sed -e 's/.*mkfs.//g' should work, awk -F . '{print $NF}' would work too $ cat mkfses /usr/sbin/mkfs.ext4 /sbin/mkfs.ext4 $ cat mkfses | awk -F . '{print $NF}' ext4 ext4 $ cat mkfses | sed -e 's/.*mkfs.//g' ext4 ext4 > Also why the "_supported_fs xfs btrfs"? So if all those other mkfs.* that are destructive to > foreign filesystem, should the test not fail instead of skipped? mkfs.xfs & mkfs.btrfs are the only filesystems I know of which check for an existing format before proceeding, so they are the only ones tested. Any other fs is skipped, because they are not designed to do what this test is... testing for. > Maybe if the maintainers of all these filesystems day in and day out running xfstests and > see shared/032 failing, they might decide to fix their evil ways. Instead of skipping the > test and the said maintainer just ignores it? I think it's just a design decision. There's no actual requirement to warn about overwriting a format, so not doing so is not a failure or a bug, IMHO. -Eric > Thanks > Boaz > > --- > diff --git a/tests/shared/032 b/tests/shared/032 > index a410003..726e6b4 100755 > --- a/tests/shared/032 > +++ b/tests/shared/032 > @@ -37,8 +37,8 @@ rm -f $seqres.full > . ./common/filter > > # real QA test starts here > -_supported_fs xfs btrfs > +# _supported_fs xfs btrfs > _supported_os Linux > > _require_scratch_nocheck > _require_no_large_scratch_dev > @@ -49,8 +49,7 @@ if [ "$FSTYP" == "btrfs" ]; then > _notrun "Installed mkfs.btrfs does not support -f option" > fi > > -echo "Silence is golden." > -for fs in `echo ${MKFS_PROG}.* | sed -e 's/.sbin.mkfs.//g'` > +for fs in `echo ${MKFS_PROG}.* | sed -e 's/.usr\/sbin.mkfs.//g'` > do > preop="" # for special input needs > preargs="" # for any special pre-device options > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Wed Feb 11 10:55:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 494D97F37 for ; Wed, 11 Feb 2015 10:55:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3547C304032 for ; Wed, 11 Feb 2015 08:55:28 -0800 (PST) X-ASG-Debug-ID: 1423673727-04cb6c6b0c1cc4b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id e4F7V6ezk3huVNPH for ; Wed, 11 Feb 2015 08:55:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 50B1260DB35D; Wed, 11 Feb 2015 10:55:27 -0600 (CST) Message-ID: <54DB897E.7060703@sandeen.net> Date: Wed, 11 Feb 2015 10:55:26 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel , fstests@vger.kernel.org Subject: Re: shared/032 is broken on Fedora References: <54DB35F0.1010203@plexistor.com> <54DB886D.9060201@sandeen.net> X-ASG-Orig-Subj: Re: shared/032 is broken on Fedora In-Reply-To: <54DB886D.9060201@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1423673727 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/11/15 10:50 AM, Eric Sandeen wrote: > (cc: fstests list) > > On 2/11/15 4:58 AM, Boaz Harrosh wrote: >> >> This is not the proper patch just to show a working version for Fedora. But I think >> it now breaks the other ARCHs. >> >> What happens is that the output of ${MKFS_PROG}.* is: >> /usr/sbin/mkfs.bfs /usr/sbin/mkfs.btrfs /usr/sbin/mkfs.cramfs /usr/sbin/mkfs.ext2 /usr/sbin/mkfs.ext3 /usr/sbin/mkfs.ext4 ... >> >> So in Fedora sbin has moved to /usr/... and therefor the sed below fails. >> My sed foo is not good enough. How to support both places for sbin? > > All we really want is the mkfs filesystem type, i.e. the ${FS} in mkfs.${FS} > > So > > sed -e 's/.*mkfs.//g' Wait, no, I misunderstood what it was working on ;) Hang on ... -Eric From sandeen@sandeen.net Wed Feb 11 11:11:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 60FA87F58 for ; Wed, 11 Feb 2015 11:11:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4FB0E304053 for ; Wed, 11 Feb 2015 09:11:11 -0800 (PST) X-ASG-Debug-ID: 1423674670-04cb6c6b091cce90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id kfT0PDNlt4cuwzON for ; Wed, 11 Feb 2015 09:11:10 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1022D60EF996; Wed, 11 Feb 2015 11:11:10 -0600 (CST) Message-ID: <54DB8D2D.20104@sandeen.net> Date: Wed, 11 Feb 2015 11:11:09 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel , fstests@vger.kernel.org Subject: [PATCH] fstests: shared/032 handle mkfs.* in either /sbin or /usr/sbin References: <54DB35F0.1010203@plexistor.com> X-ASG-Orig-Subj: [PATCH] fstests: shared/032 handle mkfs.* in either /sbin or /usr/sbin In-Reply-To: <54DB35F0.1010203@plexistor.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: 1423674670 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- mkfs programs may live in either /sbin or /usr/sbin, and the current regexp in this test only catches the latter, and so the test wont' run properly for the former. Fix this by iterating over each full path to every mkfs.${FS} program in ${MKFS.PROG}.*, and extracting the ${FS} part. We found the paths in the first place by using a wildcard with the found ${MKFS_PROG}, so we can use that string to filter out everything except the wildcard match at the end, which is the fs name we are looking for. Reported-by: Boaz Harrosh Signed-off-by: Eric Sandeen --- diff --git a/tests/shared/032 b/tests/shared/032 index a410003..8ffb54b 100755 --- a/tests/shared/032 +++ b/tests/shared/032 @@ -50,8 +50,9 @@ if [ "$FSTYP" == "btrfs" ]; then fi echo "Silence is golden." -for fs in `echo ${MKFS_PROG}.* | sed -e 's/.sbin.mkfs.//g'` +for mkfs in `echo ${MKFS_PROG}.*` do + fs=`echo $mkfs | sed -e s:${MKFS_PROG}.::` preop="" # for special input needs preargs="" # for any special pre-device options postargs="" # for any special post-device options From lczerner@redhat.com Wed Feb 11 11:23:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 274147F54 for ; Wed, 11 Feb 2015 11:23:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 067E18F8054 for ; Wed, 11 Feb 2015 09:23:11 -0800 (PST) X-ASG-Debug-ID: 1423675390-04cb6c6b0a1cd370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mwDkYpvcDVoAGDUw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 09:23:11 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1BHN8gx021325 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 11 Feb 2015 12:23:08 -0500 Received: from vpn1-5-40.ams2.redhat.com (vpn1-5-40.ams2.redhat.com [10.36.5.40]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1BHN1Ne028214 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Feb 2015 12:23:05 -0500 Date: Wed, 11 Feb 2015 18:23:01 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Eric Sandeen cc: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel , fstests@vger.kernel.org Subject: Re: shared/032 is broken on Fedora In-Reply-To: <54DB886D.9060201@sandeen.net> X-ASG-Orig-Subj: Re: shared/032 is broken on Fedora Message-ID: References: <54DB35F0.1010203@plexistor.com> <54DB886D.9060201@sandeen.net> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423675391 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 11 Feb 2015, Eric Sandeen wrote: > Date: Wed, 11 Feb 2015 10:50:53 -0600 > From: Eric Sandeen > To: Boaz Harrosh , Dave Chinner , > xfs@oss.sgi.com, linux-fsdevel , > fstests@vger.kernel.org > Subject: Re: shared/032 is broken on Fedora > > (cc: fstests list) > > On 2/11/15 4:58 AM, Boaz Harrosh wrote: > > > > This is not the proper patch just to show a working version for Fedora. But I think > > it now breaks the other ARCHs. > > > > What happens is that the output of ${MKFS_PROG}.* is: > > /usr/sbin/mkfs.bfs /usr/sbin/mkfs.btrfs /usr/sbin/mkfs.cramfs /usr/sbin/mkfs.ext2 /usr/sbin/mkfs.ext3 /usr/sbin/mkfs.ext4 ... > > > > So in Fedora sbin has moved to /usr/... and therefor the sed below fails. > > My sed foo is not good enough. How to support both places for sbin? > > All we really want is the mkfs filesystem type, i.e. the ${FS} in mkfs.${FS} > > So > > sed -e 's/.*mkfs.//g' > > should work, > > awk -F . '{print $NF}' would work too > > $ cat mkfses > /usr/sbin/mkfs.ext4 > /sbin/mkfs.ext4 > > $ cat mkfses | awk -F . '{print $NF}' > ext4 > ext4 > > $ cat mkfses | sed -e 's/.*mkfs.//g' > ext4 > ext4 > > > Also why the "_supported_fs xfs btrfs"? So if all those other mkfs.* that are destructive to > > foreign filesystem, should the test not fail instead of skipped? > > mkfs.xfs & mkfs.btrfs are the only filesystems I know of which check for > an existing format before proceeding, so they are the only ones > tested. Any other fs is skipped, because they are not designed to > do what this test is... testing for. First of all it's not only about other file system, but any common signatures which the test is ignoring. Moreover ext4 is looking for existing signatures, but will not complain in case it's run without the console attached to it so it does not break existing scripts. > > > Maybe if the maintainers of all these filesystems day in and day out running xfstests and > > see shared/032 failing, they might decide to fix their evil ways. Instead of skipping the > > test and the said maintainer just ignores it? > > I think it's just a design decision. There's no actual requirement to warn about overwriting > a format, so not doing so is not a failure or a bug, IMHO. Exactly, also as I said above mkfs.extN is checking for signatures, but at the same time we can not break scripts people has been using for lifetime. -Lukas > > -Eric > > > Thanks > > Boaz > > > > --- > > diff --git a/tests/shared/032 b/tests/shared/032 > > index a410003..726e6b4 100755 > > --- a/tests/shared/032 > > +++ b/tests/shared/032 > > @@ -37,8 +37,8 @@ rm -f $seqres.full > > . ./common/filter > > > > # real QA test starts here > > -_supported_fs xfs btrfs > > +# _supported_fs xfs btrfs > > _supported_os Linux > > > > _require_scratch_nocheck > > _require_no_large_scratch_dev > > @@ -49,8 +49,7 @@ if [ "$FSTYP" == "btrfs" ]; then > > _notrun "Installed mkfs.btrfs does not support -f option" > > fi > > > > -echo "Silence is golden." > > -for fs in `echo ${MKFS_PROG}.* | sed -e 's/.sbin.mkfs.//g'` > > +for fs in `echo ${MKFS_PROG}.* | sed -e 's/.usr\/sbin.mkfs.//g'` > > do > > preop="" # for special input needs > > preargs="" # for any special pre-device options > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From sandeen@sandeen.net Wed Feb 11 11:36:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BFBAA7F58 for ; Wed, 11 Feb 2015 11:36:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4B94AAC002 for ; Wed, 11 Feb 2015 09:36:52 -0800 (PST) X-ASG-Debug-ID: 1423676210-04cbb011621aef80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id US46MfTELQsQbk4W for ; Wed, 11 Feb 2015 09:36:50 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 720FD60FCB20; Wed, 11 Feb 2015 11:36:50 -0600 (CST) Message-ID: <54DB9332.5010606@sandeen.net> Date: Wed, 11 Feb 2015 11:36:50 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Boaz Harrosh , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel , fstests@vger.kernel.org Subject: [PATCH V2] fstests: shared/032 handle mkfs.* in either /sbin or /usr/sbin References: <54DB35F0.1010203@plexistor.com> <54DB8D2D.20104@sandeen.net> X-ASG-Orig-Subj: [PATCH V2] fstests: shared/032 handle mkfs.* in either /sbin or /usr/sbin In-Reply-To: <54DB8D2D.20104@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1423676210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- mkfs executables may live in either /sbin or /usr/sbin, and the current regexp in this test only catches the former, and so the test won't run properly with the latter. Fix this by filtering out whatever was found as ${MKFS_PROG}, rather than a hard-coded /sbin/mkfs path. Because the list was generated by using a wildcard with ${MKFS_PROG}.* this will always be the correct filter. Reported-by: Boaz Harrosh Signed-off-by: Eric Sandeen --- V2: KISS diff --git a/tests/shared/032 b/tests/shared/032 index a410003..3b06382 100755 --- a/tests/shared/032 +++ b/tests/shared/032 @@ -50,7 +50,7 @@ if [ "$FSTYP" == "btrfs" ]; then fi echo "Silence is golden." -for fs in `echo ${MKFS_PROG}.* | sed -e 's/.sbin.mkfs.//g'` +for fs in `echo ${MKFS_PROG}.* | sed -e "s:${MKFS_PROG}.::g"` do preop="" # for special input needs preargs="" # for any special pre-device options From walmart-shop30@vps01.east4.nl Wed Feb 11 13:52:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=FILL_THIS_FORM, FILL_THIS_FORM_LOAN,HK_SCAM_N4 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 A1AB37F51 for ; Wed, 11 Feb 2015 13:52:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AA25AC002 for ; Wed, 11 Feb 2015 11:52:29 -0800 (PST) X-ASG-Debug-ID: 1423684345-04cb6c6b0a1de630001-NocioJ Received: from vps01.east4.nl (vps01.east4.nl [178.22.62.51]) by cuda.sgi.com with ESMTP id vgOyAu7FETUAzVqC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 11:52:27 -0800 (PST) X-Barracuda-Envelope-From: walmart-shop30@vps01.east4.nl X-Barracuda-Apparent-Source-IP: 178.22.62.51 Received: from [213.144.242.200] (helo=wanders.nl) by vps01.east4.nl with esmtpa (Exim 4.76) (envelope-from ) id 1YLd4g-0002Fk-Ea for xfs@oss.sgi.com; Wed, 11 Feb 2015 20:35:50 +0100 Received: from server.wanders.nl (unknown [10.241.2.5]) by wanders.nl (Postfix) with ESMTP id 27F9916A0023 for ; Wed, 11 Feb 2015 20:53:57 +0100 (CET) Received: from adcsrv (localhost.localdomain [127.0.0.1]) by server.wanders.nl (Postfix) with ESMTP id 736C4EA1416 for ; Wed, 11 Feb 2015 20:52:14 +0100 (CET) From: "W.A.L * M.A.R.T" Subject: J-O-B !.. To: xfs@oss.sgi.com X-ASG-Orig-Subj: J-O-B !.. MIME-Version: 1.0 Reply-To: erhkmkscd9ltnip@jetable.org Date: Wed, 11 Feb 2015 19:36:16 +0000 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Message-Id: <20150211195214.736C4EA1416@server.wanders.nl> X-Barracuda-Connect: vps01.east4.nl[178.22.62.51] X-Barracuda-Start-Time: 1423684346 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: dcb1e21003193f757173a2a647cadf8f-846-txt X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC1_TG070 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15152 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC1_TG070 Custom Rule TG070 =93M y s t e r y - S h o p p e r s=94 OR =93S e c r e t sh o p p e r s= =94 are hired to pose as customers and to anonymously evaluate the ser= vice they receive from a given business or an organization.=20 They get paid between US-300 per assigment.They are expected to comple= te their mystery shopping assignment and fill out an evaluation form, = answering questions about their shopping experience in the establishme= nt, the quality of customer service, etc. To start earning money immediate, reply this email with the following information below to sign up : Signup - Information: Full Name (First, Middle, Last) : Phone (Home & Cell) : Full Address (Not POBOX): City, State, Country : Zip Code : Gender & Age : Occupation : Email Address: Thanks for responding, We will wait for your full details . Sincerely, Candidate Recruitment Team From david@fromorbit.com Wed Feb 11 14:54:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D06227F54 for ; Wed, 11 Feb 2015 14:54:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50B1EAC004 for ; Wed, 11 Feb 2015 12:54:25 -0800 (PST) X-ASG-Debug-ID: 1423688060-04cb6c6b0b1ebad0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qsfOo8P2OCIfgbYE for ; Wed, 11 Feb 2015 12:54:21 -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: Ag0KAPjA21R5LPv2/2dsb2JhbABbgwZSWrAmDAEBAQEBAQaJEIk8hWsEAgKBKEQBAQEBAQF8hAwBAQEDATocIwULCAMYCSUPBSUDIROIJQcO0xoBAQgCAR8YhWyFCIRtB4QqBYVUjSWFXIFRiHeIOCKCAgMZgWQqMYJDAQEB Received: from ppp121-44-251-246.lns20.syd7.internode.on.net (HELO dastard) ([121.44.251.246]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Feb 2015 07:24:20 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YLeIQ-00027f-UQ; Thu, 12 Feb 2015 07:54:06 +1100 Date: Thu, 12 Feb 2015 07:54:06 +1100 From: Dave Chinner To: Alexander Tsvetkov Cc: xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log Message-ID: <20150211205406.GT4251@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54DB5E70.80607@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1423688061 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15154 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: > Hello, > > I've obtained corrupted xfs log after some sanity xfs testing: > > "log=logfile > log_size=855 > > dd if=/dev/zero "of=$log" bs=4096 count=$log_size > loopdev=$(losetup -f) > losetup $loopdev $log > > mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV > mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT > ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT > sync > umount $SCRATCH_MNT > > xfs_logprint -l $loopdev $SCRATCH_DEV" > > Test makes crc enabled xfs filesystem with the external log of > minimal allowed size and then creates on this fs the small directory > tree > with sub directories and files of fixed depth and size with help of > fdtree utility: > https://computing.llnl.gov/?set=code&page=sio_downloads Just take metadump image and put it somewhere we can down load it. > After that xfs_logprint stably reports bad data in log: > > "Oper (307): tid: eec9b0c7 len: 16 clientid: TRANS flags: none > EXTENTS inode data > Oper (308): tid: 41000000 len: 805306368 clientid: ERROR flags: none > LOCAL attr data Clearly that operation is wrong, so everything past it is suspect. This sort of error usually comes from an error parsing an earlier ophdr, so even that probably doesn't point directly at the cause. > ============================================================================ > cycle: 1 version: 2 lsn: 1,3138 tail_lsn: 1,2 > length of Log Record: 32256 prev offset: 3074 num ops: 375 > uuid: 39a962b7-4c0d-4e0e-8bcd-39471f93bc1d format: little endian linux > h_size: 32768 > ---------------------------------------------------------------------------- > Oper (0): tid: eec9b0c7 len: 48 clientid: TRANS flags: none > ********************************************************************** > * ERROR: data block=3138 * > ********************************************************************** > > xfs_logprint: unknown log operation type (2e00) > Bad data in log" i.e. this is not the problem that needs to be chased. > Subsequent call to "xfs_repair -n -l $loopdev $SCRATCH_DEV" passes > and filesystem is mounted without errors. xfs_repair -n doesn't look at the log at all. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfields@fieldses.org Wed Feb 11 16:35:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 166427F59 for ; Wed, 11 Feb 2015 16:35:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77391AC006 for ; Wed, 11 Feb 2015 14:35:24 -0800 (PST) X-ASG-Debug-ID: 1423694122-04cb6c6b091ee490001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id a42vC8uz2ABQdQAS for ; Wed, 11 Feb 2015 14:35:22 -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 1BB982059; Wed, 11 Feb 2015 17:35:22 -0500 (EST) Date: Wed, 11 Feb 2015 17:35:22 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150211223522.GB28796@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> <20150202194826.GG22301@fieldses.org> <20150203183533.GA16929@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150203183533.GA16929@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1423694122 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15158 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 03, 2015 at 07:35:33PM +0100, Christoph Hellwig wrote: > On Mon, Feb 02, 2015 at 02:48:26PM -0500, J. Bruce Fields wrote: > > Previously: http://lkml.kernel.org/r/20150106175611.GA16413@lst.de > > > > > - any advice on testing? Is there was some simple > > > virtual setup that would allow any loser with no special > > > hardware (e.g., me) to check whether they've broken the > > > block server? > > > > Run two kvm VMs that share the same disk. Create an XFS > > filesystem on the MDS, and export it. If the client has blkmapd > > running (on Debian it needs to be started manually) it will use > > pNFS for accessing the filesystem. Verify that using the > > per-operation counters in /proc/self/mounstats. Repeat with > > additional clients as nessecary. > > > > Alternatively set up a simple iSCSI target using tgt or lio and > > connect to it from multiple clients. > > > > Which sounds reasonable to me, but I haven't tried to incorporate this > > into my regression testing yet. > > Additionally I can offer the following script to generate recalls, > which don't really happen during normal operation. I don't > really know how to write a proper testcase that coordinates access > to the exported filesystem and nfs unless it runs locally on the same node, > though. It would need some higher level, network aware test harness: Thanks. I got as far as doing a quick manual test with vm's sharing a "disk": [root@f21-2]# mount -overs=4.1 f21-1:/exports/xfs-pnfs /mnt/ [root@f21-2]# echo "hello world" >/mnt/testfile [root@f21-2]# grep LAYOUTGET /proc/self/mountstats LAYOUTGET: 1 1 0 236 196 0 4 4 I haven't tried to set up automated testing with recalls, but that shouldn't be hard. --b. > > ----- snip ----- > #!/bin/sh > > set +x > > # wait for grace period > touch /mnt/nfs1/foo > > dd if=/dev/zero of=/mnt/nfs1/foo bs=128M count=32 conv=fdatasync oflag=direct & > > sleep 2 > > echo "" > /mnt/test/foo && echo "recall done" From bfields@fieldses.org Wed Feb 11 16:54:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EA4677F5A for ; Wed, 11 Feb 2015 16:54:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8E0B8F8035 for ; Wed, 11 Feb 2015 14:54:39 -0800 (PST) X-ASG-Debug-ID: 1423695278-04cbb011631cba40001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id EN23bavXGqUewBkI for ; Wed, 11 Feb 2015 14:54:38 -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 87B112059; Wed, 11 Feb 2015 17:54:37 -0500 (EST) Date: Wed, 11 Feb 2015 17:54:37 -0500 From: "J. Bruce Fields" To: Christoph Hellwig Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, Jeff Layton , xfs@oss.sgi.com Subject: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten Message-ID: <20150211225437.GC28796@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 16/20] xfs: pass a 64-bit count argument to xfs_iomap_write_unwritten References: <1421925006-24231-1-git-send-email-hch@lst.de> <1421925006-24231-17-git-send-email-hch@lst.de> <20150129205232.GB11064@fieldses.org> <20150202073024.GA9399@lst.de> <20150202192404.GI6282@dastard> <20150202194300.GN6282@dastard> <20150202194826.GG22301@fieldses.org> <20150203183533.GA16929@lst.de> <20150211223522.GB28796@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150211223522.GB28796@fieldses.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1423695278 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15160 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 11, 2015 at 05:35:22PM -0500, J. Bruce Fields wrote: > On Tue, Feb 03, 2015 at 07:35:33PM +0100, Christoph Hellwig wrote: > > On Mon, Feb 02, 2015 at 02:48:26PM -0500, J. Bruce Fields wrote: > > > Previously: http://lkml.kernel.org/r/20150106175611.GA16413@lst.de > > > > > > > - any advice on testing? Is there was some simple > > > > virtual setup that would allow any loser with no special > > > > hardware (e.g., me) to check whether they've broken the > > > > block server? > > > > > > Run two kvm VMs that share the same disk. Create an XFS > > > filesystem on the MDS, and export it. If the client has blkmapd > > > running (on Debian it needs to be started manually) it will use > > > pNFS for accessing the filesystem. Verify that using the > > > per-operation counters in /proc/self/mounstats. Repeat with > > > additional clients as nessecary. > > > > > > Alternatively set up a simple iSCSI target using tgt or lio and > > > connect to it from multiple clients. > > > > > > Which sounds reasonable to me, but I haven't tried to incorporate this > > > into my regression testing yet. > > > > Additionally I can offer the following script to generate recalls, > > which don't really happen during normal operation. I don't > > really know how to write a proper testcase that coordinates access > > to the exported filesystem and nfs unless it runs locally on the same node, > > though. It would need some higher level, network aware test harness: > > Thanks. I got as far as doing a quick manual test with vm's sharing a > "disk": Oh, also I forgot, on fedora: [root@f21-2]# systemctl enable nfs-blkmap.target > [root@f21-2]# mount -overs=4.1 f21-1:/exports/xfs-pnfs /mnt/ > [root@f21-2]# echo "hello world" >/mnt/testfile > [root@f21-2]# grep LAYOUTGET /proc/self/mountstats > LAYOUTGET: 1 1 0 236 196 0 4 4 > > I haven't tried to set up automated testing with recalls, but that > shouldn't be hard. > > --b. > > > > > ----- snip ----- > > #!/bin/sh > > > > set +x > > > > # wait for grace period > > touch /mnt/nfs1/foo > > > > dd if=/dev/zero of=/mnt/nfs1/foo bs=128M count=32 conv=fdatasync oflag=direct & > > > > sleep 2 > > > > echo "" > /mnt/test/foo && echo "recall done" From jaegeuk@kernel.org Wed Feb 11 19:40:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E6857F59 for ; Wed, 11 Feb 2015 19:40:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1ECE78F8059 for ; Wed, 11 Feb 2015 17:40:18 -0800 (PST) X-ASG-Debug-ID: 1423705217-04bdf06a5b1e1260001-NocioJ Received: from mail.kernel.org ([198.145.29.136]) by cuda.sgi.com with ESMTP id 1kGKyMEzZlbVxcXw for ; Wed, 11 Feb 2015 17:40:17 -0800 (PST) X-Barracuda-Envelope-From: jaegeuk@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 D7833201FA; Thu, 12 Feb 2015 01:40:16 +0000 (UTC) Received: from localhost (unknown [166.170.41.193]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E13A4201ED; Thu, 12 Feb 2015 01:40:15 +0000 (UTC) Date: Wed, 11 Feb 2015 17:40:14 -0800 From: Jaegeuk Kim To: Dave Chinner , Jeff Layton , "J. Bruce Fields" Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/2 v2] xfs: introduce a generic shutdown ioctl Message-ID: <20150212014014.GA97308@jaegeuk-mac02> X-ASG-Orig-Subj: Re: [PATCH 1/2 v2] xfs: introduce a generic shutdown ioctl References: <1420796076-82847-1-git-send-email-jaegeuk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1420796076-82847-1-git-send-email-jaegeuk@kernel.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: UNKNOWN[198.145.29.136] X-Barracuda-Start-Time: 1423705217 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Change log from v1: o modify the xfs changes merged toward 3.20-rc1 -- >8 -- This patch introduces a generic ioctl for fs shutdown, which was used by xfs. If this shutdown is triggered, filesystem stops any further IOs according to the following options. 1. FS_GOING_DOWN_FULLSYNC : this will flush all the data and dentry blocks, and do checkpoint before shutdown. 2. FS_GOING_DOWN_METASYNC : this will do checkpoint before shutdown. 3. FS_GOING_DOWN_NOSYNC : this will trigger shutdown as is. Signed-off-by: Jaegeuk Kim --- fs/xfs/libxfs/xfs_fs.h | 8 ++++---- include/uapi/linux/fs.h | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 18dc721..fe0eeee 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -484,9 +484,9 @@ typedef struct xfs_swapext /* * Flags for going down operation */ -#define XFS_FSOP_GOING_FLAGS_DEFAULT 0x0 /* going down */ -#define XFS_FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */ -#define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */ +#define XFS_FSOP_GOING_FLAGS_DEFAULT FS_GOING_DOWN_FULLSYNC +#define XFS_FSOP_GOING_FLAGS_LOGFLUSH FS_GOING_DOWN_METASYNC +#define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH FS_GOING_DOWN_NOSYNC /* * ioctl commands that are used by Linux filesystems @@ -555,7 +555,7 @@ typedef struct xfs_swapext #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) #define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq) #define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom) -#define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) +#define XFS_IOC_GOINGDOWN FS_IOC_SHUTDOWN /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3735fa0..a4e4be5 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -157,6 +157,7 @@ struct inodes_stat_t { #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ #define FITHAW _IOWR('X', 120, int) /* Thaw */ #define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ +#define FS_IOC_SHUTDOWN _IOR('X', 125, __u32) /* Shutdown */ #define FS_IOC_GETFLAGS _IOR('f', 1, long) #define FS_IOC_SETFLAGS _IOW('f', 2, long) @@ -205,4 +206,11 @@ struct inodes_stat_t { #define SYNC_FILE_RANGE_WRITE 2 #define SYNC_FILE_RANGE_WAIT_AFTER 4 +/* + * Flags for going down operation used by FS_IOC_GOINGDOWN + */ +#define FS_GOING_DOWN_FULLSYNC 0x0 /* going down with full sync */ +#define FS_GOING_DOWN_METASYNC 0x1 /* going down with metadata */ +#define FS_GOING_DOWN_NOSYNC 0x2 /* going down */ + #endif /* _UAPI_LINUX_FS_H */ -- 2.1.1 From yy@xspring.net Wed Feb 11 23:31:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=HTML_MESSAGE,MANY_SPAN_IN_TEXT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC2BC7F62 for ; Wed, 11 Feb 2015 23:31:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5394AAC002 for ; Wed, 11 Feb 2015 21:31:07 -0800 (PST) X-ASG-Debug-ID: 1423719061-04bdf06a5a1e4730001-NocioJ Received: from smtpbgbr2.qq.com (smtpbgbr2.qq.com [54.207.22.56]) by cuda.sgi.com with ESMTP id BajlGV8pHdnwAgNy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 21:31:03 -0800 (PST) X-Barracuda-Envelope-From: yy@xspring.net X-Barracuda-Apparent-Source-IP: 54.207.22.56 X-QQ-mid: bizesmtp3t1423719011t467t146 Received: from yinyedeMacBook-Pro (unknown [59.37.125.61]) by esmtp4.qq.com (ESMTP) with id ; Thu, 12 Feb 2015 13:30:11 +0800 (CST) X-QQ-SSF: 0010000000200090F122B00A0000000 X-QQ-FEAT: kTc/XujRdh14EmiYksT1X5GCyPcxzyz9Vw6WUwUsboYbkW9vCLFyiLFRcjNJ4 ZToKz2RkAC6J0MjAUKB5tC9iyTiusErC8whF3DXHUdM4VmqvlFDNzhVgKcjtdTB12MRSoC+ nCrZl3jIBKsskAzYnMQ++wNJBj7xgvgfrTMSrnUOPKqA+SgEewDKUl1s1Nzdm+UMO3FlEN+ /0j8zaYTpJyIRXJAT0VpNZFtkB5P6q2k= X-QQ-GoodBg: 0 X-FOXMAIL-CODE: foxmail_code:00015C430E76 X-GUID: 6F38F4EB-89D9-2332-C4DB-46F77271ACEE From: "=?utf-8?B?eXk=?=" To: "=?utf-8?B?eGZz?=", "=?utf-8?B?RXJpYyBTYW5kZWVu?=", "=?utf-8?B?YmZvc3Rlcg==?=" Subject: Re: XFS buffer IO performance is very poor Mime-Version: 1.0 X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor Content-Type: multipart/alternative; boundary="----=_NextPart_54DC3A71_7FCE0C70_4680FC3D" Content-Transfer-Encoding: 8Bit Date: Thu, 12 Feb 2015 13:30:25 +0800 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: Foxmail_for_Mac 1.0.0 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbgbr2.qq.com[54.207.22.56] X-Barracuda-Start-Time: 1423719062 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily This is a multi-part message in MIME format. ------=_NextPart_54DC3A71_7FCE0C70_4680FC3D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 QnJpYW4gYW5kIEVyaWMsCgoKVGhhbmtzIHZlcnkgbXVjaCBmb3IgeW91ciByZXBsYXkuCgoK SSBjaGFuZ2VkIHBhcnRpdGlvbiBzdGFydCBwb3NpdGlvbiB3aXRoIDI1NkssIGJ1dCB0aGUg cGVyZm9ybWFuY2UgaXMgc3RpbGwgcG9vciwgbm8gY2hhbmdlLgojIGZkaXNrIC11bCAvZGV2 L3NkYiAgICAgICAgICAKIERldmljZSBCb290ICAgU3RhcnQgICAgIEVuZCAgIEJsb2NrcyAg SWQgU3lzdGVtCi9kZXYvc2RiMSAgICAgICA1MTIgMjkyOTM1NjM1OSAxNDY0Njc3OTI0ICA4 MyBMaW51eAoKCkkgY2hlY2tlZCB0aGUgWEZT4oCZcyBjb2RlLCBJIGFncmVlIHRoYXRYRlNf SU9MT0NLX0VYQ0wgbG9jayBtYXliZSB0aGUgcmVhc29uOgpodHRwczovL2JpdGJ1Y2tldC5v cmcvaHVzdGNhdC9rZXJuZWwtMi42LjMyL3NyYy83ODZkNzIwODA3MDUyNzM3YmIxN2JjNDRk YTlkYTIwNTU0NDAwMDM5L2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYz9hdD1tYXN0ZXIj Y2wtNzE0ClNUQVRJQyBzc2l6ZV90Cnhmc19maWxlX2J1ZmZlcmVkX2Fpb193cml0ZSgKc3Ry dWN0IGtpb2NiICppb2NiLApjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdnAsCnVuc2lnbmVkIGxv bmcgbnJfc2VncywKbG9mZl90IHBvcywKc2l6ZV90IG9jb3VudCkKewpzdHJ1Y3QgZmlsZSAq ZmlsZSA9IGlvY2Ita2lfZmlscDsKc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBm aWxlLWZfbWFwcGluZzsKc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctaG9zdDsKc3Ry dWN0IHhmc19pbm9kZSAqaXAgPSBYRlNfSShpbm9kZSk7CnNzaXplX3QgcmV0OwppbnQgZW5v c3BjID0gMDsKaW50IGlvbG9jayA9IFhGU19JT0xPQ0tfRVhDTDsKc2l6ZV90IGNvdW50ID0g b2NvdW50OwoKCnhmc19yd19pbG9jayhpcCwgaW9sb2NrKTsKCgpyZXQgPSB4ZnNfZmlsZV9h aW9fd3JpdGVfY2hlY2tzKGZpbGUsIHBvcywgY291bnQsIGlvbG9jayk7CmlmIChyZXQpCgoK CgpIb3dldmVy77yMSSBmb3VuZCB0aGF0IEVYVDMgYWxzbyBoYXZlIG11dGV4IHdoZW4gd2l0 aCBidWZmZXJlZCBJTzoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2h1c3RjYXQva2VybmVsLTIu Ni4zMi9zcmMvNzg2ZDcyMDgwNzA1MjczN2JiMTdiYzQ0ZGE5ZGEyMDU1NDQwMDAzOS9tbS9m aWxlbWFwLmM/YXQ9bWFzdGVyI2NsLTI2NDIKc3NpemVfdCBnZW5lcmljX2ZpbGVfYWlvX3dy aXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCnVuc2ln bmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKewpzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlv Y2Ita2lfZmlscDsKc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtZl9tYXBwaW5nLWhvc3Q7 CnNzaXplX3QgcmV0OwoKCkJVR19PTihpb2NiLWtpX3BvcyAhPSBwb3MpOwoKCnNiX3N0YXJ0 X3dyaXRlKGlub2RlLWlfc2IpOwptdXRleF9sb2NrKGlub2RlLWlfbXV0ZXgpOwpyZXQgPSBf X2dlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBpb2NiLWtpX3Bv cyk7Cm11dGV4X3VubG9jayhpbm9kZS1pX211dGV4KTsKCgpJIHN0aWxsIGRvbuKAmXQgdW5k ZXJzdGFuZCB3aHkgZXh0MyBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbSB3aXRoIGJ1ZmZl cmVkIElPLgoKCkJlc3QgcmVnYXJkcywKeXkKCgrljp/lp4vpgq7ku7YK5Y+R5Lu25Lq6OkVy aWMgU2FuZGVlbnNhbmRlZW5Ac2FuZGVlbi5uZXQK5pS25Lu25Lq6Onl5eXlAeHNwcmluZy5u ZXQ7IHhmc3hmc0Bvc3Muc2dpLmNvbQrlj5HpgIHml7bpl7Q6MjAxNeW5tDLmnIgxMuaXpSjl kajlm5sp4oCHMDA6MDgK5Li76aKYOlJlOiBYRlMgYnVmZmVyIElPIHBlcmZvcm1hbmNlIGlz IHZlcnkgcG9vcgoKCk9uIDIvMTEvMTUgMTozOSBBTSwgeXkgd3JvdGU6IHNuaXAgKEluIGFk ZGl0aW9uIHRvIEJyaWFuJ3MgcXVlc3Rpb25zKTogIFhGUyBmb3JtYXQgcGFyYW1ldGVzOiAg ICNta2ZzLnhmcyAtZCBzdT0yNTZrLHN3PTUgL2Rldi9zZGIxICAgI2NhdCAvcHJvYy9tb3Vu dHMgICAvZGV2L3NkYjEgL2RhdGExIHhmcyBydyxub2F0aW1lLGF0dHIyLGRlbGF5bG9nLG5v YmFycmllcixsb2dic2l6ZT0yNTZrLHN1bml0PTUxMixzd2lkdGg9MjU2MCxub3F1b3RhIDAg MCAgICNmZGlzayAtdWwgIERldmljZSBCb290IFN0YXJ0IEVuZCBCbG9ja3MgSWQgU3lzdGVt ICAvZGV2L3NkYjEgMTI4IDI5MjkzNTYzNTkgMTQ2NDY3ODExNiA4MyBMaW51eCBzbyAxMjgq NTEyID0gNjRrOyB5b3VyIHBhcnRpdGlvbiBkb2Vzbid0IHN0YXJ0IG9uIGEgMjU2ayBzdHJp cGUgdW5pdCBib3VuZGFyeSwgcmlnaHQ/IFNob3VsZG4ndCBpdCBkbyBzbz8gLUVyaWM= ------=_NextPart_54DC3A71_7FCE0C70_4680FC3D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZScsICflvq7ova/pm4Xp u5EnO2NvbG9yOiMzMzM7Ij48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1p bHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij5CcmlhbiBhbmQgRXJpYyw8L3A+ PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5k ZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsg Zm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij5UaGFua3MgdmVy eSBtdWNoIGZvciB5b3VyIHJlcGxheS48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7 IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48 cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRl JzsgbWFyZ2luOiAwcHg7Ij5JIGNoYW5nZWQgcGFydGl0aW9uIHN0YXJ0IHBvc2l0aW9uIHdp dGggMjU2SywgYnV0IHRoZSBwZXJmb3JtYW5jZSBpcyBzdGlsbCBwb29yLCBubyBjaGFuZ2Uu PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBH cmFuZGUnOyBtYXJnaW46IDBweDsiPiMgZmRpc2sgLXVsIC9kZXYvc2RiICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNp ZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij4mbmJzcDsgJm5ic3A7RGV2aWNlIEJvb3QgJm5i c3A7ICZuYnNwOyAmbmJzcDtTdGFydCAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgRW5k ICZuYnNwOyAmbmJzcDsgJm5ic3A7QmxvY2tzICZuYnNwOyBJZCAmbmJzcDtTeXN0ZW08L3A+ PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5k ZSc7IG1hcmdpbjogMHB4OyI+L2Rldi9zZGIxICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7IDUxMiAmbmJzcDsyOTI5MzU2MzU5ICZuYnNwOzE0NjQ2Nzc5MjQg Jm5ic3A7IDgzICZuYnNwO0xpbnV4PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBm b250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxicj48L3A+PHAg c3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7 IG1hcmdpbjogMHB4OyI+SSBjaGVja2VkIHRoZSBYRlPigJlzIGNvZGUsIEkgYWdyZWUgdGhh dCZuYnNwO1hGU19JT0xPQ0tfRVhDTCBsb2NrIG1heWJlIHRoZSByZWFzb246PC9wPjxwIHN0 eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBt YXJnaW46IDBweDsiPjxhIGhyZWY9Imh0dHBzOi8vYml0YnVja2V0Lm9yZy9odXN0Y2F0L2tl cm5lbC0yLjYuMzIvc3JjLzc4NmQ3MjA4MDcwNTI3MzdiYjE3YmM0NGRhOWRhMjA1NTQ0MDAw MzkvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jP2F0PW1hc3RlciNjbC03MTQiPmh0dHBz Oi8vYml0YnVja2V0Lm9yZy9odXN0Y2F0L2tlcm5lbC0yLjYuMzIvc3JjLzc4NmQ3MjA4MDcw NTI3MzdiYjE3YmM0NGRhOWRhMjA1NTQ0MDAwMzkvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmls ZS5jP2F0PW1hc3RlciNjbC03MTQ8L2E+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41 OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPlNUQVRJQyBz c2l6ZV90PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1 Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPnhmc19maWxlX2J1ZmZlcmVkX2Fpb193cml0 ZSg8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRh IEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBz dHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnN0cnVjdCBraW9jYjxzcGFuIGNsYXNz PSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQk8L3NwYW4+Kmlv Y2IsPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lk YSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIg c3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5jb25zdCBzdHJ1Y3QgaW92ZWM8c3Bh biBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3Nw YW4+KmlvdnAsPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTog J0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWIt c3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj51bnNpZ25lZCBsb25nPHNw YW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCTwv c3Bhbj5ucl9zZWdzLDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1p bHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUt dGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+bG9mZl90PHNwYW4g Y2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3Nw YW4+cG9zLDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdM dWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNw YW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c2l6ZV90PHNwYW4gY2xhc3M9 IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3NwYW4+b2Nv dW50KTwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNp ZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij57PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDog MS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFu IGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bh bj5zdHJ1Y3QgZmlsZTxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRl LXNwYWNlOnByZSI+CQk8L3NwYW4+KmZpbGUgPSBpb2NiLSZndDtraV9maWxwOzwvcD48cCBz dHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsg bWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c3RydWN0IGFkZHJlc3Nfc3BhY2U8c3BhbiBjbGFzcz0i QXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+Km1hcHBp bmcgPSBmaWxlLSZndDtmX21hcHBpbmc7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41 OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNs YXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5z dHJ1Y3QgaW5vZGU8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1z cGFjZTpwcmUiPgkJPC9zcGFuPippbm9kZSA9IG1hcHBpbmctJmd0O2hvc3Q7PC9wPjxwIHN0 eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBt YXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRl LXNwYWNlOnByZSI+CTwvc3Bhbj5zdHJ1Y3QgeGZzX2lub2RlPHNwYW4gY2xhc3M9IkFwcGxl LXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPippcCA9IFhGU19J KGlub2RlKTs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAn THVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1z cGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnNzaXplX3Q8c3BhbiBjbGFz cz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgkJCTwvc3Bhbj5y ZXQ7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lk YSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIg c3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5pbnQ8c3BhbiBjbGFzcz0iQXBwbGUt dGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgkJCTwvc3Bhbj5lbm9zcGMgPSAw OzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEg R3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0 eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+aW50PHNwYW4gY2xhc3M9IkFwcGxlLXRh Yi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3NwYW4+aW9sb2NrID0gWEZT X0lPTE9DS19FWENMOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1p bHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUt dGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c2l6ZV90PHNwYW4g Y2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3Nw YW4+Y291bnQgPSBvY291bnQ7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250 LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxicj48L3A+PHAgc3R5 bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1h cmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUt c3BhY2U6cHJlIj4JPC9zcGFuPjxpPjxiPnhmc19yd19pbG9jayhpcCwgaW9sb2NrKTs8L2I+ PC9pPjwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNp ZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48YnI+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdo dDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxz cGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwv c3Bhbj5yZXQgPSB4ZnNfZmlsZV9haW9fd3JpdGVfY2hlY2tzKGZpbGUsICZhbXA7cG9zLCAm YW1wO2NvdW50LCAmYW1wO2lvbG9jayk7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41 OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNs YXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5p ZiAocmV0KTwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdM dWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48YnI+PC9wPjxwIHN0eWxlPSJsaW5lLWhl aWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsi Pjxicj48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVj aWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+SG93ZXZlcu+8jEkgZm91bmQgdGhhdCBFWFQz IGFsc28gaGF2ZSBtdXRleCB3aGVuIHdpdGggYnVmZmVyZWQgSU86PC9wPjxwIHN0eWxlPSJs aW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46 IDBweDsiPjxhIGhyZWY9Imh0dHBzOi8vYml0YnVja2V0Lm9yZy9odXN0Y2F0L2tlcm5lbC0y LjYuMzIvc3JjLzc4NmQ3MjA4MDcwNTI3MzdiYjE3YmM0NGRhOWRhMjA1NTQ0MDAwMzkvbW0v ZmlsZW1hcC5jP2F0PW1hc3RlciNjbC0yNjQyIj5odHRwczovL2JpdGJ1Y2tldC5vcmcvaHVz dGNhdC9rZXJuZWwtMi42LjMyL3NyYy83ODZkNzIwODA3MDUyNzM3YmIxN2JjNDRkYTlkYTIw NTU0NDAwMDM5L21tL2ZpbGVtYXAuYz9hdD1tYXN0ZXIjY2wtMjY0MjwvYT48L3A+PHAgc3R5 bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1h cmdpbjogMHB4OyI+c3NpemVfdCBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9j YiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsPC9wPjxwIHN0eWxlPSJsaW5lLWhl aWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsi PjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+ CQk8L3NwYW4+dW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKTwvcD48cCBzdHls ZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFy Z2luOiAwcHg7Ij57PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWls eTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10 YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5zdHJ1Y3QgZmlsZSAq ZmlsZSA9IGlvY2ItJmd0O2tpX2ZpbHA7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41 OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNs YXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5z dHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0mZ3Q7Zl9tYXBwaW5nLSZndDtob3N0OzwvcD48 cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRl JzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3 aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c3NpemVfdCByZXQ7PC9wPjxwIHN0eWxlPSJsaW5l LWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBw eDsiPjxicj48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAn THVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1z cGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPkJVR19PTihpb2NiLSZndDtr aV9wb3MgIT0gcG9zKTs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48cCBzdHlsZT0i bGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2lu OiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFj ZTpwcmUiPgk8L3NwYW4+c2Jfc3RhcnRfd3JpdGUoaW5vZGUtJmd0O2lfc2IpOzwvcD48cCBz dHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsg bWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgk8L3NwYW4+PGk+PGI+bXV0ZXhfbG9jaygmYW1wO2lub2RlLSZndDtp X211dGV4KTs8L2I+PC9pPjwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1m YW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBw bGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+cmV0ID0gX19n ZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGlvdiwgbnJfc2VncywgJmFtcDtpb2NiLSZn dDtraV9wb3MpOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6 ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFi LXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+bXV0ZXhfdW5sb2NrKCZh bXA7aW5vZGUtJmd0O2lfbXV0ZXgpOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsg Zm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48YnI+PC9wPjxw IHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUn OyBtYXJnaW46IDBweDsiPkkgc3RpbGwgZG9u4oCZdCB1bmRlcnN0YW5kIHdoeSBleHQzIGRv ZXMgbm90IGhhdmUgdGhpcyBwcm9ibGVtIHdpdGggYnVmZmVyZWQgSU8uJm5ic3A7PC9wPjxi cj48ZGl2PjxkaXYgc3R5bGU9ImZvbnQ6IDE0cHgvMS41ICdMdWNpZGEgR3JhbmRlJzsiPkJl c3QgcmVnYXJkcyw8ZGl2Pnl5PC9kaXY+PC9kaXY+PC9kaXY+PHNwYW4gc3R5bGU9ImZvbnQ6 IDE0cHgvMS41ICdMdWNpZGEgR3JhbmRlJztjb2xvcjojMzMzOyI+PGJyPjwvc3Bhbj48ZGl2 IGNsYXNzPSJmb3htYWlsX2Jsb2NrcXVvdGVfZnJvbWhlcmVfZWxlbWVudCIgc3R5bGU9ImZv bnQ6IDEycHgvMS41ICdMdWNpZGEgR3JhbmRlJztwYWRkaW5nOjJweCAwIDJweCAwOyI+PHNw YW4gc3R5bGU9ImNvbG9yOiMzMzM7dGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDt3aGl0 ZS1zcGFjZTpwcmUtd3JhcDsiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+ Jm5ic3A75Y6f5aeL6YKu5Lu2Jm5ic3A7PHNwYW4gc3R5bGU9ImNvbG9yOiMzMzM7dGV4dC1k ZWNvcmF0aW9uOmxpbmUtdGhyb3VnaDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDsiPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9kaXY+PGRpdiBzdHlsZT0iZm9udDogMTJw eC8xLjUgJ0x1Y2lkYSBHcmFuZGUnO2JhY2tncm91bmQ6I2VmZWZlZjtjb2xvcjojNjY2NjY2 O3BhZGRpbmc6OHB4OyI+PGRpdj48YiBzdHlsZT0iY29sb3I6Izk5OTsiPuWPkeS7tuS6ujo8 L2I+Jm5ic3A7RXJpYyBTYW5kZWVuJmx0O3NhbmRlZW5Ac2FuZGVlbi5uZXQmZ3Q7PC9kaXY+ PGRpdj48YiBzdHlsZT0iY29sb3I6Izk5OTsiPuaUtuS7tuS6ujo8L2I+Jm5ic3A7eXkmbHQ7 eXlAeHNwcmluZy5uZXQmZ3Q7OyB4ZnMmbHQ7eGZzQG9zcy5zZ2kuY29tJmd0OzwvZGl2Pjxk aXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7Ij7lj5HpgIHml7bpl7Q6PC9iPiZuYnNwOzIwMTXl ubQy5pyIMTLml6Uo5ZGo5ZubKeKAhzAwOjA4PC9kaXY+PGRpdj48YiBzdHlsZT0iY29sb3I6 Izk5OTsiPuS4u+mimDo8L2I+Jm5ic3A7UmU6IFhGUyBidWZmZXIgSU8gcGVyZm9ybWFuY2Ug aXMgdmVyeSBwb29yPC9kaXY+PC9kaXY+PGJyPjxkaXYgY2xhc3M9Im1haWxfcXVvdGVfNDY5 NDYyQUREMkUwNDQxQUI3NDVENjY4NjY0NEYwREYiIHN0eWxlPSJmb250OiAxNHB4LzEuNSAn THVjaWRhIEdyYW5kZSc7Y29sb3I6IzMzMzsiPjxwcmUgc3R5bGU9IndoaXRlLXNwYWNlOnBy ZS13cmFwOyI+T24gMi8xMS8xNSAxOjM5IEFNLCB5eSB3cm90ZToKCiZsdDtzbmlwJmd0OwoK KEluIGFkZGl0aW9uIHRvIEJyaWFuJ3MgcXVlc3Rpb25zKToKCiZndDsgWEZTIGZvcm1hdCBw YXJhbWV0ZXM6CiZndDsgCiZndDsgI21rZnMueGZzIC1kIHN1PTI1Nmssc3c9NSAvZGV2L3Nk YjEKJmd0OyAKJmd0OyAjY2F0IC9wcm9jL21vdW50cwomZ3Q7IAomZ3Q7IC9kZXYvc2RiMSAv ZGF0YTEgeGZzIHJ3LG5vYXRpbWUsYXR0cjIsZGVsYXlsb2csbm9iYXJyaWVyLGxvZ2JzaXpl PTI1Nmssc3VuaXQ9NTEyLHN3aWR0aD0yNTYwLG5vcXVvdGEgMCAwCiZndDsgCiZndDsgI2Zk aXNrIC11bAomZ3Q7IERldmljZSBCb290ICAgICAgU3RhcnQgICAgICAgICBFbmQgICAgICBC bG9ja3MgICBJZCAgU3lzdGVtCiZndDsgL2Rldi9zZGIxICAgICAgICAgICAgIDEyOCAgMjky OTM1NjM1OSAgMTQ2NDY3ODExNiAgIDgzICBMaW51eAoKc28gMTI4KjUxMiA9IDY0azsgeW91 ciBwYXJ0aXRpb24gZG9lc24ndCBzdGFydCBvbiBhIDI1Nmsgc3RyaXBlIHVuaXQgYm91bmRh cnksCnJpZ2h0PyAgU2hvdWxkbid0IGl0IGRvIHNvPwoKLUVyaWMKCjwvcHJlPjwvZGl2Pjwv ZGl2Pg== ------=_NextPart_54DC3A71_7FCE0C70_4680FC3D-- From karimov-ayrat@tvd.co.nz Wed Feb 11 23:35:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CADE87F67 for ; Wed, 11 Feb 2015 23:35:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 643A0AC001 for ; Wed, 11 Feb 2015 21:35:15 -0800 (PST) X-ASG-Debug-ID: 1423719310-04bdf06a591e48b0001-NocioJ Received: from relay.mailchannels.net (ftx-008-i772.relay.mailchannels.net [50.61.143.72]) by cuda.sgi.com with ESMTP id 0H19elsuPcYUxYcu for ; Wed, 11 Feb 2015 21:35:11 -0800 (PST) X-Barracuda-Envelope-From: karimov-ayrat@tvd.co.nz X-Barracuda-Apparent-Source-IP: 50.61.143.72 X-Sender-Id: arvixe|x-authuser|rahul@lotuscolors.net Received: from BROWN.mysitehosted.com (ip-10-229-11-165.us-west-2.compute.internal [10.229.11.165]) by relay.mailchannels.net (Postfix) with ESMTPA id 1AD61603C2; Thu, 12 Feb 2015 05:35:08 +0000 (UTC) X-Sender-Id: arvixe|x-authuser|rahul@lotuscolors.net Received: from BROWN.mysitehosted.com (brown.mysitehosted.com [10.227.0.86]) by 0.0.0.0:2500 (trex/5.4.3); Thu, 12 Feb 2015 05:35:09 GMT X-MC-Relay: Neutral X-MailChannels-SenderId: arvixe|x-authuser|rahul@lotuscolors.net X-MailChannels-Auth-Id: arvixe X-MC-Loop-Signature: 1423719308837:926374578 X-MC-Ingress-Time: 1423719308837 Received: from Unknown (Unknown [219.137.250.193]) by BROWN.mysitehosted.com with ESMTPA ; Wed, 11 Feb 2015 19:34:42 -0800 X-AuthUser: rahul@lotuscolors.net Message-ID: <5451E7B4BF6B4FCC10155CD652CC3558@ylaxsdj> From: =?windows-1251?Q?=C3=EE=F1=D1=F2=F0=EE=E9=DD=EA=F1=EF=E5?= =?windows-1251?Q?=F0=F2=E8=E7=E0?= To: , , , Subject: =?windows-1251?Q?=D1=F2=E0=F2=FC=FF_52=2E_=CE=F1=F3=F9=E5?= =?windows-1251?Q?=F1=F2=E2=EB=E5=ED=E8=E5_=F1=F2=F0=EE=E8?= =?windows-1251?Q?=F2=E5=EB=FC=F1=F2=E2=E0=2C_=F0=E5=EA=EE?= =?windows-1251?Q?=ED=F1=F2=F0=F3=EA=F6=E8=E8=2C_=EA=E0=EF?= =?windows-1251?Q?=E8=F2=E0=EB=FC=ED=EE=E3=EE_=F0=E5=EC=EE?= =?windows-1251?Q?=ED=F2=E0_=EE=E1=FA=E5=EA=F2=E0_=EA=E0?= =?windows-1251?Q?=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE_=F1=F2=F0?= =?windows-1251?Q?=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0?= Date: Thu, 12 Feb 2015 04:34:21 +0100 X-ASG-Orig-Subj: =?windows-1251?Q?=D1=F2=E0=F2=FC=FF_52=2E_=CE=F1=F3=F9=E5?= =?windows-1251?Q?=F1=F2=E2=EB=E5=ED=E8=E5_=F1=F2=F0=EE=E8?= =?windows-1251?Q?=F2=E5=EB=FC=F1=F2=E2=E0=2C_=F0=E5=EA=EE?= =?windows-1251?Q?=ED=F1=F2=F0=F3=EA=F6=E8=E8=2C_=EA=E0=EF?= =?windows-1251?Q?=E8=F2=E0=EB=FC=ED=EE=E3=EE_=F0=E5=EC=EE?= =?windows-1251?Q?=ED=F2=E0_=EE=E1=FA=E5=EA=F2=E0_=EA=E0?= =?windows-1251?Q?=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE_=F1=F2=F0?= =?windows-1251?Q?=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_221E_01D0467D.2C2D7FA0" X-Priority: 3 Sender: X-Barracuda-Connect: ftx-008-i772.relay.mailchannels.net[50.61.143.72] X-Barracuda-Start-Time: 1423719311 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. ------=_NextPart_000_221E_01D0467D.2C2D7FA0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8 =E2=EE =E2=EB=EE=E6=E5=ED=E8=E8. ------=_NextPart_000_221E_01D0467D.2C2D7FA0 Content-Type: image/jpeg; name="2015_gr.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="2015_gr.jpg" /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAK0AfEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9jvhf +3t4P+LP7YPjT4J6dpviSDxV4FsWv7+7ubeBdPljDW6kROsrSFs3KfejUcNzwM8z+zx/wVU+GH7U X7UGv/CrwhF4jvdV8Pw3M8mrNbQDSrtLeRI3MMgmMjgs42kxgMASDjBP5p/tD/FPxr4K/wCCufx6 8K/Dq0kn8Z/FmBPBOnXCSGNtP+1fYHlnDDlSsUUg35Hl7t+fkr0//gnj8CND/Yz/AOC1Pj3wRYXE kmkeDvAaefdSBmadzZaZNcTleSN8ryvtGdu7aOABX57geJ8XXq0I6KHNOM5NWV1zNJf4YqLk/wC8 vM/r/MPBDhzC5JiMxqSl7aWX08TRpqV3zKNL2tSXXldSqo049bT7I+qdZ/4LXeA4NL1zWdE+GPx4 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 OCnyfu/NX3RRTauuXpZL5KXOv/Jvnb3X7ugRbja3S/4xUH/5KkvJ6rXU/PP9lf8A4IieM/2b/Cnw /wBLu/j/AH3ii2+GWr6Xqug2N5o2pT6XA1jpuqWQItrzV7kwtKdQjZ1tJLe322iIsCFvMX2L9g7/ AIJfWX7EPwL+IXw4j8Z3fiTwx4/k+1yFdKi028sLmbT4rS9aOSJivlSNErwxBFFsv7tS6Km36qoq qj9oqinr7TSXneyfpfljt2Qoe44OOnJa3lbma+7mlv3Z+Zvxd/4I1fEbQ/gr4bs9J8YeHPHPivww PAPg7QZLbwnFpFrpOgaHr0V691ewz38i306pl3WN4FcQlI4VaSu/i/4Ix+JLW81PX7H43XWgeO9b 0vxjDea1oXhx9NSDUPEOoWd69zaIl751vFB9jEYjFw0z+Yzi5jcA1950U1J6vq3N36/vElNf9vWu +rk273tZNJ2XRcv/AJI24/dey6JK1t7/AAt8Of8AginFoXwz+H/hvxJ8UvEusR+DviLrXxCu7vSb rWNGvtQk1KzvIHtYr9dUk1CEJLdtIZXu5pJVVkkL+Y7nA8A/8ELLv4d+C9N8JWfxWsrrwnqWh+E9 E8XwXnhJptQ1ZfD1893bPYXJvQtj5pfbIJYrrGC6FHYmv0IooUmmmunL/wCSK0fWy01363BpNNPr f8ZObt295309NtD4D+A//BFXxF8D5viu8fxktNUHxB0bUNG02C+8JSanZaQl3qs2ou0tpqN/d20o UztH5NtFaQOCXkjkkIYffUKeVEqkglQBkDGfwp1FTH3acaS2irL72/zbBpOcqj3k7v7kvySCiiig YUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z ------=_NextPart_000_221E_01D0467D.2C2D7FA0-- From yy@xspring.net Thu Feb 12 01:00:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=HTML_MESSAGE,MANY_SPAN_IN_TEXT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7E7B97F55 for ; Thu, 12 Feb 2015 01:00:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4057B8F8040 for ; Wed, 11 Feb 2015 23:00:42 -0800 (PST) X-ASG-Debug-ID: 1423724436-04bdf06a5a1e5fa0001-NocioJ Received: from smtpbgbr1.qq.com (smtpbgbr1.qq.com [54.207.19.206]) by cuda.sgi.com with ESMTP id FGYQb7D0T6aHctzU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Feb 2015 23:00:39 -0800 (PST) X-Barracuda-Envelope-From: yy@xspring.net X-Barracuda-Apparent-Source-IP: 54.207.19.206 X-QQ-mid: bizesmtp4t1423724379t085t142 Received: from yinyedeMacBook-Pro (unknown [59.37.125.61]) by esmtp4.qq.com (ESMTP) with id ; Thu, 12 Feb 2015 14:59:38 +0800 (CST) X-QQ-SSF: 00100000000000F09222 X-QQ-FEAT: A+cSGZkKvolyimCew7ABMGvV60p8p3OPynbLMOpA8Uj14meTSEMtW1scSQI2g ReSPLSSvzGhu4b9ocwwJmi7IGhPpIdmh34DQtWOKebnm4SRq/GyZuKxpHAsXQG0f+42YjaM r0SOtdvKqb5Q6F9OkMzdOzGHYjCeYxKimW7nga59+fEtzDO4lphAgKGdLsql/33fqPPNoKp paucm0LDVWJIsKJX9HLfnP8IFZ8EPC8o= X-QQ-GoodBg: 0 X-FOXMAIL-CODE: foxmail_code:00015C430E76 X-GUID: BE38945B-6458-364E-785C-B33522E4BAE1 From: "=?utf-8?B?eXk=?=" To: "=?utf-8?B?eGZz?=", "=?utf-8?B?RXJpYyBTYW5kZWVu?=", "=?utf-8?B?YmZvc3Rlcg==?=" Subject: Re: XFS buffer IO performance is very poor Mime-Version: 1.0 X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor Content-Type: multipart/alternative; boundary="----=_NextPart_54DC4F68_7D436800_397DE23D" Content-Transfer-Encoding: 8Bit Date: Thu, 12 Feb 2015 14:59:52 +0800 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: Foxmail_for_Mac 1.0.0 X-QQ-SENDSIZE: 520 X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbgbr1.qq.com[54.207.19.206] X-Barracuda-Start-Time: 1423724437 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15176 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily This is a multi-part message in MIME format. ------=_NextPart_54DC4F68_7D436800_397DE23D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SW4gZnVuY3Rpb254ZnNfZmlsZV9haW9fcmVhZCwgd2lsbCByZXF1ZXN0WEZTX0lPTE9DS19T SEFSRUQgbG9jayBmb3IgYm90aCBkaXJlY3QgSU8gYW5kIGJ1ZmZlcmVkIElPOgpTVEFUSUMg c3NpemVfdAp4ZnNfZmlsZV9haW9fcmVhZCgKc3RydWN0IGtpb2NiICppb2NiLApjb25zdCBz dHJ1Y3QgaW92ZWMgKmlvdnAsCnVuc2lnbmVkIGxvbmcgbnJfc2VncywKbG9mZl90IHBvcykK ewouLi4KeGZzX3J3X2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CgoKaHR0cHM6Ly9i aXRidWNrZXQub3JnL2h1c3RjYXQva2VybmVsLTIuNi4zMi9zcmMvNzg2ZDcyMDgwNzA1Mjcz N2JiMTdiYzQ0ZGE5ZGEyMDU1NDQwMDAzOS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmM/ YXQ9bWFzdGVyI2NsLTI4MQoKCnNvIHdyaXRlIHdpbGwgcHJldmVudCByZWFkIGluIFhGUy4K CgpIb3dldmVyLCBpbiBmdW5jdGlvbiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQgZm9yIGV4dDMs IHdpbGwgbm90IGxvY2tpbm9kZS1pX211dGV4LCBzbyB3cml0ZSB3aWxsIG5vdCBwcmV2ZW50 IHJlYWQgaW4gZXh0My4KCgpJIHRoaW5rIHRoaXMgbWF5YmUgdGhlIHJlYXNvbiBvZiBwb29y IHBlcmZvcm1hbmNlIGZvciBYRlMuIEkgZG8gbm90IGtub3cgaWYgdGhpcyBpcyBhIGJ1Zywg b3IgZGVzaWduIGZsYXdzIG9mIFhGUy4KCgoKCkJlc3QgcmVnYXJkcywKeXkKCgrljp/lp4vp gq7ku7YK5Y+R5Lu25Lq6Onl5eXlAeHNwcmluZy5uZXQK5pS25Lu25Lq6Onhmc3hmc0Bvc3Mu c2dpLmNvbTsgRXJpYyBTYW5kZWVuc2FuZGVlbkBzYW5kZWVuLm5ldDsgYmZvc3RlckByZWRo YXQuY29tCuWPkemAgeaXtumXtDoyMDE15bm0MuaciDEy5pelKOWRqOWbmynigIcxMzozMArk uLvpopg6UmU6IFhGUyBidWZmZXIgSU8gcGVyZm9ybWFuY2UgaXMgdmVyeSBwb29yCgoKQnJp YW4gYW5kIEVyaWMsCgoKVGhhbmtzIHZlcnkgbXVjaCBmb3IgeW91ciByZXBsYXkuCgoKSSBj aGFuZ2VkIHBhcnRpdGlvbiBzdGFydCBwb3NpdGlvbiB3aXRoIDI1NkssIGJ1dCB0aGUgcGVy Zm9ybWFuY2UgaXMgc3RpbGwgcG9vciwgbm8gY2hhbmdlLgojIGZkaXNrIC11bCAvZGV2L3Nk YiAgICAgICAgICAKIERldmljZSBCb290ICAgU3RhcnQgICAgIEVuZCAgIEJsb2NrcyAgSWQg U3lzdGVtCi9kZXYvc2RiMSAgICAgICA1MTIgMjkyOTM1NjM1OSAxNDY0Njc3OTI0ICA4MyBM aW51eAoKCkkgY2hlY2tlZCB0aGUgWEZT4oCZcyBjb2RlLCBJIGFncmVlIHRoYXRYRlNfSU9M T0NLX0VYQ0wgbG9jayBtYXliZSB0aGUgcmVhc29uOgpodHRwczovL2JpdGJ1Y2tldC5vcmcv aHVzdGNhdC9rZXJuZWwtMi42LjMyL3NyYy83ODZkNzIwODA3MDUyNzM3YmIxN2JjNDRkYTlk YTIwNTU0NDAwMDM5L2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYz9hdD1tYXN0ZXIjY2wt NzE0ClNUQVRJQyBzc2l6ZV90Cnhmc19maWxlX2J1ZmZlcmVkX2Fpb193cml0ZSgKc3RydWN0 IGtpb2NiICppb2NiLApjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdnAsCnVuc2lnbmVkIGxvbmcg bnJfc2VncywKbG9mZl90IHBvcywKc2l6ZV90IG9jb3VudCkKewpzdHJ1Y3QgZmlsZSAqZmls ZSA9IGlvY2Ita2lfZmlscDsKc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxl LWZfbWFwcGluZzsKc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctaG9zdDsKc3RydWN0 IHhmc19pbm9kZSAqaXAgPSBYRlNfSShpbm9kZSk7CnNzaXplX3QgcmV0OwppbnQgZW5vc3Bj ID0gMDsKaW50IGlvbG9jayA9IFhGU19JT0xPQ0tfRVhDTDsKc2l6ZV90IGNvdW50ID0gb2Nv dW50OwoKCnhmc19yd19pbG9jayhpcCwgaW9sb2NrKTsKCgpyZXQgPSB4ZnNfZmlsZV9haW9f d3JpdGVfY2hlY2tzKGZpbGUsIHBvcywgY291bnQsIGlvbG9jayk7CmlmIChyZXQpCgoKCgpI b3dldmVy77yMSSBmb3VuZCB0aGF0IEVYVDMgYWxzbyBoYXZlIG11dGV4IHdoZW4gd2l0aCBi dWZmZXJlZCBJTzoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2h1c3RjYXQva2VybmVsLTIuNi4z Mi9zcmMvNzg2ZDcyMDgwNzA1MjczN2JiMTdiYzQ0ZGE5ZGEyMDU1NDQwMDAzOS9tbS9maWxl bWFwLmM/YXQ9bWFzdGVyI2NsLTI2NDIKc3NpemVfdCBnZW5lcmljX2ZpbGVfYWlvX3dyaXRl KHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCnVuc2lnbmVk IGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKewpzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2It a2lfZmlscDsKc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtZl9tYXBwaW5nLWhvc3Q7CnNz aXplX3QgcmV0OwoKCkJVR19PTihpb2NiLWtpX3BvcyAhPSBwb3MpOwoKCnNiX3N0YXJ0X3dy aXRlKGlub2RlLWlfc2IpOwptdXRleF9sb2NrKGlub2RlLWlfbXV0ZXgpOwpyZXQgPSBfX2dl bmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBpb2NiLWtpX3Bvcyk7 Cm11dGV4X3VubG9jayhpbm9kZS1pX211dGV4KTsKCgpJIHN0aWxsIGRvbuKAmXQgdW5kZXJz dGFuZCB3aHkgZXh0MyBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbSB3aXRoIGJ1ZmZlcmVk IElPLgoKCkJlc3QgcmVnYXJkcywKeXkKCgrljp/lp4vpgq7ku7YK5Y+R5Lu25Lq6OkVyaWMg U2FuZGVlbnNhbmRlZW5Ac2FuZGVlbi5uZXQK5pS25Lu25Lq6Onl5eXlAeHNwcmluZy5uZXQ7 IHhmc3hmc0Bvc3Muc2dpLmNvbQrlj5HpgIHml7bpl7Q6MjAxNeW5tDLmnIgxMuaXpSjlkajl m5sp4oCHMDA6MDgK5Li76aKYOlJlOiBYRlMgYnVmZmVyIElPIHBlcmZvcm1hbmNlIGlzIHZl cnkgcG9vcgoKCk9uIDIvMTEvMTUgMTozOSBBTSwgeXkgd3JvdGU6IHNuaXAgKEluIGFkZGl0 aW9uIHRvIEJyaWFuJ3MgcXVlc3Rpb25zKTogIFhGUyBmb3JtYXQgcGFyYW1ldGVzOiAgICNt a2ZzLnhmcyAtZCBzdT0yNTZrLHN3PTUgL2Rldi9zZGIxICAgI2NhdCAvcHJvYy9tb3VudHMg ICAvZGV2L3NkYjEgL2RhdGExIHhmcyBydyxub2F0aW1lLGF0dHIyLGRlbGF5bG9nLG5vYmFy cmllcixsb2dic2l6ZT0yNTZrLHN1bml0PTUxMixzd2lkdGg9MjU2MCxub3F1b3RhIDAgMCAg ICNmZGlzayAtdWwgIERldmljZSBCb290IFN0YXJ0IEVuZCBCbG9ja3MgSWQgU3lzdGVtICAv ZGV2L3NkYjEgMTI4IDI5MjkzNTYzNTkgMTQ2NDY3ODExNiA4MyBMaW51eCBzbyAxMjgqNTEy ID0gNjRrOyB5b3VyIHBhcnRpdGlvbiBkb2Vzbid0IHN0YXJ0IG9uIGEgMjU2ayBzdHJpcGUg dW5pdCBib3VuZGFyeSwgcmlnaHQ/IFNob3VsZG4ndCBpdCBkbyBzbz8gLUVyaWM= ------=_NextPart_54DC4F68_7D436800_397DE23D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZScsICflvq7ova/pm4Xp u5EnO2NvbG9yOiMzMzM7Ij48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5k ZSc7bWFyZ2luOjA7Ij5JbiBmdW5jdGlvbiZuYnNwO3hmc19maWxlX2Fpb19yZWFkLCB3aWxs IHJlcXVlc3QmbmJzcDs8c3BhbiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsiPlhGU19JT0xP Q0tfU0hBUkVEIGxvY2sgZm9yIGJvdGggZGlyZWN0IElPIGFuZCBidWZmZXJlZCBJTzo8L3Nw YW4+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lk YSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPlNUQVRJQyBzc2l6ZV90PC9wPjxwIHN0eWxlPSJs aW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46 IDBweDsiPnhmc19maWxlX2Fpb19yZWFkKDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEu NTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBj bGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+ c3RydWN0IGtpb2NiPHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUt c3BhY2U6cHJlIj4JCTwvc3Bhbj4qaW9jYiw8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAx LjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4g Y2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFu PmNvbnN0IHN0cnVjdCBpb3ZlYzxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9 IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj4qaW92cCw8L3A+PHAgc3R5bGU9ImxpbmUtaGVp Z2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+ PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4J PC9zcGFuPnVuc2lnbmVkIGxvbmc8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxl PSJ3aGl0ZS1zcGFjZTpwcmUiPgkJPC9zcGFuPm5yX3NlZ3MsPC9wPjxwIHN0eWxlPSJsaW5l LWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBw eDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnBy ZSI+CTwvc3Bhbj5sb2ZmX3Q8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3 aGl0ZS1zcGFjZTpwcmUiPgkJCTwvc3Bhbj5wb3MpPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdo dDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPns8 L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdy YW5kZSc7IG1hcmdpbjogMHB4OyI+Li4uPC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdM dWNpZGEgR3JhbmRlJzttYXJnaW46MDsiPnhmc19yd19pbG9jayhpcCwgWEZTX0lPTE9DS19T SEFSRUQpOzwvcD48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7bWFy Z2luOjA7Ij48YnI+PC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdMdWNpZGEgR3JhbmRl JzttYXJnaW46MDsiPjxhIGhyZWY9Imh0dHBzOi8vYml0YnVja2V0Lm9yZy9odXN0Y2F0L2tl cm5lbC0yLjYuMzIvc3JjLzc4NmQ3MjA4MDcwNTI3MzdiYjE3YmM0NGRhOWRhMjA1NTQ0MDAw MzkvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jP2F0PW1hc3RlciNjbC0yODEiPmh0dHBz Oi8vYml0YnVja2V0Lm9yZy9odXN0Y2F0L2tlcm5lbC0yLjYuMzIvc3JjLzc4NmQ3MjA4MDcw NTI3MzdiYjE3YmM0NGRhOWRhMjA1NTQ0MDAwMzkvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmls ZS5jP2F0PW1hc3RlciNjbC0yODE8L2E+PC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdM dWNpZGEgR3JhbmRlJzttYXJnaW46MDsiPjxicj48L3A+PHAgc3R5bGU9ImZvbnQ6MTRweC8x LjUgJ0x1Y2lkYSBHcmFuZGUnO21hcmdpbjowOyI+c28gd3JpdGUgd2lsbCBwcmV2ZW50IHJl YWQgaW4gWEZTLjwvcD48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7 bWFyZ2luOjA7Ij48YnI+PC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdMdWNpZGEgR3Jh bmRlJzttYXJnaW46MDsiPkhvd2V2ZXIsIGluIGZ1bmN0aW9uIGdlbmVyaWNfZmlsZV9haW9f cmVhZCBmb3IgZXh0Mywgd2lsbCBub3QgbG9jayZuYnNwO2lub2RlLSZndDtpX211dGV4LCBz byB3cml0ZSB3aWxsIG5vdCBwcmV2ZW50IHJlYWQgaW4gZXh0My48L3A+PHAgc3R5bGU9ImZv bnQ6MTRweC8xLjUgJ0x1Y2lkYSBHcmFuZGUnO21hcmdpbjowOyI+PGJyPjwvcD48cCBzdHls ZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7bWFyZ2luOjA7Ij5JIHRoaW5rIHRo aXMgbWF5YmUgdGhlIHJlYXNvbiBvZiBwb29yIHBlcmZvcm1hbmNlIGZvciBYRlMuIEkgZG8g bm90IGtub3cgaWYgdGhpcyBpcyBhIGJ1Zywgb3IgZGVzaWduIGZsYXdzIG9mIFhGUy48L3A+ PHAgc3R5bGU9ImZvbnQ6MTRweC8xLjUgJ0x1Y2lkYSBHcmFuZGUnO21hcmdpbjowOyI+PGJy PjwvcD48YnI+PGRpdj48ZGl2IHN0eWxlPSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5k ZSc7Ij5CZXN0IHJlZ2FyZHMsPGRpdj55eTwvZGl2PjwvZGl2PjwvZGl2PjxzcGFuIHN0eWxl PSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Y29sb3I6IzMzMzsiPjxicj48L3Nw YW4+PGRpdiBjbGFzcz0iZm94bWFpbF9ibG9ja3F1b3RlX2Zyb21oZXJlX2VsZW1lbnQiIHN0 eWxlPSJmb250OiAxMnB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7cGFkZGluZzoycHggMCAycHgg MDsiPjxzcGFuIHN0eWxlPSJjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91 Z2g7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij4gICAgICAgICAgICAgICAgICAgICAgICAgICAg PC9zcGFuPiZuYnNwO+WOn+Wni+mCruS7tiZuYnNwOzxzcGFuIHN0eWxlPSJjb2xvcjojMzMz O3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9ImZv bnQ6IDEycHgvMS41ICdMdWNpZGEgR3JhbmRlJztiYWNrZ3JvdW5kOiNlZmVmZWY7Y29sb3I6 IzY2NjY2NjtwYWRkaW5nOjhweDsiPjxkaXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7Ij7lj5Hk u7bkuro6PC9iPiZuYnNwO3l5Jmx0O3l5QHhzcHJpbmcubmV0Jmd0OzwvZGl2PjxkaXY+PGIg c3R5bGU9ImNvbG9yOiM5OTk7Ij7mlLbku7bkuro6PC9iPiZuYnNwO3hmcyZsdDt4ZnNAb3Nz LnNnaS5jb20mZ3Q7OyBFcmljIFNhbmRlZW4mbHQ7c2FuZGVlbkBzYW5kZWVuLm5ldCZndDs7 IGJmb3N0ZXJAcmVkaGF0LmNvbTwvZGl2PjxkaXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7Ij7l j5HpgIHml7bpl7Q6PC9iPiZuYnNwOzIwMTXlubQy5pyIMTLml6Uo5ZGo5ZubKeKAhzEzOjMw PC9kaXY+PGRpdj48YiBzdHlsZT0iY29sb3I6Izk5OTsiPuS4u+mimDo8L2I+Jm5ic3A7UmU6 IFhGUyBidWZmZXIgSU8gcGVyZm9ybWFuY2UgaXMgdmVyeSBwb29yPC9kaXY+PC9kaXY+PGJy PjxkaXYgY2xhc3M9Im1haWxfcXVvdGVfNTQ3MUYzRTk4NjFGNDIxQzk0RkQ0M0NENkYxN0I1 MjQiIHN0eWxlPSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Y29sb3I6IzMzMzsi PjxkaXYgc3R5bGU9ImZvbnQ6MTRweC8xLjUgJ0x1Y2lkYSBHcmFuZGUnLCAn5b6u6L2v6ZuF 6buRJztjb2xvcjojMzMzOyI+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+QnJpYW4gYW5kIEVyaWMsPC9w PjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFu ZGUnOyBtYXJnaW46IDBweDsiPjxicj48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7 IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+VGhhbmtzIHZl cnkgbXVjaCBmb3IgeW91ciByZXBsYXkuPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41 OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxicj48L3A+ PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5k ZSc7IG1hcmdpbjogMHB4OyI+SSBjaGFuZ2VkIHBhcnRpdGlvbiBzdGFydCBwb3NpdGlvbiB3 aXRoIDI1NkssIGJ1dCB0aGUgcGVyZm9ybWFuY2UgaXMgc3RpbGwgcG9vciwgbm8gY2hhbmdl LjwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEg R3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij4jIGZkaXNrIC11bCAvZGV2L3NkYiAmbmJzcDsgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVj aWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+Jm5ic3A7ICZuYnNwO0RldmljZSBCb290ICZu YnNwOyAmbmJzcDsgJm5ic3A7U3RhcnQgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IEVu ZCAmbmJzcDsgJm5ic3A7ICZuYnNwO0Jsb2NrcyAmbmJzcDsgSWQgJm5ic3A7U3lzdGVtPC9w PjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFu ZGUnOyBtYXJnaW46IDBweDsiPi9kZXYvc2RiMSAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyA1MTIgJm5ic3A7MjkyOTM1NjM1OSAmbmJzcDsxNDY0Njc3OTI0 ICZuYnNwOyA4MyAmbmJzcDtMaW51eDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsg Zm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48YnI+PC9wPjxw IHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUn OyBtYXJnaW46IDBweDsiPkkgY2hlY2tlZCB0aGUgWEZT4oCZcyBjb2RlLCBJIGFncmVlIHRo YXQmbmJzcDtYRlNfSU9MT0NLX0VYQ0wgbG9jayBtYXliZSB0aGUgcmVhc29uOjwvcD48cCBz dHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsg bWFyZ2luOiAwcHg7Ij48YSBocmVmPSJodHRwczovL2JpdGJ1Y2tldC5vcmcvaHVzdGNhdC9r ZXJuZWwtMi42LjMyL3NyYy83ODZkNzIwODA3MDUyNzM3YmIxN2JjNDRkYTlkYTIwNTU0NDAw MDM5L2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYz9hdD1tYXN0ZXIjY2wtNzE0Ij5odHRw czovL2JpdGJ1Y2tldC5vcmcvaHVzdGNhdC9rZXJuZWwtMi42LjMyL3NyYy83ODZkNzIwODA3 MDUyNzM3YmIxN2JjNDRkYTlkYTIwNTU0NDAwMDM5L2ZzL3hmcy9saW51eC0yLjYveGZzX2Zp bGUuYz9hdD1tYXN0ZXIjY2wtNzE0PC9hPjwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEu NTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij5TVEFUSUMg c3NpemVfdDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdM dWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij54ZnNfZmlsZV9idWZmZXJlZF9haW9fd3Jp dGUoPC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lk YSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIg c3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5zdHJ1Y3Qga2lvY2I8c3BhbiBjbGFz cz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgkJPC9zcGFuPipp b2NiLDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNp ZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4i IHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+Y29uc3Qgc3RydWN0IGlvdmVjPHNw YW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9z cGFuPippb3ZwLDwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6 ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFi LXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+dW5zaWduZWQgbG9uZzxz cGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQk8 L3NwYW4+bnJfc2Vncyw8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxl LXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPmxvZmZfdDxzcGFu IGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQkJPC9z cGFuPnBvcyw8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAn THVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1z cGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnNpemVfdDxzcGFuIGNsYXNz PSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQkJPC9zcGFuPm9j b3VudCk8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVj aWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+ezwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6 IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3Bh biBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3Nw YW4+c3RydWN0IGZpbGU8c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgkJPC9zcGFuPipmaWxlID0gaW9jYi0mZ3Q7a2lfZmlscDs8L3A+PHAg c3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7 IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hp dGUtc3BhY2U6cHJlIj4JPC9zcGFuPnN0cnVjdCBhZGRyZXNzX3NwYWNlPHNwYW4gY2xhc3M9 IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPiptYXBw aW5nID0gZmlsZS0mZ3Q7Zl9tYXBwaW5nOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEu NTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBj bGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+ c3RydWN0IGlub2RlPHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUt c3BhY2U6cHJlIj4JCTwvc3Bhbj4qaW5vZGUgPSBtYXBwaW5nLSZndDtob3N0OzwvcD48cCBz dHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsg bWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0 ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c3RydWN0IHhmc19pbm9kZTxzcGFuIGNsYXNzPSJBcHBs ZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj4qaXAgPSBYRlNf SShpbm9kZSk7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTog J0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWIt c3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5zc2l6ZV90PHNwYW4gY2xh c3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3NwYW4+ cmV0OzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNp ZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4i IHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+aW50PHNwYW4gY2xhc3M9IkFwcGxl LXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JCQk8L3NwYW4+ZW5vc3BjID0g MDs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRh IEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBz dHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPmludDxzcGFuIGNsYXNzPSJBcHBsZS10 YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQkJPC9zcGFuPmlvbG9jayA9IFhG U19JT0xPQ0tfRVhDTDs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFt aWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxl LXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnNpemVfdDxzcGFu IGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CQkJPC9z cGFuPmNvdW50ID0gb2NvdW50OzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9u dC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48YnI+PC9wPjxwIHN0 eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBt YXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRl LXNwYWNlOnByZSI+CTwvc3Bhbj48aT48Yj54ZnNfcndfaWxvY2soaXAsIGlvbG9jayk7PC9i PjwvaT48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVj aWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48cCBzdHlsZT0ibGluZS1oZWln aHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48 c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8 L3NwYW4+cmV0ID0geGZzX2ZpbGVfYWlvX3dyaXRlX2NoZWNrcyhmaWxlLCAmYW1wO3Bvcywg JmFtcDtjb3VudCwgJmFtcDtpb2xvY2spOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEu NTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBj bGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+ aWYgKHJldCk8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAn THVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48cCBzdHlsZT0ibGluZS1o ZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7 Ij48YnI+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1 Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPkhvd2V2ZXLvvIxJIGZvdW5kIHRoYXQgRVhU MyBhbHNvIGhhdmUgbXV0ZXggd2hlbiB3aXRoIGJ1ZmZlcmVkIElPOjwvcD48cCBzdHlsZT0i bGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2lu OiAwcHg7Ij48YSBocmVmPSJodHRwczovL2JpdGJ1Y2tldC5vcmcvaHVzdGNhdC9rZXJuZWwt Mi42LjMyL3NyYy83ODZkNzIwODA3MDUyNzM3YmIxN2JjNDRkYTlkYTIwNTU0NDAwMDM5L21t L2ZpbGVtYXAuYz9hdD1tYXN0ZXIjY2wtMjY0MiI+aHR0cHM6Ly9iaXRidWNrZXQub3JnL2h1 c3RjYXQva2VybmVsLTIuNi4zMi9zcmMvNzg2ZDcyMDgwNzA1MjczN2JiMTdiYzQ0ZGE5ZGEy MDU1NDQwMDAzOS9tbS9maWxlbWFwLmM/YXQ9bWFzdGVyI2NsLTI2NDI8L2E+PC9wPjxwIHN0 eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBt YXJnaW46IDBweDsiPnNzaXplX3QgZ2VuZXJpY19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lv Y2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LDwvcD48cCBzdHlsZT0ibGluZS1o ZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7 Ij48c3BhbiBjbGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUi PgkJPC9zcGFuPnVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcyk8L3A+PHAgc3R5 bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1h cmdpbjogMHB4OyI+ezwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1p bHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBjbGFzcz0iQXBwbGUt dGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+c3RydWN0IGZpbGUg KmZpbGUgPSBpb2NiLSZndDtraV9maWxwOzwvcD48cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEu NTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAwcHg7Ij48c3BhbiBj bGFzcz0iQXBwbGUtdGFiLXNwYW4iIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUiPgk8L3NwYW4+ c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtJmd0O2ZfbWFwcGluZy0mZ3Q7aG9zdDs8L3A+ PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5k ZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0i d2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnNzaXplX3QgcmV0OzwvcD48cCBzdHlsZT0ibGlu ZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRlJzsgbWFyZ2luOiAw cHg7Ij48YnI+PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZhbWlseTog J0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxzcGFuIGNsYXNzPSJBcHBsZS10YWIt c3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5CVUdfT04oaW9jYi0mZ3Q7 a2lfcG9zICE9IHBvcyk7PC9wPjxwIHN0eWxlPSJsaW5lLWhlaWdodDogMS41OyBmb250LWZh bWlseTogJ0x1Y2lkYSBHcmFuZGUnOyBtYXJnaW46IDBweDsiPjxicj48L3A+PHAgc3R5bGU9 ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdp bjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3Bh Y2U6cHJlIj4JPC9zcGFuPnNiX3N0YXJ0X3dyaXRlKGlub2RlLSZndDtpX3NiKTs8L3A+PHAg c3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7 IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRhYi1zcGFuIiBzdHlsZT0id2hp dGUtc3BhY2U6cHJlIj4JPC9zcGFuPjxpPjxiPm11dGV4X2xvY2soJmFtcDtpbm9kZS0mZ3Q7 aV9tdXRleCk7PC9iPjwvaT48L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQt ZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFw cGxlLXRhYi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnJldCA9IF9f Z2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsICZhbXA7aW9jYi0m Z3Q7a2lfcG9zKTs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7IGZvbnQtZmFtaWx5 OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PHNwYW4gY2xhc3M9IkFwcGxlLXRh Yi1zcGFuIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPm11dGV4X3VubG9jaygm YW1wO2lub2RlLSZndDtpX211dGV4KTs8L3A+PHAgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxLjU7 IGZvbnQtZmFtaWx5OiAnTHVjaWRhIEdyYW5kZSc7IG1hcmdpbjogMHB4OyI+PGJyPjwvcD48 cCBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuNTsgZm9udC1mYW1pbHk6ICdMdWNpZGEgR3JhbmRl JzsgbWFyZ2luOiAwcHg7Ij5JIHN0aWxsIGRvbuKAmXQgdW5kZXJzdGFuZCB3aHkgZXh0MyBk b2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbSB3aXRoIGJ1ZmZlcmVkIElPLiZuYnNwOzwvcD48 YnI+PGRpdj48ZGl2IHN0eWxlPSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Ij5C ZXN0IHJlZ2FyZHMsPGRpdj55eTwvZGl2PjwvZGl2PjwvZGl2PjxzcGFuIHN0eWxlPSJmb250 OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Y29sb3I6IzMzMzsiPjxicj48L3NwYW4+PGRp diBjbGFzcz0iZm94bWFpbF9ibG9ja3F1b3RlX2Zyb21oZXJlX2VsZW1lbnQiIHN0eWxlPSJm b250OiAxMnB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7cGFkZGluZzoycHggMCAycHggMDsiPjxz cGFuIHN0eWxlPSJjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7d2hp dGUtc3BhY2U6cHJlLXdyYXA7Ij4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFu PiZuYnNwO+WOn+Wni+mCruS7tiZuYnNwOzxzcGFuIHN0eWxlPSJjb2xvcjojMzMzO3RleHQt ZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2PjxkaXYgc3R5bGU9ImZvbnQ6IDEy cHgvMS41ICdMdWNpZGEgR3JhbmRlJztiYWNrZ3JvdW5kOiNlZmVmZWY7Y29sb3I6IzY2NjY2 NjtwYWRkaW5nOjhweDsiPjxkaXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7Ij7lj5Hku7bkuro6 PC9iPiZuYnNwO0VyaWMgU2FuZGVlbiZsdDs8YSBocmVmPSJtYWlsdG86c2FuZGVlbkBzYW5k ZWVuLm5ldCIgdGl0bGU9Im1haWx0bzpzYW5kZWVuQHNhbmRlZW4ubmV0Ij5zYW5kZWVuQHNh bmRlZW4ubmV0PC9hPiZndDs8L2Rpdj48ZGl2PjxiIHN0eWxlPSJjb2xvcjojOTk5OyI+5pS2 5Lu25Lq6OjwvYj4mbmJzcDt5eSZsdDs8YSBocmVmPSJtYWlsdG86eXlAeHNwcmluZy5uZXQi IHRpdGxlPSJtYWlsdG86eXlAeHNwcmluZy5uZXQiPnl5QHhzcHJpbmcubmV0PC9hPiZndDs7 IHhmcyZsdDs8YSBocmVmPSJtYWlsdG86eGZzQG9zcy5zZ2kuY29tIiB0aXRsZT0ibWFpbHRv Onhmc0Bvc3Muc2dpLmNvbSI+eGZzQG9zcy5zZ2kuY29tPC9hPiZndDs8L2Rpdj48ZGl2Pjxi IHN0eWxlPSJjb2xvcjojOTk5OyI+5Y+R6YCB5pe26Ze0OjwvYj4mbmJzcDsyMDE15bm0Muac iDEy5pelKOWRqOWbmynigIcwMDowODwvZGl2PjxkaXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7 Ij7kuLvpopg6PC9iPiZuYnNwO1JlOiBYRlMgYnVmZmVyIElPIHBlcmZvcm1hbmNlIGlzIHZl cnkgcG9vcjwvZGl2PjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJtYWlsX3F1b3RlXzQ2OTQ2MkFE RDJFMDQ0MUFCNzQ1RDY2ODY2NDRGMERGIiBzdHlsZT0iZm9udDogMTRweC8xLjUgJ0x1Y2lk YSBHcmFuZGUnO2NvbG9yOiMzMzM7Ij48cHJlIHN0eWxlPSJ3aGl0ZS1zcGFjZTpwcmUtd3Jh cDsiPk9uIDIvMTEvMTUgMTozOSBBTSwgeXkgd3JvdGU6CgombHQ7c25pcCZndDsKCihJbiBh ZGRpdGlvbiB0byBCcmlhbidzIHF1ZXN0aW9ucyk6CgomZ3Q7IFhGUyBmb3JtYXQgcGFyYW1l dGVzOgomZ3Q7IAomZ3Q7ICNta2ZzLnhmcyAtZCBzdT0yNTZrLHN3PTUgL2Rldi9zZGIxCiZn dDsgCiZndDsgI2NhdCAvcHJvYy9tb3VudHMKJmd0OyAKJmd0OyAvZGV2L3NkYjEgL2RhdGEx IHhmcyBydyxub2F0aW1lLGF0dHIyLGRlbGF5bG9nLG5vYmFycmllcixsb2dic2l6ZT0yNTZr LHN1bml0PTUxMixzd2lkdGg9MjU2MCxub3F1b3RhIDAgMAomZ3Q7IAomZ3Q7ICNmZGlzayAt dWwKJmd0OyBEZXZpY2UgQm9vdCAgICAgIFN0YXJ0ICAgICAgICAgRW5kICAgICAgQmxvY2tz ICAgSWQgIFN5c3RlbQomZ3Q7IC9kZXYvc2RiMSAgICAgICAgICAgICAxMjggIDI5MjkzNTYz NTkgIDE0NjQ2NzgxMTYgICA4MyAgTGludXgKCnNvIDEyOCo1MTIgPSA2NGs7IHlvdXIgcGFy dGl0aW9uIGRvZXNuJ3Qgc3RhcnQgb24gYSAyNTZrIHN0cmlwZSB1bml0IGJvdW5kYXJ5LApy aWdodD8gIFNob3VsZG4ndCBpdCBkbyBzbz8KCi1FcmljCgo8L3ByZT48L2Rpdj48L2Rpdj48 L2Rpdj48L2Rpdj4= ------=_NextPart_54DC4F68_7D436800_397DE23D-- From alexander.tsvetkov@oracle.com Thu Feb 12 05:51:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 693C87F56 for ; Thu, 12 Feb 2015 05:51:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5572D8F804C for ; Thu, 12 Feb 2015 03:51:40 -0800 (PST) X-ASG-Debug-ID: 1423741893-04cbb011631eb860001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id iy7Yg8ZZbc8erOYW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 03:51:33 -0800 (PST) X-Barracuda-Envelope-From: alexander.tsvetkov@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 t1CBpUNd012380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 12 Feb 2015 11:51:31 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t1CBpUVL004479 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 12 Feb 2015 11:51:30 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1CBpUXj014441; Thu, 12 Feb 2015 11:51:30 GMT Received: from [10.162.81.93] (/10.162.81.93) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 12 Feb 2015 03:51:30 -0800 Message-ID: <54DC940D.4030009@oracle.com> Date: Thu, 12 Feb 2015 14:52:45 +0300 From: Alexander Tsvetkov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner , Eric Sandee CC: xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> <20150211205406.GT4251@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log In-Reply-To: <20150211205406.GT4251@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed 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: 1423741893 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- archive with necessary data is available by this reference: https://drive.google.com/open?id=0B1Cg0_B_ui2gRTQ1Yk9kVUw1Snc&authuser=0 On 02/11/2015 11:54 PM, Dave Chinner wrote: > On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: >> Hello, >> >> I've obtained corrupted xfs log after some sanity xfs testing: >> >> "log=logfile >> log_size=855 >> >> dd if=/dev/zero "of=$log" bs=4096 count=$log_size >> loopdev=$(losetup -f) >> losetup $loopdev $log >> >> mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV >> mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT >> ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT >> sync >> umount $SCRATCH_MNT >> >> xfs_logprint -l $loopdev $SCRATCH_DEV" >> >> Test makes crc enabled xfs filesystem with the external log of >> minimal allowed size and then creates on this fs the small directory >> tree >> with sub directories and files of fixed depth and size with help of >> fdtree utility: >> https://computing.llnl.gov/?set=code&page=sio_downloads > Just take metadump image and put it somewhere we can down load it. > >> After that xfs_logprint stably reports bad data in log: >> >> "Oper (307): tid: eec9b0c7 len: 16 clientid: TRANS flags: none >> EXTENTS inode data >> Oper (308): tid: 41000000 len: 805306368 clientid: ERROR flags: none >> LOCAL attr data > Clearly that operation is wrong, so everything past it is suspect. > This sort of error usually comes from an error parsing an earlier > ophdr, so even that probably doesn't point directly at the cause. > >> ============================================================================ >> cycle: 1 version: 2 lsn: 1,3138 tail_lsn: 1,2 >> length of Log Record: 32256 prev offset: 3074 num ops: 375 >> uuid: 39a962b7-4c0d-4e0e-8bcd-39471f93bc1d format: little endian linux >> h_size: 32768 >> ---------------------------------------------------------------------------- >> Oper (0): tid: eec9b0c7 len: 48 clientid: TRANS flags: none >> ********************************************************************** >> * ERROR: data block=3138 * >> ********************************************************************** >> >> xfs_logprint: unknown log operation type (2e00) >> Bad data in log" > i.e. this is not the problem that needs to be chased. > >> Subsequent call to "xfs_repair -n -l $loopdev $SCRATCH_DEV" passes >> and filesystem is mounted without errors. > xfs_repair -n doesn't look at the log at all. > > Cheers, > > Dave. Thanks, Alexander Tsvetkov From bfoster@redhat.com Thu Feb 12 12:17:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B7D157F51 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B31A304062 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5b24eba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IAIt60NE6MrkF9G3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTtS020186 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSP6030675 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5A2CD1256C1; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 12/18] xfs: helpers to convert holemask to/from generic bitmap Date: Thu, 12 Feb 2015 13:17:19 -0500 X-ASG-Orig-Subj: [PATCH v4 12/18] xfs: helpers to convert holemask to/from generic bitmap Message-Id: <1423765045-15791-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inobt record holemask field is a condensed data type designed to fit into the existing on-disk record and is zero based (allocated regions are set to 0, sparse regions are set to 1) to provide backwards compatibility. This makes the type somewhat complex for use in higher level inode manipulations such as individual inode allocation, etc. Rather than foist the complexity of dealing with this field to every bit of logic that requires inode granular information, create a helper to convert the holemask to an inode allocation bitmap. The inode allocation bitmap is inode granularity similar to the inobt record free mask and indicates which inodes of the chunk are physically allocated on disk, irrespective of whether the inode is considered allocated or free by the filesystem. The generic bitmap type requires the use of generic kernel bitmap APIs. A separate helper is provided to convert the bitmap back to a native 64-bit type (for native bitwise operations). This is required because the generic bitmap code represents a bitmap as an array of unsigned long in a little endian style (though each array value is cpu order). To ensure compatibility with various word sizes and endianness', bitmap_to_u64() exports the bitmap to little endian and swaps back to cpu byte order. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc_btree.c | 91 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc_btree.h | 7 ++++ 2 files changed, 98 insertions(+) diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index b95aac5..6ee8697 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -427,3 +427,94 @@ xfs_inobt_maxrecs( return blocklen / sizeof(xfs_inobt_rec_t); return blocklen / (sizeof(xfs_inobt_key_t) + sizeof(xfs_inobt_ptr_t)); } + +/* + * Convert a generic bitmap to native u64. + */ +uint64_t +bitmap_to_u64( + const unsigned long *bitmap, + int nbits) +{ + __le64 lebitmap; + + ASSERT(nbits <= 64); + + /* + * The bitmap format depends on the native word size. E.g., bit 0 could + * land in the middle of the 64 bits on a big endian 32-bit arch (see + * arch/powerpc/include/asm/bitops.h). To handle this, export the bitmap + * as 64-bit little endian and convert back to native byte order. + */ + bitmap_copy_le(&lebitmap, bitmap, nbits); + return le64_to_cpu(lebitmap); +} + +/* + * Convert the inode record holemask to an inode allocation bitmap. The inode + * allocation bitmap is inode granularity and specifies whether an inode is + * physically allocated on disk (not whether the inode is considered allocated + * or free by the fs). + * + * We have to be careful with regard to byte order and word size since the + * generic bitmap code uses primitive types. + * + * A bit value of 1 means the inode is allocated, a value of 0 means it is free. + */ +void +xfs_inobt_irec_to_allocmap( + unsigned long *allocbmap, + struct xfs_inobt_rec_incore *rec) +{ + int nextbit; + DECLARE_BITMAP(holemask, 16); + + bitmap_zero(allocbmap, 64); + + /* + * bitmaps are represented as an array of unsigned long (each in cpu + * byte order). ir_holemask is only 16 bits, so direct assignment is + * safe. + */ + BUILD_BUG_ON(sizeof(rec->ir_holemask) > sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * holemask is a 16-bit bitmap and inode records span 64 inodes. Thus + * each holemask bit represents multiple (XFS_INODES_PER_HOLEMASK_BIT) + * inodes. Since holemask bits represent holes, each set bit represents + * a region of the physical chunk that is not tracked by the record. + * + * We want an inode granularity allocation bitmap. We have to invert the + * holemask and set XFS_INODES_PER_HOLEMASK_BIT bits for each set bit. + * We invert and expand simultaneously by walking the unset (zeroed) + * holemask bits. For each zero bit in holemask, set the corresponding + * XFS_INODES_PER_HOLEMASK_BIT bits in the allocation bitmap. + */ + nextbit = find_first_zero_bit(holemask, 16); + while (nextbit < 16) { + bitmap_set(allocbmap, nextbit * XFS_INODES_PER_HOLEMASK_BIT, + XFS_INODES_PER_HOLEMASK_BIT); + + nextbit = find_next_zero_bit(holemask, 16, nextbit + 1); + } +} + +/* + * Return a host format mask of all the allocated inodes in the chunk. The + * bitmap format depends on the native word size (e.g. see + * arch/powerpc/include/asm/bitops.h) and so we have to marshall the bitmap + * through a defined endian conversion so that we can perform host native 64 bit + * logic operations on the resultant allocation mask. + * + * A bit value of 1 means the inode is allocated, a value of 0 means it is free. + */ +u64 +xfs_inobt_irec_to_allocmask( + struct xfs_inobt_rec_incore *irec) +{ + DECLARE_BITMAP(allocmap, 64); + + xfs_inobt_irec_to_allocmap(allocmap, irec); + return bitmap_to_u64(allocmap, 64); +} diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.h b/fs/xfs/libxfs/xfs_ialloc_btree.h index d7ebea7..cc20850 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.h +++ b/fs/xfs/libxfs/xfs_ialloc_btree.h @@ -62,4 +62,11 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, xfs_btnum_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); +/* + * Inode record holemask to allocation bitmap conversion helpers. + */ +uint64_t bitmap_to_u64(const unsigned long *, int); +void xfs_inobt_irec_to_allocmap(unsigned long *, struct xfs_inobt_rec_incore *); +u64 xfs_inobt_irec_to_allocmask(struct xfs_inobt_rec_incore *); + #endif /* __XFS_IALLOC_BTREE_H__ */ -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CEBAD7F55 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE9CC8F8073 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5b24ebb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tGNqDNRHxs9cpMTS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTCo007690 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHS0d030669 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D23AF1256BF; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 18/18] xfs: enable sparse inode chunks for v5 superblocks Date: Thu, 12 Feb 2015 13:17:25 -0500 X-ASG-Orig-Subj: [PATCH v4 18/18] xfs: enable sparse inode chunks for v5 superblocks Message-Id: <1423765045-15791-19-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Enable mounting of filesystems with sparse inode support enabled. Add the incompat. feature bit to the *_ALL mask. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 4f2160d..7122ff6 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -521,7 +521,8 @@ xfs_sb_has_ro_compat_feature( #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) + (XFS_SB_FEAT_INCOMPAT_FTYPE| \ + XFS_SB_FEAT_INCOMPAT_SPINODES) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF6907F56 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BEA2C8F8070 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cbb01163235b00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PZ6L8xeqByYyf1PE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTUN027056 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSup026128 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0033B1256B8; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 07/18] xfs: add fs geometry bit for sparse inode chunks Date: Thu, 12 Feb 2015 13:17:14 -0500 X-ASG-Orig-Subj: [PATCH v4 07/18] xfs: add fs geometry bit for sparse inode chunks Message-Id: <1423765045-15791-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define an fs geometry bit for sparse inode chunks such that the characteristic of the fs can be identified by userspace. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 18dc721..89689c6 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ +#define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index fba6532..ea390ef 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -101,7 +101,9 @@ xfs_fs_geometry( (xfs_sb_version_hasftype(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | (xfs_sb_version_hasfinobt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FINOBT : 0); + XFS_FSOP_GEOM_FLAGS_FINOBT : 0) | + (xfs_sb_version_hassparseinodes(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_SPINODES : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D1F017F58 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AED3E304064 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0a27a9d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QiAB4ACAFC5hauwa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTD2015123 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHS0b030669 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 38BB81256BC; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 10/18] xfs: pass inode count through ordered icreate log item Date: Thu, 12 Feb 2015 13:17:17 -0500 X-ASG-Orig-Subj: [PATCH v4 10/18] xfs: pass inode count through ordered icreate log item Message-Id: <1423765045-15791-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 v5 superblocks use an ordered log item for logging the initialization of inode chunks. The icreate log item is currently hardcoded to an inode count of 64 inodes. The agbno and extent length are used to initialize the inode chunk from log recovery. While an incorrect inode count does not lead to bad inode chunk initialization, we should pass the correct inode count such that log recovery has enough data to perform meaningful validity checks on the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 7 ++++--- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/xfs_log_recover.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 008cb24..7c002f2 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -250,6 +250,7 @@ xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, struct list_head *buffer_list, + int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, @@ -305,7 +306,7 @@ xfs_ialloc_inode_init( * they track in the AIL as if they were physically logged. */ if (tp) - xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, + xfs_icreate_log(tp, agno, agbno, icount, mp->m_sb.sb_inodesize, length, gen); } else version = 2; @@ -524,8 +525,8 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - error = xfs_ialloc_inode_init(args.mp, tp, NULL, agno, args.agbno, - args.len, prandom_u32()); + error = xfs_ialloc_inode_init(args.mp, tp, NULL, newlen, agno, + args.agbno, args.len, prandom_u32()); if (error) return error; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 100007d..4d4b702 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -156,7 +156,7 @@ int xfs_inobt_get_rec(struct xfs_btree_cur *cur, * Inode chunk initialisation routine */ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, - struct list_head *buffer_list, + struct list_head *buffer_list, int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a5a945f..ecc73d5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3091,8 +3091,8 @@ xlog_recover_do_icreate_pass2( XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) return 0; - xfs_ialloc_inode_init(mp, NULL, buffer_list, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); + xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, + be32_to_cpu(icl->icl_gen)); return 0; } -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E14E97F59 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF6188F806F for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0927a9d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HM0Wihn2Jh68OEKx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTOJ018940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSBt025877 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 27D6D1256B9; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 08/18] xfs: introduce inode record hole mask for sparse inode chunks Date: Thu, 12 Feb 2015 13:17:15 -0500 X-ASG-Orig-Subj: [PATCH v4 08/18] xfs: introduce inode record hole mask for sparse inode chunks Message-Id: <1423765045-15791-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inode btrees track 64 inodes per record regardless of inode size. Thus, inode chunks on disk vary in size depending on the size of the inodes. This creates a contiguous allocation requirement for new inode chunks that can be difficult to satisfy on an aged and fragmented (free space) filesystems. The inode record freecount currently uses 4 bytes on disk to track the free inode count. With a maximum freecount value of 64, only one byte is required. Convert the freecount field to a single byte and use two of the remaining 3 higher order bytes left for the hole mask field. Use the final leftover byte for the total count field. The hole mask field tracks holes in the chunks of physical space that the inode record refers to. This facilitates the sparse allocation of inode chunks when contiguous chunks are not available and allows the inode btrees to identify what portions of the chunk contain valid inodes. The total count field contains the total number of valid inodes referred to by the record. This can also be deduced from the hole mask. The count field provides clarity and redundancy for internal record verification. Note that neither of the new fields can be written to disk on fs' without sparse inode support. Doing so writes to the high-order bytes of freecount and causes corruption from the perspective of older kernels. The on-disk inobt record data structure is updated with a union to distinguish between the original, "full" format and the new, "sparse" format. The conversion routines to get, insert and update records are updated to translate to and from the on-disk record accordingly such that freecount remains a 4-byte value on non-supported fs, yet the new fields of the in-core record are always valid with respect to the record. This means that higher level code can refer to the current in-core record format unconditionally and lower level code ensures that records are translated to/from disk according to the capabilities of the fs. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 34 +++++++++++++++++++++++++--- fs/xfs/libxfs/xfs_ialloc.c | 48 +++++++++++++++++++++++++++++++++------- fs/xfs/libxfs/xfs_ialloc_btree.c | 11 ++++++++- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 47005b1..4f2160d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1285,26 +1285,54 @@ typedef __uint64_t xfs_inofree_t; #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) +#define XFS_INOBT_HOLEMASK_FULL 0 /* holemask for full chunk */ +#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(__uint16_t)) +#define XFS_INODES_PER_HOLEMASK_BIT \ + (XFS_INODES_PER_CHUNK / (NBBY * sizeof(__uint16_t))) + static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; } /* - * Data record structure + * The on-disk inode record structure has two formats. The original "full" + * format uses a 4-byte freecount. The "sparse" format uses a 1-byte freecount + * and replaces the 3 high-order freecount bytes wth the holemask and inode + * count. + * + * The holemask of the sparse record format allows an inode chunk to have holes + * that refer to blocks not owned by the inode record. This facilitates inode + * allocation in the event of severe free space fragmentation. */ typedef struct xfs_inobt_rec { __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ + union { + struct { + __be32 ir_freecount; /* count of free inodes */ + } f; + struct { + __be16 ir_holemask;/* hole mask for sparse chunks */ + __u8 ir_count; /* total inode count */ + __u8 ir_freecount; /* count of free inodes */ + } sp; + } ir_u; __be64 ir_free; /* free inode mask */ } xfs_inobt_rec_t; typedef struct xfs_inobt_rec_incore { xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ + __uint16_t ir_holemask; /* hole mask for sparse chunks */ + __uint8_t ir_count; /* total inode count */ + __uint8_t ir_freecount; /* count of free inodes (set bits) */ xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; +static inline bool xfs_inobt_issparse(uint16_t holemask) +{ + /* non-zero holemask represents a sparse rec. */ + return holemask; +} /* * Key structure diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 07cce35..008cb24 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -65,6 +65,8 @@ xfs_inobt_lookup( int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; cur->bc_rec.i.ir_freecount = 0; cur->bc_rec.i.ir_free = 0; return xfs_btree_lookup(cur, dir, stat); @@ -82,7 +84,14 @@ xfs_inobt_update( union xfs_btree_rec rec; rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + rec.inobt.ir_u.sp.ir_holemask = cpu_to_be16(irec->ir_holemask); + rec.inobt.ir_u.sp.ir_count = irec->ir_count; + rec.inobt.ir_u.sp.ir_freecount = irec->ir_freecount; + } else { + /* ir_holemask/ir_count not supported on-disk */ + rec.inobt.ir_u.f.ir_freecount = cpu_to_be32(irec->ir_freecount); + } rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -100,12 +109,27 @@ xfs_inobt_get_rec( int error; error = xfs_btree_get_rec(cur, &rec, stat); - if (!error && *stat == 1) { - irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); - irec->ir_free = be64_to_cpu(rec->inobt.ir_free); + if (error || *stat == 0) + return error; + + irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask); + irec->ir_count = rec->inobt.ir_u.sp.ir_count; + irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount; + } else { + /* + * ir_holemask/ir_count not supported on-disk. Fill in hardcoded + * values for full inode chunks. + */ + irec->ir_holemask = XFS_INOBT_HOLEMASK_FULL; + irec->ir_count = XFS_INODES_PER_CHUNK; + irec->ir_freecount = + be32_to_cpu(rec->inobt.ir_u.f.ir_freecount); } - return error; + irec->ir_free = be64_to_cpu(rec->inobt.ir_free); + + return 0; } /* @@ -114,10 +138,14 @@ xfs_inobt_get_rec( STATIC int xfs_inobt_insert_rec( struct xfs_btree_cur *cur, + __uint16_t holemask, + __uint8_t count, __int32_t freecount, xfs_inofree_t free, int *stat) { + cur->bc_rec.i.ir_holemask = holemask; + cur->bc_rec.i.ir_count = count; cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); @@ -154,7 +182,9 @@ xfs_inobt_insert( } ASSERT(i == 0); - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + error = xfs_inobt_insert_rec(cur, XFS_INOBT_HOLEMASK_FULL, + XFS_INODES_PER_CHUNK, + XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); @@ -1604,7 +1634,9 @@ xfs_difree_finobt( */ XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); - error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + error = xfs_inobt_insert_rec(cur, ibtrec->ir_holemask, + ibtrec->ir_count, + ibtrec->ir_freecount, ibtrec->ir_free, &i); if (error) goto error; diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 964c465..b95aac5 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -167,7 +167,16 @@ xfs_inobt_init_rec_from_cur( union xfs_btree_rec *rec) { rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino); - rec->inobt.ir_freecount = cpu_to_be32(cur->bc_rec.i.ir_freecount); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + rec->inobt.ir_u.sp.ir_holemask = + cpu_to_be16(cur->bc_rec.i.ir_holemask); + rec->inobt.ir_u.sp.ir_count = cur->bc_rec.i.ir_count; + rec->inobt.ir_u.sp.ir_freecount = cur->bc_rec.i.ir_freecount; + } else { + /* ir_holemask/ir_count not supported on-disk */ + rec->inobt.ir_u.f.ir_freecount = + cpu_to_be32(cur->bc_rec.i.ir_freecount); + } rec->inobt.ir_free = cpu_to_be64(cur->bc_rec.i.ir_free); } -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E452A7F5A for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D39AD304066 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0b27a9d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1JndylwtqBy3MlQt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHT6F015121 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSjH030646 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1F71A1256BA; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 05/18] xfs: use sparse chunk alignment for min. inode allocation requirement Date: Thu, 12 Feb 2015 13:17:12 -0500 X-ASG-Orig-Subj: [PATCH v4 05/18] xfs: use sparse chunk alignment for min. inode allocation requirement Message-Id: <1423765045-15791-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_select() iterates through the allocation groups looking for free inodes or free space to determine whether to allow an inode allocation to proceed. If no free inodes are available, it assumes that an AG must have an extent longer than mp->m_ialloc_blks. Sparse inode chunk support currently allows for allocations smaller than the traditional inode chunk size specified in m_ialloc_blks. The current minimum sparse allocation is set in the superblock sb_spino_align field at mkfs time. Create a new m_ialloc_min_blks field in xfs_mount and use this to represent the minimum supported allocation size for inode chunks. Initialize m_ialloc_min_blks at mount time based on whether sparse inodes are supported. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 5 +++++ fs/xfs/xfs_mount.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ffac044..07cce35 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -644,7 +644,7 @@ xfs_ialloc_ag_select( * if we fail allocation due to alignment issues then it is most * likely a real ENOSPC condition. */ - ineed = mp->m_ialloc_blks; + ineed = mp->m_ialloc_min_blks; if (flags && ineed > 1) ineed += xfs_ialloc_cluster_alignment(mp); longest = pag->pagf_longest; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index a461c2e..2b5b4fe 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -697,6 +697,11 @@ xfs_sb_mount_common( mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; + + if (sbp->sb_spino_align) + mp->m_ialloc_min_blks = sbp->sb_spino_align; + else + mp->m_ialloc_min_blks = mp->m_ialloc_blks; } /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a5b2ff8..97f17d5 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -136,6 +136,8 @@ typedef struct xfs_mount { __uint64_t m_flags; /* global mount flags */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ + int m_ialloc_min_blks;/* min blocks in sparse inode + * allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ struct xfs_trans_resv m_resv; /* precomputed res values */ -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F3E197F5D for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4944304062 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5c24ebb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uexpTYpNsBDPU123 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTRC018946 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSSx025876 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A719E1256B4; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 14/18] xfs: randomly do sparse inode allocations in DEBUG mode Date: Thu, 12 Feb 2015 13:17:21 -0500 X-ASG-Orig-Subj: [PATCH v4 14/18] xfs: randomly do sparse inode allocations in DEBUG mode Message-Id: <1423765045-15791-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sparse inode allocations generally only occur when full inode chunk allocation fails. This requires some level of filesystem space usage and fragmentation. For filesystems formatted with sparse inode chunks enabled, do random sparse inode chunk allocs when compiled in DEBUG mode to increase test coverage. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 1c81f08..d96c5e1 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -609,9 +609,18 @@ xfs_ialloc_ag_alloc( struct xfs_inobt_rec_incore rec; struct xfs_perag *pag; + int do_sparse = 0; + +#ifdef DEBUG + /* randomly do sparse inode allocations */ + if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb)) + do_sparse = prandom_u32() & 1; +#endif + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; + args.fsbno = NULLFSBLOCK; /* * Locking will ensure that we don't have two callers in here @@ -632,6 +641,8 @@ xfs_ialloc_ag_alloc( agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + args.mp->m_ialloc_blks; + if (do_sparse) + goto sparse_alloc; if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); @@ -670,8 +681,7 @@ xfs_ialloc_ag_alloc( * subsequent requests. */ args.minalignslop = 0; - } else - args.fsbno = NULLFSBLOCK; + } if (unlikely(args.fsbno == NULLFSBLOCK)) { /* @@ -729,6 +739,7 @@ xfs_ialloc_ag_alloc( if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && args.fsbno == NULLFSBLOCK) { +sparse_alloc: args.type = XFS_ALLOCTYPE_NEAR_BNO; args.agbno = be32_to_cpu(agi->agi_root); args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 32DD17F5E for ; Thu, 12 Feb 2015 12:17:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2111A304066 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0b27a9e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d13bxWySgDkAzxqD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:30 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTt6018944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSma026130 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 879E21256B5; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 16/18] xfs: only free allocated regions of inode chunks Date: Thu, 12 Feb 2015 13:17:23 -0500 X-ASG-Orig-Subj: [PATCH v4 16/18] xfs: only free allocated regions of inode chunks Message-Id: <1423765045-15791-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode chunk is currently added to the transaction free list based on a simple fsb conversion and hardcoded chunk length. The nature of sparse chunks is such that the physical chunk of inodes on disk may consist of one or more discontiguous parts. Blocks that reside in the holes of the inode chunk are not inodes and could be allocated to any other use or not allocated at all. Refactor the existing xfs_bmap_add_free() call into the xfs_difree_inode_chunk() helper. The new helper uses the existing calculation if a chunk is not sparse. Otherwise, use the inobt record holemask to free the contiguous regions of the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 81 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 62fc075..9b1d204 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1801,6 +1801,83 @@ out_error: return error; } +/* + * Free the blocks of an inode chunk. We must consider that the inode chunk + * might be sparse and only free the regions that are allocated as part of the + * chunk. + */ +STATIC void +xfs_difree_inode_chunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *rec, + struct xfs_bmap_free *flist) +{ + xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); + int startidx, endidx; + int nextbit; + xfs_agblock_t agbno; + int contigblk; + DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS); + + 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); + return; + } + + /* holemask is only 16-bits (fits in an unsigned long) */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * Find contiguous ranges of zeroes (i.e., allocated regions) in the + * holemask and convert the start/end index of each range to an extent. + * We start with the start and end index both pointing at the first 0 in + * the mask. + */ + startidx = endidx = find_first_zero_bit(holemask, + XFS_INOBT_HOLEMASK_BITS); + nextbit = startidx + 1; + while (startidx < XFS_INOBT_HOLEMASK_BITS) { + nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS, + nextbit); + /* + * If the next zero bit is contiguous, update the end index of + * the current range and continue. + */ + if (nextbit != XFS_INOBT_HOLEMASK_BITS && + nextbit == endidx + 1) { + endidx = nextbit; + goto next; + } + + /* + * nextbit is not contiguous with the current end index. Convert + * the current start/end to an extent and add it to the free + * list. + */ + agbno = sagbno + (startidx * XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + contigblk = ((endidx - startidx + 1) * + XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + + 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); + + /* reset range to current bit and carry on... */ + startidx = endidx = nextbit; + +next: + nextbit++; + } +} + STATIC int xfs_difree_inobt( struct xfs_mount *mp, @@ -1892,9 +1969,7 @@ xfs_difree_inobt( goto error0; } - 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_difree_inode_chunk(mp, agno, &rec, flist); } else { *deleted = 0; -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B99117F54 for ; Thu, 12 Feb 2015 12:17:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7DA7B8F806F for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5c24eba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 99rn0fxFvsJ7vbIq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTpU007685 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSSv025876 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 11E881256BB; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 06/18] xfs: sparse inode chunks feature helpers and mount requirements Date: Thu, 12 Feb 2015 13:17:13 -0500 X-ASG-Orig-Subj: [PATCH v4 06/18] xfs: sparse inode chunks feature helpers and mount requirements Message-Id: <1423765045-15791-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inode chunks feature uses the helper function to enable the allocation of sparse inode chunks. The incompatible feature bit is set on disk at mkfs time to prevent mount from unsupported kernels. Also, enforce the inode alignment requirements required for sparse inode chunks at mount time. When enabled, full inode chunks (and all inode record) alignment is increased from cluster size to inode chunk size. Sparse inode alignment must match the cluster size of the fs. Both superblock alignment fields are set as such by mkfs when sparse inode support is enabled. Finally, warn that sparse inode chunks is an experimental feature until further notice. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 7 +++++++ fs/xfs/libxfs/xfs_sb.c | 21 +++++++++++++++++++++ fs/xfs/xfs_mount.c | 16 ++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index dbca93d..47005b1 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -519,6 +519,7 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ (XFS_SB_FEAT_INCOMPAT_FTYPE) @@ -568,6 +569,12 @@ static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); } +static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES); +} + /* * end of superblock version macros */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 2b5b4fe..5b20a6c 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -182,6 +182,27 @@ xfs_mount_validate_sb( return -EFSCORRUPTED; } + /* + * Full inode chunks must be aligned to inode chunk size when + * sparse inodes are enabled to support the sparse chunk + * allocation algorithm and prevent overlapping inode records. + */ + if (xfs_sb_version_hassparseinodes(sbp)) { + uint32_t align; + + xfs_alert(mp, + "EXPERIMENTAL sparse inode feature enabled. Use at your own risk!"); + + align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize + >> sbp->sb_blocklog; + if (sbp->sb_inoalignmt != align) { + xfs_warn(mp, +"Inode block alignment (%u) must match chunk size (%u) for sparse inodes.", + sbp->sb_inoalignmt, align); + return -EINVAL; + } + } + if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { xfs_warn(mp, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4fa80e6..61fd023 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -738,6 +738,22 @@ xfs_mountfs( } /* + * If enabled, sparse inode chunk alignment is expected to match the + * cluster size. Full inode chunk alignment must match the chunk size, + * but that is checked on sb read verification... + */ + if (xfs_sb_version_hassparseinodes(&mp->m_sb) && + mp->m_sb.sb_spino_align != + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) { + xfs_warn(mp, + "Sparse inode block alignment (%u) must match cluster size (%llu).", + mp->m_sb.sb_spino_align, + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)); + error = -EINVAL; + goto out_remove_uuid; + } + + /* * Set inode alignment fields */ xfs_set_inoalignment(mp); -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34F9A7F60 for ; Thu, 12 Feb 2015 12:17:31 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 155D6304064 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0a27a9e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Qg5RI1Vq2L99TfX8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:30 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTwv020198 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSjJ030646 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 942881256B7; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 15/18] xfs: filter out sparse regions from individual inode allocation Date: Thu, 12 Feb 2015 13:17:22 -0500 X-ASG-Orig-Subj: [PATCH v4 15/18] xfs: filter out sparse regions from individual inode allocation Message-Id: <1423765045-15791-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from an existing record with free inodes traditionally selects the first inode available according to the ir_free mask. With sparse inode chunks, the ir_free mask could refer to an unallocated region. We must mask the unallocated regions out of ir_free before using it to select a free inode in the chunk. Update the xfs_inobt_first_free_inode() helper to find the first free inode available of the allocated regions of the inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index d96c5e1..62fc075 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1077,13 +1077,24 @@ xfs_ialloc_get_rec( } /* - * Return the offset of the first free inode in the record. + * Return the offset of the first free inode in the record. If the inode chunk + * is sparsely allocated, we convert the record holemask to inode granularity + * and mask off the unallocated regions from the inode free mask. */ STATIC int xfs_inobt_first_free_inode( struct xfs_inobt_rec_incore *rec) { - return xfs_lowbit64(rec->ir_free); + xfs_inofree_t realfree; + + /* if there are no holes, return the first available offset */ + if (!xfs_inobt_issparse(rec->ir_holemask)) + return xfs_lowbit64(rec->ir_free); + + realfree = xfs_inobt_irec_to_allocmask(rec); + realfree &= rec->ir_free; + + return xfs_lowbit64(realfree); } /* -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 031BE7F51 for ; Thu, 12 Feb 2015 12:17:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4FA1304062 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cbb01162235b00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BSlwGmcH5FEu07IB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTTA015124 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSBD030670 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 412891256BE; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 09/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Date: Thu, 12 Feb 2015 13:17:16 -0500 X-ASG-Orig-Subj: [PATCH v4 09/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Message-Id: <1423765045-15791-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The bulkstat and inumbers mechanisms make the assumption that inode records consist of a full 64 inode chunk in several places. For example, this is used to track how many inodes have been processed overall as well as to determine whether a record has allocated inodes that must be handled. This assumption is invalid for sparse inode records. While sparse inodes will be marked as free in the ir_free mask, they are not accounted as free in ir_freecount because they cannot be allocated. Therefore, ir_freecount may be less than 64 inodes in an inode record for which all physically allocated inodes are free (and in turn ir_freecount < 64 does not signify that the record has allocated inodes). The new in-core inobt record format includes the ir_count field. This holds the number of true, physical inodes tracked by the record. The in-core ir_count field is always valid as it is hardcoded to XFS_INODES_PER_CHUNK when sparse inodes is not enabled. Use ir_count to handle inode records correctly in bulkstat in a generic manner. Signed-off-by: Brian Foster --- fs/xfs/xfs_itable.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 82e3142..7c68058 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -252,7 +252,7 @@ xfs_bulkstat_grab_ichunk( } irec->ir_free |= xfs_inobt_maskn(0, idx); - *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + *icount = irec->ir_count - irec->ir_freecount; } return 0; @@ -415,6 +415,8 @@ xfs_bulkstat( goto del_cursor; if (icount) { irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; @@ -447,13 +449,15 @@ xfs_bulkstat( * If this chunk has any allocated inodes, save it. * Also start read-ahead now for this chunk. */ - if (r.ir_freecount < XFS_INODES_PER_CHUNK) { + if (r.ir_freecount < r.ir_count) { xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - icount += XFS_INODES_PER_CHUNK - r.ir_freecount; + icount += r.ir_count - r.ir_freecount; } error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { @@ -599,8 +603,7 @@ xfs_inumbers( agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); - buffer[bufidx].xi_alloccount = - XFS_INODES_PER_CHUNK - r.ir_freecount; + buffer[bufidx].xi_alloccount = r.ir_count - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; if (++bufidx == bcount) { long written; -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C0F07F55 for ; Thu, 12 Feb 2015 12:17:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15499304062 for ; Thu, 12 Feb 2015 10:17:33 -0800 (PST) X-ASG-Debug-ID: 1423765048-04cbb01165235b00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iCTJjnKEKnBtuLwD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHSUg015113 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHS5n030634 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C0EE91256B7; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 01/18] xfs: create individual inode alloc. helper Date: Thu, 12 Feb 2015 13:17:08 -0500 X-ASG-Orig-Subj: [PATCH v4 01/18] xfs: create individual inode alloc. helper Message-Id: <1423765045-15791-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from sparse inode records must filter the ir_free mask against ir_holemask. In preparation for this requirement, create a helper to allocate an individual inode from an inode record. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..12b62a34 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -731,6 +731,16 @@ xfs_ialloc_get_rec( } /* + * Return the offset of the first free inode in the record. + */ +STATIC int +xfs_inobt_first_free_inode( + struct xfs_inobt_rec_incore *rec) +{ + return xfs_lowbit64(rec->ir_free); +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int @@ -960,7 +970,7 @@ newino: } alloc_inode: - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1209,7 +1219,7 @@ xfs_dialloc_ag( if (error) goto error_cur; - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 651757F61 for ; Thu, 12 Feb 2015 12:17:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26ED1304067 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5a24eba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t88FOzufMDvBupJU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTfP020188 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSpc030673 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4FB671256BD; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 13/18] xfs: allocate sparse inode chunks on full chunk allocation failure Date: Thu, 12 Feb 2015 13:17:20 -0500 X-ASG-Orig-Subj: [PATCH v4 13/18] xfs: allocate sparse inode chunks on full chunk allocation failure Message-Id: <1423765045-15791-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode chunk. If all else fails, reduce the allocation to the sparse length and alignment and attempt to allocate a sparse inode chunk. If sparse chunk allocation succeeds, check whether an inobt record already exists that can track the chunk. If so, inherit and update the existing record. Otherwise, insert a new record for the sparse chunk. Create helpers to align sparse chunk inode records and insert or update existing records in the inode btrees. The xfs_inobt_insert_sprec() helper implements the merge or update semantics required for sparse inode records with respect to both the inobt and finobt. To update the inobt, either insert a new record or merge with an existing record. To update the finobt, use the updated inobt record to either insert or replace an existing record. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 332 +++++++++++++++++++++++++++++++++++++-- fs/xfs/libxfs/xfs_ialloc_btree.c | 21 +++ fs/xfs/libxfs/xfs_ialloc_btree.h | 7 + fs/xfs/xfs_trace.h | 47 ++++++ 4 files changed, 393 insertions(+), 14 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 7c002f2..1c81f08 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -378,6 +378,216 @@ xfs_ialloc_inode_init( } /* + * Align startino and allocmask for a recently allocated sparse chunk such that + * they are fit for insertion (or merge) into the on-disk inode btrees. + * + * Background: + * + * When enabled, sparse inode support increases the inode alignment from cluster + * size to inode chunk size. This means that the minimum range between two + * non-adjacent inode records in the inobt is large enough for a full inode + * record. This allows for cluster sized, cluster aligned block allocation + * without need to worry about whether the resulting inode record overlaps with + * another record in the tree. Without this basic rule, we would have to deal + * with the consequences of overlap by potentially undoing recent allocations in + * the inode allocation codepath. + * + * Because of this alignment rule (which is enforced on mount), there are two + * inobt possibilities for newly allocated sparse chunks. One is that the + * aligned inode record for the chunk covers a range of inodes not already + * covered in the inobt (i.e., it is safe to insert a new sparse record). The + * other is that a record already exists at the aligned startino that considers + * the newly allocated range as sparse. In the latter case, record content is + * merged in hope that sparse inode chunks fill to full chunks over time. + */ +STATIC void +xfs_align_sparse_ino( + struct xfs_mount *mp, + xfs_agino_t *startino, + uint16_t *allocmask) +{ + xfs_agblock_t agbno; + xfs_agblock_t mod; + int offset; + + agbno = XFS_AGINO_TO_AGBNO(mp, *startino); + mod = agbno % mp->m_sb.sb_inoalignmt; + if (!mod) + return; + + /* calculate the inode offset and align startino */ + offset = mod << mp->m_sb.sb_inopblog; + *startino -= offset; + + /* + * Since startino has been aligned down, left shift allocmask such that + * it continues to represent the same physical inodes relative to the + * new startino. + */ + *allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; +} + +/* + * Determine whether the source inode record can merge into the target. Both + * records must be sparse, the inode ranges must match and there must be no + * allocation overlap between the records. + */ +STATIC bool +__xfs_inobt_can_merge( + struct xfs_inobt_rec_incore *trec, /* tgt record */ + struct xfs_inobt_rec_incore *srec) /* src record */ +{ + DECLARE_BITMAP(talloc, 64); + DECLARE_BITMAP(salloc, 64); + DECLARE_BITMAP(tmp, 64); + + /* records must cover the same inode range */ + if (trec->ir_startino != srec->ir_startino) + return false; + + /* both records must be sparse */ + if (!xfs_inobt_issparse(trec->ir_holemask) || + !xfs_inobt_issparse(srec->ir_holemask)) + return false; + + /* both records must track some inodes */ + if (!trec->ir_count || !srec->ir_count) + return false; + + /* can't exceed capacity of a full record */ + if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK) + return false; + + /* verify there is no allocation overlap */ + xfs_inobt_irec_to_allocmap(talloc, trec); + xfs_inobt_irec_to_allocmap(salloc, srec); + + bitmap_and(tmp, salloc, talloc, 64); + if (!bitmap_empty(tmp, 64)) + return false; + + return true; +} + +/* + * Merge the source inode record into the target. The caller must call + * __xfs_inobt_can_merge() to ensure the merge is valid. + */ +STATIC void +__xfs_inobt_rec_merge( + struct xfs_inobt_rec_incore *trec, /* target */ + struct xfs_inobt_rec_incore *srec) /* src */ +{ + ASSERT(trec->ir_startino == srec->ir_startino); + + /* combine the counts */ + trec->ir_count += srec->ir_count; + trec->ir_freecount += srec->ir_freecount; + + /* + * Merge the holemask and free mask. For both fields, 0 bits refer to + * allocated inodes. We combine the allocated ranges with bitwise AND. + */ + trec->ir_holemask &= srec->ir_holemask; + trec->ir_free &= srec->ir_free; +} + +/* + * Insert a new sparse inode chunk into the associated inode btree. The inode + * record for the sparse chunk is pre-aligned to a startino that should match + * any pre-existing sparse inode record in the tree. This allows sparse chunks + * to fill over time. + * + * This function supports two modes of handling preexisting records depending on + * the merge flag. If merge is true, the provided record is merged with the + * existing record and updated in place. The merged record is returned in nrec. + * If merge is false, an existing record is replaced with the provided record. + * If no preexisting record exists, the provided record is always inserted. + * + * It is considered corruption if a merge is requested and not possible. Given + * the sparse inode alignment constraints, this should never happen. + */ +STATIC int +xfs_inobt_insert_sprec( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + int btnum, + struct xfs_inobt_rec_incore *nrec, /* in/out: new/merged rec. */ + bool merge) /* merge or replace */ +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int error; + int i; + struct xfs_inobt_rec_incore rec; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + /* the new record is pre-aligned so we know where to look */ + error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + /* if nothing there, insert a new record and return */ + if (i == 0) { + error = xfs_inobt_insert_rec(cur, nrec->ir_holemask, + nrec->ir_count, nrec->ir_freecount, + nrec->ir_free, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + goto out; + } + + /* + * A record exists at this startino. Merge or replace the record + * depending on what we've been asked to do. + */ + if (merge) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + XFS_WANT_CORRUPTED_GOTO(rec.ir_startino == nrec->ir_startino, + error); + + /* + * This should never fail. If we have coexisting records that + * cannot merge, something is seriously wrong. + */ + XFS_WANT_CORRUPTED_GOTO(__xfs_inobt_can_merge(nrec, &rec), + error); + + trace_xfs_irec_merge_pre(mp, agno, rec.ir_startino, + rec.ir_holemask, nrec->ir_startino, + nrec->ir_holemask); + + /* merge to nrec to output the updated record */ + __xfs_inobt_rec_merge(nrec, &rec); + + trace_xfs_irec_merge_post(mp, agno, nrec->ir_startino, + nrec->ir_holemask); + + error = xfs_inobt_rec_check_count(mp, nrec); + if (error) + goto error; + } + + error = xfs_inobt_update(cur, nrec); + if (error) + goto error; + +out: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ @@ -395,6 +605,8 @@ xfs_ialloc_ag_alloc( xfs_agino_t newlen; /* new number of inodes */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ + uint16_t allocmask = (uint16_t) -1; /* init. to full chunk */ + struct xfs_inobt_rec_incore rec; struct xfs_perag *pag; memset(&args, 0, sizeof(args)); @@ -510,6 +722,45 @@ xfs_ialloc_ag_alloc( return error; } + /* + * Finally, try a sparse allocation if the filesystem supports it and + * the sparse allocation length is smaller than a full chunk. + */ + if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && + args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && + args.fsbno == NULLFSBLOCK) { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.agbno = be32_to_cpu(agi->agi_root); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); + args.alignment = args.mp->m_sb.sb_spino_align; + args.prod = 1; + + args.minlen = args.mp->m_ialloc_min_blks; + args.maxlen = args.minlen; + + /* + * The inode record will be aligned to full chunk size. We must + * prevent sparse allocation from AG boundaries that result in + * invalid inode records, such as records that start at agbno 0 + * or extend beyond the AG. + * + * Set min agbno to the first aligned, non-zero agbno and max to + * the last aligned agbno that is at least one full chunk from + * the end of the AG. + */ + args.min_agbno = args.mp->m_sb.sb_inoalignmt; + args.max_agbno = round_down(args.mp->m_sb.sb_agblocks, + args.mp->m_sb.sb_inoalignmt) - + args.mp->m_ialloc_blks; + + error = xfs_alloc_vextent(&args); + if (error) + return error; + + newlen = args.len << args.mp->m_sb.sb_inopblog; + allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1; + } + if (args.fsbno == NULLFSBLOCK) { *alloc = 0; return 0; @@ -534,6 +785,73 @@ xfs_ialloc_ag_alloc( * Convert the results. */ newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); + + if (xfs_inobt_issparse(~allocmask)) { + /* + * We've allocated a sparse chunk. Align the startino and mask. + */ + xfs_align_sparse_ino(args.mp, &newino, &allocmask); + + rec.ir_startino = newino; + rec.ir_holemask = ~allocmask; + rec.ir_count = newlen; + rec.ir_freecount = newlen; + rec.ir_free = XFS_INOBT_ALL_FREE; + + /* + * Insert the sparse record into the inobt and allow for a merge + * if necessary. If a merge does occur, rec is updated to the + * merged record. + */ + error = xfs_inobt_insert_sprec(args.mp, tp, agbp, XFS_BTNUM_INO, + &rec, true); + if (error == -EFSCORRUPTED) { + xfs_alert(args.mp, + "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u", + XFS_AGINO_TO_INO(args.mp, agno, + rec.ir_startino), + rec.ir_holemask, rec.ir_count); + xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE); + } + if (error) + return error; + + /* + * We can't merge the part we've just allocated as for the inobt + * due to finobt semantics. The original record may or may not + * exist independent of whether physical inodes exist in this + * sparse chunk. + * + * We must update the finobt record based on the inobt record. + * rec contains the fully merged and up to date inobt record + * from the previous call. Set merge false to replace any + * existing record with this one. + */ + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert_sprec(args.mp, tp, agbp, + XFS_BTNUM_FINO, &rec, + false); + if (error) + return error; + } + } else { + /* full chunk - insert new records to both btrees */ + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, + newlen, XFS_BTNUM_FINO); + if (error) + return error; + } + } + + /* + * Update AGI counts and newino. + */ be32_add_cpu(&agi->agi_count, newlen); be32_add_cpu(&agi->agi_freecount, newlen); pag = xfs_perag_get(args.mp, agno); @@ -542,20 +860,6 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btrees. - */ - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_INO); - if (error) - return error; - - if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_FINO); - if (error) - return error; - } - /* * Log allocation group header fields */ xfs_ialloc_log_agi(tp, agbp, diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 6ee8697..aaa78c7 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -518,3 +518,24 @@ xfs_inobt_irec_to_allocmask( xfs_inobt_irec_to_allocmap(allocmap, irec); return bitmap_to_u64(allocmap, 64); } + +#if defined(DEBUG) || defined(XFS_WARN) +/* + * Verify that an in-core inode record has a valid inode count. + */ +int +xfs_inobt_rec_check_count( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + int inocount; + DECLARE_BITMAP(allocbmap, XFS_INODES_PER_CHUNK); + + xfs_inobt_irec_to_allocmap(allocbmap, rec); + inocount = bitmap_weight(allocbmap, XFS_INODES_PER_CHUNK); + if (inocount != rec->ir_count) + return -EFSCORRUPTED; + + return 0; +} +#endif /* DEBUG */ diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.h b/fs/xfs/libxfs/xfs_ialloc_btree.h index cc20850..686c9de 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.h +++ b/fs/xfs/libxfs/xfs_ialloc_btree.h @@ -69,4 +69,11 @@ uint64_t bitmap_to_u64(const unsigned long *, int); void xfs_inobt_irec_to_allocmap(unsigned long *, struct xfs_inobt_rec_incore *); u64 xfs_inobt_irec_to_allocmask(struct xfs_inobt_rec_incore *); +#if defined(DEBUG) || defined(XFS_WARN) +int xfs_inobt_rec_check_count(struct xfs_mount *, + struct xfs_inobt_rec_incore *); +#else +#define xfs_inobt_rec_check_count(mp, rec) 0 +#endif /* DEBUG */ + #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..12a4bf4 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -734,6 +734,53 @@ TRACE_EVENT(xfs_iomap_prealloc_size, __entry->blocks, __entry->shift, __entry->writeio_blocks) ) +TRACE_EVENT(xfs_irec_merge_pre, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask, xfs_agino_t nagino, uint16_t nholemask), + TP_ARGS(mp, agno, agino, holemask, nagino, nholemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + __field(xfs_agino_t, nagino) + __field(uint16_t, nholemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + __entry->nagino = nagino; + __entry->nholemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x) new (%u:0x%x)", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, + __entry->agino, __entry->holemask, __entry->nagino, + __entry->nholemask) +) + +TRACE_EVENT(xfs_irec_merge_post, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask), + TP_ARGS(mp, agno, agino, holemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x)", MAJOR(__entry->dev), + MINOR(__entry->dev), __entry->agno, __entry->agino, + __entry->holemask) +) + #define DEFINE_IREF_EVENT(name) \ DEFINE_EVENT(xfs_iref_class, name, \ TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 428457F56 for ; Thu, 12 Feb 2015 12:17:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1FF2B8F8070 for ; Thu, 12 Feb 2015 10:17:33 -0800 (PST) X-ASG-Debug-ID: 1423765048-04cbb01164235b00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Er0ONDXfdFjYvX6M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHS0n020182 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHS7i026220 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id CD4541256B4; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 02/18] xfs: update free inode record logic to support sparse inode records Date: Thu, 12 Feb 2015 13:17:09 -0500 X-ASG-Orig-Subj: [PATCH v4 02/18] xfs: update free inode record logic to support sparse inode records Message-Id: <1423765045-15791-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_difree_inobt() uses logic in a couple places that assume inobt records refer to fully allocated chunks. Specifically, the use of mp->m_ialloc_inos can cause problems for inode chunks that are sparsely allocated. Sparse inode chunks can, by definition, define a smaller number of inodes than a full inode chunk. Fix the logic that determines whether an inode record should be removed from the inobt to use the ir_free mask rather than ir_freecount. Fix the agi counters modification to use ir_freecount to add the actual number of inodes freed rather than assuming a full inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 12b62a34..ffac044 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1509,7 +1509,7 @@ xfs_difree_inobt( * When an inode cluster is free, it becomes eligible for removal */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && - (rec.ir_freecount == mp->m_ialloc_inos)) { + (rec.ir_free == XFS_INOBT_ALL_FREE)) { *deleted = 1; *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); @@ -1519,7 +1519,7 @@ xfs_difree_inobt( * AGI and Superblock inode counts, and mark the disk space * to be freed when the transaction is committed. */ - ilen = mp->m_ialloc_inos; + ilen = rec.ir_freecount; be32_add_cpu(&agi->agi_count, -ilen); be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); @@ -1640,7 +1640,7 @@ xfs_difree_finobt( * keeping inode chunks permanently on disk, remove the record. * Otherwise, update the record with the new information. */ - if (rec.ir_freecount == mp->m_ialloc_inos && + if (rec.ir_free == XFS_INOBT_ALL_FREE && !(mp->m_flags & XFS_MOUNT_IKEEP)) { error = xfs_btree_delete(cur, &i); if (error) -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 70A107F5A for ; Thu, 12 Feb 2015 12:17:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46E86304062 for ; Thu, 12 Feb 2015 10:17:30 -0800 (PST) X-ASG-Debug-ID: 1423765049-04bdf06a5924eba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gHfh0tViitix7muR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHTqg020189 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSHd025880 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 793661256C0; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 11/18] xfs: handle sparse inode chunks in icreate log recovery Date: Thu, 12 Feb 2015 13:17:18 -0500 X-ASG-Orig-Subj: [PATCH v4 11/18] xfs: handle sparse inode chunks in icreate log recovery Message-Id: <1423765045-15791-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Recovery of icreate transactions assumes hardcoded values for the inode count and chunk length. Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update the icreate validity checks to allow for appropriately sized inode chunks and verify the inode count matches what is expected based on the extent length rather than assuming a hardcoded count. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ecc73d5..74d504b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3068,12 +3068,22 @@ xlog_recover_do_icreate_pass2( return -EINVAL; } - /* existing allocation is fixed value */ - ASSERT(count == mp->m_ialloc_inos); - ASSERT(length == mp->m_ialloc_blks); - if (count != mp->m_ialloc_inos || - length != mp->m_ialloc_blks) { - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); + /* + * The inode chunk is either full or sparse and we only support + * m_ialloc_min_blks sized sparse allocations at this time. + */ + if (length != mp->m_ialloc_blks && + length != mp->m_ialloc_min_blks) { + xfs_warn(log->l_mp, + "%s: unsupported chunk length", __FUNCTION__); + return -EINVAL; + } + + /* verify inode count is consistent with extent length */ + if ((count >> mp->m_sb.sb_inopblog) != length) { + xfs_warn(log->l_mp, + "%s: inconsistent inode count and chunk length", + __FUNCTION__); return -EINVAL; } -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 718D47F5D for ; Thu, 12 Feb 2015 12:17:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B2EC8F8071 for ; Thu, 12 Feb 2015 10:17:33 -0800 (PST) X-ASG-Debug-ID: 1423765048-04cb6c6b0c27a9d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vuMpJyaS6BcMDXT6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:29 -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 (8.14.4/8.14.4) with ESMTP id t1CIHSId015115 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSWm030635 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6D6241256B6; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 00/18] xfs: sparse inode chunks Date: Thu, 12 Feb 2015 13:17:07 -0500 X-ASG-Orig-Subj: [PATCH v4 00/18] xfs: sparse inode chunks Message-Id: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v4 of sparse inode support for XFS. The changes are primarily based on Dave's review comments from v3. The highlights are a refactor of the on-disk inobt record format and sparse inode chunk allocation and record management code. The inobt record refactor introduces a union to distinguish the original on-disk format from the new format and an associated change in behavior where the in-core record fields can be unconditionally considered valid. For example, higher level code can refer to the in-core ir_count field regardless of whether the sparse inodes feature is enabled or not. This reduces the need for helpers and sb feature check clutter throughout the code. The sparse chunk allocation refactor cleans up the sparse record management code such that record merge and inobt updates do not involve multiple tree lookups. It also condenses the sparse record management code into a single helper (a la xfs_inobt_insert() for full inode chunks) that can be used for the inobt and finobt. Patches 1-3 are generic preparation patches that do not depend on sparse inode bits. Patches 4-7 introduce the sb alignment field, mount feature helpers and associated bits. Patches 8-12 introduce the inobt record data structure update and associated bits/helpers. Patches 13-17 implement the sparse chunk and individual inode allocation and free mechanisms. Finally, patch 18 enables the ability to mount sparse inode enabled filesystems. Thoughts, reviews, flames appreciated... Brian v4: - Rename sb_spinoalignmt to sb_spino_align. - Clean up error/warning messages. - Use a union to differentiate old/new xfs_inobt_rec on-disk format. Refactor such that in-core record fields are always valid. - Rename/move allocmap (bitmap) helper functions and provide extra helper for endian conv. - Refactor sparse chunk allocation record management code. - Clean up #ifdef and label usage for DEBUG mode sparse allocs. - Split up and moved some generic, preparatory hunks earlier in series. v3: http://oss.sgi.com/archives/xfs/2015-02/msg00110.html - Rebase to latest for-next (bulkstat rework, data structure shuffling, etc.). - Fix issparse helper logic. - Update inode alignment model w/ spinodes enabled. All inode records are chunk size aligned, sparse allocations cluster size aligned (both enforced on mount). - Reworked sparse inode record merge logic to coincide w/ new alignment model. - Mark feature as experimental (warn on mount). - Include and use block allocation agbno range limit to prevent allocation of invalid inode records. - Add some DEBUG bits to improve sparse alloc. test coverage. v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html - Use a manually set feature bit instead of dynamic based on the existence of sparse inode chunks. - Add sb/mp fields for sparse alloc. granularity (use instead of cluster size). - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page size arches. - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. - Use byte of pad space in inobt record for inode count field. - Convert bitmap mgmt to use generic bitmap code. - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. - Add fs geometry bit for sparse inodes. - Rebase to latest for-next (bulkstat refactor). v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html Brian Foster (18): xfs: create individual inode alloc. helper xfs: update free inode record logic to support sparse inode records xfs: support min/max agbno args in block allocator xfs: add sparse inode chunk alignment superblock field xfs: use sparse chunk alignment for min. inode allocation requirement xfs: sparse inode chunks feature helpers and mount requirements xfs: add fs geometry bit for sparse inode chunks xfs: introduce inode record hole mask for sparse inode chunks xfs: use actual inode count for sparse records in bulkstat/inumbers xfs: pass inode count through ordered icreate log item xfs: handle sparse inode chunks in icreate log recovery xfs: helpers to convert holemask to/from generic bitmap xfs: allocate sparse inode chunks on full chunk allocation failure xfs: randomly do sparse inode allocations in DEBUG mode xfs: filter out sparse regions from individual inode allocation xfs: only free allocated regions of inode chunks xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() xfs: enable sparse inode chunks for v5 superblocks fs/xfs/libxfs/xfs_alloc.c | 42 ++- fs/xfs/libxfs/xfs_alloc.h | 2 + fs/xfs/libxfs/xfs_format.h | 50 +++- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 533 +++++++++++++++++++++++++++++++++++---- fs/xfs/libxfs/xfs_ialloc.h | 12 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 123 ++++++++- fs/xfs/libxfs/xfs_ialloc_btree.h | 14 + fs/xfs/libxfs/xfs_sb.c | 30 ++- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_inode.c | 28 +- fs/xfs/xfs_itable.c | 13 +- fs/xfs/xfs_log_recover.c | 26 +- fs/xfs/xfs_mount.c | 16 ++ fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_trace.h | 47 ++++ 16 files changed, 857 insertions(+), 86 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C91A37F51 for ; Thu, 12 Feb 2015 12:17:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 37718AC004 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cbb01165235b10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q7NNJgtxIwdoxzZ2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:30 -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 (8.14.4/8.14.4) with ESMTP id t1CIHSkc016489 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSni025868 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AC0211231FF; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 03/18] xfs: support min/max agbno args in block allocator Date: Thu, 12 Feb 2015 13:17:10 -0500 X-ASG-Orig-Subj: [PATCH v4 03/18] xfs: support min/max agbno args in block allocator Message-Id: <1423765045-15791-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block allocator supports various arguments to tweak block allocation behavior and set allocation requirements. The sparse inode chunk feature introduces a new requirement not supported by the current arguments. Sparse inode allocations must convert or merge into an inode record that describes a fixed length chunk (64 inodes x inodesize). Full inode chunk allocations by definition always result in valid inode records. Sparse chunk allocations are smaller and the associated records can refer to blocks not owned by the inode chunk. This model can result in invalid inode records in certain cases. For example, if a sparse allocation occurs near the start of an AG, the aligned inode record for that chunk might refer to agbno 0. If an allocation occurs towards the end of the AG and the AG size is not aligned, the inode record could refer to blocks beyond the end of the AG. While neither of these scenarios directly result in corruption, they both insert invalid inode records and at minimum cause repair to complain, are unlikely to merge into full chunks over time and set land mines for other areas of code. To guarantee sparse inode chunk allocation creates valid inode records, support the ability to specify an agbno range limit for XFS_ALLOCTYPE_NEAR_BNO block allocations. The min/max agbno's are specified in the allocation arguments and limit the block allocation algorithms to that range. The starting 'agbno' hint is clamped to the range if the specified agbno is out of range. If no sufficient extent is available within the range, the allocation fails. For backwards compatibility, the min/max fields can be initialized to 0 to disable range limiting (e.g., equivalent to min=0,max=agsize). Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_alloc.c | 42 +++++++++++++++++++++++++++++++++++++----- fs/xfs/libxfs/xfs_alloc.h | 2 ++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf44..0ddf6c9 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -149,13 +149,27 @@ xfs_alloc_compute_aligned( { xfs_agblock_t bno; xfs_extlen_t len; + xfs_extlen_t diff; /* Trim busy sections out of found extent */ xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + /* + * If we have a largish extent that happens to start before min_agbno, + * see if we can shift it into range... + */ + if (bno < args->min_agbno && bno + len > args->min_agbno) { + diff = args->min_agbno - bno; + if (len > diff) { + bno += diff; + len -= diff; + } + } + if (args->alignment > 1 && len >= args->minlen) { xfs_agblock_t aligned_bno = roundup(bno, args->alignment); - xfs_extlen_t diff = aligned_bno - bno; + + diff = aligned_bno - bno; *resbno = aligned_bno; *reslen = diff >= len ? 0 : len - diff; @@ -790,9 +804,13 @@ xfs_alloc_find_best_extent( * The good extent is closer than this one. */ if (!dir) { + if (*sbnoa > args->max_agbno) + goto out_use_good; if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { + if (*sbnoa < args->min_agbno) + goto out_use_good; if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -879,6 +897,17 @@ xfs_alloc_ag_vextent_near( dofirst = prandom_u32() & 1; #endif + /* handle unitialized agbno range so caller doesn't have to */ + if (!args->min_agbno && !args->max_agbno) + args->max_agbno = args->mp->m_sb.sb_agblocks - 1; + ASSERT(args->min_agbno <= args->max_agbno); + + /* clamp agbno to the range if it's outside */ + if (args->agbno < args->min_agbno) + args->agbno = args->min_agbno; + if (args->agbno > args->max_agbno) + args->agbno = args->max_agbno; + restart: bno_cur_lt = NULL; bno_cur_gt = NULL; @@ -971,6 +1000,8 @@ restart: <bnoa, <lena); if (ltlena < args->minlen) continue; + if (ltbnoa < args->min_agbno || ltbnoa > args->max_agbno) + continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ASSERT(args->len >= args->minlen); @@ -1091,11 +1122,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); - if (ltlena >= args->minlen) + if (ltlena >= args->minlen && ltbnoa >= args->min_agbno) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) goto error0; - if (!i) { + if (!i || ltbnoa < args->min_agbno) { xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); bno_cur_lt = NULL; @@ -1107,11 +1138,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, gtbno, gtlen, >bnoa, >lena); - if (gtlena >= args->minlen) + if (gtlena >= args->minlen && gtbnoa <= args->max_agbno) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) goto error0; - if (!i) { + if (!i || gtbnoa > args->max_agbno) { xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR); bno_cur_gt = NULL; @@ -1211,6 +1242,7 @@ restart: ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltnew >= args->min_agbno && ltnew <= args->max_agbno); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index d1b4b6a..29f27b2 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -112,6 +112,8 @@ typedef struct xfs_alloc_arg { xfs_extlen_t total; /* total blocks needed in xaction */ xfs_extlen_t alignment; /* align answer to multiple of this */ xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */ + xfs_agblock_t min_agbno; /* set an agbno range for NEAR allocs */ + xfs_agblock_t max_agbno; /* ... */ xfs_extlen_t len; /* output: actual size of extent */ xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ xfs_alloctype_t otype; /* original allocation type */ -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EBB7E7F54 for ; Thu, 12 Feb 2015 12:17:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7747BAC006 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0c27a9e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cxEI56NUHX5G46UU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:30 -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 (8.14.4/8.14.4) with ESMTP id t1CIHStf016488 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSvW025870 for ; Thu, 12 Feb 2015 13:17:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E38261256B5; Thu, 12 Feb 2015 13:17:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 04/18] xfs: add sparse inode chunk alignment superblock field Date: Thu, 12 Feb 2015 13:17:11 -0500 X-ASG-Orig-Subj: [PATCH v4 04/18] xfs: add sparse inode chunk alignment superblock field Message-Id: <1423765045-15791-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add sb_spino_align to the superblock to specify sparse inode chunk alignment. This also currently represents the minimum allowable sparse chunk allocation size. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 6 +++--- fs/xfs/libxfs/xfs_sb.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 8eb7189..dbca93d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -170,7 +170,7 @@ typedef struct xfs_sb { __uint32_t sb_features_log_incompat; __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; + xfs_extlen_t sb_spino_align; /* sparse inode chunk alignment */ xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -256,7 +256,7 @@ typedef struct xfs_dsb { __be32 sb_features_log_incompat; __le32 sb_crc; /* superblock crc */ - __be32 sb_pad; + __be32 sb_spino_align; /* sparse inode chunk alignment */ __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -282,7 +282,7 @@ typedef enum { XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINO_ALIGN, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe9..a461c2e 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -382,7 +382,7 @@ __xfs_sb_from_disk( be32_to_cpu(from->sb_features_log_incompat); /* crc is only used on disk, not in memory; just init to 0 here. */ to->sb_crc = 0; - to->sb_pad = 0; + to->sb_spino_align = be32_to_cpu(from->sb_spino_align); to->sb_pquotino = be64_to_cpu(from->sb_pquotino); to->sb_lsn = be64_to_cpu(from->sb_lsn); /* Convert on-disk flags to in-memory flags? */ @@ -524,7 +524,7 @@ xfs_sb_to_disk( cpu_to_be32(from->sb_features_incompat); to->sb_features_log_incompat = cpu_to_be32(from->sb_features_log_incompat); - to->sb_pad = 0; + to->sb_spino_align = cpu_to_be32(from->sb_spino_align); to->sb_lsn = cpu_to_be64(from->sb_lsn); } } -- 1.8.3.1 From bfoster@redhat.com Thu Feb 12 12:17:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0383B7F55 for ; Thu, 12 Feb 2015 12:17:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 864EAAC001 for ; Thu, 12 Feb 2015 10:17:31 -0800 (PST) X-ASG-Debug-ID: 1423765049-04cb6c6b0927a9e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CBufbjlDG0j43MqE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 10:17:30 -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 (8.14.4/8.14.4) with ESMTP id t1CIHThr007692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1CIHSur026128 for ; Thu, 12 Feb 2015 13:17:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C3D451256B6; Thu, 12 Feb 2015 13:17:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 17/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Date: Thu, 12 Feb 2015 13:17:24 -0500 X-ASG-Orig-Subj: [PATCH v4 17/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Message-Id: <1423765045-15791-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> References: <1423765045-15791-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: 1423765049 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ifree_cluster() is called to mark all in-memory inodes and inode buffers as stale. This occurs after we've removed the inobt records and dropped any references of inobt data. xfs_ifree_cluster() uses the starting inode number to walk the namespace of inodes expected for a single chunk a cluster buffer at a time. The cluster buffer disk addresses are calculated by decoding the sequential inode numbers expected from the chunk. The problem with this approach is that if the inode chunk being removed is a sparse chunk, not all of the buffer addresses that are calculated as part of this sequence may be inode clusters. Attempting to acquire the buffer based on expected inode characterstics (i.e., cluster length) can lead to errors and is generally incorrect. We already use a couple variables to carry requisite state from xfs_difree() to xfs_ifree_cluster(). Rather than add a third, define a new internal structure to carry the existing parameters through these functions. Add an alloc field that represents the physical allocation bitmap of inodes in the chunk being removed. Modify xfs_ifree_cluster() to check each inode against the bitmap and skip the clusters that were never allocated as real inodes on disk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 17 +++++++---------- fs/xfs/libxfs/xfs_ialloc.h | 10 ++++++++-- fs/xfs/xfs_inode.c | 28 ++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 9b1d204..3734613 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1885,8 +1885,7 @@ xfs_difree_inobt( struct xfs_buf *agbp, xfs_agino_t agino, struct xfs_bmap_free *flist, - int *deleted, - xfs_ino_t *first_ino, + struct xfs_icluster *xic, struct xfs_inobt_rec_incore *orec) { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); @@ -1944,9 +1943,9 @@ xfs_difree_inobt( */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_free == XFS_INOBT_ALL_FREE)) { - - *deleted = 1; - *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->deleted = 1; + xic->first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->alloc = xfs_inobt_irec_to_allocmask(&rec); /* * Remove the inode cluster from the AGI B+Tree, adjust the @@ -1971,7 +1970,7 @@ xfs_difree_inobt( xfs_difree_inode_chunk(mp, agno, &rec, flist); } else { - *deleted = 0; + xic->deleted = 0; error = xfs_inobt_update(cur, &rec); if (error) { @@ -2110,8 +2109,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted,/* set if inode cluster was deleted */ - xfs_ino_t *first_ino)/* first inode in deleted cluster */ + struct xfs_icluster *xic) /* cluster info if deleted */ { /* REFERENCED */ xfs_agblock_t agbno; /* block number containing inode */ @@ -2162,8 +2160,7 @@ xfs_difree( /* * Fix up the inode allocation btree. */ - error = xfs_difree_inobt(mp, tp, agbp, agino, flist, deleted, first_ino, - &rec); + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, xic, &rec); if (error) goto error0; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 4d4b702..12401fe 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -28,6 +28,13 @@ struct xfs_btree_cur; /* Move inodes in clusters of this size */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 +struct xfs_icluster { + bool deleted; /* record is deleted */ + xfs_ino_t first_ino; /* first inode number */ + uint64_t alloc; /* inode phys. allocation bitmap for + * sparse chunks */ +}; + /* Calculate and return the number of filesystem blocks per inode cluster */ static inline int xfs_icluster_size_fsb( @@ -90,8 +97,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino); /* first inode in deleted cluster */ + struct xfs_icluster *ifree); /* cluster info if deleted */ /* * Return the location of the inode in imap, for mapping it into a buffer. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index daafa1f..a054110 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2182,9 +2182,9 @@ xfs_iunlink_remove( */ STATIC int xfs_ifree_cluster( - xfs_inode_t *free_ip, - xfs_trans_t *tp, - xfs_ino_t inum) + xfs_inode_t *free_ip, + xfs_trans_t *tp, + struct xfs_icluster *xic) { xfs_mount_t *mp = free_ip->i_mount; int blks_per_cluster; @@ -2197,13 +2197,26 @@ xfs_ifree_cluster( xfs_inode_log_item_t *iip; xfs_log_item_t *lip; struct xfs_perag *pag; + xfs_ino_t inum; + inum = xic->first_ino; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum)); blks_per_cluster = xfs_icluster_size_fsb(mp); inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; nbufs = mp->m_ialloc_blks / blks_per_cluster; for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) { + /* + * The allocation bitmap tells us which inodes of the chunk were + * physically allocated. Skip the cluster if an inode falls into + * a sparse region. + */ + if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) { + ASSERT(((inum - xic->first_ino) % + inodes_per_cluster) == 0); + continue; + } + blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); @@ -2361,8 +2374,7 @@ xfs_ifree( xfs_bmap_free_t *flist) { int error; - int delete; - xfs_ino_t first_ino; + struct xfs_icluster xic = { 0 }; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(ip->i_d.di_nlink == 0); @@ -2378,7 +2390,7 @@ xfs_ifree( if (error) return error; - error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino); + error = xfs_difree(tp, ip->i_ino, flist, &xic); if (error) return error; @@ -2395,8 +2407,8 @@ xfs_ifree( ip->i_d.di_gen++; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (delete) - error = xfs_ifree_cluster(ip, tp, first_ino); + if (xic.deleted) + error = xfs_ifree_cluster(ip, tp, &xic); return error; } -- 1.8.3.1 From david@fromorbit.com Thu Feb 12 15:05:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 843927F51 for ; Thu, 12 Feb 2015 15:05:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F5188F8054 for ; Thu, 12 Feb 2015 13:05:00 -0800 (PST) X-ASG-Debug-ID: 1423775097-04cbb0116325e020001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GC8XphPj0vnNGCcZ for ; Thu, 12 Feb 2015 13:04:58 -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: ArkLAPgU3VR5LCM5PGdsb2JhbABbgwaBLIIzg3mqJwEBAQEBAQaYNAQCAoErRAEBAQEBAQUBAQEBODuEDAEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIJQfVVwEBAQEGAgEfGIVshQiEbQeDFoEUBZhbgRmFT4wZhCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Feb 2015 07:34:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YM0vm-0004dM-17; Fri, 13 Feb 2015 08:04:14 +1100 Date: Fri, 13 Feb 2015 08:04:13 +1100 From: Dave Chinner To: yy Cc: xfs , Eric Sandeen , bfoster Subject: Re: XFS buffer IO performance is very poor Message-ID: <20150212210413.GC12722@dastard> X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423775097 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 12, 2015 at 02:59:52PM +0800, yy wrote: > In functionxfs_file_aio_read, will requestXFS_IOLOCK_SHARED lock > for both direct IO and buffered IO: > so write will prevent read in XFS. > > However, in function generic_file_aio_read for ext3, will not > lockinode-i_mutex, so write will not prevent read in ext3. > > I think this maybe the reason of poor performance for XFS. I do > not know if this is a bug, or design flaws of XFS. This is a bug and design flaw in ext3, and most other Linux filesystems. Posix states that write() must execute atomically and so no concurrent operation that reads or modifies data should should see a partial write. The linux page cache doesn't enforce this - a read to the same range as a write can return partially written data on page granularity, as read/write only serialise on page locks in the page cache. XFS is the only Linux filesystem that actually follows POSIX requirements here - the shared/exclusive locking guarantees that a buffer write completes wholly before a read is allowed to access the data. There is a down side - you can't run concurrent buffered reads and writes to the same file - if you need to do that then that's what direct IO is for, and coherency between overlapping reads and writes is then the application's problem, not the filesystem... Maybe at some point in the future we might address this with ranged IO locks, but there really aren't many multithreaded programs that hit this issue... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 12 17:17:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E8EDE7F54 for ; Thu, 12 Feb 2015 17:17:41 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69C85AC002 for ; Thu, 12 Feb 2015 15:17:38 -0800 (PST) X-ASG-Debug-ID: 1423783054-04cb6c6b0c299220001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id A68sZRG4i5jJimVr for ; Thu, 12 Feb 2015 15:17:35 -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: An0VAIgz3VR5LCM5PGdsb2JhbABbgwZSWoIzrhQMAQEBAQEBBpJJhWsCAgEBAoEkRAEBAQEBAQUBAQEBODuEDAEBAQQnExwjEAgDFQMJDBkPBSUDBxoTiCwO1U4BAQEBAQUBAQEBAR0YhWyFCIQJZAcKgwyBFAWSf4VcgRk4gk6GKog4hCQqMYECgUEBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Feb 2015 09:39:42 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YM2tA-0004qc-MN; Fri, 13 Feb 2015 10:09:40 +1100 Date: Fri, 13 Feb 2015 10:09:40 +1100 From: Dave Chinner To: Alexander Tsvetkov Cc: Eric Sandee , xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log Message-ID: <20150212230940.GD12722@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> <20150211205406.GT4251@dastard> <54DC940D.4030009@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54DC940D.4030009@oracle.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: 1423783054 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 12, 2015 at 02:52:45PM +0300, Alexander Tsvetkov wrote: > On 02/11/2015 11:54 PM, Dave Chinner wrote: > >On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: > >>Hello, > >> > >>I've obtained corrupted xfs log after some sanity xfs testing: > >> > >>"log=logfile > >>log_size=855 > >> > >>dd if=/dev/zero "of=$log" bs=4096 count=$log_size > >>loopdev=$(losetup -f) > >>losetup $loopdev $log > >> > >>mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV > >>mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT > >>./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT > >>sync > >>umount $SCRATCH_MNT > >> > >>xfs_logprint -l $loopdev $SCRATCH_DEV" > >> > >>Test makes crc enabled xfs filesystem with the external log of > >>minimal allowed size and then creates on this fs the small directory > >>tree > >>with sub directories and files of fixed depth and size with help of > >>fdtree utility: > >>https://computing.llnl.gov/?set=code&page=sio_downloads > >Just take metadump image and put it somewhere we can down load it. > > > >>After that xfs_logprint stably reports bad data in log: Please try the patch below, it fixes the problem on the image you provided. Cheers, Dave. -- Dave Chinner david@fromorbit.com logprint: fix inode fork print record overrun From: Dave Chinner logprint checks for whether the inode log item extends across a log record boundary so that it doesn't try to dereference beyond the ned of the buffer containing the log items. It doesn' however, take into account log items with attribute forks in them, and so doesn't catch the overrun in this case. Fix it. reported-by: Alexander Tsvetkov Signed-off-by: Dave Chinner --- logprint/log_misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 521ab66..e4f2174 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -698,7 +698,7 @@ xlog_print_trans_inode( xlog_print_trans_inode_core(&dino); *ptr += xfs_icdinode_size(dino.di_version); - if (*i == num_ops-1 && f->ilf_size == 3) { + if (*i == num_ops-1 && f->ilf_size >= 3) { return 1; } From dave@fromorbit.com Thu Feb 12 17:21:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4F15B7F55 for ; Thu, 12 Feb 2015 17:21:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFBE7AC005 for ; Thu, 12 Feb 2015 15:21:06 -0800 (PST) X-ASG-Debug-ID: 1423783264-04bdf06a59271cc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id HBO8lP3AVix0g3MR for ; Thu, 12 Feb 2015 15:21: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: ApgIAK403VR5LCM5PGdsb2JhbABbgwaBLIYsqicBAQEBAQEGmWBEAQEBAQEBBQEBAQE4O4Q6LzsYUhgDBy2IGQMQrmShGQ2GAYYEh0uBRoEBhBQFlxaMDoI1hgOBZwELAYIwKjGBAoFBAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Feb 2015 09:44:18 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YM2xd-0004qy-VV for xfs@oss.sgi.com; Fri, 13 Feb 2015 10:14:18 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YM2xd-00034v-UU for xfs@oss.sgi.com; Fri, 13 Feb 2015 10:14:17 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Date: Fri, 13 Feb 2015 10:14:17 +1100 X-ASG-Orig-Subj: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Message-Id: <1423782857-11800-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1423783264 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Dave Chinner Test generic/224 is failing with a corruption being detected on one of Michael's test boxes. Debug that Michael added is indicating that the minleft trimming is resulting in an underflow: ..... before fixup: rlen 1 args->len 0 after xfs_alloc_fix_len : rlen 1 args->len 1 before goto out_nominleft: rlen 1 args->len 0 before fixup: rlen 1 args->len 0 after xfs_alloc_fix_len : rlen 1 args->len 1 after fixup: rlen 1 args->len 1 before fixup: rlen 1 args->len 0 after xfs_alloc_fix_len : rlen 1 args->len 1 after fixup: rlen 4294967295 args->len 4294967295 XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 The "goto out_nominleft:" indicates that we are getting close to ENOSPC in the AG, and a couple of allocations later we underflow and the corruption check fires in xfs_alloc_ag_vextent_size(). The issue is that the extent length fixups comaprisons are done with variables of xfs_extlen_t types. These are unsigned so an underflow looks like a really big value and hence is not detected as being smaller than the minimum length allowed for the extent. Hence the corruption check fires as it is noticing that the returned length is longer than the original extent length passed in. This can be easily fixed by ensuring we do the underflow test on signed values, the same way xfs_alloc_fix_len() prevents underflow. So we realise in future that these casts prevent underflows from going undetected, add comments to the code indicating this. Reported-by: Michael L. Semon Tested-by: Michael L. Semon Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_alloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 710554c..41e3630 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -260,6 +260,7 @@ xfs_alloc_fix_len( rlen = rlen - (k - args->mod); else rlen = rlen - args->prod + (args->mod - k); + /* casts to (int) catch length underflows */ if ((int)rlen < (int)args->minlen) return; ASSERT(rlen >= args->minlen && rlen <= args->maxlen); @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( if (diff >= 0) return 1; args->len += diff; /* shrink the allocated space */ - if (args->len >= args->minlen) + /* casts to (int) catch length underflows */ + if ((int)args->len >= (int)args->minlen) return 1; args->agbno = NULLAGBLOCK; return 0; -- 2.0.0 From bfields@fieldses.org Thu Feb 12 19:11:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 64D727F54 for ; Thu, 12 Feb 2015 19:11:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34C0B304039 for ; Thu, 12 Feb 2015 17:11:34 -0800 (PST) X-ASG-Debug-ID: 1423789891-04bdf06a5a273d00001-NocioJ Received: from fieldses.org (fieldses.org [173.255.197.46]) by cuda.sgi.com with ESMTP id 9HPQgJNp23KM3n0X for ; Thu, 12 Feb 2015 17:11:31 -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 E494824D7; Thu, 12 Feb 2015 20:11:30 -0500 (EST) Date: Thu, 12 Feb 2015 20:11:30 -0500 From: "J. Bruce Fields" To: Dave Chinner Cc: Jeff Layton , Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150213011130.GA6808@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <1421925006-24231-20-git-send-email-hch@lst.de> <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> <20150209201154.GA27746@fieldses.org> <20150210000423.GY12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150210000423.GY12722@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: fieldses.org[173.255.197.46] X-Barracuda-Start-Time: 1423789891 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15214 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 10, 2015 at 11:04:23AM +1100, Dave Chinner wrote: > On Mon, Feb 09, 2015 at 03:11:54PM -0500, J. Bruce Fields wrote: > > On Sun, Feb 08, 2015 at 09:09:42AM -0500, Jeff Layton wrote: > > > On Sun, 8 Feb 2015 14:34:35 +0100 > > > Christoph Hellwig wrote: > > > > > > > On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > > > > > You'd basically just be pulling my tree (Christoph's is just my nfsd > > > > > tree with his patches on top, and I've been testing with exactly that > > > > > locally, just putting off pushing it out till we decide this.) > > > > > > > > > > So anyway, fine with me if you want to just pull that into the xfs tree. > > > > > Mine's ready whenever, so if I send my pull pretty soon after the merge > > > > > window and you send it a little later then we still keep the property > > > > > that Linus's merge still has a diffstat only in our respective areas. > > > > > > > > > > (OK, it's a little more complicated because I've got the same > > > > > arrangement with jlayton, so the order is jlayton's lock pull, then my > > > > > nfsd pull, then your xfs pull. Is this getting too complicated? > > > > > jlayton and I are both ready to so and I think it'd work.) > > > > > > > > > > I'm also fine with duplicating those few patches, or whatever. > > > > > > > > Maybe the better idea is to pull the xfs tree in the nfsd tree, but > > > > that would require Dave sending an early pull request so that the > > > > nfsd pull doesn't get delayed. > > > > > > > > Or we just defer the pnfsd merge. While I tried to get it in in time > > > > for 3.20 all the delays during review mean we're really late no and should > > > > punt it to 3.21. > > > > > > FWIW, I plan to send a pull request for the locking changes as soon as > > > the merge window opens. Hopefully that won't be an issue for long... > > > > This includes Christoph's branch (all but the final xfs commits): > > > > git://linux-nfs.org/~bfields/linux.git for-3.20 > > > > That's what I intend to submit. Hope that's OK. Then it's up to Dave > > whether he wants to pull that in and include the xfs patches. > > I'm about to send a pull request to Linus for the current XFS tree. > Once that is merged, I'll pull in the remaining xfs-pnfs patches > and send another pull request to Linus after the NFS tree is merged. Sounds good, thanks. The nfsd tree's merged now so it should be good to go if you haven't found any show-stoppers. --b. From david@fromorbit.com Thu Feb 12 19:54:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6D6067F55 for ; Thu, 12 Feb 2015 19:54:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E1E8AAC005 for ; Thu, 12 Feb 2015 17:54:28 -0800 (PST) X-ASG-Debug-ID: 1423792465-04cbb01165264020001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id e68pxzPDnN4ss0Yy for ; Thu, 12 Feb 2015 17:54:25 -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: AsoXANpX3VR5LCM5PGdsb2JhbABbgwZSWoIzg3mqKAEBAQEBAQaSQYVzAgIBAQKBJUQBAQEBAQEFAQEBATg7hA0BBTocIxAIAxgJJQ8FJQMHGhOILNVDAQEBAQEFAQEBAR4YhWyFCIRtB4MWgRQFkn+CEYNLgRmOKoM+hCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Feb 2015 12:24:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YM5SY-000532-Ji; Fri, 13 Feb 2015 12:54:22 +1100 Date: Fri, 13 Feb 2015 12:54:22 +1100 From: Dave Chinner To: "J. Bruce Fields" Cc: Jeff Layton , Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150213015422.GE12722@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> <20150209201154.GA27746@fieldses.org> <20150210000423.GY12722@dastard> <20150213011130.GA6808@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150213011130.GA6808@fieldses.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: 1423792465 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Feb 12, 2015 at 08:11:30PM -0500, J. Bruce Fields wrote: > On Tue, Feb 10, 2015 at 11:04:23AM +1100, Dave Chinner wrote: > > On Mon, Feb 09, 2015 at 03:11:54PM -0500, J. Bruce Fields wrote: > > > On Sun, Feb 08, 2015 at 09:09:42AM -0500, Jeff Layton wrote: > > > > On Sun, 8 Feb 2015 14:34:35 +0100 > > > > Christoph Hellwig wrote: > > > > > > > > > On Fri, Feb 06, 2015 at 05:42:58PM -0500, J. Bruce Fields wrote: > > > > > > You'd basically just be pulling my tree (Christoph's is just my nfsd > > > > > > tree with his patches on top, and I've been testing with exactly that > > > > > > locally, just putting off pushing it out till we decide this.) > > > > > > > > > > > > So anyway, fine with me if you want to just pull that into the xfs tree. > > > > > > Mine's ready whenever, so if I send my pull pretty soon after the merge > > > > > > window and you send it a little later then we still keep the property > > > > > > that Linus's merge still has a diffstat only in our respective areas. > > > > > > > > > > > > (OK, it's a little more complicated because I've got the same > > > > > > arrangement with jlayton, so the order is jlayton's lock pull, then my > > > > > > nfsd pull, then your xfs pull. Is this getting too complicated? > > > > > > jlayton and I are both ready to so and I think it'd work.) > > > > > > > > > > > > I'm also fine with duplicating those few patches, or whatever. > > > > > > > > > > Maybe the better idea is to pull the xfs tree in the nfsd tree, but > > > > > that would require Dave sending an early pull request so that the > > > > > nfsd pull doesn't get delayed. > > > > > > > > > > Or we just defer the pnfsd merge. While I tried to get it in in time > > > > > for 3.20 all the delays during review mean we're really late no and should > > > > > punt it to 3.21. > > > > > > > > FWIW, I plan to send a pull request for the locking changes as soon as > > > > the merge window opens. Hopefully that won't be an issue for long... > > > > > > This includes Christoph's branch (all but the final xfs commits): > > > > > > git://linux-nfs.org/~bfields/linux.git for-3.20 > > > > > > That's what I intend to submit. Hope that's OK. Then it's up to Dave > > > whether he wants to pull that in and include the xfs patches. > > > > I'm about to send a pull request to Linus for the current XFS tree. > > Once that is merged, I'll pull in the remaining xfs-pnfs patches > > and send another pull request to Linus after the NFS tree is merged. > > Sounds good, thanks. The nfsd tree's merged now so it should be good to > go if you haven't found any show-stoppers. Thanks Bruce. I might have to build a merged tree because one of the changes from the review modified a header file introduced in the NFS tree. I'll see how it goes, and see if I can avoid doing something that will make Linus yell at me :P Cheers, Dave. -- Dave Chinner david@fromorbit.com From yy@xspring.net Thu Feb 12 20:21:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=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 EF0817F55 for ; Thu, 12 Feb 2015 20:21:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D0D9AC001 for ; Thu, 12 Feb 2015 18:20:59 -0800 (PST) X-ASG-Debug-ID: 1423794056-04bdf06a59275070001-NocioJ Received: from smtpbg303.qq.com (smtpbg303.qq.com [184.105.206.26]) by cuda.sgi.com with ESMTP id S5NGHgKdh2yiRmpV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 18:20:57 -0800 (PST) X-Barracuda-Envelope-From: yy@xspring.net X-Barracuda-Apparent-Source-IP: 184.105.206.26 X-QQ-mid: bizesmtp9t1423794023t734t251 Received: from yinyedeMacBook-Pro (unknown [59.37.125.61]) by esmtp4.qq.com (ESMTP) with id ; Fri, 13 Feb 2015 10:20:23 +0800 (CST) X-QQ-SSF: 00100000002000F0F222B00A0000000 X-QQ-FEAT: 8WhyVGeJAza0QvRdvUg1sCoJPrQnW/Nvi4MYDizAEW+cFNsBLN53/Ei46j9HZ dOpPqmnLSpXOkmD+2bJscTn05fTLlcBlARg8O2CnI4Bo6VI7qcbYTqpgPbI8rYEN4+8smz1 6wqos1C3qyz4dXwGNYB4IZeOukaat9DybMady75UlzKlKzEz1YmFG7ahrapvYPHRn/o50yx 2ltCv4LWC1ZDcjOSoTC2a X-QQ-GoodBg: 0 X-FOXMAIL-CODE: foxmail_code:00015C430E76 X-GUID: 9C8A5F75-BF5B-6A46-C0CC-4E3C3E4F2D77 From: "=?utf-8?B?eXk=?=" To: "=?utf-8?B?RGF2ZSBDaGlubmVy?=" Cc: "=?utf-8?B?eGZz?=", "=?utf-8?B?RXJpYyBTYW5kZWVu?=", "=?utf-8?B?YmZvc3Rlcg==?=" Subject: Re: XFS buffer IO performance is very poor Mime-Version: 1.0 X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor Content-Type: multipart/alternative; boundary="----=_NextPart_54DD5F7C_7DC6ECA0_11A7F16B" Content-Transfer-Encoding: 8Bit Date: Fri, 13 Feb 2015 10:20:44 +0800 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: Foxmail_for_Mac 1.0.0 X-QQ-SENDSIZE: 520 X-QQ-FName: 79F08A94DF194CA1B79441FA8E2C6BC2 X-QQ-LocalIP: 58.250.132.20 X-Barracuda-Connect: smtpbg303.qq.com[184.105.206.26] X-Barracuda-Start-Time: 1423794057 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, FROM_EXCESS_BASE64, FROM_EXCESS_BASE64_2, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 0.01 FROM_EXCESS_BASE64 From: base64 encoded unnecessarily 1.05 FROM_EXCESS_BASE64_2 From: base64 encoded unnecessarily This is a multi-part message in MIME format. ------=_NextPart_54DD5F7C_7DC6ECA0_11A7F16B Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGF2ZSwKVGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgeW91ciBleHBsYW5hdGlvbi4KCgpJIGhp dCB0aGlzIGlzc3VlIHdoZW4gcnVuIE15U1FMIG9uIFhGUy4gRGlyZWN0IElPIGlzIHZlcnkg aW1wb3J0IGZvciBNeVNRTCBvbiBYRlMsYnV0IEkgY2Fu4oCZdCBmb3VuZCBhbnkgZG9jdW1l bnQgZXhwbGFuYXRpb24gdGhpcyBwcm9ibGVtLk1heWJlIHRoaXMgd2lsbCBjYXVzZSBncmVh dCBjb25mdXNpb24gZm9yIG90aGVyIE15U1FMIHVzZXJzIGFsc28sIHNvIG1heWJlIHRoaXMg cHJvYmxlbSBzaG91bGQgYmUgZXhwbGFpbmVkIGluIFhGUyBkb2N1bWVudC4KCgpCZXN0IHJl Z2FyZHMsCnl5CgoK5Y6f5aeL6YKu5Lu2CuWPkeS7tuS6ujpEYXZlIENoaW5uZXJkYXZpZEBm cm9tb3JiaXQuY29tCuaUtuS7tuS6ujp5eXl5QHhzcHJpbmcubmV0CuaKhOmAgTp4ZnN4ZnNA b3NzLnNnaS5jb207IEVyaWMgU2FuZGVlbnNhbmRlZW5Ac2FuZGVlbi5uZXQ7IGJmb3N0ZXJi Zm9zdGVyQHJlZGhhdC5jb20K5Y+R6YCB5pe26Ze0OjIwMTXlubQy5pyIMTPml6Uo5ZGo5LqU KeKAhzA1OjA0CuS4u+mimDpSZTogWEZTIGJ1ZmZlciBJTyBwZXJmb3JtYW5jZSBpcyB2ZXJ5 IHBvb3IKCgpPbiBUaHUsIEZlYiAxMiwgMjAxNSBhdCAwMjo1OTo1MlBNICswODAwLCB5eSB3 cm90ZTogIEluIGZ1bmN0aW9ueGZzX2ZpbGVfYWlvX3JlYWQsIHdpbGwgcmVxdWVzdFhGU19J T0xPQ0tfU0hBUkVEIGxvY2sgIGZvciBib3RoIGRpcmVjdCBJTyBhbmQgYnVmZmVyZWQgSU86 ICBzbyB3cml0ZSB3aWxsIHByZXZlbnQgcmVhZCBpbiBYRlMuICAgSG93ZXZlciwgaW4gZnVu Y3Rpb24gZ2VuZXJpY19maWxlX2Fpb19yZWFkIGZvciBleHQzLCB3aWxsIG5vdCAgbG9ja2lu b2RlLWlfbXV0ZXgsIHNvIHdyaXRlIHdpbGwgbm90IHByZXZlbnQgcmVhZCBpbiBleHQzLiAg IEkgdGhpbmsgdGhpcyBtYXliZSB0aGUgcmVhc29uIG9mIHBvb3IgcGVyZm9ybWFuY2UgZm9y IFhGUy4gSSBkbyAgbm90IGtub3cgaWYgdGhpcyBpcyBhIGJ1Zywgb3IgZGVzaWduIGZsYXdz IG9mIFhGUy4gVGhpcyBpcyBhIGJ1ZyBhbmQgZGVzaWduIGZsYXcgaW4gZXh0MywgYW5kIG1v c3Qgb3RoZXIgTGludXggZmlsZXN5c3RlbXMuIFBvc2l4IHN0YXRlcyB0aGF0IHdyaXRlKCkg bXVzdCBleGVjdXRlIGF0b21pY2FsbHkgYW5kIHNvIG5vIGNvbmN1cnJlbnQgb3BlcmF0aW9u IHRoYXQgcmVhZHMgb3IgbW9kaWZpZXMgZGF0YSBzaG91bGQgc2hvdWxkIHNlZSBhIHBhcnRp YWwgd3JpdGUuIFRoZSBsaW51eCBwYWdlIGNhY2hlIGRvZXNuJ3QgZW5mb3JjZSB0aGlzIC0g YSByZWFkIHRvIHRoZSBzYW1lIHJhbmdlIGFzIGEgd3JpdGUgY2FuIHJldHVybiBwYXJ0aWFs bHkgd3JpdHRlbiBkYXRhIG9uIHBhZ2UgZ3JhbnVsYXJpdHksIGFzIHJlYWQvd3JpdGUgb25s eSBzZXJpYWxpc2Ugb24gcGFnZSBsb2NrcyBpbiB0aGUgcGFnZSBjYWNoZS4gWEZTIGlzIHRo ZSBvbmx5IExpbnV4IGZpbGVzeXN0ZW0gdGhhdCBhY3R1YWxseSBmb2xsb3dzIFBPU0lYIHJl cXVpcmVtZW50cyBoZXJlIC0gdGhlIHNoYXJlZC9leGNsdXNpdmUgbG9ja2luZyBndWFyYW50 ZWVzIHRoYXQgYSBidWZmZXIgd3JpdGUgY29tcGxldGVzIHdob2xseSBiZWZvcmUgYSByZWFk IGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBkYXRhLiBUaGVyZSBpcyBhIGRvd24gc2lkZSAt IHlvdSBjYW4ndCBydW4gY29uY3VycmVudCBidWZmZXJlZCByZWFkcyBhbmQgd3JpdGVzIHRv IHRoZSBzYW1lIGZpbGUgLSBpZiB5b3UgbmVlZCB0byBkbyB0aGF0IHRoZW4gdGhhdCdzIHdo YXQgZGlyZWN0IElPIGlzIGZvciwgYW5kIGNvaGVyZW5jeSBiZXR3ZWVuIG92ZXJsYXBwaW5n IHJlYWRzIGFuZCB3cml0ZXMgaXMgdGhlbiB0aGUgYXBwbGljYXRpb24ncyBwcm9ibGVtLCBu b3QgdGhlIGZpbGVzeXN0ZW0uLi4gTWF5YmUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJl IHdlIG1pZ2h0IGFkZHJlc3MgdGhpcyB3aXRoIHJhbmdlZCBJTyBsb2NrcywgYnV0IHRoZXJl IHJlYWxseSBhcmVuJ3QgbWFueSBtdWx0aXRocmVhZGVkIHByb2dyYW1zIHRoYXQgaGl0IHRo aXMgaXNzdWUuLi4gQ2hlZXJzLCBEYXZlLiAtLSBEYXZlIENoaW5uZXIgZGF2aWRAZnJvbW9y Yml0LmNvbQ== ------=_NextPart_54DD5F7C_7DC6ECA0_11A7F16B Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZScsICflvq7ova/pm4Xp u5EnO2NvbG9yOiMzMzM7Ij48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5k ZSc7bWFyZ2luOjA7Ij5EYXZlLDwvcD48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRh IEdyYW5kZSc7bWFyZ2luOjA7Ij5UaGFuayB5b3UgdmVyeSBtdWNoIGZvciB5b3VyIGV4cGxh bmF0aW9uLjwvcD48cCBzdHlsZT0iZm9udDoxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7bWFy Z2luOjA7Ij48YnI+PC9wPjxwIHN0eWxlPSJmb250OjE0cHgvMS41ICdMdWNpZGEgR3JhbmRl JzttYXJnaW46MDsiPkkgaGl0IHRoaXMgaXNzdWUgd2hlbiBydW4gTXlTUUwgb24gWEZTLiBE aXJlY3QgSU8gaXMgdmVyeSBpbXBvcnQgZm9yIE15U1FMIG9uIFhGUyxidXQgSSBjYW7igJl0 IGZvdW5kIGFueSBkb2N1bWVudCBleHBsYW5hdGlvbiB0aGlzIHByb2JsZW0uTWF5YmUgdGhp cyB3aWxsIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbiBmb3Igb3RoZXIgTXlTUUwgdXNlcnMgYWxz bywgc28gbWF5YmUgJm5ic3A7dGhpcyBwcm9ibGVtIHNob3VsZCBiZSBleHBsYWluZWQgaW4g WEZTIGRvY3VtZW50LjwvcD48YnI+PGRpdj48ZGl2IHN0eWxlPSJmb250OiAxNHB4LzEuNSAn THVjaWRhIEdyYW5kZSc7Ij5CZXN0IHJlZ2FyZHMsPGRpdj55eTwvZGl2PjwvZGl2PjwvZGl2 PjxzcGFuIHN0eWxlPSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Y29sb3I6IzMz MzsiPjxicj48L3NwYW4+PGRpdiBjbGFzcz0iZm94bWFpbF9ibG9ja3F1b3RlX2Zyb21oZXJl X2VsZW1lbnQiIHN0eWxlPSJmb250OiAxMnB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7cGFkZGlu ZzoycHggMCAycHggMDsiPjxzcGFuIHN0eWxlPSJjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlv bjpsaW5lLXRocm91Z2g7d2hpdGUtc3BhY2U6cHJlLXdyYXA7Ij4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgPC9zcGFuPiZuYnNwO+WOn+Wni+mCruS7tiZuYnNwOzxzcGFuIHN0eWxl PSJjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7d2hpdGUtc3BhY2U6 cHJlLXdyYXA7Ij4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvZGl2Pjxk aXYgc3R5bGU9ImZvbnQ6IDEycHgvMS41ICdMdWNpZGEgR3JhbmRlJztiYWNrZ3JvdW5kOiNl ZmVmZWY7Y29sb3I6IzY2NjY2NjtwYWRkaW5nOjhweDsiPjxkaXY+PGIgc3R5bGU9ImNvbG9y OiM5OTk7Ij7lj5Hku7bkuro6PC9iPiZuYnNwO0RhdmUgQ2hpbm5lciZsdDtkYXZpZEBmcm9t b3JiaXQuY29tJmd0OzwvZGl2PjxkaXY+PGIgc3R5bGU9ImNvbG9yOiM5OTk7Ij7mlLbku7bk uro6PC9iPiZuYnNwO3l5Jmx0O3l5QHhzcHJpbmcubmV0Jmd0OzwvZGl2PjxkaXY+PGIgc3R5 bGU9ImNvbG9yOiM5OTk7Ij7mioTpgIE6PC9iPiZuYnNwO3hmcyZsdDt4ZnNAb3NzLnNnaS5j b20mZ3Q7OyBFcmljIFNhbmRlZW4mbHQ7c2FuZGVlbkBzYW5kZWVuLm5ldCZndDs7IGJmb3N0 ZXImbHQ7YmZvc3RlckByZWRoYXQuY29tJmd0OzwvZGl2PjxkaXY+PGIgc3R5bGU9ImNvbG9y OiM5OTk7Ij7lj5HpgIHml7bpl7Q6PC9iPiZuYnNwOzIwMTXlubQy5pyIMTPml6Uo5ZGo5LqU KeKAhzA1OjA0PC9kaXY+PGRpdj48YiBzdHlsZT0iY29sb3I6Izk5OTsiPuS4u+mimDo8L2I+ Jm5ic3A7UmU6IFhGUyBidWZmZXIgSU8gcGVyZm9ybWFuY2UgaXMgdmVyeSBwb29yPC9kaXY+ PC9kaXY+PGJyPjxkaXYgY2xhc3M9Im1haWxfcXVvdGVfNDdCMDIyNDM3OTdGNDNEREI1QzND RERERjIyN0JENzciIHN0eWxlPSJmb250OiAxNHB4LzEuNSAnTHVjaWRhIEdyYW5kZSc7Y29s b3I6IzMzMzsiPjxwcmUgc3R5bGU9IndoaXRlLXNwYWNlOnByZS13cmFwOyI+T24gVGh1LCBG ZWIgMTIsIDIwMTUgYXQgMDI6NTk6NTJQTSArMDgwMCwgeXkgd3JvdGU6CiZndDsgSW4gZnVu Y3Rpb254ZnNfZmlsZV9haW9fcmVhZCwgd2lsbCByZXF1ZXN0WEZTX0lPTE9DS19TSEFSRUQg bG9jawomZ3Q7IGZvciBib3RoIGRpcmVjdCBJTyBhbmQgYnVmZmVyZWQgSU86CgomZ3Q7IHNv IHdyaXRlIHdpbGwgcHJldmVudCByZWFkIGluIFhGUy4KJmd0OyAKJmd0OyBIb3dldmVyLCBp biBmdW5jdGlvbiBnZW5lcmljX2ZpbGVfYWlvX3JlYWQgZm9yIGV4dDMsIHdpbGwgbm90CiZn dDsgbG9ja2lub2RlLWlfbXV0ZXgsIHNvIHdyaXRlIHdpbGwgbm90IHByZXZlbnQgcmVhZCBp biBleHQzLgomZ3Q7IAomZ3Q7IEkgdGhpbmsgdGhpcyBtYXliZSB0aGUgcmVhc29uIG9mIHBv b3IgcGVyZm9ybWFuY2UgZm9yIFhGUy4gSSBkbwomZ3Q7IG5vdCBrbm93IGlmIHRoaXMgaXMg YSBidWcsIG9yIGRlc2lnbiBmbGF3cyBvZiBYRlMuCgpUaGlzIGlzIGEgYnVnIGFuZCBkZXNp Z24gZmxhdyBpbiBleHQzLCBhbmQgbW9zdCBvdGhlciBMaW51eApmaWxlc3lzdGVtcy4gUG9z aXggc3RhdGVzIHRoYXQgd3JpdGUoKSBtdXN0IGV4ZWN1dGUgYXRvbWljYWxseSBhbmQKc28g bm8gY29uY3VycmVudCBvcGVyYXRpb24gdGhhdCByZWFkcyBvciBtb2RpZmllcyBkYXRhIHNo b3VsZCBzaG91bGQKc2VlIGEgcGFydGlhbCB3cml0ZS4gVGhlIGxpbnV4IHBhZ2UgY2FjaGUg ZG9lc24ndCBlbmZvcmNlIHRoaXMgLSBhCnJlYWQgdG8gdGhlIHNhbWUgcmFuZ2UgYXMgYSB3 cml0ZSBjYW4gcmV0dXJuIHBhcnRpYWxseSB3cml0dGVuIGRhdGEKb24gcGFnZSBncmFudWxh cml0eSwgYXMgcmVhZC93cml0ZSBvbmx5IHNlcmlhbGlzZSBvbiBwYWdlIGxvY2tzIGluCnRo ZSBwYWdlIGNhY2hlLgoKWEZTIGlzIHRoZSBvbmx5IExpbnV4IGZpbGVzeXN0ZW0gdGhhdCBh Y3R1YWxseSBmb2xsb3dzIFBPU0lYCnJlcXVpcmVtZW50cyBoZXJlIC0gdGhlIHNoYXJlZC9l eGNsdXNpdmUgbG9ja2luZyBndWFyYW50ZWVzIHRoYXQgYQpidWZmZXIgd3JpdGUgY29tcGxl dGVzIHdob2xseSBiZWZvcmUgYSByZWFkIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZQpkYXRh LiBUaGVyZSBpcyBhIGRvd24gc2lkZSAtIHlvdSBjYW4ndCBydW4gY29uY3VycmVudCBidWZm ZXJlZCByZWFkcwphbmQgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgLSBpZiB5b3UgbmVlZCB0 byBkbyB0aGF0IHRoZW4gdGhhdCdzCndoYXQgZGlyZWN0IElPIGlzIGZvciwgYW5kIGNvaGVy ZW5jeSBiZXR3ZWVuIG92ZXJsYXBwaW5nIHJlYWRzIGFuZAp3cml0ZXMgaXMgdGhlbiB0aGUg YXBwbGljYXRpb24ncyBwcm9ibGVtLCBub3QgdGhlIGZpbGVzeXN0ZW0uLi4KCk1heWJlIGF0 IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB3ZSBtaWdodCBhZGRyZXNzIHRoaXMgd2l0aCBy YW5nZWQKSU8gbG9ja3MsIGJ1dCB0aGVyZSByZWFsbHkgYXJlbid0IG1hbnkgbXVsdGl0aHJl YWRlZCBwcm9ncmFtcyB0aGF0CmhpdCB0aGlzIGlzc3VlLi4uCgpDaGVlcnMsCgpEYXZlLgot LSAKRGF2ZSBDaGlubmVyCjxhIGhyZWY9Im1haWx0bzpkYXZpZEBmcm9tb3JiaXQuY29tIiB0 aXRsZT0ibWFpbHRvOmRhdmlkQGZyb21vcmJpdC5jb20iPmRhdmlkQGZyb21vcmJpdC5jb208 L2E+CjwvcHJlPjwvZGl2PjwvZGl2Pg== ------=_NextPart_54DD5F7C_7DC6ECA0_11A7F16B-- From sfr@canb.auug.org.au Thu Feb 12 20:38:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EED1B7F55 for ; Thu, 12 Feb 2015 20:38:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CCEC78F8054 for ; Thu, 12 Feb 2015 18:38:21 -0800 (PST) X-ASG-Debug-ID: 1423795097-04cb6c6b0929cfe0001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id FJbGhGcozgGWWnCw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Feb 2015 18:38:19 -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 455D7140151; Fri, 13 Feb 2015 13:38:16 +1100 (AEDT) Date: Fri, 13 Feb 2015 13:38:11 +1100 From: Stephen Rothwell To: Dave Chinner Cc: "J. Bruce Fields" , Jeff Layton , Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150213133811.5c3b9f49@canb.auug.org.au> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations In-Reply-To: <20150213015422.GE12722@dastard> References: <20150205004758.GO4251@dastard> <20150205070858.GA593@lst.de> <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> <20150209201154.GA27746@fieldses.org> <20150210000423.GY12722@dastard> <20150213011130.GA6808@fieldses.org> <20150213015422.GE12722@dastard> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; i586-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/72iLWnDTYf9Pc=xJPr1Q12+"; protocol="application/pgp-signature" X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1423795098 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/72iLWnDTYf9Pc=xJPr1Q12+ Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Hi Dave, On Fri, 13 Feb 2015 12:54:22 +1100 Dave Chinner wrote: > > Thanks Bruce. I might have to build a merged tree because one of the > changes from the review modified a header file introduced in the NFS > tree. >=20 > I'll see how it goes, and see if I can avoid doing something that > will make Linus yell at me :P If its a syntactic conflict with an obvious resolution, just leave it (or maybe mention it in the pull request). It gives him something to do so he feels useful. :-) /me notes that I did not see a conflict while merging the xfs tree in linux-next today ... --=20 Cheers, Stephen Rothwell sfr@canb.auug.org.au --Sig_/72iLWnDTYf9Pc=xJPr1Q12+ Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJU3WOYAAoJEMDTa8Ir7ZwVNrMP/1MGyDeHamIa2ByYrBlsbCoS bq9BV7bEw5lXMK4pklOHwDtJmsPs/ozuCZ4Yc65UkEbE3f228ZyMXNVODcrJBtTc 66xfJpFhx9P7Stk/ViDLv3GPPwS3iW93Ru/62dNhy81NGRXznY1YQ8quzX8H/nmD JxACRPsDtLnUCFIskpxc9WYBAgP9hbU2UfBD+ryfOf11GNcW8FC5IFfxaWK/D/or 6nyRCJ0KeVmEy/zIQ6TT32I/RIe78VPKJ3fuY+wAOiWzv4fUI9uP7W0i1rfZYb6Z +aQ+E4GTp5WUmI2vGf7hnbZTdEmaXzP+PFnz2bMSCUr/FLiOiJS1kiDqVZQaZjgQ ItHInE1emxenhVaHsqSCQ6LEl0auAgqKfw27A3Po4xYX0ZTIUQGaA1cZtwxv79bz CNVK2Puy3GIRiu4G2HQqjkvFu3FXdwSUEnm6y+6xpDEi7oUaJJJy9szLP9rTeBYq 0odtBEn2m88EUME/hJskO3OwIrMPPCyP0/cOfaJIoEWvHMMxttmqbGnAF7Cq/mrr 1X8xdh+3pwfMyqolqiU3ZiU4hM12dmj4jFoLdIfSCPSZxup795FEUcbb1KTam+/P irnAfzhr0+E5caWYfurlB8RHxF6+2w3CCwnB15nmW6GHb6m/Y3U4eIRV72GgOzg4 ZMI7g9jls6pXGv7rvYge =uaiD -----END PGP SIGNATURE----- --Sig_/72iLWnDTYf9Pc=xJPr1Q12+-- From erin@nb-channel.com Fri Feb 13 00:53:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D69217F55 for ; Fri, 13 Feb 2015 00:53:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5752FAC002 for ; Thu, 12 Feb 2015 22:52:58 -0800 (PST) X-ASG-Debug-ID: 1423810375-04cbb0116327b5f0001-NocioJ Received: from hwhost4.qiye.163.com (hwhost4.qiye.163.com [180.150.142.123]) by cuda.sgi.com with ESMTP id jxMJtRncrN6nhpqa for ; Thu, 12 Feb 2015 22:52:55 -0800 (PST) X-Barracuda-Envelope-From: erin@nb-channel.com X-Barracuda-Apparent-Source-IP: 180.150.142.123 Received: from erin$nb-channel.com ( [36.22.63.168] ) by ajax-webmail-wmsvr3 (Coremail) ; Fri, 13 Feb 2015 14:50:09 +0800 (CST) X-Originating-IP: [36.22.63.168] Date: Fri, 13 Feb 2015 14:50:09 +0800 (CST) From: Erin To: xfs@oss.sgi.com Subject: Parameters from elevator landing door X-Priority: 3 X-ASG-Orig-Subj: Parameters from elevator landing door X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20140422(26738.6344) Copyright (c) 2002-2015 www.mailtech.cn 163-hosting Content-Type: multipart/alternative; boundary="----=_Part_32129_1587487525.1423810209917" MIME-Version: 1.0 Message-ID: <5f26b9da.1904.14b81b3a87e.Coremail.erin@nb-channel.com> X-CM-TRANSID:y2R4CkDpL0Kint1UWHIPAA--.4367W X-CM-SenderInfo: hhul0qlqenuxpdqqvzoofrz/1tbiBQuddlSYSP2LeAAHso X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== X-Barracuda-Connect: hwhost4.qiye.163.com[180.150.142.123] X-Barracuda-Start-Time: 1423810375 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15226 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_32129_1587487525.1423810209917 Content-Type: text/plain; charset=GBK Content-Transfer-Encoding: base64 SGkKCiAKClRoaXMgaXMgTmluYSBmcm9tIE5pbmdibyBDaGFubmVsIEVsZWN0cmljYWwgY28uLGx0 ZC4gV2UgYXJlIGEgcHJvZmVzc2lvbmFsIG1hbnVmYWN0dXJlciAgYW5kIGRlc2lnbmVyIGluIGVs ZXZhdG9yIHBhcnRzLCAgaXRzIG1haW4gcHJvZHVjdHMgYXJlIGFjY2Vzc29yaWVzIG9mIGVsZXZh dG9yIGFuZCBlc2NhbGF0b3Igc3VjaCBhczogZG9vciBvcGVyYXRvciwgc2VjdXJpdHkgY29tcG9u ZW50cywgTG9hZCBtZWFzdXJpbmcgZGV2aWNlLCBsaWdodCBjdXJ0YWluIGFuZCBtb3Zpbmcgd2Fs a3dheaGvcyBwZWRhbCBldGMuCgpXZSBzZWxsIGhpZ2ggcXVhbGl0eSBlbGV2YXRvciBhY2Nlc3Nv cmllcyBvZiBkb21lc3RpYyBhbmQgaW50ZXJuYXRpb25hbCBmYW1vdXMgYnJhbmRzLiBXZSBjYW4g Zm9ybSBjb21wbGV0ZSBzZXRzIHRvIG1hbnkgZWxldmF0b3IgYnJhbmRzIHN1Y2ggYXMgTWl0c3Vi aXNoaSwgVGh5c3NlbiwgT3RpcywgU2NoaW5kbGVyLCBLT05FLCBGdWppLCBhbmQgWXVuZ3RheSBl dGMuCgpQbHMgZmVlbCBmcmVlIHRvIGNvbnRhY3Qgd2l0aCBtZSBpZiB5b3Ugd291bGQgbGlrZSB0 byBrbm93IG1vcmUgIQoKQi53aXNoZXMKCiAKCkVyaW4KCiAKCk5pbmdibyBDaGFubmVsIEVsZWN0 cm9tZWNoYW5pY2FsIENvLiBMdGQKClJvb20gMTUxMixNb3JnYW4gSW50ZXJuYXRpb25hbCBCdWxk aW5nIEMsCgpUYWloZSBSb2FkLEJlaWx1biwgTmluZ2JvLCBaaGVqaWFuZyAzMDAwMTIsIENoaW5h CgpUZWw6IDAwODYgNTc0IDg2ODAyNjg4ICAgICBGYXg6IDAwODYgNTc0ODY4MDI3ODgKClNreXBl OmNoYW5uZWwtbmluYQ== ------=_Part_32129_1587487525.1423810209917 Content-Type: text/html; charset=GBK Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7 Zm9udC1mYW1pbHk6QXJpYWwiPjxkaXYgYWxpZ249ImxlZnQiIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW46IDBjbSAwY20gMHB0OyB0ZXh0LWFsaWduOiBsZWZ0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuOyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAiIEFyaWFsPSIiIGZv bnQtc2l6ZTo9IiIgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6PSIiIMvOzOU9IiIgbXNvLWZvbnQt a2VybmluZzo9IiI+CjxwIGFsaWduPSJsZWZ0IiBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luOiAwY20gMGNtIDBwdDsgdGV4dC1hbGlnbjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbjsiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1mYW1pbHk6ICIgQXJpYWw9 IiIgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6PSIiIMvOzOU9IiIgbXNvLWZvbnQta2VybmluZzo9 IiIgbXNvLWJpZGktZm9udC13ZWlnaHQ6PSIiIGJvbGQ9IiI+PGZvbnQgc2l6ZT0iMyI+SGk8bzpw PjwvbzpwPjwvZm9udD48L3NwYW4+PC9wPgo8cCBhbGlnbj0ibGVmdCIgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9Im1hcmdpbjogMGNtIDBjbSAwcHQ7IHRleHQtYWxpZ246IGxlZnQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW47Ij48bzpwPjxmb250IHNpemU9IjMiPiZuYnNwOzwvZm9udD48 L286cD48L3A+CjxwIGFsaWduPSJsZWZ0IiBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2lu OiAwY20gMGNtIDBwdDsgdGV4dC1hbGlnbjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbjsiPjxmb250IHNpemU9IjMiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1mYW1p bHk6ICIgQXJpYWw9IiIgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6PSIiIMvOzOU9IiIgbXNvLWZv bnQta2VybmluZzo9IiIgbXNvLWJpZGktZm9udC13ZWlnaHQ6PSIiIGJvbGQ9IiI+VGhpcyAKaXMg TmluYSBmcm9tIE5pbmdibyBDaGFubmVsIEVsZWN0cmljYWwgY28uLGx0ZC4gV2UgYXJlIGEgcHJv ZmVzc2lvbmFsIAptYW51ZmFjdHVyZXImbmJzcDsgYW5kIGRlc2lnbmVyIGluIGVsZXZhdG9yIHBh cnRzLCZuYnNwOyBpdHMgbWFpbiBwcm9kdWN0cyBhcmUgYWNjZXNzb3JpZXMgCm9mIGVsZXZhdG9y IGFuZCBlc2NhbGF0b3Igc3VjaCBhczogZG9vciBvcGVyYXRvciwgc2VjdXJpdHkgY29tcG9uZW50 cywgTG9hZCAKbWVhc3VyaW5nIGRldmljZSwgbGlnaHQgY3VydGFpbiBhbmQgbW92aW5nIHdhbGt3 YXmhr3MgcGVkYWwgCmV0Yy48L3NwYW4+PG86cD48L286cD48L2ZvbnQ+PC9wPgo8cCBhbGlnbj0i bGVmdCIgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMGNtIDBjbSAwcHQ7IHRleHQt YWxpZ246IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47Ij48Zm9udCBzaXplPSIz Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtZmFtaWx5OiAiIEFyaWFsPSIiIG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5Oj0iIiDLzszlPSIiIG1zby1mb250LWtlcm5pbmc6PSIiIG1zby1i aWRpLWZvbnQtd2VpZ2h0Oj0iIiBib2xkPSIiPldlIApzZWxsIGhpZ2ggcXVhbGl0eSBlbGV2YXRv ciBhY2Nlc3NvcmllcyBvZiBkb21lc3RpYyBhbmQgaW50ZXJuYXRpb25hbCBmYW1vdXMgCmJyYW5k cy4gV2UgY2FuIGZvcm0gY29tcGxldGUgc2V0cyB0byBtYW55IGVsZXZhdG9yIGJyYW5kcyBzdWNo IGFzIE1pdHN1YmlzaGksIApUaHlzc2VuLCBPdGlzLCBTY2hpbmRsZXIsIEtPTkUsIEZ1amksIGFu ZCBZdW5ndGF5IApldGMuPC9zcGFuPjxvOnA+PC9vOnA+PC9mb250PjwvcD4KPHAgYWxpZ249Imxl ZnQiIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46IDBjbSAwY20gMHB0OyB0ZXh0LWFs aWduOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyI+PHNwYW4gbGFuZz0iRU4t VVMiIHN0eWxlPSJmb250LWZhbWlseTogIiBBcmlhbD0iIiBtc28tZmFyZWFzdC1mb250LWZhbWls eTo9IiIgy87M5T0iIiBtc28tZm9udC1rZXJuaW5nOj0iIiBtc28tYmlkaS1mb250LXdlaWdodDo9 IiIgYm9sZD0iIj48Zm9udCBzaXplPSIzIj5QbHMgZmVlbCBmcmVlIHRvIGNvbnRhY3Qgd2l0aCBt ZSBpZiB5b3Ugd291bGQgbGlrZSB0byBrbm93IG1vcmUgISAKPG86cD48L286cD48L2ZvbnQ+PC9z cGFuPjwvcD4KPHAgYWxpZ249ImxlZnQiIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW46 IDBjbSAwY20gMHB0OyB0ZXh0LWFsaWduOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuOyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LWZhbWlseTogIiBBcmlhbD0iIiBt c28tZmFyZWFzdC1mb250LWZhbWlseTo9IiIgy87M5T0iIiBtc28tZm9udC1rZXJuaW5nOj0iIiBt c28tYmlkaS1mb250LXdlaWdodDo9IiIgYm9sZD0iIj48Zm9udCBzaXplPSIzIj5CLndpc2hlczxv OnA+PC9vOnA+PC9mb250Pjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW46IDBjbSAwY20gMHB0OyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LWZhbWls eTogIiBBcmlhbD0iIiBCbGFjaz0iIiBtc28tZmFyZWFzdC1mb250LWZhbWlseTo9IiIgy87M5T0i IiBtc28tZm9udC1rZXJuaW5nOj0iIj48bzpwPjxmb250IGZhY2U9IkFyaWFsIiBzaXplPSIzIj4m bmJzcDs8L2ZvbnQ+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbjogMGNtIDBjbSAwcHQ7Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtZmFt aWx5OiAiIEFyaWFsPSIiIEJsYWNrPSIiIG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5Oj0iIiDLzszl PSIiIG1zby1mb250LWtlcm5pbmc6PSIiPjxvOnA+PGZvbnQgZmFjZT0iQXJpYWwiIHNpemU9IjMi PkVyaW48L2ZvbnQ+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbjogMGNtIDBjbSAwcHQ7Ij4mbmJzcDs8L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW46IDBjbSAwY20gMHB0OyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250 LWZhbWlseTogIiBBcmlhbD0iIiBtc28tZmFyZWFzdC1mb250LWZhbWlseTo9IiIgy87M5T0iIiBt c28tZm9udC1rZXJuaW5nOj0iIiBtc28tYmlkaS1mb250LXdlaWdodDo9IiIgYm9sZD0iIj48Zm9u dCBzaXplPSIzIj5OaW5nYm8gQ2hhbm5lbCBFbGVjdHJvbWVjaGFuaWNhbCBDby4gTHRkPG86cD48 L286cD48L2ZvbnQ+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bjogMGNtIDBjbSAwcHQ7Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtZmFtaWx5OiAi IEFyaWFsPSIiIG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5Oj0iIiDLzszlPSIiIG1zby1mb250LWtl cm5pbmc6PSIiIG1zby1iaWRpLWZvbnQtd2VpZ2h0Oj0iIiBib2xkPSIiPjxmb250IHNpemU9IjMi PlJvb20gMTUxMixNb3JnYW4gSW50ZXJuYXRpb25hbCBCdWxkaW5nIEMsPG86cD48L286cD48L2Zv bnQ+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbjogMGNtIDBj bSAwcHQ7Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImZvbnQtZmFtaWx5OiAiIEFyaWFsPSIi IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5Oj0iIiDLzszlPSIiIG1zby1mb250LWtlcm5pbmc6PSIi IG1zby1iaWRpLWZvbnQtd2VpZ2h0Oj0iIiBib2xkPSIiPjxmb250IHNpemU9IjMiPlRhaWhlIFJv YWQsQmVpbHVuLCBOaW5nYm8sIFpoZWppYW5nIAozMDAwMTIsJm5ic3A7Q2hpbmE8bzpwPjwvbzpw PjwvZm9udD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luOiAw Y20gMGNtIDBwdDsiPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1mYW1pbHk6ICIgQXJp YWw9IiIgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6PSIiIMvOzOU9IiIgbXNvLWZvbnQta2Vybmlu Zzo9IiIgbXNvLWJpZGktZm9udC13ZWlnaHQ6PSIiIGJvbGQ9IiI+PGZvbnQgc2l6ZT0iMyI+VGVs OiAwMDg2IDU3NCA4NjgwMjY4OCAmbmJzcDsgJm5ic3A7Jm5ic3A7RmF4OiAwMDg2IAo1NzQ4Njgw Mjc4ODxvOnA+PC9vOnA+PC9mb250Pjwvc3Bhbj48L3A+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl PSJmb250LWZhbWlseTogIiBBcmlhbD0iIiBtc28tZmFyZWFzdC1mb250LWZhbWlseTo9IiIgy87M 5T0iIiBtc28tZm9udC1rZXJuaW5nOj0iIiBtc28tYmlkaS1mb250LXdlaWdodDo9IiIgYm9sZD0i IiBtc28tYW5zaS1sYW5ndWFnZTo9IiIgRU4tVVM9IiIgbXNvLWZhcmVhc3QtbGFuZ3VhZ2U6PSIi IFpILUNOPSIiIG1zby1iaWRpLWxhbmd1YWdlOj0iIiBBUi1TQT0iIj48Zm9udCBzaXplPSIzIj5T a3lwZTpjaGFubmVsLW5pbmE8L2ZvbnQ+PC9zcGFuPjwvc3Bhbj48L2Rpdj48L2Rpdj4= ------=_Part_32129_1587487525.1423810209917-- From cmaiolino@redhat.com Fri Feb 13 07:14:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD2BD7F58 for ; Fri, 13 Feb 2015 07:14:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9E6148F804B for ; Fri, 13 Feb 2015 05:14:51 -0800 (PST) X-ASG-Debug-ID: 1423833289-04bdf06a5c2966e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sZ5ecKXDupHzt80S (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Feb 2015 05:14:50 -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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1DDEnuG009820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 13 Feb 2015 08:14:49 -0500 Received: from hades.maiolino.org (dhcp-1-103.brq.redhat.com [10.34.1.103]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1DDEkon031086 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Feb 2015 08:14:49 -0500 Date: Fri, 13 Feb 2015 11:14:46 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [RFC] xfs shrink feature Message-ID: <20150213131446.GC1800@hades.maiolino.org> X-ASG-Orig-Subj: [RFC] xfs shrink feature Mail-Followup-To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423833290 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi folks, I've been seeing a lot of users requesting a shrink feature for XFS, and I believe it's time to have it implemented in XFS. Is there anybody working on a shrink feature? If not, I'm going to start to work on it, if nobody have any objections. Cheers -- Carlos From cmaiolino@redhat.com Fri Feb 13 07:47:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BABAF7F5A for ; Fri, 13 Feb 2015 07:47:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A9563304059 for ; Fri, 13 Feb 2015 05:47:10 -0800 (PST) X-ASG-Debug-ID: 1423835225-04cbb01164287920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IIXBXUGw9ZyVRKM4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Feb 2015 05:47:06 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1DDl0E5005192 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 13 Feb 2015 08:47:01 -0500 Received: from hades.maiolino.org (dhcp-1-103.brq.redhat.com [10.34.1.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1DDktCa019721 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Fri, 13 Feb 2015 08:46:59 -0500 Date: Fri, 13 Feb 2015 11:46:55 -0200 From: Carlos Maiolino To: yy Cc: Dave Chinner , bfoster , Eric Sandeen , xfs Subject: Re: XFS buffer IO performance is very poor Message-ID: <20150213134655.GD1800@hades.maiolino.org> X-ASG-Orig-Subj: Re: XFS buffer IO performance is very poor Mail-Followup-To: yy , Dave Chinner , bfoster , Eric Sandeen , xfs References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423835226 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello, On Fri, Feb 13, 2015 at 10:20:44AM +0800, yy wrote: > Dave, > > Thank you very much for your explanation. > > I hit this issue when run MySQL on XFS. Direct IO is very import for > MySQL on XFS,but I can’t found any document explanation this > problem.Maybe this will cause great confusion for other MySQL users > also, so maybe this problem should be explained in XFS document. I don't think this is something that should be explained in XFS documentation, but at filesystems documentation in general. Once xfs follows the POSIX requirements, it's not a "out of standards" behavior, but otherwise, so, I agree that this should be something documented, but not exactly in XFS itself. > Best regards, > yy > 原始邮件 > 发件人: Dave Chinner > 收件人: yy > 抄送: xfs; Eric Sandeen; > bfoster > 发送时间: 2015年2月13日(周五) 05:04 > 主题: Re: XFS buffer IO performance is very poor > On Thu, Feb 12, 2015 at 02:59:52PM +0800, yy wrote: > > In functionxfs_file_aio_read, will requestXFS_IOLOCK_SHARED lock > > for both direct IO and buffered IO: > > > so write will prevent read in XFS. > > > > However, in function generic_file_aio_read for ext3, will not > > lockinode-i_mutex, so write will not prevent read in ext3. > > > > I think this maybe the reason of poor performance for XFS. I do > > not know if this is a bug, or design flaws of XFS. > > This is a bug and design flaw in ext3, and most other Linux > filesystems. Posix states that write() must execute atomically and > so no concurrent operation that reads or modifies data should should > see a partial write. The linux page cache doesn't enforce this - a > read to the same range as a write can return partially written data > on page granularity, as read/write only serialise on page locks in > the page cache. > > XFS is the only Linux filesystem that actually follows POSIX > requirements here - the shared/exclusive locking guarantees that a > buffer write completes wholly before a read is allowed to access the > data. There is a down side - you can't run concurrent buffered reads > and writes to the same file - if you need to do that then that's > what direct IO is for, and coherency between overlapping reads and > writes is then the application's problem, not the filesystem... > > Maybe at some point in the future we might address this with ranged > IO locks, but there really aren't many multithreaded programs that > hit this issue... > > Cheers, > > Dave. > -- > Dave Chinner > [1]david@fromorbit.com > > References > > 1. mailto:david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From arekm@maven.pl Fri Feb 13 09:28:45 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6DFD57F67 for ; Fri, 13 Feb 2015 09:28:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE9EFAC002 for ; Fri, 13 Feb 2015 07:28:41 -0800 (PST) X-ASG-Debug-ID: 1423841311-04cbb0116228a860001-NocioJ Received: from mail-la0-f50.google.com (mail-la0-f50.google.com [209.85.215.50]) by cuda.sgi.com with ESMTP id hJQqUu5AtVhsXWGF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 13 Feb 2015 07:28:32 -0800 (PST) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 209.85.215.50 Received: by lams18 with SMTP id s18so17010908lam.11 for ; Fri, 13 Feb 2015 07:28:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=from:to:subject:date:user-agent:references:in-reply-to:mime-version :content-type:content-transfer-encoding:message-id; bh=2kksEVHL+PlZb7i5UB4nkFhgFkKAjiKD+mBBuaO7eXI=; b=okNK7kXYFxzcvsgu6V3urdSBRHcCq6DLonuFukTjnXZmFjh9apKFEwOc5NpE/Qe2Mn BEWRTlYtB6Lrk6QR2kLmx2FO52jU9FEH1btKEcq8dM8fNX4ZxfCP2Pgci4VQa1V18SM7 ORD/QrbWskdZOR/50EOgnBCx28Asb9J+XKmd8= 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:user-agent:references :in-reply-to:mime-version:content-type:content-transfer-encoding :message-id; bh=2kksEVHL+PlZb7i5UB4nkFhgFkKAjiKD+mBBuaO7eXI=; b=T4gWuk3bona4lSzjOs7uafBgVCfhsg48X0J32p0uwIDfcUyyFQsWnDWZDG8g6Dceby KNREwDrx3Ocy82IMoMlCyYf4HJoaMG0GNUVdGIGugtABx1pTQzlJI0RXdJrdv4VCxb1g 0MzdTLaG2d5D8xmPkZEKSP1vVFZlj/QGBDBHBpHFPcmHdsQc7TAq6SrW3g7J10Bp0gBH aVzMkqzbiKi/Km87hewywPP4966u8OHYBY1WK8tL27LXyPTYaPvWaAJIH7Jjg8Nrd5q2 sl1O1ONScpi8VWqwgvsPdCB+zhTcha3E6CMK1yGvk7S0afENV5XZPMZ6SMW/QqxTs9ni ALbQ== X-Gm-Message-State: ALoCoQnyQyGqu+ZPxnqZ6NGlpozBO0cc/LIHmfYBDqfWJKRs+tEPQdWGksYA4/SynyjsGM0R0r6Y X-Received: by 10.112.129.195 with SMTP id ny3mr8921327lbb.10.1423841311025; Fri, 13 Feb 2015 07:28:31 -0800 (PST) Received: from xps.localnet (85-222-71-204.dynamic.chello.pl. [85.222.71.204]) by mx.google.com with ESMTPSA id cn5sm1418085lbd.41.2015.02.13.07.28.30 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Feb 2015 07:28:30 -0800 (PST) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: xfs@oss.sgi.com Subject: Re: [RFC] xfs shrink feature Date: Fri, 13 Feb 2015 16:28:29 +0100 X-ASG-Orig-Subj: Re: [RFC] xfs shrink feature User-Agent: KMail/1.13.7 (Linux/3.19.0; KDE/4.14.3; x86_64; ; ) References: <20150213131446.GC1800@hades.maiolino.org> In-Reply-To: <20150213131446.GC1800@hades.maiolino.org> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201502131628.29224.arekm@maven.pl> X-Barracuda-Connect: mail-la0-f50.google.com[209.85.215.50] X-Barracuda-Start-Time: 1423841312 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0613, BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15243 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.00 BSF_SC0_MV0613 BSF_SC0_MV0613 0.10 BSF_SC0_SA085 Custom Rule SA085 On Friday 13 of February 2015, Carlos Maiolino wrote: > Hi folks, >=20 > I've been seeing a lot of users requesting a shrink feature for XFS, and I > believe it's time to have it implemented in XFS. Wow, great :-) http://xfs.org/index.php/Shrinking_Support > Is there anybody working on a shrink feature? If not, I'm going to start = to > work on it, if nobody have any objections. online shrinking I hope. =20 > Cheers =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / ( maven.pl | pld-linux.org ) From psilvao@gmail.com Fri Feb 13 12:45:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 D9D8F7F69 for ; Fri, 13 Feb 2015 12:45:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5983DAC001 for ; Fri, 13 Feb 2015 10:45:00 -0800 (PST) X-ASG-Debug-ID: 1423853098-04cbb011652907d0001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id seXMiScMUPYR1FkS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 13 Feb 2015 10:44:58 -0800 (PST) X-Barracuda-Envelope-From: psilvao@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id k48so18386411wev.0 for ; Fri, 13 Feb 2015 10:44:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=bDZPtKWfOg9LzYKxIU97qTWcDF+kL5weFLPxPFBhWqg=; b=1CP/HJ4+Kn+ltdEI+kmS8u2N+tSSAZWsqrgjMe7Ba9PCbcwvIfXqYVTI0yxfv2jFWX hNlCYcNfJogoS9vReZefruEYtPKOk6rDRjpHpiryoT24K1HnW41QrCBJRZ7q5yhLNNTp uCnRhk3pntJpZHGMJwSzMmpebVmZfYi8Bv3h3Ybrs5V9yA6EN2GyLQ2SGiUTNDE+6aAW 5huGT+8Bzckz2egKwxPMt0c0xmJqI0zqSAJmKP2QgkeAphbFVmFY3EIX3geuHtPJykU3 QfNkJYE6/X8ebq9kJ4LntF+H6tp73BQf/7+J0Zv24ewJ/K+H+oKlZTxTOnusoVhoMmFV r5DA== MIME-Version: 1.0 X-Received: by 10.180.10.131 with SMTP id i3mr19367661wib.54.1423853097628; Fri, 13 Feb 2015 10:44:57 -0800 (PST) Received: by 10.194.234.10 with HTTP; Fri, 13 Feb 2015 10:44:57 -0800 (PST) Date: Fri, 13 Feb 2015 15:44:57 -0300 Message-ID: Subject: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c From: Pablo Silva X-ASG-Orig-Subj: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c2616e18b985050efca2c7 X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1423853098 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15249 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 --001a11c2616e18b985050efca2c7 Content-Type: text/plain; charset=UTF-8 Hi ! We have a server with centos 6.6, kernel version: 2.6.32-431.17.1.el6.x86_64, where we got the following message: Feb 12 19:22:15 vtl kernel: Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted 2.6.32-431.17.1.el6.x86_64 #1 Feb 12 19:22:15 vtl kernel: Call Trace: Feb 12 19:22:15 vtl kernel: [] ? xfs_error_report+0x3f/0x50 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_dialloc+0x43e/0x850 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 [xfs] Feb 12 19:22:15 vtl kernel: [] ? kmem_zone_zalloc+0x3a/0x50 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_dir_ialloc+0x74/0x2b0 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_create+0x440/0x640 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_vn_mknod+0xad/0x1c0 [xfs] Feb 12 19:22:15 vtl kernel: [] ? xfs_vn_create+0x10/0x20 [xfs] Feb 12 19:22:15 vtl kernel: [] ? vfs_create+0xe6/0x110 Feb 12 19:22:15 vtl kernel: [] ? do_filp_open+0xa8e/0xd20 Feb 12 19:22:15 vtl kernel: [] ? alloc_fd+0x92/0x160 Feb 12 19:22:15 vtl kernel: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. Caller 0xffffffffa0422980 I can't find more information for this..., perhaps a bug or other thing ..., welcome any hint for to research.. Thanks in advance! -Pablo --001a11c2616e18b985050efca2c7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi !

=C2=A0=C2=A0=C2=A0 We have a server= with centos 6.6, kernel version: 2.6.32-431.17.1.el6.x86_64, where we got = the following message:

Feb 12 19:22:15 vtl kernel:=
=20
Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted 2.6.32-431.1=
7.1.el6.x86_64 #1
Feb 12 19:22:15 vtl kernel: Call Trace:
Feb 12 19:22:15 vtl kernel: [<ffffffffa041ae5f>] ? xfs_error_report+0=
x3f/0x50 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs_ialloc+0x60/0x=
6e0 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa041ec2e>] ? xfs_dialloc+0x43e/=
0x850 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs_ialloc+0x60/0x=
6e0 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa044007a>] ? kmem_zone_zalloc+0=
x3a/0x50 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa043b814>] ? xfs_dir_ialloc+0x7=
4/0x2b0 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa043d900>] ? xfs_create+0x440/0=
x640 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa044aa5d>] ? xfs_vn_mknod+0xad/=
0x1c0 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffffa044aba0>] ? xfs_vn_create+0x10=
/0x20 [xfs]
Feb 12 19:22:15 vtl kernel: [<ffffffff81198086>] ? vfs_create+0xe6/0x=
110
Feb 12 19:22:15 vtl kernel: [<ffffffff8119bb9e>] ? do_filp_open+0xa8e=
/0xd20
Feb 12 19:22:15 vtl kernel: [<ffffffff811a7ea2>] ? alloc_fd+0x92/0x16=
0
Feb 12 19:22:15 vtl kernel: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at =
line 990 of file fs/xfs/xfs_ialloc.c.  Caller 0xffffffffa0422980

I can't find more information for this..., pe=
rhaps a bug or other thing ..., welcome any hint for to research..

<= /pre>
Thanks in advance!

-Pablo=
 
--001a11c2616e18b985050efca2c7-- From bfoster@redhat.com Fri Feb 13 14:07:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E4A6D7F6A for ; Fri, 13 Feb 2015 14:07:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D31F38F8073 for ; Fri, 13 Feb 2015 12:07:22 -0800 (PST) X-ASG-Debug-ID: 1423858041-04cbb011632926f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QIOxHVCZmdYeJ8mv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Feb 2015 12:07:21 -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 (8.14.4/8.14.4) with ESMTP id t1DK7Kuc002514 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 13 Feb 2015 15:07:21 -0500 Received: from laptop.bfoster (vpn-50-17.rdu2.redhat.com [10.10.50.17]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1DK7Hce003623 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 13 Feb 2015 15:07:19 -0500 Date: Fri, 13 Feb 2015 15:07:17 -0500 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [PATCH v4 00/18] xfs: sparse inode chunks Message-ID: <20150213200717.GA7498@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v4 00/18] xfs: sparse inode chunks References: <1423765045-15791-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423765045-15791-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1423858041 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 12, 2015 at 01:17:07PM -0500, Brian Foster wrote: > Hi all, > > Here's v4 of sparse inode support for XFS. The changes are primarily > based on Dave's review comments from v3. The highlights are a refactor > of the on-disk inobt record format and sparse inode chunk allocation and > record management code. > > The inobt record refactor introduces a union to distinguish the original > on-disk format from the new format and an associated change in behavior > where the in-core record fields can be unconditionally considered valid. > For example, higher level code can refer to the in-core ir_count field > regardless of whether the sparse inodes feature is enabled or not. This > reduces the need for helpers and sb feature check clutter throughout the > code. > > The sparse chunk allocation refactor cleans up the sparse record > management code such that record merge and inobt updates do not involve > multiple tree lookups. It also condenses the sparse record management > code into a single helper (a la xfs_inobt_insert() for full inode > chunks) that can be used for the inobt and finobt. > > Patches 1-3 are generic preparation patches that do not depend on sparse > inode bits. Patches 4-7 introduce the sb alignment field, mount feature > helpers and associated bits. Patches 8-12 introduce the inobt record > data structure update and associated bits/helpers. Patches 13-17 > implement the sparse chunk and individual inode allocation and free > mechanisms. Finally, patch 18 enables the ability to mount sparse inode > enabled filesystems. > > Thoughts, reviews, flames appreciated... > FYI, having looked a bit into pulling some of this back into userspace, I think I'm going to try and go back to using some of the native bitmap routines as done in v1 rather than using the generic bitmap stuff. The only real benefit I see is the use of bitmap_weight(), and that's just for a debug mode check. I'm not sure it's worth the divergence the whole thing creates with userspace. I'll send a new version once I have something, but I'd appreciate any feedback on the refactoring in patches 8 and 13 in the meantime... Brian > Brian > > v4: > - Rename sb_spinoalignmt to sb_spino_align. > - Clean up error/warning messages. > - Use a union to differentiate old/new xfs_inobt_rec on-disk format. > Refactor such that in-core record fields are always valid. > - Rename/move allocmap (bitmap) helper functions and provide extra > helper for endian conv. > - Refactor sparse chunk allocation record management code. > - Clean up #ifdef and label usage for DEBUG mode sparse allocs. > - Split up and moved some generic, preparatory hunks earlier in series. > v3: http://oss.sgi.com/archives/xfs/2015-02/msg00110.html > - Rebase to latest for-next (bulkstat rework, data structure shuffling, > etc.). > - Fix issparse helper logic. > - Update inode alignment model w/ spinodes enabled. All inode records > are chunk size aligned, sparse allocations cluster size aligned (both > enforced on mount). > - Reworked sparse inode record merge logic to coincide w/ new alignment > model. > - Mark feature as experimental (warn on mount). > - Include and use block allocation agbno range limit to prevent > allocation of invalid inode records. > - Add some DEBUG bits to improve sparse alloc. test coverage. > v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html > - Use a manually set feature bit instead of dynamic based on the > existence of sparse inode chunks. > - Add sb/mp fields for sparse alloc. granularity (use instead of cluster > size). > - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page > size arches. > - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. > - Use byte of pad space in inobt record for inode count field. > - Convert bitmap mgmt to use generic bitmap code. > - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. > - Add fs geometry bit for sparse inodes. > - Rebase to latest for-next (bulkstat refactor). > v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html > > Brian Foster (18): > xfs: create individual inode alloc. helper > xfs: update free inode record logic to support sparse inode records > xfs: support min/max agbno args in block allocator > xfs: add sparse inode chunk alignment superblock field > xfs: use sparse chunk alignment for min. inode allocation requirement > xfs: sparse inode chunks feature helpers and mount requirements > xfs: add fs geometry bit for sparse inode chunks > xfs: introduce inode record hole mask for sparse inode chunks > xfs: use actual inode count for sparse records in bulkstat/inumbers > xfs: pass inode count through ordered icreate log item > xfs: handle sparse inode chunks in icreate log recovery > xfs: helpers to convert holemask to/from generic bitmap > xfs: allocate sparse inode chunks on full chunk allocation failure > xfs: randomly do sparse inode allocations in DEBUG mode > xfs: filter out sparse regions from individual inode allocation > xfs: only free allocated regions of inode chunks > xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() > xfs: enable sparse inode chunks for v5 superblocks > > fs/xfs/libxfs/xfs_alloc.c | 42 ++- > fs/xfs/libxfs/xfs_alloc.h | 2 + > fs/xfs/libxfs/xfs_format.h | 50 +++- > fs/xfs/libxfs/xfs_fs.h | 1 + > fs/xfs/libxfs/xfs_ialloc.c | 533 +++++++++++++++++++++++++++++++++++---- > fs/xfs/libxfs/xfs_ialloc.h | 12 +- > fs/xfs/libxfs/xfs_ialloc_btree.c | 123 ++++++++- > fs/xfs/libxfs/xfs_ialloc_btree.h | 14 + > fs/xfs/libxfs/xfs_sb.c | 30 ++- > fs/xfs/xfs_fsops.c | 4 +- > fs/xfs/xfs_inode.c | 28 +- > fs/xfs/xfs_itable.c | 13 +- > fs/xfs/xfs_log_recover.c | 26 +- > fs/xfs/xfs_mount.c | 16 ++ > fs/xfs/xfs_mount.h | 2 + > fs/xfs/xfs_trace.h | 47 ++++ > 16 files changed, 857 insertions(+), 86 deletions(-) > > -- > 1.8.3.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri Feb 13 16:35:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4CD477F6C for ; Fri, 13 Feb 2015 16:35:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B954304032 for ; Fri, 13 Feb 2015 14:35:16 -0800 (PST) X-ASG-Debug-ID: 1423866910-04cb6c6b0b2cb140001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 40YBWewMF172Se8a for ; Fri, 13 Feb 2015 14:35:10 -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: AkQLAPN63lR5LCM5PGdsb2JhbABWBYMGUlqMMKMgDAEBAQEBAQaSS4VrBAICgRFEAQEBAQEBBQEBAQE4O4QMAQEBAwE6HCgLCAMYCSUPBSUDBy2IJQcO1TAYhWyFCIJggUxIhCoFkwqFXpMGhCQqMQGCQgEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Feb 2015 09:05:08 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YMOpH-0006rP-L5 for xfs@oss.sgi.com; Sat, 14 Feb 2015 09:35:07 +1100 Date: Sat, 14 Feb 2015 09:35:07 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [RFC] xfs shrink feature Message-ID: <20150213223507.GV4251@dastard> X-ASG-Orig-Subj: Re: [RFC] xfs shrink feature References: <20150213131446.GC1800@hades.maiolino.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150213131446.GC1800@hades.maiolino.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: 1423866910 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 13, 2015 at 11:14:46AM -0200, Carlos Maiolino wrote: > Hi folks, > > I've been seeing a lot of users requesting a shrink feature for XFS, and I > believe it's time to have it implemented in XFS. I'm not so sure about that. > Is there anybody working on a shrink feature? If not, I'm going to > start to work on it, if nobody have any objections. I currently in design discussions with various other developers about a line of development that will make growing and shrinking XFS redundant operations. i.e. if we get this right, we'll never need to deal with capacity changes of XFS filesystems at the XFS level again. both grow and shrink will be instanteneous, and not require any modification to the layout of the filesystem at all. Mind you, that's not the reason for that line of development - it's all about integrated snapshots in XFS. We essentially get grow/shrink for free with that infrastructure.... I'm not quite ready to publish the docco yet - need to get all my ducks in a line first - but if it does work out as a feasible line of development, then the old "shrink" method is essentially a dead end. However, don't let that stop you working towards shrink, because there is infrastructure that it requires that we need for other things as well. Take you pick: - parent pointers - AG state control - ranged bulkstat call (e.g. AG range) - allocation location control from userspace (which may tie in to AG state control) - Atomic inode location swaps Parent pointers are needed to locate the owners of the inodes in AGs that need to be moved efficiently. i.e. bulkstat the inodes, use parent lookup to return parent or entire path to inode. It's also needed for more efficient and robust metadata checking and online repair of broken directory structures. AG state control is needed to tell the filesystem not to allocate in specific AGs, and then to take them completely off line prior to a shrink operation starting. It is also needed for online repair of AGs and other applications that need to manipulate the contents of an AG without interference from the rest of the filesystem. Efficient shrink also relies on reverse block mapping being available. I'm working on that right now for multiple reasons, none of which are for shrinking the filesystem. ;) I'd recommend that you work on the infrastructure problems one at a time, rather than "shrink" because the infrastructure has multiple uses and we need that infrastructure for various reasons much more urgently than we do shrink. However, once the infrastructure is in place, shrink should just be a case of tying it all together with a userspace utility. That is, of course, if we still need it. If you want something simple to start with then the ranged bulkstat calls and AG state control are the place to start. However, I'd recommend you start with finishing off the parent pointer infrastructure because that's more important in the longer term. We had converged to the point where we had a design that solved all known problems, but it wasn't ever implemented. That's where we need to pick it up from. Design for EAs in here: http://oss.sgi.com/archives/xfs/2014-01/msg00263.html But it's worth reading the entire discussion starting here because it start with a summary of the different approaches taken and why they were rejected: http://oss.sgi.com/archives/xfs/2014-01/msg00224.html Cheers, Dave. -- Dave Chinner david@fromorbit.com From aneurer@paulbunyan.net Fri Feb 13 16:57:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D704B7F6F for ; Fri, 13 Feb 2015 16:57:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C386B304039 for ; Fri, 13 Feb 2015 14:57:44 -0800 (PST) X-ASG-Debug-ID: 1423868263-04cb6c6b0b2cb910001-NocioJ Received: from smtpauth.paulbunyan.net (smtpauth.paulbunyan.net [209.191.199.150]) by cuda.sgi.com with ESMTP id lqjHCV3VgFX7HGCm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Feb 2015 14:57:43 -0800 (PST) X-Barracuda-Envelope-From: aneurer@paulbunyan.net X-Barracuda-Apparent-Source-IP: 209.191.199.150 Received: from server08.uab.edu (unknown [190.193.84.212]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: aneurer@paulbunyan.net) by smtpauth.paulbunyan.net (Postfix) with ESMTP id 1FFA11B29045 for ; Fri, 13 Feb 2015 16:57:42 -0600 (CST) Content-Type: multipart/mixed; boundary="===============1960675907==" MIME-Version: 1.0 Subject: Affiliate To: xfs@oss.sgi.com X-ASG-Orig-Subj: Affiliate From: "SK" Date: Fri, 13 Feb 2015 19:53:31 -0300 Reply-To: skwan50@sina.cn Message-Id: <20150213225743.1FFA11B29045@smtpauth.paulbunyan.net> X-Barracuda-Connect: smtpauth.paulbunyan.net[209.191.199.150] X-Barracuda-Start-Time: 1423868263 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- You will not see this in a MIME-aware mail reader. --===============1960675907== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Your aid is needed to consummate a venture in Asia. Find details herewith --===============1960675907== Content-Type: application/pdf MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Proposition.pdf" JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFIKL0xh bmcgKOMQxiYeKQovU3RydWN0VHJlZVJvb3QgMTcgMCBSCi9NYXJrSW5mbyA8PAovTWFya2VkIHRy dWUKPj4KPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAyCi9LaWRzIFsg MyAwIFIgMTEgMCBSIF0KPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAy IDAgUgovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA1IDAgUgo+PgovUHJvY1NldCBbIC9QREYg L1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUkgXQo+PgovQW5ub3RzIFsgNyAwIFIgOCAwIFIg OSAwIFIgMTAgMCBSIF0KL01lZGlhQm94IFsgMCAwIDU5NS4zMiA4NDEuOTIgXQovQ29udGVudHMg NCAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAovUyAvVHJhbnNwYXJlbmN5Ci9DUyAvRGV2aWNl UkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJlbnRzIDAKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0Zp bHRlciAvRmxhdGVEZWNvZGUKL0xlbmd0aCAyODMyCj4+CnN0cmVhbQqZ9K0mB93O/3cm87nBj6Aq hkaAwfUBE+vbBVQJoNa93gNtUjxwscw2+45kP5QT3W/Y5hIKyXh+S77P7Fleuky8AOOEOMPChavn Y89hx2jLUJ1BO39cHAlO64PdAjpjsytCqDLweWpogjJbO4xxhu565htDwcEnBBEhTeyLViSM6nGs i9MTvnyEYqX7mlt36juz3v3VA76g1nYh4UqL+Cx7/cIrRXNEWa6U0Egy81ZCOdRanL9Cr7tHCqkz Hkw+v7uf9FhVC4Oc4131T7iF2TzXqDmS8chgzIQ6NYorFAudJ3eCj5ZO/vRpT+Ts1H5Lf4uUEUbr 18xm8tPlcwK9pcY+2/2cb7KBWChTEvP8yPmMXwD2y8efXD6MiB0ANqf7HrT+/iOOWKYJiiJud7UM dEhI0r5NWqybdmKo4tpiO349gcDDxK9yLhNft6QA03F3WVvzJFmGL1FqjqxL3hrR2JFiysVQAmW0 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 FphCQWvJ7bKE48VZ6c9bbJSHm9+Tg6fXo+U+xOgo/RVZtU8GVIky+Vy9vRvB7xqk+0ld80+K8Av2 DRZkaq7AsCW5+ZfJ2sPH39twJPanugwYmXuPzH81yBVzE9FTSpVx8LyAZO+kBy2v+SjhtwRX51i5 Qgp/+GF0N+PKA8HKm3Wt683CtDXnLtLr86g8rjnl+d2kKEzucAzwu6A1bo/tY7cmJt1hpwkBUXLy EFvNgPgVZBOUJnIXGs1GsZ1NnZFuwK7UOBxeYKwBzmY56D0ZiKGNXTd6eVXYu+i2sX9J6sS/MBGz JSFG06XpHKxVpaeIbdfqIiQT/yh0YXAbI/K300YOvn3MYuAmjRULl+skcf2QAArhS7uIOTj7H+7L J2rxzzKk3PQ1qellWDwKmxxObiK8Sx+5A7SX2+St5/bAF3SJWC/uJOnhiXrhw60blWig8Udk9m+R BWGhkHDhcio5oFn8dAg5cx//iKu3j1nqNgYjakPTGBzfT5YrkxOlwc1QxjbwhEPH0fmtWryS2jtS 3jXwY2nCDq72IPc1p2zwAYoZyFE6tK1fLOciqD75IihK6gmmfANayESwM4zQLisEWg5WCt8GJpGZ ABYivQLXYRkVOLPIgNd76KO28F4vdj5oCw5NqAG7JA9ETMgkkh2SPUS7HeBmVbfZvIFgCg7Ot364 IhNeuKul6posBOCHKEGXnb1oR2olkhLZtsotyiMpUQ5zeBIkMRT9Of5TY0SJXWiFMG0EkR4VUERN oMua//pPfc84SxVqXIOmIUu5mUiL+DxR5DbR6QXfBNk/jRgDcAfvFmIXxPOXSoMC+hVdUOeJZL4U hsbkBRo/qE99bZYHC5jLEHf6DTZpqs8KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8Ci9UeXBl IC9Gb250Ci9TdWJ0eXBlIC9UcnVlVHlwZQovTmFtZSAvRjEKL0Jhc2VGb250IC9UaW1lcyMyME5l dyMyMFJvbWFuCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9Gb250RGVzY3JpcHRvciA2IDAg UgovRmlyc3RDaGFyIDMyCi9MYXN0Q2hhciAxMjIKL1dpZHRocyA2MCAwIFIKPj4KZW5kb2JqCjYg MCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Gb250TmFtZSAvVGltZXMjMjBOZXcjMjBS b21hbgovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA4OTEKL0Rlc2NlbnQgLTIxNgov Q2FwSGVpZ2h0IDY5MwovQXZnV2lkdGggNDAxCi9NYXhXaWR0aCAyNjE0Ci9Gb250V2VpZ2h0IDQw MAovWEhlaWdodCAyNTAKL0xlYWRpbmcgNDIKL1N0ZW1WIDQwCi9Gb250QkJveCBbIC01NjggLTIx NiAyMDQ2IDY5MyBdCj4+CmVuZG9iago3IDAgb2JqCjw8Ci9TdWJ0eXBlIC9MaW5rCi9SZWN0IFsg NjkuNzUgMjg3LjM0IDQ2Ny41IDMxMy4yIF0KL0JTIDw8Ci9XIDAKPj4KL0YgNAovQSA8PAovVHlw ZSAvQWN0aW9uCi9TIC9VUkkKL1VSSSAosvpWPmum5IUR8dG+9bYqYbhsY5gVv4jeZ5xSQL6reCId iktmXCkDjkekydv/mnBfghAwjCbQFcnBzgNwPpmDGpfCFuTRePIpCj4+Ci9TdHJ1Y3RQYXJlbnQg MQo+PgplbmRvYmoKOCAwIG9iago8PAovU3VidHlwZSAvTGluawovUmVjdCBbIDY5Ljc1IDI3MS40 NyA1MjUuNTUgMjg3LjM0IF0KL0JTIDw8Ci9XIDAKPj4KL0YgNAovQSA8PAovVHlwZSAvQWN0aW9u Ci9TIC9VUkkKL1VSSSAoNUxTI5zS1sPgBcPIqcTHMwWqVJiO8bm+ZDCBoZgsefqTNXzsk0tFc9fD GvUTyeReslxmOy7hs1ximzEQGfqixee+M74j+2BGw8zqPaVxsZu3i1BBoYhsbSFcKXbC09fjAzB7 ykJ5PikKPj4KL1N0cnVjdFBhcmVudCAyCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9TdWJ0eXBlIC9M aW5rCi9SZWN0IFsgNjkuNzUgMjQ1LjYgMTcxLjI1IDI3MS40NyBdCi9CUyA8PAovVyAwCj4+Ci9G IDQKL0EgPDwKL1R5cGUgL0FjdGlvbgovUyAvVVJJCi9VUkkgKI63Ej0Dd9RtUgXjVxbvPkwbd7n2 FL57rEqFay28YYw+jpgsNa0/St5U9fpdgH6w07c1prC+yWyMXqrfXFxVpEZpKlkz1QNMVNkyWJuV XHJnZ9qrZMiDPSww9nRVOdUUK3YHYi2O+SkKPj4KL1N0cnVjdFBhcmVudCAzCj4+CmVuZG9iagox MCAwIG9iago8PAovU3VidHlwZSAvTGluawovUmVjdCBbIDY5Ljc1IDIxOS43MyA0MjIuMTkgMjQ1 LjYgXQovQlMgPDwKL1cgMAo+PgovRiA0Ci9BIDw8Ci9UeXBlIC9BY3Rpb24KL1MgL1VSSQovVVJJ ICjySfGEHLr/Kh+xwtyhliurcf/Jn/IlXGIYXCjz4JT+/SezXFyjHzU+hp0A42I9OCY8D11F9ZIS 9Mvr3EGIvh3rWEOiYg/MhDWeMykKPj4KL1N0cnVjdFBhcmVudCA0Cj4+CmVuZG9iagoxMSAwIG9i ago8PAovVHlwZSAvUGFnZQovUGFyZW50IDIgMCBSCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0Yy IDEzIDAgUgovRjEgNSAwIFIKPj4KL0V4dEdTdGF0ZSA8PAovR1MxNSAxNSAwIFIKPj4KL1Byb2NT ZXQgWyAvUERGIC9UZXh0IC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0KPj4KL01lZGlhQm94IFsg MCAwIDU5NS4zMiA4NDEuOTIgXQovQ29udGVudHMgMTIgMCBSCi9Hcm91cCA8PAovVHlwZSAvR3Jv dXAKL1MgL1RyYW5zcGFyZW5jeQovQ1MgL0RldmljZVJHQgo+PgovVGFicyAvUwovU3RydWN0UGFy ZW50cyA1Cj4+CmVuZG9iagoxMiAwIG9iago8PAovRmlsdGVyIC9GbGF0ZURlY29kZQovTGVuZ3Ro IDE2MzYKPj4Kc3RyZWFtCgX1506BI1UYQzh09dxEiy8qjcirdO3+r51x1cTf/2MTwUjO93deZT59 X3RynSnNrn4a0IOs0GO3TPgz1dJxaRIe9a7nsH5SvtDQpmSdOPgK8A9fuKzTSjRzUYyhw0bs8VKp Mr2qhc37jeXw64cFHmf4vEEpOq5U6ixno5bx1DoV3FtJKmYqBrvPzVJyrJn+WNKdx1FhOJ8Vbz+p v4tal8RflHeCI9H6ZTUE7bsbb4vJmLHpuRu07MVaXt3WERS7ME5O10fXKP03QLYBDabRarnWYdGf NZLcLJi5LO0EEOMh786YmLDPsFpm2+KhL7FPneXU4QuDRUdlAgGXhhTM9pzPZ0za9YdABw63ijB/ EZaNZhguMgjlHVjoVB4joHk7otaoa8cXEz2Faz6mEUEmnMuXpWtJULwam1lYMBYuiIQeBOl5RXjM Lqcru8uZc4MH6SjN2z6ZhJRDC9W0lBzpTwiFL/Q9LqXjcyAnvg0TXGVwU1LQprquaIwH2fZ2zBQ2 MtBTULIkDXBBekF0G1Y3dog5NGVE7O+0biDkIX0whQrLD0mKano/ppVkmmyyr3QD4fa5VI73kYMo LaFoRrCI2UqERrQ70vIqGfaVXfTtWNZ+NzKPaGJkbx1ra+usfpYFDOViRWm8dlZ6md/0vtMo7Jnz PqpLoaV9/TwMdaRCxGB5QmCBFMBgGc8VbR870a4/5WLlra8FzhiGTTh5p6Xq6RjFhUJYxK2H/lQv qlYjN6LxqnFp3ZGTsicXJA6Fhoow7O9xY4JMRCh1de6AVfau54YRfsgR6jhxUcK9a7+s+uE9VFfc nAOUaMApyWku7+Tpv8461GZ/lx9E7HP7ZNT/+t4kchAKGvn9qeV4ybVeRBsb0SPwEgl1WnO1k4hG pOlXzQH95NIkGSslSInDlko9r/oGCTs6TKtoepODMUmUfpKKTvFzr4kYG2SUpehTNZ3PV0OxjzHL VsZ3wzFKM8c4cMeOWmvtJZpUw+RwvShA8zY66MUBro+r/PI4vFypLjVSeoGPYqWYExUJLav3qxvl I5BtujHkMLjZJB9sr5sJ5kbaBHhc84rK2UXTTtIML3H6YtKuXCzms4RVIe/P9GsdLqY9jkYS8dNE +Y45ZJi9A0dT0dDupk4hgWVg7G2hfB0k4aRu1r84gdPJ1EcY+RkAT/97gk3u+OYRnhMdjxR+dfVl ogQ0gJ/aZNnubXb8gMLHrLvwdP4j0dQ7AO/IummjKmQJ66PtzlspGYIQc0f8Dp7fF2BDUCTCEwba p6+RSqSrynpBg0IjNR5xTiyINpDfWaschwstuXlVVTigaekzL8aSAzbnc7S3N7cNGslUIiLX+cs+ rZyTPST1z/E/t1p5jrxjMXdyLUfD0ciw5yPLj/HtJ2cWgQWJxQuQf5lTV3Z83xwWjDmHsWZPoy99 8Dd2morqpXfs9DxY0ud0iWYGmXNvMZc+Ci6YlzcDYpUD4FRANRepquw3JC7PNJGCT7lam1L6y8SC nnL2N9Nh7u4TxVaPqb0RFLagB/BOfS1Z9dTNlvXMB+erOXYTcN/9c/YTfFGbqOSnSFI4LRU0zolq l9jiRXJy+C7NA8VnvTjyQYvhmSQAY68Cl9itahSgXq39ejjxqBGJaO/MAZtCxIuWcHixuR88+vsL uW/payXjz2m1uFQJCs7gbbk7U/JNed3MA7yGXh/P6WLkTq5oGCI7BQ9+ojvTa5CElH57jSgh+fKi lwXcR3bTFD8kPDhD8mtnHZvxM47gb0CibbfHR3c1PcOuZbdAv4kkURGVxirCXKWAjUer6f3pj6Dd aREi2j1ZoKPAdGsr8skOFuTQiBF+4hHJIcMoO90yNO/H09InySU2/Ko6Bgf+CemT4GIdI1KaXpr/ 6UtVF+sXQHf/59XCa80SyKJnW+jOKsb+lTqqANesrpJPwCMpl47loKsDYpQe+QFHJNfUDwINpfEu xPSlLeEXRKVrMsdvkbZ1JqRmgv19ITiUyBScwVIxp2EkP6PdSzwRl8bsBjoSg9E8c6nDdSespf7l DitJT9Qkd5pQzi2sE60XzUveu0uVuYRdCK2ZBjZymBNcLX9hFB4tI3os4J/DIhX73W39eTL3/HR5 HGFpVLJwO3qVimE0WbjfyPrx9UwARP4g7rNFO2KE2NbbRNvSOCaFj+HjMkBJxBsINbxahPolrPcK ZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5 cGUKL05hbWUgL0YyCi9CYXNlRm9udCAvVGltZXMjMjBOZXcjMjBSb21hbixCb2xkCi9FbmNvZGlu ZyAvV2luQW5zaUVuY29kaW5nCi9Gb250RGVzY3JpcHRvciAxNCAwIFIKL0ZpcnN0Q2hhciAzMgov TGFzdENoYXIgODcKL1dpZHRocyA2MSAwIFIKPj4KZW5kb2JqCjE0IDAgb2JqCjw8Ci9UeXBlIC9G b250RGVzY3JpcHRvcgovRm9udE5hbWUgL1RpbWVzIzIwTmV3IzIwUm9tYW4sQm9sZAovRmxhZ3Mg MzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA4OTEKL0Rlc2NlbnQgLTIxNgovQ2FwSGVpZ2h0IDY3 NwovQXZnV2lkdGggNDI3Ci9NYXhXaWR0aCAyNTU4Ci9Gb250V2VpZ2h0IDcwMAovWEhlaWdodCAy NTAKL0xlYWRpbmcgNDIKL1N0ZW1WIDQyCi9Gb250QkJveCBbIC01NTggLTIxNiAyMDAwIDY3NyBd Cj4+CmVuZG9iagoxNSAwIG9iago8PAovVHlwZSAvRXh0R1N0YXRlCi9CTSAvTm9ybWFsCi9jYSAx Cj4+CmVuZG9iagoxNiAwIG9iago8PAovQXV0aG9yICiupWcXSf+OKQovQ3JlYXRvciAoFB8rFmnG zRTYqQZZ1I5YXvv+66FQB2/8QES6E4cZTb3V4WvwUC8uXHLFaSkKL0NyZWF0aW9uRGF0ZSAortoZ a1ia/Ubo7TcE5cttAdCo2vJgmUgpCi9Nb2REYXRlICiu2hlrWJr9RujtNwTly20B0Kja8mCZSCkK L1Byb2R1Y2VyICgUHysWacbNFNipBlnUjlhe+/7roVAHb/xARLoThxlNvdXha/BQLy5ccsVpKQo+ PgplbmRvYmoKMTcgMCBvYmoKPDwKL1R5cGUgL1N0cnVjdFRyZWVSb290Ci9Sb2xlTWFwIDE4IDAg UgovUGFyZW50VHJlZSAxOSAwIFIKL0sgWyAyMCAwIFIgXQovUGFyZW50VHJlZU5leHRLZXkgNgo+ PgplbmRvYmoKMTggMCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRub3RlIC9Ob3RlCi9UZXh0 Ym94IC9TZWN0Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5saW5lU2hhcGUgL1NlY3QK L0Fubm90YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9vayAvRG9jdW1lbnQKL1dv cmtzaGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVldCAvUGFydAovRGlhbG9n c2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlhZ3JhbSAvRmlndXJlCj4+ CmVuZG9iagoxOSAwIG9iago8PAovTnVtcyBbIDAgMjIgMCBSIDEgMzAgMCBSIDIgMzUgMCBSIDMg MzUgMCBSIDQgNDEgMCBSIDUgNTAgMCBSIF0KPj4KZW5kb2JqCjIwIDAgb2JqCjw8Ci9QIDE3IDAg UgovUyAvUGFydAovVHlwZSAvU3RydWN0RWxlbQovSyBbIDIxIDAgUiAyNCAwIFIgMjUgMCBSIDI2 IDAgUiAyNyAwIFIgMjggMCBSIDI5IDAgUiAzNCAwIFIgNDAgMCBSIDQ1IDAgUiA0NiAwIFIgNDcg MCBSIAo0OCAwIFIgNDkgMCBSIDUxIDAgUiA1MiAwIFIgNTMgMCBSIDU0IDAgUiA1NSAwIFIgNTYg MCBSIDU3IDAgUiA1OCAwIFIgNTkgMCBSIF0KPj4KZW5kb2JqCjIxIDAgb2JqCjw8Ci9QIDIwIDAg UgovUyAvUAovVHlwZSAvU3RydWN0RWxlbQovSyBbIDAgXQovUGcgMyAwIFIKPj4KZW5kb2JqCjIy IDAgb2JqClsgMjEgMCBSIDI0IDAgUiAyNSAwIFIgMjYgMCBSIDI3IDAgUiAyOCAwIFIgMzIgMCBS IDMzIDAgUiAzOCAwIFIgMzkgMCBSIDQzIDAgUiA0NCAwIFIgCjQ1IDAgUiA0NiAwIFIgNDcgMCBS IDQ4IDAgUiBdCmVuZG9iagoyMyAwIG9iago8PAovVHlwZSAvT2JqU3RtCi9OIDQyCi9GaXJzdCAz MTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKL0xlbmd0aCA3NDkKPj4Kc3RyZWFtCm9Tq5tp2OCyjJks 9Zer8nI1r5pfJfi6HXMGV4lr+CJIVOA+vtR1E7vUaz/CrBOD3bTnpiRzJVob7TuRgxeATnL/eIs5 sxX338yJk9anurGHT86dpWCAUqqX/MMvzuXOqmkdhIvWwqNCVFFPqV6nXiQII2pJ3HyJPofhYWG4 cV0CA4uv5H7hWLeXiFdaUk7Mdcu9w1Pd+OvrMv9tz5+h/UgcNecvNZCeBLFVqGSYDVMuGtsk8K4g 1zRD73/htbtAaNnMISrRvALr9urnPCwjaR/H5fsEWnkD3AD8NqAl2ocNm+0foHWAl9ovoK95vRvw IOnoLiCh8EDcNl/95D+GP0/Q/rdqB/EuWya2mHbUHiFw9hxuXZKqKwPNfnB42KlyNvp8Sokghyxn Ax+Pr7EFkYJ+CbTbzg09jjnz0yPJWBiLt1iOioTByrb/PKMQHsFkgvvhSb8SqfZXcmpRXFLnwOfS u69PZPyrMpccZnqU5r2pQngGo0QomVKYihqVu1wepNjEvS6myJMsRnyh5XfQl6WO5ILG9ptxRwHc lK6VzEWr6UdR8g5pctZrqib5rwL4GMEj8GbEs3OKl6PfPyWipgumnT3epSesUHRTvvVF6tBzUDIM jd2p8IgPETRfVaTl9/3nftRlMIoOcISPRWP6ub0V10+wfRT6F4AZ8L43CqLyWlr05/1AO2OCUMkC WmxZBcTMDJzlkUO22Vem6gZSJ7ttp02jPsOyGeBo8EBifrA6HTvWmkpLdzw79has/kQPt+vvvSxC 5B1gCp7R+qgLX07tCILRAx2vCjxbwyUQCiWkcnEoPE5p7HIiNgEvqwzqR9e71JpdyvZuGuOKI84I 3SiY/3l23nCXTuLvhbeAyAlTWAPaqTG0zejs6X6bKr8aRo5hvNjy0QF3ulrfEChNPfkT65l7Qu5W 1km+DNFsNdJf3qvekVBfHS5wl8O8lqXLlR+4CxAVqX8WSCLLiHWb7RPJOD2r4R088TZttoVpCmVu ZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RF bGVtCi9LIFsgMSBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMjUgMCBvYmoKPDwKL1AgMjAgMCBSCi9T IC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgMiBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMjYgMCBv YmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgMyBdCi9QZyAzIDAg Ugo+PgplbmRvYmoKMjcgMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVt Ci9LIFsgNCBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMjggMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9Q Ci9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgNSBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMjkgMCBvYmoK PDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgMzAgMCBSIDMzIDAgUiBd Ci9QZyAzIDAgUgo+PgplbmRvYmoKMzAgMCBvYmoKPDwKL1AgMjkgMCBSCi9TIC9MaW5rCi9UeXBl IC9TdHJ1Y3RFbGVtCi9LIFsgMzEgMCBSIDMyIDAgUiBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMzEg MCBvYmoKPDwKL1R5cGUgL09CSlIKL09iaiA3IDAgUgovUGcgMyAwIFIKPj4KZW5kb2JqCjMyIDAg b2JqCjw8Ci9QIDMwIDAgUgovUyAvU3BhbgovVHlwZSAvU3RydWN0RWxlbQovUGcgMyAwIFIKL0sg Ngo+PgplbmRvYmoKMzMgMCBvYmoKPDwKL1AgMjkgMCBSCi9TIC9TcGFuCi9UeXBlIC9TdHJ1Y3RF bGVtCi9QZyAzIDAgUgovSyA3Cj4+CmVuZG9iagozNCAwIG9iago8PAovUCAyMCAwIFIKL1MgL1AK L1R5cGUgL1N0cnVjdEVsZW0KL0sgWyAzNSAwIFIgMzkgMCBSIF0KL1BnIDMgMCBSCj4+CmVuZG9i agozNSAwIG9iago8PAovUCAzNCAwIFIKL1MgL0xpbmsKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyAz NiAwIFIgMzcgMCBSIDM4IDAgUiBdCi9QZyAzIDAgUgo+PgplbmRvYmoKMzYgMCBvYmoKPDwKL1R5 cGUgL09CSlIKL09iaiA4IDAgUgovUGcgMyAwIFIKPj4KZW5kb2JqCjM3IDAgb2JqCjw8Ci9UeXBl IC9PQkpSCi9PYmogOSAwIFIKL1BnIDMgMCBSCj4+CmVuZG9iagozOCAwIG9iago8PAovUCAzNSAw IFIKL1MgL1NwYW4KL1R5cGUgL1N0cnVjdEVsZW0KL1BnIDMgMCBSCi9LIDgKPj4KZW5kb2JqCjM5 IDAgb2JqCjw8Ci9QIDM0IDAgUgovUyAvU3BhbgovVHlwZSAvU3RydWN0RWxlbQovUGcgMyAwIFIK L0sgOQo+PgplbmRvYmoKNDAgMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RF bGVtCi9LIFsgNDEgMCBSIDQ0IDAgUiBdCi9QZyAzIDAgUgo+PgplbmRvYmoKNDEgMCBvYmoKPDwK L1AgNDAgMCBSCi9TIC9MaW5rCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgNDIgMCBSIDQzIDAgUiBd Ci9QZyAzIDAgUgo+PgplbmRvYmoKNDIgMCBvYmoKPDwKL1R5cGUgL09CSlIKL09iaiAxMCAwIFIK L1BnIDMgMCBSCj4+CmVuZG9iago0MyAwIG9iago8PAovUCA0MSAwIFIKL1MgL1NwYW4KL1R5cGUg L1N0cnVjdEVsZW0KL1BnIDMgMCBSCi9LIDEwCj4+CmVuZG9iago0NCAwIG9iago8PAovUCA0MCAw IFIKL1MgL1NwYW4KL1R5cGUgL1N0cnVjdEVsZW0KL1BnIDMgMCBSCi9LIDExCj4+CmVuZG9iago0 NSAwIG9iago8PAovUCAyMCAwIFIKL1MgL1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyAxMiBdCi9Q ZyAzIDAgUgo+PgplbmRvYmoKNDYgMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1 Y3RFbGVtCi9LIFsgMTMgXQovUGcgMyAwIFIKPj4KZW5kb2JqCjQ3IDAgb2JqCjw8Ci9QIDIwIDAg UgovUyAvUAovVHlwZSAvU3RydWN0RWxlbQovSyBbIDE0IF0KL1BnIDMgMCBSCj4+CmVuZG9iago0 OCAwIG9iago8PAovUCAyMCAwIFIKL1MgL1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyAxNSBdCi9Q ZyAzIDAgUgo+PgplbmRvYmoKNDkgMCBvYmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1 Y3RFbGVtCi9LIFsgMCBdCi9QZyAxMSAwIFIKPj4KZW5kb2JqCjUwIDAgb2JqClsgNDkgMCBSIDUx IDAgUiA1MiAwIFIgNTMgMCBSIDU0IDAgUiA1NSAwIFIgNTYgMCBSIDU3IDAgUiA1OCAwIFIgNTkg MCBSIF0KZW5kb2JqCjUxIDAgb2JqCjw8Ci9QIDIwIDAgUgovUyAvUAovVHlwZSAvU3RydWN0RWxl bQovSyBbIDEgXQovUGcgMTEgMCBSCj4+CmVuZG9iago1MiAwIG9iago8PAovUCAyMCAwIFIKL1Mg L1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyAyIF0KL1BnIDExIDAgUgo+PgplbmRvYmoKNTMgMCBv YmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgMyBdCi9QZyAxMSAw IFIKPj4KZW5kb2JqCjU0IDAgb2JqCjw8Ci9QIDIwIDAgUgovUyAvUAovVHlwZSAvU3RydWN0RWxl bQovSyBbIDQgXQovUGcgMTEgMCBSCj4+CmVuZG9iago1NSAwIG9iago8PAovUCAyMCAwIFIKL1Mg L1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyA1IF0KL1BnIDExIDAgUgo+PgplbmRvYmoKNTYgMCBv YmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgNiBdCi9QZyAxMSAw IFIKPj4KZW5kb2JqCjU3IDAgb2JqCjw8Ci9QIDIwIDAgUgovUyAvUAovVHlwZSAvU3RydWN0RWxl bQovSyBbIDcgXQovUGcgMTEgMCBSCj4+CmVuZG9iago1OCAwIG9iago8PAovUCAyMCAwIFIKL1Mg L1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWyA4IF0KL1BnIDExIDAgUgo+PgplbmRvYmoKNTkgMCBv YmoKPDwKL1AgMjAgMCBSCi9TIC9QCi9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsgOSBdCi9QZyAxMSAw IFIKPj4KZW5kb2JqCjYwIDAgb2JqClsgMjUwIDAgMCA1MDAgNTAwIDgzMyA3NzggMCAzMzMgMzMz IDAgMCAyNTAgMzMzIDI1MCAyNzggNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIAo1MDAgNTAw IDUwMCAyNzggMCAwIDAgMCAwIDAgNzIyIDY2NyA2NjcgNzIyIDYxMSA1NTYgNzIyIDcyMiAzMzMg MCA3MjIgMCA4ODkgNzIyIDcyMiAKNTU2IDAgNjY3IDU1NiA2MTEgNzIyIDAgOTQ0IDAgNzIyIDAg MCAwIDAgMCA1MDAgMCA0NDQgNTAwIDQ0NCA1MDAgNDQ0IDMzMyA1MDAgNTAwIAoyNzggMjc4IDUw MCAyNzggNzc4IDUwMCA1MDAgNTAwIDUwMCAzMzMgMzg5IDI3OCA1MDAgNTAwIDcyMiA1MDAgNTAw IDQ0NCBdCmVuZG9iago2MSAwIG9iagpbIDI1MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1MDAgMCA3MjIgNjY3IDAgCjcyMiA2Njcg MCAwIDc3OCAzODkgMCAwIDAgMCA3MjIgNzc4IDAgMCAwIDU1NiA2NjcgMCAwIDEwMDAgXQplbmRv YmoKNjIgMCBvYmoKPDwKL1R5cGUgL1hSZWYKL1NpemUgNjIKL1cgWyAxIDQgMiBdCi9Sb290IDEg MCBSCi9JbmZvIDE2IDAgUgovSUQgWyA8N0E5MTU1OTBFODM4RUM0QzgwRTU0ODY3MEVEQ0Y0OEE+ IDw3QTkxNTU5MEU4MzhFQzRDODBFNTQ4NjcwRURDRjQ4QT4gXQovRmlsdGVyIC9GbGF0ZURlY29k ZQovTGVuZ3RoIDE3MQo+PgpzdHJlYW0KeJw10MsRwXAQx/GN9yuJCCIP4hkUoAgdaEMBCjCjADeN uHB1VIMGNBB/+2UP+5md2Z2d+YmYynPLdE/kywGuivVQ7AyeinNT3KPS3iveTunMFH+jhC8lOivx Ce4iBfMhkAVksIQ5/FZW5iC5/CcLClCEEpShATWoQBXq0AYHmtACG1zogQ8edKALfQhgACFEsIYY EhjCCFIYwwSmMDMRpG+NbrIV+QDQvRTqCmVuZHN0cmVhbQplbmRvYmoKNjMgMCBvYmoKPDwKL0Zp bHRlciAvU3RhbmRhcmQKL1YgMgovUiAzCi9MZW5ndGggMTI4Ci9PIDwwOTJGOUZDREI3QkRGRjBF MjEwQ0FDQkY4OTFEMTI0RTRGQkQ4OTI0QTE3NzA1NUEzQTMxQjYyQTBFNTU3RDZDPgovVSA8ODlF RUVFODBBMUE4RTk3Mzk2OUE4NzIyMDkzMzY0OTYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMD4KL1AgNjE2MzIKPj4KZW5kb2JqCjY0IDAgb2JqCjw8Ci9GaWx0ZXIgL1N0YW5kYXJkCi9W IDIKL1IgMwovTGVuZ3RoIDEyOAovTyA8MDkyRjlGQ0RCN0JERkYwRTIxMENBQ0JGODkxRDEyNEU0 RkJEODkyNEExNzcwNTVBM0EzMUI2MkEwRTU1N0Q2Qz4KL1UgPDg5RUVFRTgwQTFBOEU5NzM5NjlB ODcyMjA5MzM2NDk2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA+Ci9QIDYxNjMyCj4+ CmVuZG9iagp4cmVmCjAgNjUKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE1IDAwMDAwIG4g CjAwMDAwMDAxMzAgMDAwMDAgbiAKMDAwMDAwMDE5NiAwMDAwMCBuIAowMDAwMDAwNDk5IDAwMDAw IG4gCjAwMDAwMDM0MDQgMDAwMDAgbiAKMDAwMDAwMzU4OSAwMDAwMCBuIAowMDAwMDAzODQyIDAw MDAwIG4gCjAwMDAwMDQwNTkgMDAwMDAgbiAKMDAwMDAwNDMxMCAwMDAwMCBuIAowMDAwMDA0NTU5 IDAwMDAwIG4gCjAwMDAwMDQ3ODEgMDAwMDAgbiAKMDAwMDAwNTA5MCAwMDAwMCBuIAowMDAwMDA2 ODAwIDAwMDAwIG4gCjAwMDAwMDY5OTEgMDAwMDAgbiAKMDAwMDAwNzI1MCAwMDAwMCBuIAowMDAw MDA3MzA3IDAwMDAwIG4gCjAwMDAwMDc1MzMgMDAwMDAgbiAKMDAwMDAwNzY0NyAwMDAwMCBuIAow MDAwMDA3OTMxIDAwMDAwIG4gCjAwMDAwMDgwMTcgMDAwMDAgbiAKMDAwMDAwODI0NSAwMDAwMCBu IAowMDAwMDA4MzIwIDAwMDAwIG4gCjAwMDAwMDg0NTMgMDAwMDAgbiAKMDAwMDAwOTMwNiAwMDAw MCBuIAowMDAwMDA5MzgxIDAwMDAwIG4gCjAwMDAwMDk0NTYgMDAwMDAgbiAKMDAwMDAwOTUzMSAw MDAwMCBuIAowMDAwMDA5NjA2IDAwMDAwIG4gCjAwMDAwMDk2ODEgMDAwMDAgbiAKMDAwMDAwOTc2 OCAwMDAwMCBuIAowMDAwMDA5ODU4IDAwMDAwIG4gCjAwMDAwMDk5MTMgMDAwMDAgbiAKMDAwMDAw OTk4NyAwMDAwMCBuIAowMDAwMDEwMDYxIDAwMDAwIG4gCjAwMDAwMTAxNDggMDAwMDAgbiAKMDAw MDAxMDI0NSAwMDAwMCBuIAowMDAwMDEwMzAwIDAwMDAwIG4gCjAwMDAwMTAzNTUgMDAwMDAgbiAK MDAwMDAxMDQyOSAwMDAwMCBuIAowMDAwMDEwNTAzIDAwMDAwIG4gCjAwMDAwMTA1OTAgMDAwMDAg biAKMDAwMDAxMDY4MCAwMDAwMCBuIAowMDAwMDEwNzM2IDAwMDAwIG4gCjAwMDAwMTA4MTEgMDAw MDAgbiAKMDAwMDAxMDg4NiAwMDAwMCBuIAowMDAwMDEwOTYyIDAwMDAwIG4gCjAwMDAwMTEwMzgg MDAwMDAgbiAKMDAwMDAxMTExNCAwMDAwMCBuIAowMDAwMDExMTkwIDAwMDAwIG4gCjAwMDAwMTEy NjYgMDAwMDAgbiAKMDAwMDAxMTM1NiAwMDAwMCBuIAowMDAwMDExNDMyIDAwMDAwIG4gCjAwMDAw MTE1MDggMDAwMDAgbiAKMDAwMDAxMTU4NCAwMDAwMCBuIAowMDAwMDExNjYwIDAwMDAwIG4gCjAw MDAwMTE3MzYgMDAwMDAgbiAKMDAwMDAxMTgxMiAwMDAwMCBuIAowMDAwMDExODg4IDAwMDAwIG4g CjAwMDAwMTE5NjQgMDAwMDAgbiAKMDAwMDAxMjA0MCAwMDAwMCBuIAowMDAwMDEyMzgzIDAwMDAw IG4gCjAwMDAwMTI1NDMgMDAwMDAgbiAKMDAwMDAxMjkyNCAwMDAwMCBuIAowMDAwMDEzMTM1IDAw MDAwIG4gCnRyYWlsZXIKPDwKL1Jvb3QgMSAwIFIKL0luZm8gMTYgMCBSCi9JRCBbIDw3QTkxNTU5 MEU4MzhFQzRDODBFNTQ4NjcwRURDRjQ4QT4gPDBDQzU4OTM2RTIzRjNERDZEQ0JDQjEzMUM5NTkz RUJEPiBdCi9YUmVmU3RtIDg2ODMKL1NpemUgNjUKL0VuY3J5cHQgNjQgMCBSCj4+CnN0YXJ0eHJl ZgoxMzM0NgolJUVPRgo= --===============1960675907==-- From tinguely@sgi.com Fri Feb 13 17:40:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BD7267F55 for ; Fri, 13 Feb 2015 17:40:32 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86995304032; Fri, 13 Feb 2015 15:40:29 -0800 (PST) Message-ID: <54DE8B6D.8010401@sgi.com> Date: Fri, 13 Feb 2015 17:40:29 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> In-Reply-To: <1423782857-11800-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 02/12/15 17:14, Dave Chinner wrote: > From: Dave Chinner > > Test generic/224 is failing with a corruption being detected on one > of Michael's test boxes. Debug that Michael added is indicating > that the minleft trimming is resulting in an underflow: > > ..... > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > before goto out_nominleft: rlen 1 args->len 0 > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > after fixup: rlen 1 args->len 1 > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > after fixup: rlen 4294967295 args->len 4294967295 > XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 > > The "goto out_nominleft:" indicates that we are getting close to > ENOSPC in the AG, and a couple of allocations later we underflow > and the corruption check fires in xfs_alloc_ag_vextent_size(). > > The issue is that the extent length fixups comaprisons are done > with variables of xfs_extlen_t types. These are unsigned so an > underflow looks like a really big value and hence is not detected > as being smaller than the minimum length allowed for the extent. > Hence the corruption check fires as it is noticing that the returned > length is longer than the original extent length passed in. > > This can be easily fixed by ensuring we do the underflow test on > signed values, the same way xfs_alloc_fix_len() prevents underflow. > So we realise in future that these casts prevent underflows from > going undetected, add comments to the code indicating this. > > Reported-by: Michael L. Semon > Tested-by: Michael L. Semon > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_alloc.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) int diff = be32_to_cpu(agf->agf_freeblks) - args->len - args->minleft; > @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( > if (diff >= 0) > return 1; If the diff math was done correctly, wouldn't it get caught here? > args->len += diff; /* shrink the allocated space */ > - if (args->len >= args->minlen) > + /* casts to (int) catch length underflows */ > + if ((int)args->len >= (int)args->minlen) > return 1; > args->agbno = NULLAGBLOCK; > return 0; We can and should fix the wrap in xfs_alloc_fix_minleft() but this also points to the fact that xfs_alloc_fix_freelist() is incorrectly choosing AGs that will later fail the allocation alignment, minlen, and minleft requirements. You can connect the dots to see how this can lead to a deadlock with extent frees. We have seen them. I hacked the XFS code to lead to this situation. Also bad is xfs_alloc_vextent() will temporally ignore the minleft for the xfs_alloc_fix_freelist() but makes the ag allocator enforce the minleft. I got this condition to ASSERT in xfs_alloc_ag_vextent_size(), but I never got a deadlock. It would require just the right sequence from xfs_alloc_vextent() and xfs_bmap_btalloc(). --Mark. From jojo@nb-channel.com Sat Feb 14 02:47:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1CFBB7F75 for ; Sat, 14 Feb 2015 02:47:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F3E018F8071 for ; Sat, 14 Feb 2015 00:46:58 -0800 (PST) X-ASG-Debug-ID: 1423903615-04cbb011652acee0001-NocioJ Received: from hwhost4.qiye.163.com (hwhost4.qiye.163.com [180.150.142.123]) by cuda.sgi.com with ESMTP id Uijc1fD7Ocn3mkTZ for ; Sat, 14 Feb 2015 00:46:56 -0800 (PST) X-Barracuda-Envelope-From: jojo@nb-channel.com X-Barracuda-Apparent-Source-IP: 180.150.142.123 Received: from jojo$nb-channel.com ( [36.22.63.168] ) by ajax-webmail-wmsvr3 (Coremail) ; Sat, 14 Feb 2015 16:06:38 +0800 (CST) X-Originating-IP: [36.22.63.168] Date: Sat, 14 Feb 2015 16:06:38 +0800 (CST) From: Jojo To: xfs@oss.sgi.com Subject: door lock for elevator X-Priority: 3 X-ASG-Orig-Subj: door lock for elevator X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20140422(26738.6344) Copyright (c) 2002-2015 www.mailtech.cn 163-hosting Content-Type: multipart/alternative; boundary="----=_Part_67477_1616728169.1423901198942" MIME-Version: 1.0 Message-ID: <30836f48.15ca.14b87200a5e.Coremail.jojo@nb-channel.com> X-CM-TRANSID:y2R4CkDpL0IPAt9Uu58PAA--.5515W X-CM-SenderInfo: pmrm0qlqenuxpdqqvzoofrz/1tbiBQWgS1SYSQRBQwACsq X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== X-Barracuda-Connect: hwhost4.qiye.163.com[180.150.142.123] X-Barracuda-Start-Time: 1423903615 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15279 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_67477_1616728169.1423901198942 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 IAoKSGVsbG8KCiAKCkFzIGtub3dpbmcgdGhhdCB5b3UgYXJlIGluIHRoZSBFbGV2YXRvciBtYXJr ZXQgLiBOaW5nYm8gQ2hhbm5lbCBFbGVjdHJpY2FsIGNvLixsdGQuIGhlcmUsIHdyaXRpbmcgdG8g ZXN0YWJsaXNoIGJ1c2luZXNzIHJlbGF0aW9uc2hpcCB3aXRoIHlvdSAuT3VyIGNvbXBhbnkgaGFz IHdvbiBBVURJVEVEIFNVUFBMSUVSIGJ5IFNHUy1DU1RDIGFuZCBwYXNzZWQgSVNPOTAwMToyMDA4 IGF1dGhlbnRpY2F0aW9uLENFIENlcnRpZmljYXRlLiBPdXIgcHJvZHVjdHMgYXJlIDoKCjHvvIxk b29yIG9wZXJhdG9yCgoy77yMc2FmZXR5IENvbXBvbmVudHMKCjPvvIxlbGV2YXRvciBsb2FkIGNl bGwKCldlIGFyZSBzdXBwb3J0aW5nIG1hbnkgZWxldmF0b3IgYnJhbmRzIHN1Y2ggYXMgTWl0c3Vi aXNoaSwgVGh5c3NlbiwgT3RpcywgU2NoaW5kbGVyLCBLT05FLCBGdWppLCBhbmQgWXVuZ3RheSBl dGMuCgpQbGVhc2UgZG9u4oCZdCBoZXNpdGF0ZSB0byBjb250YWN0IG1lIGlmIHRoZXJlIGlzIGFu eSBpdGVtIHlvdSBhcmUgaW50ZXJlc3RlZC4KCkIud2lzaGVzCgogCgpDaGVycnkKCiAKCk5pbmdi byBDaGFubmVsIEVsZWN0cm9tZWNoYW5pY2FsIENvLiBMdGQKClJvb20gMTUxMixNb3JnYW4gSW50 ZXJuYXRpb25hbCBCdWxkaW5nIEMsCgpUYWloZSBSb2FkLEJlaWx1biwgTmluZ2JvLCBaaGVqaWFu ZyAzMDAwMTIsIENoaW5hCgpUZWw6IDAwODYgNTc0IDg2ODAyNjg4ICAgICBGYXg6IDAwODYgNTc0 ODY4MDI3ODgKClNreXBlOmNoYW5uZWwtbmluYQoKCgo= ------=_Part_67477_1616728169.1423901198942 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PERJVj48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1J TFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnIj48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQt U0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnIj48U1BBTiBsYW5n PSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTRwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3Nh bnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJu aW5nOiAwcHQiPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDE2cHg7IEZPTlQtRkFNSUxZOiAnQXJp YWwnLCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMHB0Ij48Rk9OVCBzaXplPSIzIj4mbmJzcDsgCjxQIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnIj5IZWxs bzxvOnA+PC9vOnA+PC9TUEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Ik1BUkdJ TjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0 OyBGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZiciPjxvOnA+Jm5ic3A7PC9vOnA+PC9T UEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQi PjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog J0FyaWFsJywnc2Fucy1zZXJpZiciPkFzIGtub3dpbmcgdGhhdCB5b3UgYXJlIGluIHRoZSBFbGV2 YXRvciBtYXJrZXQgLiA8L1NQQU4+PFNQQU4gbGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdl aWdodDogYm9sZCI+TmluZ2JvIENoYW5uZWwgRWxlY3RyaWNhbCBjby4sbHRkLjwvU1BBTj48U1BB TiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlh bCcsJ3NhbnMtc2VyaWYnIj4gaGVyZSwgd3JpdGluZyB0byBlc3RhYmxpc2ggYnVzaW5lc3MgcmVs YXRpb25zaGlwIHdpdGggeW91IC5PdXIgY29tcGFueSBoYXMgd29uIEFVRElURUQgU1VQUExJRVIg YnkgU0dTLUNTVEMgYW5kIHBhc3NlZCBJU085MDAxOjIwMDggYXV0aGVudGljYXRpb24sQ0UgQ2Vy dGlmaWNhdGUuIE91ciBwcm9kdWN0cyBhcmUgOiA8bzpwPjwvbzpwPjwvU1BBTj48L1A+CjxQIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPSJF Ti1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMt c2VyaWYnIj4xPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZ OiDlrovkvZM7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1hc2NpaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1pbm9yLWZhcmVhc3Q7IG1z by1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBBcmlhbCI+ 77yMPC9TUEFOPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05U LUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZiciPmRvb3Igb3BlcmF0b3I8bzpwPjwvbzpwPjwv U1BBTj48L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0 Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6 ICdBcmlhbCcsJ3NhbnMtc2VyaWYnIj4yPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEy cHQ7IEZPTlQtRkFNSUxZOiDlrovkvZM7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1mYXJlYXN0LXRoZW1lLWZvbnQ6IG1p bm9yLWZhcmVhc3Q7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQt ZmFtaWx5OiBBcmlhbCI+77yMPC9TUEFOPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1T SVpFOiAxMnB0OyBGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZiciPnNhZmV0eSBDb21w b25lbnRzPG86cD48L286cD48L1NQQU4+PC9QPgo8UCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i TUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJyI+MzwvU1BBTj48U1BBTiBz dHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tZmFy ZWFzdC10aGVtZS1mb250OiBtaW5vci1mYXJlYXN0OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFy aWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWwiPu+8jDwvU1BBTj48U1BBTiBsYW5nPSJF Ti1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMt c2VyaWYnIj5lbGV2YXRvciBsb2FkIGNlbGw8bzpwPjwvbzpwPjwvU1BBTj48L1A+CjxQIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPSJFTi1V UyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2Vy aWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tYmlkaS1mb250LXdlaWdo dDogYm9sZCI+V2UgYXJlIHN1cHBvcnRpbmcgbWFueSBlbGV2YXRvciBicmFuZHMgc3VjaCBhcyBN aXRzdWJpc2hpLCBUaHlzc2VuLCBPdGlzLCBTY2hpbmRsZXIsIEtPTkUsIEZ1amksIGFuZCBZdW5n dGF5IGV0Yy48L1NQQU4+PFNQQU4gbGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7 IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJyI+PG86cD48L286cD48L1NQQU4+PC9Q Pgo8UCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4g bGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwn LCdzYW5zLXNlcmlmJyI+UGxlYXNlIGRvbuKAmXQgaGVzaXRhdGUgdG8gY29udGFjdCBtZSBpZiB0 aGVyZSBpcyBhbnkgaXRlbSB5b3UgYXJlIGludGVyZXN0ZWQuPG86cD48L286cD48L1NQQU4+PC9Q Pgo8UCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4g bGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwn LCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdlaWdodDogYm9sZCI+Qi53aXNoZXM8bzpwPjwv bzpwPjwvU1BBTj48L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJNQVJHSU46IDBjbSAw Y20gMHB0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1G QU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xkIj48 bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJN QVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTog MTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2Vp Z2h0OiBib2xkIj5DaGVycnk8L1NQQU4+PC9QPgo8UCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i TUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz0iRU4tVVMiIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiAnQXJpYWwnLCdzYW5zLXNlcmlmJzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LXdl aWdodDogYm9sZCI+PC9TUEFOPiZuYnNwOzwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBGT05ULUZBTUlMWTogJ0FyaWFsJywnc2Fucy1zZXJpZic7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13 ZWlnaHQ6IGJvbGQiPk5pbmdibyBDaGFubmVsIEVsZWN0cm9tZWNoYW5pY2FsIENvLiBMdGQ8bzpw PjwvbzpwPjwvU1BBTj48L1A+CjxQIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJNQVJHSU46IDBj bSAwY20gMHB0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9O VC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2VpZ2h0OiBib2xk Ij5Sb29tIDE1MTIsTW9yZ2FuIEludGVybmF0aW9uYWwgQnVsZGluZyBDLDxvOnA+PC9vOnA+PC9T UEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQi PjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog J0FyaWFsJywnc2Fucy1zZXJpZic7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJvbGQiPlRhaWhlIFJv YWQsQmVpbHVuLCBOaW5nYm8sIFpoZWppYW5nIDMwMDAxMiwmbmJzcDtDaGluYTxvOnA+PC9vOnA+ PC9TUEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlM WTogJ0FyaWFsJywnc2Fucy1zZXJpZic7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC13ZWlnaHQ6IGJvbGQiPlRlbDog MDA4NiA1NzQgODY4MDI2ODggJm5ic3A7ICZuYnNwOyZuYnNwO0ZheDogMDA4NiA1NzQ4NjgwMjc4 ODxvOnA+PC9vOnA+PC9TUEFOPjwvUD4KPFAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIGFsaWduPSJsZWZ0Ij48U1BBTiBsYW5nPSJFTi1VUyIgc3R5bGU9IkZPTlQtU0laRTog MTJwdDsgRk9OVC1GQU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtd2Vp Z2h0OiBib2xkOyBtc28tYW5zaS1sYW5ndWFnZTogRU4tVVM7IG1zby1mYXJlYXN0LWxhbmd1YWdl OiBaSC1DTjsgbXNvLWJpZGktbGFuZ3VhZ2U6IEFSLVNBIj5Ta3lwZTpjaGFubmVsLW5pbmE8L1NQ QU4+PC9QPjwvRk9OVD48L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTZweDsgRk9OVC1G QU1JTFk6ICdBcmlhbCcsJ3NhbnMtc2VyaWYnOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQiPjxTUEFOIGxhbmc9IkVOLVVTIiBzdHlsZT0iV0hJ VEUtU1BBQ0U6IG5vcm1hbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4 OyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRweC8yMXB4IEFyaWFsOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBw eDsgZm9udC1zaXplLWFkanVzdDogbm9uZTsgZm9udC1zdHJldGNoOiBub3JtYWwiIHZlcmRhbmE9 IiI+PEZPTlQgZmFjZT0iSGVsdmV0aWNhLCBNaWNyb3NvZnQgWWFoZWksIHZlcmRhbmEiPjwvRk9O VD48L1NQQU4+PC9TUEFOPjwvU1BBTj48L1NQQU4+PC9TUEFOPjxCUj48QlI+PC9ESVY+ ------=_Part_67477_1616728169.1423901198942-- From david@fromorbit.com Sat Feb 14 17:30:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BB517F6A for ; Sat, 14 Feb 2015 17:30:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8A804304032 for ; Sat, 14 Feb 2015 15:29:57 -0800 (PST) X-ASG-Debug-ID: 1423956594-04cb6c6b0a308d40001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id yn09ZqRqfS7zTuFH for ; Sat, 14 Feb 2015 15:29:55 -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: AgEVAKnZ31R5LCM5PGdsb2JhbABbgwaBLII0g3mpMAEBAQEBAQaYOQICAQECgQ1EAQEBAQEBBQEBAQE4O4QMAQEBAwEnExwjBQsIAxUDCSUPBQ0YAwcaE4gZAwkHzWUNhVABAQEHAQEBAR4YhWyFCIJDgUZkB4QqBY1MiV2BRYpTgjeGBIQkKjGBAoFBAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 15 Feb 2015 09:59:53 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YMm9n-0008O3-IN; Sun, 15 Feb 2015 10:29:51 +1100 Date: Sun, 15 Feb 2015 10:29:51 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Message-ID: <20150214232951.GW4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54DE8B6D.8010401@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1423956594 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On Fri, Feb 13, 2015 at 05:40:29PM -0600, Mark Tinguely wrote: > On 02/12/15 17:14, Dave Chinner wrote: > >From: Dave Chinner > > > >Test generic/224 is failing with a corruption being detected on one > >of Michael's test boxes. Debug that Michael added is indicating > >that the minleft trimming is resulting in an underflow: > > > >..... > > before fixup: rlen 1 args->len 0 > > after xfs_alloc_fix_len : rlen 1 args->len 1 > > before goto out_nominleft: rlen 1 args->len 0 > > before fixup: rlen 1 args->len 0 > > after xfs_alloc_fix_len : rlen 1 args->len 1 > > after fixup: rlen 1 args->len 1 > > before fixup: rlen 1 args->len 0 > > after xfs_alloc_fix_len : rlen 1 args->len 1 > > after fixup: rlen 4294967295 args->len 4294967295 > > XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 > > > >The "goto out_nominleft:" indicates that we are getting close to > >ENOSPC in the AG, and a couple of allocations later we underflow > >and the corruption check fires in xfs_alloc_ag_vextent_size(). > > > >The issue is that the extent length fixups comaprisons are done > >with variables of xfs_extlen_t types. These are unsigned so an > >underflow looks like a really big value and hence is not detected > >as being smaller than the minimum length allowed for the extent. > >Hence the corruption check fires as it is noticing that the returned > >length is longer than the original extent length passed in. > > > >This can be easily fixed by ensuring we do the underflow test on > >signed values, the same way xfs_alloc_fix_len() prevents underflow. > >So we realise in future that these casts prevent underflows from > >going undetected, add comments to the code indicating this. > > > >Reported-by: Michael L. Semon > >Tested-by: Michael L. Semon > >Signed-off-by: Dave Chinner > >--- > > fs/xfs/libxfs/xfs_alloc.c | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > int diff = be32_to_cpu(agf->agf_freeblks) > - args->len - args->minleft; > Preconditions: agf->agf_freeblks = 1 args->len = 1 args->minleft = 2 Therefore, diff = -2 > >@@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( > > if (diff >= 0) > > return 1; > > If the diff math was done correctly, wouldn't it get caught here? No, diff < 0. > > args->len += diff; /* shrink the allocated space */ 1 += -2 = -1 > >- if (args->len >= args->minlen) if (0xffffffff >= 1) broken. > >+ /* casts to (int) catch length underflows */ > >+ if ((int)args->len >= (int)args->minlen) if (-1 >= 1) correct. > > return 1; > > args->agbno = NULLAGBLOCK; > > return 0; > > We can and should fix the wrap in xfs_alloc_fix_minleft() but this > also points to the fact that xfs_alloc_fix_freelist() is incorrectly > choosing AGs that will later fail the allocation alignment, minlen, > and minleft requirements. I don't think there's a problem there. At least, not the problem I think you trying to describe. > You can connect the dots to see how this can lead to a deadlock with > extent frees. We have seen them. I hacked the XFS code to lead to > this situation. You should post the test cases and the patch that exposes the issues you are concerned about. Otherwise we have no real idea of what problems you are talking about, and certainly can't reproduce them. > Also bad is xfs_alloc_vextent() will temporally ignore the minleft > for the xfs_alloc_fix_freelist() but makes the ag allocator enforce > the minleft. Hmmm - I suspect you haven't understood the underlying reason for setting minleft to zero for the call to xfs_alloc_fix_freelist(). There's are two places we do this: single AG constrainted allocation, and the "any AG, but near ENOSPC" allocation. For single AG constrained allocation, minleft is something we can ignore because we must select that AG for allocation. minleft is applied against the total allocation requirement, not the minimum length of allocation that can be done. Hence we might be able to do a minlen allocation, but we'd reject it because we can't do a maxlen allocation due to minleft requirements. Hence we switch off minleft in that case when doing freelist checks so that we don't reject allocations that could do a minlen allocation successfully. This requires the low level allocator to be able to trim back the selected extent from whatever length it finds to repesect minleft, and if it can't then fail the allocation. That is the function of xfs_alloc_fix_minleft() - constrain the allocated extent to the required minleft or fail the allocation. And for the lowspace algorithm, the reasoning is similar. After two attempts to allocate in AGs that have enough space for a maxlen allocation, we switch off minleft so that we only constrain the AG search to AGs that can definitely satisfy a minlen allocation, hence improving the chance we can do an allocation successfully near ENOSPC. Cheers, Dave. -- Dave Chinner david@fromorbit.com From root@krios.tbi.univie.ac.at Sat Feb 14 23:25:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37B3D7F66 for ; Sat, 14 Feb 2015 23:25:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C89A6AC001 for ; Sat, 14 Feb 2015 21:25:08 -0800 (PST) X-ASG-Debug-ID: 1423977905-04cb6c6b0a319fb0001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id F0A0u2y2crllpCin for ; Sat, 14 Feb 2015 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 8C6505EE25; Sun, 15 Feb 2015 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 7AC235F301; Sun, 15 Feb 2015 06:25:03 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20150215052503.7AC235F301@krios.tbi.univie.ac.at> Date: Sun, 15 Feb 2015 06:25:03 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1423977906 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15321 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From rfq@bicheng-ltd.net Sun Feb 15 05:05:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=HK_RANDOM_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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 231867F69 for ; Sun, 15 Feb 2015 05:05:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA24D8F8050 for ; Sun, 15 Feb 2015 03:05:36 -0800 (PST) X-ASG-Debug-ID: 1423998327-04bdf06a5c3460b0001-NocioJ Received: from mx1.dns.com.cn (mx1.dns.com.cn [119.254.72.141]) by cuda.sgi.com with ESMTP id CrjYJmLPdp7Jxy7H for ; Sun, 15 Feb 2015 03:05:28 -0800 (PST) X-Barracuda-Envelope-From: rfq@bicheng-ltd.net X-Barracuda-Apparent-Source-IP: 119.254.72.141 Received: from PC-20150125VEJS (unknown [153.99.36.45]) by mx1.dns.com.cn (DNS Email Server) with ESMTPA id 9DE9A2EB7A5 for ; Sun, 15 Feb 2015 19:05:25 +0800 (CST) From: "bicheng PCB" To: "xfs@oss.sgi.com" Reply-To: bichengccts@163.com Date: Sun, 15 Feb 2015 19:05:55 +0800 Subject: Multilayer PCB, thin laminates MIME-Version: 1.0 X-ASG-Orig-Subj: Multilayer PCB, thin laminates Content-Type: multipart/alternative; boundary="_=aspNetEmail=_5b69a26deffc43a1a4f15c7b07bba4e3" X-Mailer: Foxmail 6, 13, 102, 15 [cn] Message-ID: X-Scanned-By: AntiSpam on 119.254.72.141 X-Barracuda-Connect: mx1.dns.com.cn[119.254.72.141] X-Barracuda-Start-Time: 1423998327 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message --_=aspNetEmail=_5b69a26deffc43a1a4f15c7b07bba4e3 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Dear =24=E6=94=B6=E4=BB=B6=E4=BA=BA=24 , ,=0D=0A=0D=0A<>= 8=2E You don=E2=80=99t track your progress=E4=BD=A0=E6=B2=A1=E6=9C=89=E8=B7= =9F=E8=B8=AA=E8=BF=9B=E5=BA=A6=0D=0A=0D=0A =0D=0A=0D=0AGood day=2E=0D=0A=0D= =0AThis is a courtesy email to let you know that multilayer PCB=27s repre= sent one of the most complicated products in the PCB industry=2E A breakd= own of multilayer boards show that it consists of 3 basic elements: coppe= r foils, prepregs sheets and thin laminates=2E =0D=0A=0D=0A =0D=0A=0D=0A=0D= =0A=0D=0AThin laminate (base material FR-4)=0D=0A=0D=0A=0D=0AVendor=0D=0A= =0D=0AModel=0D=0A=0D=0AThickness=0D=0A=0D=0ACopper=0D=0A=0D=0ATG=0D=0A=0D= =0AER=0D=0A=0D=0A=0D=0ASHENGYI=0D=0A=0D=0AS1141=0D=0A=0D=0A0=2E05-3=2E2 m= m=0D=0A=0D=0A17-105 =CE=BCm=0D=0A=0D=0A=E2=89=A5130=0D=0A=0D=0A=E2=89=A45= =2E4=0D=0A=0D=0A=0D=0ASHENGYI=0D=0A=0D=0AS1170=0D=0A=0D=0A0=2E05-3=2E2 mm= =0D=0A=0D=0A17-105 =CE=BCm=0D=0A=0D=0A=E2=89=A5170=0D=0A=0D=0A=E2=89=A45=2E= 4=0D=0A=0D=0A=0D=0AITEQ=0D=0A=0D=0AIT-140=0D=0A=0D=0A0=2E05-1=2E5 mm=0D=0A= =0D=0A17-175 =CE=BCm=0D=0A=0D=0A>135=0D=0A=0D=0A=EF=BC=9C5=2E4=0D=0A=0D=0A= =0D=0AITEQ=0D=0A=0D=0AIT-180=0D=0A=0D=0A0=2E05-1=2E5 mm=0D=0A=0D=0A17-175= =CE=BCm=0D=0A=0D=0A>170=0D=0A=0D=0A=EF=BC=9C5=2E4=0D=0A=0D=0A=0D=0AITEQ=0D= =0A=0D=0AIT-180A=0D=0A=0D=0A0=2E05-1=2E5 mm=0D=0A=0D=0A17-175 =CE=BCm=0D=0A= =0D=0A>170=0D=0A=0D=0A=EF=BC=9C5=2E4=0D=0A=0D=0A=0D=0A =0D=0A=0D=0AIf you= have requirements on the PCB=27s, please do not hesitate to contact us b= y simply reply back to this email or following contact=2E I will get back= to you ASAP=2E=0D=0A=0D=0AWish you the best in trade=2E =0D=0A=0D=0A =0D= =0A=0D=0AChristina Lau =7C Business development=0D=0A=0D=0ABicheng PCB =7C= 3-203 Shidai Jingyuan, Fuyong, Baoan, Shenzhen, China 518103 =7C (86-755= -27374946 =7C www=2Ebicheng-pcb=2Ecom =7C sales10=40bicheng-pcb=2Ecom=0D=0A= =0D=0AIf you wish to opt-out from the mailing list, reply as =22remove=22= in the subject line=2E --_=aspNetEmail=_5b69a26deffc43a1a4f15c7b07bba4e3 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

Dear =24=E6=94=B6= =E4=BB=B6=E4=BA=BA=24=26nbsp;, ,

=26lt;=26lt;Keep on reading to lea= rn why New Year=E2=80=99s resolutions fail (and how to succeed)=2E=26gt;=26= gt;8=2E You don=E2=80=99= t track your progress=E4=BD=A0=E6=B2=A1=E6=9C=89= =E8=B7=9F=E8=B8=AA=E8=BF=9B=E5=BA=A6

=26nbsp;

Goo= d day=2E

This is a courtesy email to let you know = that multilayer PCB=27s repr= esent one of the most complicated products in the PCB industry=2E=26nbsp;= A breakdown of multilayer boards sh= ow that it consists of 3 basic elements: copper foils, prepregs sheets an= d=26nbsp;thin laminates=2E=26nbsp;

=26nbsp;

= = =E2=89=A5130

<= td style=3D=22BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtex= t 1pt solid; PADDING-BOTTOM: 0cm; BACKGROUND-COLOR: transparent; PADDING-= LEFT: 0cm; PADDING-RIGHT: 0cm; HEIGHT: 14pt; BORDER-TOP: =23f0f0f0; BORDE= R-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm; mso-border-alt: solid wi= ndowtext =2E75pt; mso-border-top-alt: solid windowtext =2E75pt=22 valign=3D= =22bottom=22 nowrap=3D=22nowrap=22>

SHENGYI

<= p style=3D=22TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-pagination: widow= -orphan=22 class=3D=22MsoNormal=22 align=3D=22left=22>17-175 =CE=BCm

=26gt;170

<= p style=3D=22TEXT-ALIGN: left; MARGIN: 0cm 0cm 0pt; mso-pagination: widow= -orphan=22 class=3D=22MsoNormal=22 align=3D=22left=22>17-175 =CE=BCm

Thin lamina= te (base material FR-4)

Vendor

Model<= /span>

Thickness

Copper

TG

ER

SHENGYI

S1141

0=2E05-3=2E2 mm

17-105 =CE=BCm

=E2=89=A45=2E4

S1170

0=2E05-3=2E2 mm

17-105 =CE=BCm

=E2=89=A5= 170

=E2=89=A45=2E4

ITEQ

IT-140

0=2E05-1=2E5 mm

=26gt;135

=EF=BC=9C5=2E= 4

ITEQ=

IT-180

0=2E05-1=2E5 mm

17-175 =CE=BCm

=EF=BC=9C= 5=2E4

ITEQ

IT-180A<= o:p>

0=2E05-1=2E5 mm

=26gt;170

=EF=BC=9C5=2E= 4

=26nbsp;

If you have requirements on the PCB=27= s, please do not hesitate to contact us by simply reply back to this emai= l or following contact=2E I will get back to you ASAP=2E

Wish = you the best in trade=2E=26nbsp;

=26nbsp;

Christina Lau =7C Business devel= opment

Bicheng PCB =7C 3-203 Shidai Jingyuan, Fuyong, = Baoan, Shenzhen, China 518103 =7C (86-755-27374946 =7C www=2Ebicheng-pcb=2Ecom =7C sales10=40bicheng-pcb=2Ecom

If you wish to opt-out from the mailing list, reply as =26quot;remove=26quot;= in the subject line=2E

=26nbsp; --_=aspNetEmail=_5b69a26deffc43a1a4f15c7b07bba4e3-- From adrscube@gmail.com Sun Feb 15 08:38:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 69A5C7F67 for ; Sun, 15 Feb 2015 08:38:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58528304039 for ; Sun, 15 Feb 2015 06:38:48 -0800 (PST) X-ASG-Debug-ID: 1424011126-04cb6c6b0b3792f0001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id PA6Kvay7ltHRydDi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 15 Feb 2015 06:38:47 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by mail-pa0-f43.google.com with SMTP id fa1so29504968pad.2 for ; Sun, 15 Feb 2015 06:38:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=VPzwnR0XEedfN1rOxGyvqAS8RJBdEQwuj/LSEmj0oUM=; b=NrsCwF6pYPZQl9eLP9iXJKetYi4TNlPKFOMPE86ezYz7q9XD4z6qsVSYlHM1KSYXPL 5DusJ/mZW8eGeBL+532vQjd3HTT9HP4ZR+BTNwO+7L4xECNhiaiYCbrTGBWfBpXJsHsa nrZI/YbliEcuB/RfSlIR28DhExS9Jotw1qGqFsZX383KIlQro3SWYMfFeM/6JF6Uo+ex MV5iQxGFXw0uKUl2W/m2Gt1XKduAodE/o2GYpjSD2BbljwXMOKv9JJcZtJ9YD5a7hvNr wM8MEnXM8I3Kn/nBgRgN0GijRUNOaUQ9XTL3XwwM6KtZosKwkM0UDI0hya6lKXuV09xw adqQ== MIME-Version: 1.0 X-Received: by 10.68.106.226 with SMTP id gx2mr32140634pbb.78.1424011126316; Sun, 15 Feb 2015 06:38:46 -0800 (PST) Received: by 10.70.7.165 with HTTP; Sun, 15 Feb 2015 06:38:46 -0800 (PST) Date: Sun, 15 Feb 2015 20:08:46 +0530 Message-ID: Subject: [RFD] : Allowing xfs_fsr to defragment portions of a file From: Dhruvesh Rathore X-ASG-Orig-Subj: [RFD] : Allowing xfs_fsr to defragment portions of a file To: xfs@oss.sgi.com Cc: Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1424011127 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, The xfs_fsr utility in its current state does not support defragmentation of parts of file. Either the entire file is defragmented, or if free space is not available then the operation is not performed. We would like to enhance the utility allowing it to defragment parts of the file, ins such a condition. --------------------------------------------------------------------------------------------------------------- Our initial task was to understand how xfs_fsr currently defragments the file: 1) In /fsr/xfs_fsr.c from main() the control is passed to fsrfile(). In fsrfile(), we open the original file and collect bstat information. A call is then made to fsrfile_common() 2) In fsrfile_common() we check if sufficient free space is available to defragment the file, and if not then we exit. If free space is available, then a call is made to packfile() 3) In packfile(), read_fd_bmap() function provides us with the current number of extents used by the file (cur_nextents) and the ideal number of extents needed to save the file (nextents). In function read_fd_bmap() the the outmap[ ] structure is also populated. 4) packfile() will initially allocate new extents (nextents) to the temporary file and then copy(swap) extents form the existing file. We then fchown() the new temp file and space occupied by the prev fragmented copy is then freed. --------------------------------------------------------------------------------------------------------------- Our understanding to the approach of defragmenting portions of a file is as follows: 1) In fsrfile_common(), a new function will be called when the code determines that there is insufficient free space to defragment the entire file. 2) The new function performs the following tasks: ---> Call read_fd_bmap() to get cur_nextents and nextents(ideal). Using nextents we will then have to determine how many extents can be defragmented against the free space available. ---> Creating a temp file will not be feasible as it will create a problem when we want to change owners. ---> The function will have to hence focus on swapping the existing extents from the fragmented file. For this a swap_extent() function will be needed, which will take arguments as the current extent and the location(in free space) where it needs to be swapped to. For the above functionality Dave suggested that we have a look at EXT4_IOC_MOVE_EXT and its usage. We are however unsure of how to compress the extents which have been chosen for defragmentation and keep the other extents untouched. We are also in doubt about how to proceed without creating a temp file for defragmentation. Any thoughts, comments, opinions etc, are welcome Thank you. Regards A-DRS. From david@fromorbit.com Sun Feb 15 17:26:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CF9B97F47 for ; Sun, 15 Feb 2015 17:26:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD3F3304053 for ; Sun, 15 Feb 2015 15:26:09 -0800 (PST) X-ASG-Debug-ID: 1424042762-04bdf06a5b392f30001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 9Z1QYFdZRsphFten for ; Sun, 15 Feb 2015 15:26:03 -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: AvQUAAAq4VR5LCM5PGdsb2JhbABcgwaBLIYtqTUCAQEBAQaYOQICAQECgRJEAQEBAQEBBQEBAQE4O4QNAQU6HCMQCAMOCgklDwUlAwcaE4gszDgBAQEHAgEfGIVshQiEbQeEKgWNTIsikw6CJByBZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl2.internode.on.net with ESMTP; 16 Feb 2015 09:55:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YN8Ys-0001aI-Lx; Mon, 16 Feb 2015 10:25:14 +1100 Date: Mon, 16 Feb 2015 10:25:14 +1100 From: Dave Chinner To: Stephen Rothwell Cc: "J. Bruce Fields" , Jeff Layton , Christoph Hellwig , Jeff Layton , linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 19/20] xfs: implement pNFS export operations Message-ID: <20150215232514.GZ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 19/20] xfs: implement pNFS export operations References: <20150205135756.GA6386@lst.de> <20150206222047.GM12722@dastard> <20150206224258.GJ29783@fieldses.org> <20150208133435.GA27081@lst.de> <20150208090942.51e99687@tlielax.poochiereds.net> <20150209201154.GA27746@fieldses.org> <20150210000423.GY12722@dastard> <20150213011130.GA6808@fieldses.org> <20150213015422.GE12722@dastard> <20150213133811.5c3b9f49@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150213133811.5c3b9f49@canb.auug.org.au> 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: 1424042763 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15358 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 13, 2015 at 01:38:11PM +1100, Stephen Rothwell wrote: > Hi Dave, > > On Fri, 13 Feb 2015 12:54:22 +1100 Dave Chinner wrote: > > > > Thanks Bruce. I might have to build a merged tree because one of the > > changes from the review modified a header file introduced in the NFS > > tree. > > > > I'll see how it goes, and see if I can avoid doing something that > > will make Linus yell at me :P > > If its a syntactic conflict with an obvious resolution, just leave it > (or maybe mention it in the pull request). It gives him something to > do so he feels useful. :-) Heh. It's not actually a conflict, though. The issue is that some of the review comments on the XFS side resulted in changes files introduced from the NFS tree. So the XFS side can't be merged without the NFS changes being present.... > /me notes that I did not see a conflict while merging the xfs tree in > linux-next today ... Because I haven't pushed them yet ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Feb 15 19:16:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE3BC7F47 for ; Sun, 15 Feb 2015 19:16:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C136AC001 for ; Sun, 15 Feb 2015 17:16:13 -0800 (PST) X-ASG-Debug-ID: 1424049369-04bdf06a5b398720001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Ri6HYFpSdO0B3QZ5 for ; Sun, 15 Feb 2015 17:16:10 -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: AtoKAO9D4VR5LCM5PGdsb2JhbABcgwYiMFqCNIN5qSkNAQEDBpJEAoVzBAKBFEQBAQEBAQEFAQEBATg7hGkjGCQ0BSUDBy2ILMxYIBiFbIl1HYIXDEAdgRQFjUyFQ4VfgRmLLoZHgiQcgWQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl2.internode.on.net with ESMTP; 16 Feb 2015 11:46:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNAIC-0001mT-Jd; Mon, 16 Feb 2015 12:16:08 +1100 Date: Mon, 16 Feb 2015 12:16:08 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: bfields@fieldses.org, hch@lst.de, sfr@canb.auug.org.au Subject: [ANNOUNCE] xfs: for-next branch updated to 781355c (pnfs block layout support) Message-ID: <20150216011608.GA4251@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 781355c (pnfs block layout support) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="/WwmFnJnmDyWGHa4" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1424049369 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --/WwmFnJnmDyWGHa4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The 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 update contains the XFS support for the block layout PNFS server. It turns out that Bruce had included the changes that Christoph had sent for the NFS header files (thanks, Bruce!), so the XFS patches can stand alone without needing any other tree merges. I've tested that it merges cleanly with the current -linus tree and compiles, and I repeated bruce's basic "get layout" test to see if it did what it should on a merge tree. I'll leave this to cycle through a -next tree for a couple of days, and then ask Linus to pull it. The new head of the for-next branch is commit: 781355c xfs: recall pNFS layouts on conflicting access New Commits: Christoph Hellwig (2): [5278511] xfs: implement pNFS export operations [781355c] xfs: recall pNFS layouts on conflicting access Code Diffstat: fs/xfs/Makefile | 1 + fs/xfs/xfs_export.c | 6 + fs/xfs/xfs_file.c | 14 ++- fs/xfs/xfs_fsops.c | 6 + fs/xfs/xfs_ioctl.c | 9 +- fs/xfs/xfs_iops.c | 13 ++- fs/xfs/xfs_iops.h | 1 + fs/xfs/xfs_mount.h | 11 ++ fs/xfs/xfs_pnfs.c | 322 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ fs/xfs/xfs_pnfs.h | 18 +++ 10 files changed, 393 insertions(+), 8 deletions(-) create mode 100644 fs/xfs/xfs_pnfs.c create mode 100644 fs/xfs/xfs_pnfs.h --=20 Dave Chinner david@fromorbit.com --/WwmFnJnmDyWGHa4 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJU4UTYAAoJEK3oKUf0dfodf1cP/RqDtKvyEastFj9zHCuYgLDU bg7Q2EKwbY7zn/P6adusJwfJ25GKHO7sYxo68V/esMSRoWXCVeuRAbOk1apbQx9C X+DsHdHiA2M4nkVB9jekR5a05zjqHU2gVZwdyVZYE4psLCGOkuMluES9pgacH8Fl xPBgC3mPg8h9L1m29/YqMYUTDXut1nJSo47B4Bioih5iDIHbe910RggkuzRjyPTF nQY02ZJN0+f1CKBrASmn3WqRdj1+7Q2dZfPoLrsyOBviEnrf7AYK5p+clYw8j1lA +IRFwxXatfnzHfxri8dTn6E6YwibDSySwoPLE2s7epkZkiOfmO3tTWYhRCWDj7HC FNJQ+CNjTXrcMgVzx9+bMpQluBWkkV2HpJkOXIaPTuzkKe8MjNWpm4OSl2mZ4Xpe R+b7lrWcjviejDybca1WzENABax9BbaRCojlK7V8fa7Hd9PZ46uqlbtCeKaV3Dvi KiddJk68Hx4rRZh6dgARxUNpTOiABz6VAxCfrdAc5t6zowiNMWsTqI7Msm04/G8R VmVaUVIet3ZEcqMlEhWPmCcAxJ5XxVqPnNy9WRRcsvaCV/vxl3wxahXRzq0YQbAp 9Aux7p6UuWvLGQ3QmnAamXUoPIlGe/5ebKcjwdzfNSaELBj6SVYv7SyRUjzErRpc oo/oIvwJmknaGcv/TCWI =CIsQ -----END PGP SIGNATURE----- --/WwmFnJnmDyWGHa4-- From mlsemon35@gmail.com Sun Feb 15 21:39:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 485797F3F for ; Sun, 15 Feb 2015 21:39:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB472AC001 for ; Sun, 15 Feb 2015 19:39:29 -0800 (PST) X-ASG-Debug-ID: 1424057964-04cb6c6b0a3bb900001-NocioJ Received: from mail-qa0-f51.google.com (mail-qa0-f51.google.com [209.85.216.51]) by cuda.sgi.com with ESMTP id VnvRNAjnkVdQwowN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 15 Feb 2015 19:39:25 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.51 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.51] Received: by mail-qa0-f51.google.com with SMTP id i13so20466577qae.10 for ; Sun, 15 Feb 2015 19:39:24 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.51] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.51] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=F5FKkWFxH+H1b9Dw+B6CFTyTUprU4biP5clhCLojvHo=; b=vDpRgFocO5l71QOs1m+BOWaKD1+pDcNXtbBpXWK1xABKH/oyeHjp3vNKp+zelJ2gRf k/bzm8/sWMahOrYGSNkmtRg+qivRQGOQd0k0oNCcK8BIiTuky6/Eqm3R/+xttWsCVfhV 5kl0NpfPvzxvlauw7P1I7I0raZkZpaf7SPnXLkj0KlXRWDTg2PhO2k1MiEQIhWvgK4K3 wlOdBs539sVy8xA2/XyANRuguPL2xpE7Pq2Yx0umnsA/LXwYlNb3VoFqwDGIkgN4OnLz Y1aAeXeuUn4+OqQ60io1Mo9UenE6cN2V4BtEiFG3Jbc+v4YieBbC5Lget09GhG33p3Xb nNAw== X-Received: by 10.140.102.170 with SMTP id w39mr142730qge.100.1424057964320; Sun, 15 Feb 2015 19:39:24 -0800 (PST) Received: from yholen.ds (rrcs-97-76-23-49.se.biz.rr.com. [97.76.23.49]) by mx.google.com with ESMTPSA id l78sm944470qhl.34.2015.02.15.19.39.23 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 15 Feb 2015 19:39:23 -0800 (PST) Message-ID: <54E16667.1050200@gmail.com> Date: Sun, 15 Feb 2015 22:39:19 -0500 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner , Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC In-Reply-To: <20150214232951.GW4251@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-qa0-f51.google.com[209.85.216.51] X-Barracuda-Start-Time: 1424057964 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15367 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On 02/14/15 18:29, Dave Chinner wrote: > On Fri, Feb 13, 2015 at 05:40:29PM -0600, Mark Tinguely wrote: >> On 02/12/15 17:14, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> Test generic/224 is failing with a corruption being detected on one >>> of Michael's test boxes. Debug that Michael added is indicating >>> that the minleft trimming is resulting in an underflow: >>> >>> ..... >>> before fixup: rlen 1 args->len 0 >>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>> before goto out_nominleft: rlen 1 args->len 0 >>> before fixup: rlen 1 args->len 0 >>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>> after fixup: rlen 1 args->len 1 >>> before fixup: rlen 1 args->len 0 >>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>> after fixup: rlen 4294967295 args->len 4294967295 >>> XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 >>> >>> The "goto out_nominleft:" indicates that we are getting close to >>> ENOSPC in the AG, and a couple of allocations later we underflow >>> and the corruption check fires in xfs_alloc_ag_vextent_size(). >>> >>> The issue is that the extent length fixups comaprisons are done >>> with variables of xfs_extlen_t types. These are unsigned so an >>> underflow looks like a really big value and hence is not detected >>> as being smaller than the minimum length allowed for the extent. >>> Hence the corruption check fires as it is noticing that the returned >>> length is longer than the original extent length passed in. >>> >>> This can be easily fixed by ensuring we do the underflow test on >>> signed values, the same way xfs_alloc_fix_len() prevents underflow. >>> So we realise in future that these casts prevent underflows from >>> going undetected, add comments to the code indicating this. >>> >>> Reported-by: Michael L. Semon >>> Tested-by: Michael L. Semon >>> Signed-off-by: Dave Chinner >>> --- >>> fs/xfs/libxfs/xfs_alloc.c | 4 +++- >>> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> >> int diff = be32_to_cpu(agf->agf_freeblks) >> - args->len - args->minleft; >> > > Preconditions: > > agf->agf_freeblks = 1 > args->len = 1 > args->minleft = 2 > > Therefore, diff = -2 > >>> @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( >>> if (diff >= 0) >>> return 1; >> >> If the diff math was done correctly, wouldn't it get caught here? > > No, diff < 0. > > >>> args->len += diff; /* shrink the allocated space */ > > 1 += -2 > = -1 > >>> - if (args->len >= args->minlen) > > if (0xffffffff >= 1) > > broken. > >>> + /* casts to (int) catch length underflows */ >>> + if ((int)args->len >= (int)args->minlen) > > if (-1 >= 1) > > correct. > >>> return 1; >>> args->agbno = NULLAGBLOCK; >>> return 0; >> >> We can and should fix the wrap in xfs_alloc_fix_minleft() but this >> also points to the fact that xfs_alloc_fix_freelist() is incorrectly >> choosing AGs that will later fail the allocation alignment, minlen, >> and minleft requirements. > > I don't think there's a problem there. At least, not the problem I > think you trying to describe. > >> You can connect the dots to see how this can lead to a deadlock with >> extent frees. We have seen them. I hacked the XFS code to lead to >> this situation. > > You should post the test cases and the patch that exposes the issues > you are concerned about. Otherwise we have no real idea of what > problems you are talking about, and certainly can't reproduce them. > >> Also bad is xfs_alloc_vextent() will temporally ignore the minleft >> for the xfs_alloc_fix_freelist() but makes the ag allocator enforce >> the minleft. > > Hmmm - I suspect you haven't understood the underlying reason for > setting minleft to zero for the call to xfs_alloc_fix_freelist(). > There's are two places we do this: single AG constrainted > allocation, and the "any AG, but near ENOSPC" allocation. > > For single AG constrained allocation, minleft is something we can > ignore because we must select that AG for allocation. minleft is > applied against the total allocation requirement, not the minimum > length of allocation that can be done. Hence we might be able to do > a minlen allocation, but we'd reject it because we can't do a maxlen > allocation due to minleft requirements. > > Hence we switch off minleft in that case when doing freelist checks > so that we don't reject allocations that could do a minlen > allocation successfully. This requires the low level allocator to be > able to trim back the selected extent from whatever length it finds > to repesect minleft, and if it can't then fail the allocation. > That is the function of xfs_alloc_fix_minleft() - constrain the > allocated extent to the required minleft or fail the allocation. > > And for the lowspace algorithm, the reasoning is similar. After two > attempts to allocate in AGs that have enough space for a maxlen > allocation, we switch off minleft so that we only constrain the AG > search to AGs that can definitely satisfy a minlen allocation, hence > improving the chance we can do an allocation successfully near > ENOSPC. > > Cheers, > > Dave. I took something out of Mark's argument. The original condition was hit using fstests generic/224 on RAID-0, while sizing up an old Core 2 PC for a new purpose. With Mark mentioning AGs, I looked around a little bit. The case can be hit more easily with this test on 16-GB $TEST_DEV and $SCRATCH_DEV: while true; do MKFS_OPTIONS='-d agcount=16' ./check generic/224; done That may not mean anything--a 50 MB/s Caviar SE on a SATA-1 controller may just make the original test too slow for my patience--but the extra AGs do make things seem rather repeatable. I'll be happy to leave both the Core 2 PC and the i686 Pentium 4 PC in an unpatched state, should you or Mark want me to fetch more values via printk debugging. Everything else XFS is in pretty good shape for the "small or few" purposes here. Thanks! Michael From cmaiolino@redhat.com Mon Feb 16 03:58:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E9837F4E for ; Mon, 16 Feb 2015 03:58:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91B2DAC006 for ; Mon, 16 Feb 2015 01:58:49 -0800 (PST) X-ASG-Debug-ID: 1424080727-04cb6c6b0b3cbca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id C2e7XLH5VM3DmP5J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Feb 2015 01:58:48 -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 (8.14.4/8.14.4) with ESMTP id t1G9wkQF006808 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 16 Feb 2015 04:58:46 -0500 Received: from hades.maiolino.org (dhcp-1-103.brq.redhat.com [10.34.1.103]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1G9whS3012442 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Mon, 16 Feb 2015 04:58:45 -0500 Date: Mon, 16 Feb 2015 07:58:42 -0200 From: Carlos Maiolino To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC] xfs shrink feature Message-ID: <20150216095842.GA1938@hades.maiolino.org> X-ASG-Orig-Subj: Re: [RFC] xfs shrink feature Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com References: <20150213131446.GC1800@hades.maiolino.org> <20150213223507.GV4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150213223507.GV4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424080728 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Dave, On Sat, Feb 14, 2015 at 09:35:07AM +1100, Dave Chinner wrote: > On Fri, Feb 13, 2015 at 11:14:46AM -0200, Carlos Maiolino wrote: > > Hi folks, > > > > I've been seeing a lot of users requesting a shrink feature for XFS, and I > > believe it's time to have it implemented in XFS. > > I'm not so sure about that. > > > Is there anybody working on a shrink feature? If not, I'm going to > > start to work on it, if nobody have any objections. > > > I currently in design discussions with various other developers > about a line of development that will make growing and shrinking XFS > redundant operations. i.e. if we get this right, we'll never need to > deal with capacity changes of XFS filesystems at the XFS level > again. both grow and shrink will be instanteneous, and not require > any modification to the layout of the filesystem at all. > Oh, I had no idea about this discussion :) > Mind you, that's not the reason for that line of development - it's > all about integrated snapshots in XFS. We essentially get > grow/shrink for free with that infrastructure.... > I suppose LSF will be the place for that design discussion. > I'm not quite ready to publish the docco yet - need to get all my > ducks in a line first - but if it does work out as a feasible line > of development, then the old "shrink" method is essentially a dead > end. > > However, don't let that stop you working towards shrink, because > there is infrastructure that it requires that we need for other > things as well. Take you pick: > > - parent pointers > - AG state control > - ranged bulkstat call (e.g. AG range) > - allocation location control from userspace > (which may tie in to AG state control) > - Atomic inode location swaps > > > http://oss.sgi.com/archives/xfs/2014-01/msg00263.html > > But it's worth reading the entire discussion starting here because > it start with a summary of the different approaches taken and why > they were rejected: > > http://oss.sgi.com/archives/xfs/2014-01/msg00224.html > > Cheers, > Yep, I can work on that stuff, thanks for pointing me up the parent inodes discussion. I'll try to show up with something soon. Cheers -- Carlos From bfoster@redhat.com Mon Feb 16 07:41:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABF957F4E for ; Mon, 16 Feb 2015 07:41:32 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B97B8F804B for ; Mon, 16 Feb 2015 05:41:29 -0800 (PST) X-ASG-Debug-ID: 1424094087-04bdf06a5c3baa50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ejbo7qVGlMoaFAnX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Feb 2015 05:41:28 -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 (8.14.4/8.14.4) with ESMTP id t1GDfPBS016830 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 16 Feb 2015 08:41:25 -0500 Received: from laptop.bfoster (vpn-57-91.rdu2.redhat.com [10.10.57.91]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1GDfMsf005608 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 16 Feb 2015 08:41:24 -0500 Date: Mon, 16 Feb 2015 08:41:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Message-ID: <20150216134121.GC9234@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423782857-11800-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424094088 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Feb 13, 2015 at 10:14:17AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Test generic/224 is failing with a corruption being detected on one > of Michael's test boxes. Debug that Michael added is indicating > that the minleft trimming is resulting in an underflow: > > ..... > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > before goto out_nominleft: rlen 1 args->len 0 > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > after fixup: rlen 1 args->len 1 > before fixup: rlen 1 args->len 0 > after xfs_alloc_fix_len : rlen 1 args->len 1 > after fixup: rlen 4294967295 args->len 4294967295 > XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 > > The "goto out_nominleft:" indicates that we are getting close to > ENOSPC in the AG, and a couple of allocations later we underflow > and the corruption check fires in xfs_alloc_ag_vextent_size(). > > The issue is that the extent length fixups comaprisons are done > with variables of xfs_extlen_t types. These are unsigned so an > underflow looks like a really big value and hence is not detected > as being smaller than the minimum length allowed for the extent. > Hence the corruption check fires as it is noticing that the returned > length is longer than the original extent length passed in. > > This can be easily fixed by ensuring we do the underflow test on > signed values, the same way xfs_alloc_fix_len() prevents underflow. > So we realise in future that these casts prevent underflows from > going undetected, add comments to the code indicating this. > > Reported-by: Michael L. Semon > Tested-by: Michael L. Semon > Signed-off-by: Dave Chinner > --- Looks fine to me: Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_alloc.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 710554c..41e3630 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -260,6 +260,7 @@ xfs_alloc_fix_len( > rlen = rlen - (k - args->mod); > else > rlen = rlen - args->prod + (args->mod - k); > + /* casts to (int) catch length underflows */ > if ((int)rlen < (int)args->minlen) > return; > ASSERT(rlen >= args->minlen && rlen <= args->maxlen); > @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( > if (diff >= 0) > return 1; > args->len += diff; /* shrink the allocated space */ > - if (args->len >= args->minlen) > + /* casts to (int) catch length underflows */ > + if ((int)args->len >= (int)args->minlen) > return 1; > args->agbno = NULLAGBLOCK; > return 0; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From alexander.tsvetkov@oracle.com Mon Feb 16 07:53:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 61ECD7F4E for ; Mon, 16 Feb 2015 07:53:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AE71304039 for ; Mon, 16 Feb 2015 05:53:58 -0800 (PST) X-ASG-Debug-ID: 1424094836-04cbb01162393df0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id iIavDgQxraDYXYk4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Feb 2015 05:53:56 -0800 (PST) X-Barracuda-Envelope-From: alexander.tsvetkov@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 t1GDrrtg018103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 16 Feb 2015 13:53:54 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id t1GDrrfW028122 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 16 Feb 2015 13:53:53 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1GDrqRs024964; Mon, 16 Feb 2015 13:53:52 GMT Received: from [10.162.81.109] (/10.162.81.109) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 16 Feb 2015 05:53:52 -0800 Message-ID: <54E1F6C2.4060105@oracle.com> Date: Mon, 16 Feb 2015 16:55:14 +0300 From: Alexander Tsvetkov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandee , xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> <20150211205406.GT4251@dastard> <54DC940D.4030009@oracle.com> <20150212230940.GD12722@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log In-Reply-To: <20150212230940.GD12722@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed 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: 1424094836 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 02/13/2015 02:09 AM, Dave Chinner wrote: > On Thu, Feb 12, 2015 at 02:52:45PM +0300, Alexander Tsvetkov wrote: >> On 02/11/2015 11:54 PM, Dave Chinner wrote: >>> On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: >>>> Hello, >>>> >>>> I've obtained corrupted xfs log after some sanity xfs testing: >>>> >>>> "log=logfile >>>> log_size=855 >>>> >>>> dd if=/dev/zero "of=$log" bs=4096 count=$log_size >>>> loopdev=$(losetup -f) >>>> losetup $loopdev $log >>>> >>>> mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV >>>> mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT >>>> ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT >>>> sync >>>> umount $SCRATCH_MNT >>>> >>>> xfs_logprint -l $loopdev $SCRATCH_DEV" >>>> >>>> Test makes crc enabled xfs filesystem with the external log of >>>> minimal allowed size and then creates on this fs the small directory >>>> tree >>>> with sub directories and files of fixed depth and size with help of >>>> fdtree utility: >>>> https://computing.llnl.gov/?set=code&page=sio_downloads >>> Just take metadump image and put it somewhere we can down load it. >>> >>>> After that xfs_logprint stably reports bad data in log: > Please try the patch below, it fixes the problem on the image you > provided. I've restored provided image to filesystem with the same log file, applied patch to latest xfsprogs and have stable pass runs of xfs_logprint on that filesystem and running with xfsprogs without this patch results to xfs_logprint segfaults reported that means patch is working. The problem that it is not working for repeated test runs where xfs_logprint still continue to report bad log data. It seems it is working for some cases including this image, because sometimes test can be passed but most part of test runs have still this xfs_logprint log error. Here is another fs image that is still failed for me with patch applied to xfsprogs: https://drive.google.com/file/d/0B1Cg0_B_ui2gM1Bzdkc3TWVqbGM/view?usp=sharing > Cheers, > > Dave. Thanks, Alexander Tsvetkov From bfoster@redhat.com Mon Feb 16 08:10:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F2D2A7F4E for ; Mon, 16 Feb 2015 08:10:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA03E8F804C for ; Mon, 16 Feb 2015 06:10:44 -0800 (PST) X-ASG-Debug-ID: 1424095843-04cb6c6b093dccc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6c9ONBqwD5VyTSv0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Feb 2015 06:10:43 -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 (8.14.4/8.14.4) with ESMTP id t1GEAfOU015472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 16 Feb 2015 09:10:41 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1GEAfTh018428; Mon, 16 Feb 2015 09:10:41 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 39ABA1256B4; Mon, 16 Feb 2015 09:10:40 -0500 (EST) Date: Mon, 16 Feb 2015 09:10:40 -0500 From: Brian Foster To: Pablo Silva Cc: xfs@oss.sgi.com Subject: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c Message-ID: <20150216141039.GA48651@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424095843 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote: > Hi ! > > We have a server with centos 6.6, kernel version: > 2.6.32-431.17.1.el6.x86_64, where we got the following message: > > Feb 12 19:22:15 vtl kernel: > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted > 2.6.32-431.17.1.el6.x86_64 #1 > Feb 12 19:22:15 vtl kernel: Call Trace: > Feb 12 19:22:15 vtl kernel: [] ? > xfs_error_report+0x3f/0x50 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_dialloc+0x43e/0x850 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? > kmem_zone_zalloc+0x3a/0x50 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? > xfs_dir_ialloc+0x74/0x2b0 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_create+0x440/0x640 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_vn_mknod+0xad/0x1c0 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? xfs_vn_create+0x10/0x20 [xfs] > Feb 12 19:22:15 vtl kernel: [] ? vfs_create+0xe6/0x110 > Feb 12 19:22:15 vtl kernel: [] ? do_filp_open+0xa8e/0xd20 > Feb 12 19:22:15 vtl kernel: [] ? alloc_fd+0x92/0x160 > Feb 12 19:22:15 vtl kernel: XFS: Internal error > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. > Caller 0xffffffffa0422980 > /* * None left in the last group, search the whole AG */ error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); for (;;) { error = xfs_inobt_get_rec(cur, &rec, &i); if (error) goto error0; XFS_WANT_CORRUPTED_GOTO(i == 1, error0); if (rec.ir_freecount > 0) break; error = xfs_btree_increment(cur, 0, &i); if (error) goto error0; ---> XFS_WANT_CORRUPTED_GOTO(i == 1, error0); } That corresponds to the check above. This code is part of the inode allocator where we expect an AG to have free inodes and we're doing a brute force search for a record. Apparently we go off the AG or some other problem occurs before we find a free inode record. Does 'xfs_repair -n' report any problems with this fs? Have there been any other storage errors reported in the logs? Is the problem reproducible or was it a one off occurrence? Brian > I can't find more information for this..., perhaps a bug or other > thing ..., welcome any hint for to research.. > > Thanks in advance! > > -Pablo > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From somdeepdey10@gmail.com Mon Feb 16 08:20:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 099B07F3F for ; Mon, 16 Feb 2015 08:20:55 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E46578F8050 for ; Mon, 16 Feb 2015 06:20:54 -0800 (PST) X-ASG-Debug-ID: 1424096450-04cb6c6b0a3ddad0001-NocioJ Received: from mail-la0-f49.google.com (mail-la0-f49.google.com [209.85.215.49]) by cuda.sgi.com with ESMTP id dR9s4ENuvYsSkTRP (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 06:20:51 -0800 (PST) X-Barracuda-Envelope-From: somdeepdey10@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] Received: by labgq15 with SMTP id gq15so29080005lab.3 for ; Mon, 16 Feb 2015 06:20:50 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=yaGApVjeN1FyfTKIc0NnNSy9JjwiZEbrToGaOOpgtFo=; b=vtfThYw3B85yDf+KnWAgMhB3C5KWhPATSNz2xAryor8KAn0+Jg1PFf7vh17pZh1AhA p71R2qQUYmMS4PAFR+EM547QHxbLkER+tlh7Q64L7pjK+zUGQoX/a3jqlV34u9Hgmnqz 3jyTfpDjQmK5KE6ph8pJ/6uPanwiwDQYHg21y+BBN6ysudsn7nzL95SyR5vky4z14cYy 8duatiSEyywa4ZVuZB5FCAq+eei+wcHCcu3RJ+nOcJFjyBQ3rheKE3R6yBiWD/n3P501 AtQ7XmQxPDBtoZj+5O3ygypscQhH/QB6U4K4LdJ+4xqS31+NU0QnrJulHsTzi/M4kHCV xaQw== MIME-Version: 1.0 X-Received: by 10.152.21.5 with SMTP id r5mr2838104lae.24.1424096450382; Mon, 16 Feb 2015 06:20:50 -0800 (PST) Received: by 10.25.42.137 with HTTP; Mon, 16 Feb 2015 06:20:50 -0800 (PST) In-Reply-To: References: <20150204195555.GR6282@dastard> Date: Mon, 16 Feb 2015 19:50:50 +0530 Message-ID: Subject: Re: Mails sent to the XFS mailing list From: Somdeep Dey X-ASG-Orig-Subj: Re: Mails sent to the XFS mailing list To: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f49.google.com[209.85.215.49] X-Barracuda-Start-Time: 1424096451 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, We have sent a RFD mail on the mailing list about the current task that we are doing: defragmenting parts of a file. (Haven't got a response yet) http://oss.sgi.com/archives/xfs/2015-02/msg00264.html We were actually stuck on a logical aspect, of how to go ahead performing defragmentation without creating a temporary file, and then copy extents to it. ----------------------------------------------------------------------------------------------------- File: fsr/xfs_fsr.c In fsr/xfs_fsr.c code , we also had a doubt about how to modify the number of extents for the temp file getting created. Line 1321 onwards: It would be of great help if u could shed some light on the ioctl's - XFS_IOC_UNRESVSP64 and XFS_IOC_RESVSP64, We took a test case where a file had 3 extents. The for loop at line 1321 now had nextents value as 1 (i.e ideal extent count 1) and outmap[extent].bmv_length was addition of all blocks, i.e. outmap[ ] array had one index (for 1 ideal extent) After that we tried running a defragmentation test, by making read_fd_bmap() function return nextents value as 2, and subsequently made outmap[ ] have two entries instead of one. However the temp file that got created (Line 1321 onwards) still had new_nextents as 1 (Line 1382) instead of having 2. Any thoughts ? :) Regards, A-DRS From linkinjeon@gmail.com Mon Feb 16 09:48:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 0D8117F4E for ; Mon, 16 Feb 2015 09:48:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 80E3EAC001 for ; Mon, 16 Feb 2015 07:48:40 -0800 (PST) X-ASG-Debug-ID: 1424101718-04cbb0116339dee0001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id I4Ys6AV8wYOTg4a4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:48:38 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjz10 with SMTP id z10so36632464pdj.12 for ; Mon, 16 Feb 2015 07:48:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=MqcrjWBqMiszn6LMQz71fC6Io4pC1UoHKru14CZ6Ahw=; b=YbdOa2MJWLih84bWheNkBA/RzNW+LtuS5FgYUygJedxhmjq7gClUaVRNtoIfc/UL2q qtx7xL+zi2+IQfIjrMN7yOcrCzrWqs2a+K555uTFlC6WVPhjqzdZ9Orxcb3jW2UYHvAB H2z3bx7kXhqVzdCHIjqrwXU6RhtW20QoMA8nV2vgnN9Q9vSLbeOHtQkBHS0tpXf4GjGx tY59ntmQPUG1ojuov/pS/zak9ZptT/q7KVCQlUyMWdcrHaxRRzNo1cut9a8H+Ptxud2U OwlLqStcuQiIhjkN1WYUTFPw7ES9M2V6GbTaFF5+hH1M5RiyrOeTczUfut5aHiayIEWK rVzw== X-Received: by 10.70.89.129 with SMTP id bo1mr41005156pdb.129.1424101717873; Mon, 16 Feb 2015 07:48:37 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.48.31 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:48:36 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 0/12] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 00:47:47 +0900 X-ASG-Orig-Subj: [PATCH RESEND 0/12] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1424101718 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon In continuation of the work of making the process of non linear editing of media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE for fallocate. This flag will work opposite to the FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will create new space inside file by inserting a hole within the range specified by offset and len. User can write new data in this space. e.g. ads. Like collapse range, currently we have the limitation that offset and len should be block size aligned for both XFS and Ext4. The semantics of the flag are : 1) It creates space within file by inserting a hole of len bytes starting at offset byte without overwriting any existing data. All the data blocks from offset to EOF are shifted towards right to make hole space. 2) It should be used exclusively. No other fallocate flag in combination. 3) Offset and length supplied to fallocate should be fs block size aligned in case of xfs and ext4. 4) Insert range does not work for the case when offset is overlapping/beyond i_size. If the user wants to insert space at the end of file they are advised to use either ftruncate(2) or fallocate(2) with mode 0. 5) It increses the size of file by len bytes. Namjae Jeon (12): fs: Add support FALLOC_FL_INSERT_RANGE for fallocate xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE xfstests: generic/042: Standard insert range tests xfstests: generic/043: Delayed allocation insert range xfstests: generic/044: Multi insert range tests xfstests: generic/045: Delayed allocation multi insert xfstests: generic/046: Test multiple fallocate insert/collapse range calls xfstests: fsstress: Add fallocate insert range operation xfstests: fsx: Add fallocate insert range operation manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:48:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E31F7F55 for ; Mon, 16 Feb 2015 09:48:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D31A304043 for ; Mon, 16 Feb 2015 07:48:47 -0800 (PST) X-ASG-Debug-ID: 1424101725-04cbb0116439df10001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id qyT2kgqRmVpeftZR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:48:46 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdev10 with SMTP id v10so36672436pde.7 for ; Mon, 16 Feb 2015 07:48:45 -0800 (PST) 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=zKDoejhWRj2a05GaJ3cFA4wG/P5rvQfx3tnGmPwmAyE=; b=AkcD7Ls8Rhq0Zsp+DXWrJYwA8T1dzs0019cDX3K2J7ThqO+vxYeoImBZ03hGHWVUQj /42K0JNmL04m6MAOeLd7elhDPys1TXAKsPV6+oCT5VXwzjc7AwklvBhP3EHMqYVe//IR 2h9PlmU4HbmBVycOXST5M8scnvEK8/sNDK2R9PnFX2b+C7OIKuUlz3v/9bW7oBybs284 OyR1hM4Dyn8FJaIzGJf3FRN01WNUybqHUB+MnrsL+BTMNnEdxUuSapDS6MjoIZOq2HoQ btzl6LS54GJwOD+KtALwgbB1B9SVcIZ3bRMb4Gfnv1H4WCac4+0R+JKQY1edi+mgRuv/ svkQ== X-Received: by 10.70.34.14 with SMTP id v14mr41551116pdi.132.1424101725861; Mon, 16 Feb 2015 07:48:45 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.48.41 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:48:44 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 00:47:48 +0900 X-ASG-Orig-Subj: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424101680-3301-2-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1424101726 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Cc: Brian Foster --- fs/open.c | 8 +++++++- include/uapi/linux/falloc.h | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/fs/open.c b/fs/open.c index 813be03..762fb45 100644 --- a/fs/open.c +++ b/fs/open.c @@ -232,7 +232,8 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +251,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..3e445a7 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,21 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to insert space within the file size without + * overwriting any existing data. The contents of the file beyond offset are + * shifted towards right by len bytes to create a hole. As such, this + * operation will increase the size of the file by len bytes. + * + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * + * Attempting to insert space using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:48:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F3E0E7F59 for ; Mon, 16 Feb 2015 09:48:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A889D304043 for ; Mon, 16 Feb 2015 07:48:54 -0800 (PST) X-ASG-Debug-ID: 1424101731-04bdf06a593c58d0001-NocioJ Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by cuda.sgi.com with ESMTP id SuBuLBZglxLmAEWL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:48:51 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdev10 with SMTP id v10so36640765pde.10 for ; Mon, 16 Feb 2015 07:48:51 -0800 (PST) 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=6XCWiuelibUtMSMMPcs5GXgWue0/dHgvpihokA3B8r4=; b=Cwpe77ny+AkEUzTcYTGj/5PdLx2Gt3Llgn41PVMpQrOzb8tI4TeLbOXkYfwq5MAEdT gaJ+bTEjHfZGSnBKXYVVntVMfyJNW51OKOcT9k5LNRL+8IaYzPY510FGtgJkoNV9tQaq Eirs2+Zf6xeZT9W4R7xUZtA1gKG/AfZTHyWadbzF2yUDLfOxOiiyFZpqMZ/OtGmdhLbK KwaDWM8vZbTCeByDg01Op0at9sKOu3sMl61w4jaexs8DwC2BUdBz+COzUZfgVB6oFOhj KekAF/UOGDQdaGfl60BheNhRVq1PWqYwUwjguyd+ILsXXiCMVnyUEBdSNqT51KHuTBlH 6ZYA== X-Received: by 10.70.31.197 with SMTP id c5mr41033359pdi.93.1424101731442; Mon, 16 Feb 2015 07:48:51 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.48.47 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:48:50 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 00:47:49 +0900 X-ASG-Orig-Subj: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424101680-3301-3-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f181.google.com[209.85.192.181] X-Barracuda-Start-Time: 1424101731 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 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 From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 358 ++++++++++++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_bmap.h | 13 +- fs/xfs/xfs_bmap_util.c | 126 +++++++++++----- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 38 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 455 insertions(+), 83 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015..6699e53 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5518,50 +5518,86 @@ xfs_bmse_shift_one( int *current_ext, struct xfs_bmbt_rec_host *gotp, struct xfs_btree_cur *cur, - int *logflags) + int *logflags, + enum SHIFT_DIRECTION SHIFT) { struct xfs_ifork *ifp; xfs_fileoff_t startoff; - struct xfs_bmbt_rec_host *leftp; + struct xfs_bmbt_rec_host *contp; struct xfs_bmbt_irec got; - struct xfs_bmbt_irec left; + struct xfs_bmbt_irec cont; int error; int i; + int total_extents; ifp = XFS_IFORK_PTR(ip, whichfork); + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); xfs_bmbt_get_all(gotp, &got); - startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); - /* - * Check for merge if we've got an extent to the left, otherwise make - * sure there's enough room at the start of the file for the shift. - */ - if (*current_ext) { - /* grab the left extent and check for a large enough hole */ - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); - xfs_bmbt_get_all(leftp, &left); + if (SHIFT == SHIFT_LEFT) { + startoff = got.br_startoff - offset_shift_fsb; - if (startoff < left.br_startoff + left.br_blockcount) + /* + * Check for merge if we've got an extent to the left, + * otherwise make sure there's enough room at the start + * of the file for the shift. + */ + if (*current_ext) { + /* + * grab the left extent and check for a large + * enough hole. + */ + contp = xfs_iext_get_ext(ifp, *current_ext - 1); + xfs_bmbt_get_all(contp, &cont); + + if (startoff < cont.br_startoff + cont.br_blockcount) + return -EINVAL; + + /* check whether to merge the extent or shift it down */ + if (xfs_bmse_can_merge(&cont, &got, offset_shift_fsb)) { + return xfs_bmse_merge(ip, whichfork, + offset_shift_fsb, + *current_ext, gotp, contp, + cur, logflags); + } + } else if (got.br_startoff < offset_shift_fsb) return -EINVAL; + } else { + startoff = got.br_startoff + offset_shift_fsb; + /* + * If this is not the last extent in the file, make sure there's + * enough room between current extent and next extent for + * accommodating the shift. + */ + if (*current_ext < (total_extents - 1)) { + contp = xfs_iext_get_ext(ifp, *current_ext + 1); + xfs_bmbt_get_all(contp, &cont); + if (startoff + got.br_blockcount > cont.br_startoff) + return -EINVAL; - /* check whether to merge the extent or shift it down */ - if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { - return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, - *current_ext, gotp, leftp, cur, - logflags); + /* + * Unlike a left shift (which involves a hole punch), + * a right shift does not modify extent neighbors + * in any way. We should never find mergeable extents + * in this scenario. Check anyways and warn if we + * encounter two extents that could be one. + */ + if (xfs_bmse_can_merge(&got, &cont, offset_shift_fsb)) + WARN_ON_ONCE(1); } - } else if (got.br_startoff < offset_shift_fsb) - return -EINVAL; - + } /* * Increment the extent index for the next iteration, update the start * offset of the in-core extent and update the btree if applicable. */ - (*current_ext)++; + if (SHIFT == SHIFT_LEFT) + (*current_ext)++; + else + (*current_ext)--; xfs_bmbt_set_startoff(gotp, startoff); *logflags |= XFS_ILOG_CORE; if (!cur) { @@ -5581,10 +5617,10 @@ xfs_bmse_shift_one( } /* - * Shift extent records to the left to cover a hole. + * Shift extent records to the left/right to cover/create a hole. * * The maximum number of extents to be shifted in a single operation is - * @num_exts. @start_fsb specifies the file offset to start the shift and the + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb * is the length by which each extent is shifted. If there is no hole to shift * the extents into, this will be considered invalid operation and we abort @@ -5594,12 +5630,13 @@ int xfs_bmap_shift_extents( struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, int *done, - xfs_fileoff_t *next_fsb, + xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + enum SHIFT_DIRECTION SHIFT, int num_exts) { struct xfs_btree_cur *cur = NULL; @@ -5609,10 +5646,11 @@ xfs_bmap_shift_extents( struct xfs_ifork *ifp; xfs_extnum_t nexts = 0; xfs_extnum_t current_ext; + xfs_extnum_t total_extents; + xfs_extnum_t stop_extent; int error = 0; int whichfork = XFS_DATA_FORK; int logflags = 0; - int total_extents; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5628,6 +5666,7 @@ xfs_bmap_shift_extents( ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS)) { @@ -5645,43 +5684,85 @@ xfs_bmap_shift_extents( } /* + * There may be delalloc extents in the data fork before the range we + * are collapsing out, so we cannot use the count of real extents here. + * Instead we have to calculate it from the incore fork. + */ + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (total_extents == 0) { + *done = 1; + goto del_cursor; + } + + /* + * In case of first right shift, we need to initialize next_fsb + */ + if (*next_fsb == NULLFSBLOCK) { + ASSERT(SHIFT == SHIFT_RIGHT); + gotp = xfs_iext_get_ext(ifp, total_extents - 1); + xfs_bmbt_get_all(gotp, &got); + *next_fsb = got.br_startoff; + if (stop_fsb > *next_fsb) { + *done = 1; + goto del_cursor; + } + } + + /* Lookup the extent index at which we have to stop */ + if (SHIFT == SHIFT_RIGHT) { + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); + /* Make stop_extent exclusive of shift range */ + stop_extent--; + } else + stop_extent = total_extents; + + /* * Look up the extent index for the fsb where we start shifting. We can * henceforth iterate with current_ext as extent list changes are locked * out via ilock. * * gotp can be null in 2 cases: 1) if there are no extents or 2) - * start_fsb lies in a hole beyond which there are no extents. Either + * *next_fsb lies in a hole beyond which there are no extents. Either * way, we are done. */ - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); if (!gotp) { *done = 1; goto del_cursor; } - /* - * There may be delalloc extents in the data fork before the range we - * are collapsing out, so we cannot use the count of real extents here. - * Instead we have to calculate it from the incore fork. - */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - while (nexts++ < num_exts && current_ext < total_extents) { + /* some sanity checking before we finally start shifting extents */ + if ((SHIFT == SHIFT_LEFT && current_ext >= stop_extent) || + (SHIFT == SHIFT_RIGHT && current_ext <= stop_extent)) { + error = EIO; + goto del_cursor; + } + + while (nexts++ < num_exts) { error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, - ¤t_ext, gotp, cur, &logflags); + ¤t_ext, gotp, cur, &logflags, + SHIFT); if (error) goto del_cursor; + /* + * In case there was an extent merge after shifting extent, + * extent numbers would change. + * Update total extent count and grab the next record. + */ + if (SHIFT == SHIFT_LEFT) { + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + stop_extent = total_extents; + } - /* update total extent count and grab the next record */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - if (current_ext >= total_extents) + if (current_ext == stop_extent) { + *done = 1; + *next_fsb = NULLFSBLOCK; break; + } gotp = xfs_iext_get_ext(ifp, current_ext); } - /* Check if we are done */ - if (current_ext == total_extents) { - *done = 1; - } else if (next_fsb) { + if (!*done) { xfs_bmbt_get_all(gotp, &got); *next_fsb = got.br_startoff; } @@ -5696,3 +5777,192 @@ del_cursor: return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be split. @split_fsb is a block where the extents is split. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur = NULL; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* split extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + xfs_extnum_t current_ext; + int error = 0; + int logflags = 0; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + + logflags = XFS_ILOG_CORE; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } else + logflags |= XFS_ILOG_DEXT; + + /* Add new extent */ + current_ext++; + xfs_iext_insert(ip, current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) { + cur->bc_private.b.allocated = 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + } + + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, + &firstfsb, &free_list); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return error; +} diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index b9d8a49..6ed6cd1 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -166,6 +166,11 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) */ #define XFS_BMAP_MAX_SHIFT_EXTENTS 1 +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + #ifdef DEBUG void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int whichfork, unsigned long caller_ip); @@ -211,8 +216,10 @@ int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, - int *done, xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, - struct xfs_bmap_free *flist, int num_exts); + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, + int *done, xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, enum SHIFT_DIRECTION SHIFT, + int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 22a5dcb..841744c 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1376,22 +1376,19 @@ out: } /* - * xfs_collapse_file_space() - * This routine frees disk space and shift extent for the given file. - * The first thing we do is to free data blocks in the specified range - * by calling xfs_free_file_space(). It would also sync dirty data - * and invalidate page cache over the region on which collapse range - * is working. And Shift extent records to the left to cover a hole. - * RETURNS: - * 0 on success - * errno on error - * + * @next_fsb will keep track of the extent currently undergoing shift. + * @stop_fsb will keep track of the extent at which we have to stop. + * If we are shifting left, we will start with block (offset + len) and + * shift each extent till last extent. + * If we are shifting right, we will start with last extent inside file space + * and continue until we reach the block corresponding to offset. */ int -xfs_collapse_file_space( - struct xfs_inode *ip, - xfs_off_t offset, - xfs_off_t len) +xfs_shift_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len, + enum SHIFT_DIRECTION SHIFT) { int done = 0; struct xfs_mount *mp = ip->i_mount; @@ -1400,21 +1397,26 @@ xfs_collapse_file_space( struct xfs_bmap_free free_list; xfs_fsblock_t first_block; int committed; - xfs_fileoff_t start_fsb; + xfs_fileoff_t stop_fsb; xfs_fileoff_t next_fsb; xfs_fileoff_t shift_fsb; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); - trace_xfs_collapse_file_space(ip); + if (SHIFT == SHIFT_LEFT) { + next_fsb = XFS_B_TO_FSB(mp, offset + len); + stop_fsb = XFS_B_TO_FSB(mp, VFS_I(ip)->i_size); + } else { + /* + * If right shift, delegate the work of initialization of + * next_fsb to xfs_bmap_shift_extent as it has ilock held. + */ + next_fsb = NULLFSBLOCK; + stop_fsb = XFS_B_TO_FSB(mp, offset); + } - next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); - error = xfs_free_file_space(ip, offset, len); - if (error) - return error; - /* * Trim eofblocks to avoid shifting uninitialized post-eof preallocation * into the accessible region of the file. @@ -1427,20 +1429,23 @@ xfs_collapse_file_space( /* * Writeback and invalidate cache for the remainder of the file as we're - * about to shift down every extent from the collapse range to EOF. The - * free of the collapse range above might have already done some of - * this, but we shouldn't rely on it to do anything outside of the range - * that was freed. + * about to shift down every extent from offset to EOF. */ error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - offset + len, -1); + offset, -1); if (error) return error; error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - (offset + len) >> PAGE_CACHE_SHIFT, -1); + offset >> PAGE_CACHE_SHIFT, -1); if (error) return error; + if (SHIFT == SHIFT_RIGHT) { + error = xfs_bmap_split_extent(ip, stop_fsb); + if (error) + return error; + } + while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); /* @@ -1464,7 +1469,7 @@ xfs_collapse_file_space( if (error) goto out; - xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_bmap_init(&free_list, &first_block); @@ -1472,10 +1477,9 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - start_fsb = next_fsb; - error = xfs_bmap_shift_extents(tp, ip, start_fsb, shift_fsb, - &done, &next_fsb, &first_block, &free_list, - XFS_BMAP_MAX_SHIFT_EXTENTS); + error = xfs_bmap_shift_extents(tp, ip, &next_fsb, shift_fsb, + &done, stop_fsb, &first_block, &free_list, + SHIFT, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; @@ -1484,18 +1488,70 @@ xfs_collapse_file_space( goto out; error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_iunlock(ip, XFS_ILOCK_EXCL); } return error; out: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } /* + * xfs_collapse_file_space() + * This routine frees disk space and shift extent for the given file. + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. And Shift extent records to the left to cover a hole. + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + int error; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_collapse_file_space(ip); + + error = xfs_free_file_space(ip, offset, len); + if (error) + return error; + + return xfs_shift_file_space(ip, offset, len, SHIFT_LEFT); +} + +/* + * xfs_insert_file_space() + * This routine create hole space by shifting extents for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. + * RETURNS: + * 0 on success + * errno on error + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + return xfs_shift_file_space(ip, offset, len, SHIFT_RIGHT); +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 736429a..af97d9a 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -63,6 +63,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1cdba95..222a91a 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -823,11 +823,13 @@ xfs_file_fallocate( long error; enum xfs_prealloc_flags flags = 0; loff_t new_size = 0; + int do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -857,6 +859,28 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + + new_size = i_size_read(inode) + len; + do_file_insert = 1; } else { flags |= XFS_PREALLOC_SET; @@ -891,8 +915,20 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Some operations are performed after the inode size is updated. For + * example, insert range expands the address space of the file, shifts + * all subsequent extents to create a hole inside the file. Updating + * the size first ensures that shifted extents aren't left hanging + * past EOF in the event of a crash or failure. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); return error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..7e45fa1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -664,6 +664,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:48:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B9F0B7F4E for ; Mon, 16 Feb 2015 09:48:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8B4C8F8040 for ; Mon, 16 Feb 2015 07:48:59 -0800 (PST) X-ASG-Debug-ID: 1424101737-04cb6c6b0c3e84d0001-NocioJ Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id KWhcZRcHwosH1X0b (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:48:57 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfp1 with SMTP id fp1so32401766pdb.5 for ; Mon, 16 Feb 2015 07:48:57 -0800 (PST) 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=U4Ud89Ic8ckuaNYhSFVSMGALQS0OlEH9uD1ikmD93BA=; b=bCu54na4dSSTSNDtLWpsHgWW8Z5U80r++E+SgRPj9bpOP0nN90FTU7iqBjffsVfiy/ RmrXekVs1wHUVsYYOJj92c7kcGo/mur/gsI9A6K1qyQHPiJBdlwXAOV6vo9eYj7/WMr0 5VmaBPSKQed5YbGnQbdnWkj71425EFU4ArObtxxa+liJGK1LeQROl/jLkdwnSosFSqM3 Mwpoi5rkSz97AmY7kJMhqSVeYzdcwhK94pWm+5PDxMmJGZBnjAxIRJ5OPMxyZ/ajxCt/ fj8teRzfIpzn5QDpkm+jKMrOjBBYxoK3Ba70oWqTI1svG71K2JS6RPpWkm+FLupcQktd LSeQ== X-Received: by 10.70.12.162 with SMTP id z2mr2632862pdb.7.1424101737090; Mon, 16 Feb 2015 07:48:57 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.48.53 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:48:56 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 00:47:50 +0900 X-ASG-Orig-Subj: [PATCH RESEND 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424101680-3301-4-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1424101737 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 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 From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 6 + fs/ext4/extents.c | 302 +++++++++++++++++++++++++++++++++++-------- include/trace/events/ext4.h | 25 ++++ 3 files changed, 282 insertions(+), 51 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 98ee89c..6db57e6 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -90,6 +90,11 @@ typedef __u32 ext4_lblk_t; /* data type for block group number */ typedef unsigned int ext4_group_t; +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + /* * Flags used in mballoc's allocation_context flags field. * @@ -2766,6 +2771,7 @@ extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); +extern int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len); extern int ext4_swap_extents(handle_t *handle, struct inode *inode1, struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2, ext4_lblk_t count, diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index bed4308..a07b109 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4924,7 +4924,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) @@ -4944,6 +4945,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (mode & FALLOC_FL_COLLAPSE_RANGE) return ext4_collapse_range(inode, offset, len); + if (mode & FALLOC_FL_INSERT_RANGE) + return ext4_insert_range(inode, offset, len); + if (mode & FALLOC_FL_ZERO_RANGE) return ext4_zero_range(file, offset, len, mode); @@ -5230,13 +5234,13 @@ ext4_access_path(handle_t *handle, struct inode *inode, /* * ext4_ext_shift_path_extents: * Shift the extents of a path structure lying between path[depth].p_ext - * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift - * from starting block for each extent. + * and EXT_LAST_EXTENT(path[depth].p_hdr), by @shift blocks. @SHIFT tells + * if it is right shift or left shift operation. */ static int ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, struct inode *inode, handle_t *handle, - ext4_lblk_t *start) + enum SHIFT_DIRECTION SHIFT) { int depth, err = 0; struct ext4_extent *ex_start, *ex_last; @@ -5258,19 +5262,25 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) update = 1; - *start = le32_to_cpu(ex_last->ee_block) + - ext4_ext_get_actual_len(ex_last); - while (ex_start <= ex_last) { - le32_add_cpu(&ex_start->ee_block, -shift); - /* Try to merge to the left. */ - if ((ex_start > - EXT_FIRST_EXTENT(path[depth].p_hdr)) && - ext4_ext_try_to_merge_right(inode, - path, ex_start - 1)) + if (SHIFT == SHIFT_LEFT) { + le32_add_cpu(&ex_start->ee_block, + -shift); + /* Try to merge to the left. */ + if ((ex_start > + EXT_FIRST_EXTENT(path[depth].p_hdr)) + && + ext4_ext_try_to_merge_right(inode, + path, ex_start - 1)) + ex_last--; + else + ex_start++; + } else { + le32_add_cpu(&ex_last->ee_block, shift); + ext4_ext_try_to_merge_right(inode, path, + ex_last); ex_last--; - else - ex_start++; + } } err = ext4_ext_dirty(handle, inode, path + depth); if (err) @@ -5285,7 +5295,10 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (err) goto out; - le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + if (SHIFT == SHIFT_LEFT) + le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + else + le32_add_cpu(&path[depth].p_idx->ei_block, shift); err = ext4_ext_dirty(handle, inode, path + depth); if (err) goto out; @@ -5303,19 +5316,20 @@ out: /* * ext4_ext_shift_extents: - * All the extents which lies in the range from start to the last allocated - * block for the file are shifted downwards by shift blocks. + * All the extents which lies in the range from @start to the last allocated + * block for the @inode are shifted either towards left or right (depending + * upon @SHIFT) by @shift blocks. * On success, 0 is returned, error otherwise. */ static int ext4_ext_shift_extents(struct inode *inode, handle_t *handle, - ext4_lblk_t start, ext4_lblk_t shift) + ext4_lblk_t start, ext4_lblk_t shift, + enum SHIFT_DIRECTION SHIFT) { struct ext4_ext_path *path; int ret = 0, depth; struct ext4_extent *extent; - ext4_lblk_t stop_block; - ext4_lblk_t ex_start, ex_end; + ext4_lblk_t stop, *iterator, ex_start, ex_end; /* Let path point to the last extent */ path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); @@ -5327,58 +5341,84 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, if (!extent) goto out; - stop_block = le32_to_cpu(extent->ee_block) + + stop = le32_to_cpu(extent->ee_block) + ext4_ext_get_actual_len(extent); - /* Nothing to shift, if hole is at the end of file */ - if (start >= stop_block) - goto out; + /* + * In case of left shift, Don't start shifting extents until we make + * sure the hole is big enough to accommodate the shift. + */ + if (SHIFT == SHIFT_LEFT) { + path = ext4_find_extent(inode, start - 1, &path, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + if (extent) { + ex_start = le32_to_cpu(extent->ee_block); + ex_end = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + ex_start = 0; + ex_end = 0; + } - /* - * Don't start shifting extents until we make sure the hole is big - * enough to accomodate the shift. - */ - path = ext4_find_extent(inode, start - 1, &path, 0); - if (IS_ERR(path)) - return PTR_ERR(path); - depth = path->p_depth; - extent = path[depth].p_ext; - if (extent) { - ex_start = le32_to_cpu(extent->ee_block); - ex_end = le32_to_cpu(extent->ee_block) + - ext4_ext_get_actual_len(extent); - } else { - ex_start = 0; - ex_end = 0; + if ((start == ex_start && shift > ex_start) || + (shift > start - ex_end)) { + ext4_ext_drop_refs(path); + kfree(path); + return -EINVAL; + } } - if ((start == ex_start && shift > ex_start) || - (shift > start - ex_end)) - return -EINVAL; + /* + * In case of left shift, iterator points to start and it is increased + * till we reach stop. In case of right shift, iterator points to stop + * and it is decreased till we reach start. + */ + if (SHIFT == SHIFT_LEFT) + iterator = &start; + else + iterator = &stop; /* Its safe to start updating extents */ - while (start < stop_block) { - path = ext4_find_extent(inode, start, &path, 0); + while (start < stop) { + path = ext4_find_extent(inode, *iterator, &path, 0); if (IS_ERR(path)) return PTR_ERR(path); depth = path->p_depth; extent = path[depth].p_ext; if (!extent) { EXT4_ERROR_INODE(inode, "unexpected hole at %lu", - (unsigned long) start); + (unsigned long) *iterator); return -EIO; } - if (start > le32_to_cpu(extent->ee_block)) { + if (SHIFT == SHIFT_LEFT && *iterator > + le32_to_cpu(extent->ee_block)) { /* Hole, move to the next extent */ if (extent < EXT_LAST_EXTENT(path[depth].p_hdr)) { path[depth].p_ext++; } else { - start = ext4_ext_next_allocated_block(path); + *iterator = ext4_ext_next_allocated_block(path); continue; } } + + if (SHIFT == SHIFT_LEFT) { + extent = EXT_LAST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + extent = EXT_FIRST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) > 0 ? + le32_to_cpu(extent->ee_block) - 1 : 0; + /* Update path extent in case we need to stop */ + while (le32_to_cpu(extent->ee_block) < start) + extent++; + path[depth].p_ext = extent; + } ret = ext4_ext_shift_path_extents(path, shift, inode, - handle, &start); + handle, SHIFT); if (ret) break; } @@ -5483,7 +5523,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) ext4_discard_preallocations(inode); ret = ext4_ext_shift_extents(inode, handle, punch_stop, - punch_stop - punch_start); + punch_stop - punch_start, SHIFT_LEFT); if (ret) { up_write(&EXT4_I(inode)->i_data_sem); goto out_stop; @@ -5508,6 +5548,166 @@ out_mutex: return ret; } +/* + * ext4_insert_range: + * This function implements the FALLOC_FL_INSERT_RANGE flag of fallocate. + * The data blocks starting from @offset to the EOF are shifted by @len + * towards right to create a hole in the @inode. Inode size is increased + * by len bytes. + * Returns 0 on success, error otherwise. + */ +int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + handle_t *handle; + struct ext4_ext_path *path; + struct ext4_extent *extent; + ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk = 0; + unsigned int credits, ee_len; + int ret = 0, depth, split_flag = 0; + loff_t ioffset; + + /* Insert range works only on fs block size aligned offsets. */ + if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) || + len & (EXT4_CLUSTER_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + trace_ext4_insert_range(inode, offset, len); + + offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb); + len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb); + + /* Call ext4_force_commit to flush all data in case of data=journal */ + if (ext4_should_journal_data(inode)) { + ret = ext4_force_commit(inode->i_sb); + if (ret) + return ret; + } + + /* + * Need to round down to align start offset to page size boundary + * for page size > block size. + */ + ioffset = round_down(offset, PAGE_SIZE); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, + LLONG_MAX); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { + ret = -EOPNOTSUPP; + goto out_mutex; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + ret = -EFBIG; + goto out_mutex; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + + truncate_pagecache(inode, ioffset); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + /* Expand file to avoid data loss if there is error while shifting */ + inode->i_size += len; + EXT4_I(inode)->i_disksize += len; + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_stop; + + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + path = ext4_find_extent(inode, offset_lblk, NULL, 0); + if (IS_ERR(path)) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + depth = ext_depth(inode); + extent = path[depth].p_ext; + if (extent) { + ee_start_lblk = le32_to_cpu(extent->ee_block); + ee_len = ext4_ext_get_actual_len(extent); + + /* + * If offset_lblk is not the starting block of extent, split + * the extent @offset_lblk + */ + if ((offset_lblk > ee_start_lblk) && + (offset_lblk < (ee_start_lblk + ee_len))) { + if (ext4_ext_is_unwritten(extent)) + split_flag = EXT4_EXT_MARK_UNWRIT1 | + EXT4_EXT_MARK_UNWRIT2; + ret = ext4_split_extent_at(handle, inode, &path, + offset_lblk, split_flag, + EXT4_EX_NOCACHE | + EXT4_GET_BLOCKS_PRE_IO | + EXT4_GET_BLOCKS_METADATA_NOFAIL); + } + + ext4_ext_drop_refs(path); + kfree(path); + if (ret < 0) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + } + + ret = ext4_es_remove_extent(inode, offset_lblk, + EXT_MAX_BLOCKS - offset_lblk); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + /* + * if offset_lblk lies in a hole which is at start of file, use + * ee_start_lblk to shift extents + */ + ret = ext4_ext_shift_extents(inode, handle, + ee_start_lblk > offset_lblk ? ee_start_lblk : offset_lblk, + len_lblk, SHIFT_RIGHT); + + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + +out_stop: + ext4_journal_stop(handle); +out_dio: + ext4_inode_resume_unlocked_dio(inode); +out_mutex: + mutex_unlock(&inode->i_mutex); + return ret; +} + /** * ext4_swap_extents - Swap extents between two inodes * diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 6e5abd6..2a89d66 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2478,6 +2478,31 @@ TRACE_EVENT(ext4_collapse_range, __entry->offset, __entry->len) ); +TRACE_EVENT(ext4_insert_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + TRACE_EVENT(ext4_es_shrink, TP_PROTO(struct super_block *sb, int nr_shrunk, u64 scan_time, int nr_skipped, int retried), -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 91E8B7F6A for ; Mon, 16 Feb 2015 09:49:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7085530405F for ; Mon, 16 Feb 2015 07:49:05 -0800 (PST) X-ASG-Debug-ID: 1424101743-04cbb0116439dfa0001-NocioJ Received: from mail-pd0-f180.google.com (mail-pd0-f180.google.com [209.85.192.180]) by cuda.sgi.com with ESMTP id xtqAc9dqkP44J2CY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:04 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjy10 with SMTP id y10so36669981pdj.6 for ; Mon, 16 Feb 2015 07:49:03 -0800 (PST) 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=XCztRdQGlXtPMWeh/XZLh4dB4PgcqH7jUe4CN9zVTRg=; b=hBWDzj92lj6PYtFiMBU1eE4onChiIMnqGs0cl8G22Q3DQNBnJ1CRZ5dGbAU5k+oeQU kisKjLHN/IM5ovuT/1VcaWaAtFUVJoaAmGK44Oulc3yPxZd+MuxFBwqr2wyMxju0OCuR LjUHzv6E0NVpztPeL1UsxTfMEqOqo+wvjdId0lqN5GwHtFc7ENtndNHfw03GdK8uSGpp yfpOf6r1eeQDLE+dPejAYX9Glhjl+EOt5JVfDj+J3Af3pgL0KZbo3TkwiHOsM3g2O3LU HJzuZXebhgzCDKiO85NIkRBCw5UPJxwIqKEyNha+4qpSEtI5vQ+ieyxFcrEs4y8AkzUI IIRg== X-Received: by 10.70.90.107 with SMTP id bv11mr40669177pdb.87.1424101743733; Mon, 16 Feb 2015 07:49:03 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.48.59 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:03 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Date: Tue, 17 Feb 2015 00:47:51 +0900 X-ASG-Orig-Subj: [PATCH RESEND 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-Id: <1424101680-3301-5-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f180.google.com[209.85.192.180] X-Barracuda-Start-Time: 1424101744 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man/man8/xfs_io.8 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index cf27b99..416206f 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the manual page to de-allocates blocks and eliminates the hole created in this process by shifting data blocks into the hole. .TP +.BI finsert " offset length" +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the +.BR fallocate (2) +manual page to create the hole by shifting data blocks. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 097F27F6C for ; Mon, 16 Feb 2015 09:49:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF1ED304043 for ; Mon, 16 Feb 2015 07:49:10 -0800 (PST) X-ASG-Debug-ID: 1424101748-04bdf06a593c5950001-NocioJ Received: from mail-pd0-f175.google.com (mail-pd0-f175.google.com [209.85.192.175]) by cuda.sgi.com with ESMTP id WJHkCUxT0r3pgiAA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:09 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfp1 with SMTP id fp1so36636379pdb.9 for ; Mon, 16 Feb 2015 07:49:08 -0800 (PST) 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=xovo+Ln68OET0o17FzTJB6/NEnbMBaGnvyHVWzoLKlE=; b=Lcasm1e7FbWmoMK8uJPUIyBbtKXwx7UKxR7xsEdyGJ6QQGDlCeUlQT6Lwk8yKrcXur SRrkfG8cBXyKtgUe2x5HPfKYOH0+/fSryCgfU1tpQxzJpoA8iVS03iIagnpiQGx8bLPF dPlVY/7TJjXxA43F4QOxp86Viu0SMk/WChYfbhGozxyX3r0hz+pvEgrHv1cqCHnRBTOq JUWgy/3Htu+4ucVa+56vhYT2tt6H7YC20qxmaO2CW4dSHY9t4HLxGxEWCMRPKUn2FflD JbiQx/0G5iR4qK27rX7CWbHW1IYYBaRy3Ewglf9rw10uUAaPHXvtxAY5fAmt6dqa25Ls vkyw== X-Received: by 10.70.103.236 with SMTP id fz12mr32052302pdb.167.1424101748787; Mon, 16 Feb 2015 07:49:08 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.05 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:08 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 5/12] xfstests: generic/042: Standard insert range tests Date: Tue, 17 Feb 2015 00:47:52 +0900 X-ASG-Orig-Subj: [PATCH RESEND 5/12] xfstests: generic/042: Standard insert range tests Message-Id: <1424101680-3301-6-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f175.google.com[209.85.192.175] X-Barracuda-Start-Time: 1424101749 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(042) tries to test various corner cases for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/punch | 5 ++++ common/rc | 2 +- tests/generic/042 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/042.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tests/generic/042 create mode 100644 tests/generic/042.out diff --git a/common/punch b/common/punch index 237b4d8..a75f4cf 100644 --- a/common/punch +++ b/common/punch @@ -527,6 +527,11 @@ _test_generic_punch() return fi + # If zero_cmd is finsert, don't check unaligned offsets + if [ "$zero_cmd" == "finsert" ]; then + return + fi + echo " 16. data -> cache cold ->hole" if [ "$remove_testfile" ]; then rm -f $testfile diff --git a/common/rc b/common/rc index 5377ba0..4388e29 100644 --- a/common/rc +++ b/common/rc @@ -1520,7 +1520,7 @@ _require_xfs_io_command() "falloc" ) testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` ;; - "fpunch" | "fcollapse" | "zero" | "fzero" ) + "fpunch" | "fcollapse" | "zero" | "fzero" | "finsert" ) testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "$command 4k 8k" $testfile 2>&1` ;; diff --git a/tests/generic/042 b/tests/generic/042 new file mode 100644 index 0000000..9b83e8d --- /dev/null +++ b/tests/generic/042 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/042 +# +# Standard insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/042.out b/tests/generic/042.out new file mode 100644 index 0000000..2406d71 --- /dev/null +++ b/tests/generic/042.out @@ -0,0 +1,78 @@ +QA output created by 042 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index fb67b57..0d41c72 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -44,6 +44,7 @@ 039 metadata auto quick 040 metadata auto quick 041 metadata auto quick +042 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1190A7F4E for ; Mon, 16 Feb 2015 09:49:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8DB430405F for ; Mon, 16 Feb 2015 07:49:15 -0800 (PST) X-ASG-Debug-ID: 1424101753-04bdf06a5a3c5980001-NocioJ Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by cuda.sgi.com with ESMTP id Jw5j1fvVcg3tt9HL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:14 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbnh10 with SMTP id nh10so32456507pdb.11 for ; Mon, 16 Feb 2015 07:49:13 -0800 (PST) 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=Vw/4ZM4YyAgneFajKiG/3Fj8B7xjTmPGaRxBLCyCjaw=; b=oSRtX+zhop0JcsMLBp+5A7sMqEflOm0sZCnUMV5TReOF4FTedZm1N0ZlA+Y1KRR4Rm w5/3bds+PtiChHLn2NjAl//tooFeJaXtQwpkfHIOzRFfTYAnxKxFKKgz2sfQeTq52kqz BMuztYiYShQ9F924tebaNADL+/SrXOVfi8Z8ZFo0CpKO3mGH+UmPqVsD0xRO6Gucg3ge ftUWyORhUA84TqDVvfk9+fV37LgA5gRemlodX+bA3OOrV5jO2Ck1rR8WS37uaFN7m14q Qh+IeTstkcZ7lxobiOfBMAX/xSwzsk/AuUP1kgU6fOkblKW2uvYLbcTV25ToZ4JoCK/p Mq/A== X-Received: by 10.70.7.99 with SMTP id i3mr41554994pda.130.1424101753768; Mon, 16 Feb 2015 07:49:13 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.09 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:13 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 6/12] xfstests: generic/043: Delayed allocation insert range Date: Tue, 17 Feb 2015 00:47:53 +0900 X-ASG-Orig-Subj: [PATCH RESEND 6/12] xfstests: generic/043: Delayed allocation insert range Message-Id: <1424101680-3301-7-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f181.google.com[209.85.192.181] X-Barracuda-Start-Time: 1424101754 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(043) tries to test various corner cases with delayed extents for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/043 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/043.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 144 insertions(+) create mode 100644 tests/generic/043 create mode 100644 tests/generic/043.out diff --git a/tests/generic/043 b/tests/generic/043 new file mode 100644 index 0000000..e70644d --- /dev/null +++ b/tests/generic/043 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/043 +# +# Delayed allocation insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/043.out b/tests/generic/043.out new file mode 100644 index 0000000..817ed09 --- /dev/null +++ b/tests/generic/043.out @@ -0,0 +1,78 @@ +QA output created by 043 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 0d41c72..c2156a1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -45,6 +45,7 @@ 040 metadata auto quick 041 metadata auto quick 042 auto quick prealloc +043 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 38D687F67 for ; Mon, 16 Feb 2015 09:49:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADA1AAC001 for ; Mon, 16 Feb 2015 07:49:20 -0800 (PST) X-ASG-Debug-ID: 1424101758-04cb6c6b0c3e8560001-NocioJ Received: from mail-pd0-f178.google.com (mail-pd0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id 8PrulzaXKZNFrOhu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:19 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjz10 with SMTP id z10so36728513pdj.0 for ; Mon, 16 Feb 2015 07:49:18 -0800 (PST) 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=e1SmfkoweTzGh+ySJ0S6YBo5eVO3GUY7pAxWLSEvl7w=; b=qxmbnHO655qZtX1TJJOTuWSoYOEt7QFCx2Di3+9ovzl5AaXtVOhJXK8pAZueicuCkP iiKOOSR7ko0eSzj0myK0luTrLoBqX88JO0osnam/XgiRSllt42gRTR8iek30DYDRP+HQ LfE071t2QqIvOUGgQPeujZItd2jGifX+ckneH6/xa0ATjQaV7riuX98ROMY2nUNTRXat qb6NeQ7MgEOqtaISs6o1akC+ncsH0i9r47eya0GarqdbtK2xX1Yy9baRhWXmFk/gVi+l qxJS/gQUWKjQZuOk1XBuqkCWGpfR4e8OVK/VjdpbQ30ccNPTGnvx3AbppNGUgvi6EWUk kmIg== X-Received: by 10.67.22.104 with SMTP id hr8mr28636876pad.133.1424101758523; Mon, 16 Feb 2015 07:49:18 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.14 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:17 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 7/12] xfstests: generic/044: Multi insert range tests Date: Tue, 17 Feb 2015 00:47:54 +0900 X-ASG-Orig-Subj: [PATCH RESEND 7/12] xfstests: generic/044: Multi insert range tests Message-Id: <1424101680-3301-8-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1424101758 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(044) tries to test various corner cases with pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/044 | 65 ++++++++++++++++++++++++++++++++++++++++ tests/generic/044.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/044 create mode 100644 tests/generic/044.out diff --git a/tests/generic/044 b/tests/generic/044 new file mode 100644 index 0000000..4d6be1b --- /dev/null +++ b/tests/generic/044 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/044 +# +# Multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/044.out b/tests/generic/044.out new file mode 100644 index 0000000..4ddfb65 --- /dev/null +++ b/tests/generic/044.out @@ -0,0 +1,80 @@ +QA output created by 044 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index c2156a1..70444a3 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -46,6 +46,7 @@ 041 metadata auto quick 042 auto quick prealloc 043 auto quick prealloc +044 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 35E637F6C for ; Mon, 16 Feb 2015 09:49:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1639C30405F for ; Mon, 16 Feb 2015 07:49:26 -0800 (PST) X-ASG-Debug-ID: 1424101763-04cb6c6b0a3e85a0001-NocioJ Received: from mail-pd0-f169.google.com (mail-pd0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id evwWPFODGHHIoOf6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:24 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdev10 with SMTP id v10so36646057pde.10 for ; Mon, 16 Feb 2015 07:49:23 -0800 (PST) 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=eLL/Gwr6F4eI2D+CmXTuEZ2MP2xQh33eD2sMnR2INTk=; b=SAfTksdIEuQr5EdyeUN5tEIdPEYimYBAbVeqDNIn+xjC2yeGN0jsT2TRANQQyOW1zE BlPI3X8cssaBjLDUchxevgDrx2OfX+mAVHUVGr2YCjVql54y4j1gsaBnrg7V929RrsbQ fnxx1q8Wl7e1SLkZZ1vaAqy8NaD7gEkjeykGDCNDbtxHLmb27kb9+APckKjGZ6RjQ80Z w5OTwcj4U65Lt4BDPplExqkoSKGh51ChurgtQtvB1yjVluGVj7Y8HDzaOjNpFIeInyYK CbqjDUUlmWOeV8GTztoT6U4C5cFs7Os1ERinf5LE4nH2sKb6GeAhkLCs6yhHLLNXo31d J0uQ== X-Received: by 10.68.141.204 with SMTP id rq12mr40623853pbb.7.1424101763879; Mon, 16 Feb 2015 07:49:23 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.19 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:23 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 8/12] xfstests: generic/045: Delayed allocation multi insert Date: Tue, 17 Feb 2015 00:47:55 +0900 X-ASG-Orig-Subj: [PATCH RESEND 8/12] xfstests: generic/045: Delayed allocation multi insert Message-Id: <1424101680-3301-9-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1424101764 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(045) tries to test various corner cases with delayed extents and pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/045 | 65 ++++++++++++++++++++++++++++++++++++++++ tests/generic/045.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/045 create mode 100644 tests/generic/045.out diff --git a/tests/generic/045 b/tests/generic/045 new file mode 100644 index 0000000..de4de02 --- /dev/null +++ b/tests/generic/045 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/045 +# +# Delayed allocation multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/045.out b/tests/generic/045.out new file mode 100644 index 0000000..5bfd760 --- /dev/null +++ b/tests/generic/045.out @@ -0,0 +1,80 @@ +QA output created by 045 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 70444a3..772f910 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -47,6 +47,7 @@ 042 auto quick prealloc 043 auto quick prealloc 044 auto quick prealloc +045 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 81A757F62 for ; Mon, 16 Feb 2015 09:49:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44ADF304062 for ; Mon, 16 Feb 2015 07:49:36 -0800 (PST) X-ASG-Debug-ID: 1424101770-04bdf06a593c59d0001-NocioJ Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id hpUbYWYinfFKGPD0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:30 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjg10 with SMTP id g10so36816470pdj.1 for ; Mon, 16 Feb 2015 07:49:30 -0800 (PST) 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=mGm2BU5OoLMWo0g3ZYVOpjgjza1sQZir3Momlposy1s=; b=NJ56wB1D7c/iFo6Tee6U23MsJhjADlbE9ZPkj6CX3aA1K7YCP4uQp8tjz5YNB7FYVB crujPEFVJF6k9ct0v5N4viV/9O5HDnFV6WGMYZA4i4v3ojMF3ddP5D8+yKsidTTcgvqY BmdnkfhkoEwV3v66ovrzzRbouFt62aTxECJVWTFT4gsrNhPmcL0/WNp5Rhdc+LCFEz/F iADoWx6qA03bEIWlP5RCcfSpTaXH2lLoQ2niVY8TNaDVksiYCwc3p7k3iqkmELhedegP fupTBk8ZU8VArSkGqMBizRzYOYjNtXqkA6LfJW4DgqcVBwFNNIySw5eUJQ6jp/SDsSAt Xetg== X-Received: by 10.68.221.34 with SMTP id qb2mr41157121pbc.47.1424101770243; Mon, 16 Feb 2015 07:49:30 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.26 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:29 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 9/12] xfstests: generic/046: Test multiple fallocate insert/collapse range calls Date: Tue, 17 Feb 2015 00:47:56 +0900 X-ASG-Orig-Subj: [PATCH RESEND 9/12] xfstests: generic/046: Test multiple fallocate insert/collapse range calls Message-Id: <1424101680-3301-10-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1424101770 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(043) tries to test finsert range a single alternate block multiple times and test merge code of collase range. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- tests/generic/046 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/046.out | 2 ++ tests/generic/group | 1 + 3 files changed, 98 insertions(+) create mode 100644 tests/generic/046 create mode 100644 tests/generic/046.out diff --git a/tests/generic/046 b/tests/generic/046 new file mode 100644 index 0000000..5d036e0 --- /dev/null +++ b/tests/generic/046 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. generic/046 +# +# Test multiple fallocate insert/collapse range calls on same file. +# Call insert range a single alternate block multiple times until the file +# is left with 100 extents and as much number of extents. And Call collapse +# range about the previously inserted ranges to test merge code of collapse +# range. Also check for data integrity and file system consistency. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +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 +_supported_fs generic +_supported_os Linux + +_require_scratch +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" +_require_xfs_io_command "fcollapse" +src=$SCRATCH_MNT/testfile +dest=$SCRATCH_MNT/testfile.dest +BLOCKS=100 +BSIZE=`get_block_size $SCRATCH_MNT` +rm -f $seqres.full + +_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" +_scratch_mount || _fail "mount failed" +length=$(($BLOCKS * $BSIZE)) + +# Write file +_do "$XFS_IO_PROG -f -c \"pwrite 0 $length\" -c fsync $src" +cp $src $dest +extent_before=`$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l` + +# Insert alternate blocks +for (( j=0; j < $(($BLOCKS/2)); j++ )); do + offset=$((($j*$BSIZE)*2)) + _do "$XFS_IO_PROG -c \"finsert $offset $BSIZE\" $dest" +done + +# Check if 100 extents are present +$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l + +_check_scratch_fs +if [ $? -ne 0 ]; then + status=1 + exit +fi + +# Collapse alternate blocks +for (( j=0; j < $(($BLOCKS/2)); j++ )); do + offset=$((($j*$BSIZE))) + _do "$XFS_IO_PROG -c \"fcollapse $offset $BSIZE\" $dest" +done + +extent_after=`$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l` +if [ $extent_before -ne $extent_after ]; then + echo "extents mismatched before = $extent_before after = $extent_after" +fi + +# compare original file and test file. +cmp $src $dest || _fail "file bytes check failed" + +# success, all done +status=0 +exit diff --git a/tests/generic/046.out b/tests/generic/046.out new file mode 100644 index 0000000..2a6a862 --- /dev/null +++ b/tests/generic/046.out @@ -0,0 +1,2 @@ +QA output created by 046 +100 diff --git a/tests/generic/group b/tests/generic/group index 772f910..75e567e 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -48,6 +48,7 @@ 043 auto quick prealloc 044 auto quick prealloc 045 auto quick prealloc +046 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 D554C7F6C for ; Mon, 16 Feb 2015 09:49:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 64F70AC001 for ; Mon, 16 Feb 2015 07:49:38 -0800 (PST) X-ASG-Debug-ID: 1424101776-04cbb0116439e030001-NocioJ Received: from mail-pd0-f182.google.com (mail-pd0-f182.google.com [209.85.192.182]) by cuda.sgi.com with ESMTP id vVCuZXaRWBASi2UA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:36 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfl12 with SMTP id fl12so36683031pdb.4 for ; Mon, 16 Feb 2015 07:49:36 -0800 (PST) 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=F/Mz2ptynSNpSFgrVrtc0b6NP86IrGJoDQcmg+2xbEM=; b=ZukXIMl1/x+g3PGSRXSazK8ScHTbf2Abk/Dn85QDaEKprBsKLQbxSZe2gErxmZMHOj MeSFcEz4RQxkMsjpciPsdU7SK7j25osQvvUqvQiJvNFeECEsTiVW+tZpHRyaBZLVpRI0 g2w8ez6QiDihye975Z30hbrwsQrvYM6qDCoYNFauLRwt6Bt3Li7TKgBS2TSchyarLFGu KEcEct44rsjHvRo0BLKIF21nZOXIuuinKoIu/NTVVz83KiFClHkSnRFy6VwuTa5qhYmT r25UIcQsmFxx9e0XsNk9ZAZfkFm4v4ILnr7+TZnrp5Ls/NxqNbjvnu3TakKSozOivgHg zoMQ== X-Received: by 10.70.61.130 with SMTP id p2mr41974171pdr.0.1424101776050; Mon, 16 Feb 2015 07:49:36 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.32 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:35 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 10/12] xfstests: fsstress: Add fallocate insert range operation Date: Tue, 17 Feb 2015 00:47:57 +0900 X-ASG-Orig-Subj: [PATCH RESEND 10/12] xfstests: fsstress: Add fallocate insert range operation Message-Id: <1424101680-3301-11-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f182.google.com[209.85.192.182] X-Barracuda-Start-Time: 1424101776 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon This commit adds insert operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- ltp/fsstress.c | 19 ++++++++++++++++--- src/global.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index b56fe5c..aa3e0c3 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -72,6 +72,7 @@ typedef enum { OP_PUNCH, OP_ZERO, OP_COLLAPSE, + OP_INSERT, OP_READ, OP_READLINK, OP_RENAME, @@ -170,6 +171,7 @@ void mknod_f(int, long); void punch_f(int, long); void zero_f(int, long); void collapse_f(int, long); +void insert_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -209,6 +211,7 @@ opdesc_t ops[] = { { OP_PUNCH, "punch", punch_f, 1, 1 }, { OP_ZERO, "zero", zero_f, 1, 1 }, { OP_COLLAPSE, "collapse", collapse_f, 1, 1 }, + { OP_INSERT, "insert", insert_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -2176,6 +2179,7 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"}, { -1, NULL} }; @@ -2227,10 +2231,11 @@ do_fallocate(int opno, long r, int mode) off %= maxfsize; len = (off64_t)(random() % (1024 * 1024)); /* - * Collapse range requires off and len to be block aligned, make it - * more likely to be the case. + * Collapse/insert range requires off and len to be block aligned, + * make it more likely to be the case. */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { + if ((mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)) && + (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } @@ -2656,6 +2661,14 @@ collapse_f(int opno, long r) } void +insert_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_INSERT_RANGE); +#endif +} + +void read_f(int opno, long r) { char *buf; diff --git a/src/global.h b/src/global.h index 8180f66..f63246b 100644 --- a/src/global.h +++ b/src/global.h @@ -172,6 +172,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + #endif /* HAVE_LINUX_FALLOC_H */ #endif /* GLOBAL_H */ -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 50DBF7F59 for ; Mon, 16 Feb 2015 09:49:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22E3B304043 for ; Mon, 16 Feb 2015 07:49:57 -0800 (PST) X-ASG-Debug-ID: 1424101795-04bdf06a5c3c5a60001-NocioJ Received: from mail-pd0-f171.google.com (mail-pd0-f171.google.com [209.85.192.171]) by cuda.sgi.com with ESMTP id 18B9To1hhoiw52kQ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:55 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfl12 with SMTP id fl12so36686129pdb.4 for ; Mon, 16 Feb 2015 07:49:55 -0800 (PST) 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=OMNQ7IbrorUfFUbMS0RQuNyrOCVf3LCMnQSqQa6rqtk=; b=bL9x3eJspVwEg98eEnQjziJs4x6H2lp/0rsMlRoWN4VbnDhY9B7QXe/GyYiaTnQrrJ fl91ycerrznom/Bjkl3y+xLv+k+1qN1eJY+WepmfXzbnYDqkgyZK/E2kilhgY+gYQjk7 575jjSMmsHkixkz3+jXzHKPyie9hUrHvMheAoqO/poITY19cwlw8FApY4fE84m1cx8cN aMuXBUB3zMd5Bpx8qqY91s7kDV1FwFflBaVSVy6oOJMJarnzlCJppPZdG+jZzkiiIMJt jtOFfR18yUMZHF9dynZ5TskAn0kC8Cifib911FCaldGy/ZNYuUpee+eTEJOBmWcob4M7 pR3A== X-Received: by 10.70.54.69 with SMTP id h5mr40271366pdp.37.1424101794960; Mon, 16 Feb 2015 07:49:54 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.51 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:54 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 12/12] manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate Date: Tue, 17 Feb 2015 00:47:59 +0900 X-ASG-Orig-Subj: [PATCH RESEND 12/12] manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate Message-Id: <1424101680-3301-13-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f171.google.com[209.85.192.171] X-Barracuda-Start-Time: 1424101795 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon Update FALLOC_FL_INSERT_RANGE flag in fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man2/fallocate.2 | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git a/man2/fallocate.2 b/man2/fallocate.2 index adf42db..9b3c460 100644 --- a/man2/fallocate.2 +++ b/man2/fallocate.2 @@ -8,7 +8,7 @@ .\" 2011-09-19: Added FALLOC_FL_PUNCH_HOLE .\" 2011-09-19: Substantial restructuring of the page .\" -.TH FALLOCATE 2 2015-01-22 "Linux" "Linux Programmer's Manual" +.TH FALLOCATE 2 2015-02-14 "Linux" "Linux Programmer's Manual" .SH NAME fallocate \- manipulate file space .SH SYNOPSIS @@ -225,6 +225,56 @@ XFS (since Linux 3.14) .IP * ext4, for extent-based files (since Linux 3.14) .\" commit b8a8684502a0fc852afa0056c6bb2a9273f6fcc0 +.SS Increasing file space +.\" TODO: Mention commit id and supporting Linux version +Specifying the +.BR FALLOC_FL_INSERT_RANGE +flag in +.I mode +will increase the file space by inserting a hole within the file size without +overwriting any existing data. The hole will start at +.I offset +and continue for +.I len +bytes. For inserting hole inside file, the contents of the file starting at +.I offset +will be shifted towards right by +.I len +bytes. Inserting a hole inside the file will increase the file size by +.I len +bytes. + +This mode has the same limitation as +.BR FALLOC_FL_COLLAPSE_RANGE +regarding the +granularity of the operation. +If the granulrity requirements are not met, +.BR fallocate () +will fail with the error +.BR EINVAL. +If the +.I offset +overlaps with end of file OR if it is greater than end of file, an error is +returned. For such type of operations, i.e. inserting a hole at the end of +file, +.BR ftruncate(2) +should be used. +In case +.IR offset + len +exceeds the maximum file size, errno will be set to +.B EFBIG. + +No other flags may be specified in +.IR mode +in conjunction with +.BR FALLOC_FL_INSERT_RANGE . + +As of Linux XXXX, +.\" TODO: Mention commit id and supporting Linux version +.B FALLOC_FL_INSERT_RANGE +is supported by +ext4 (only for extent-based files) and XFS. + .SH RETURN VALUE On success, .BR fallocate () @@ -242,6 +292,12 @@ is not a valid file descriptor, or is not opened for writing. .IR offset + len exceeds the maximum file size. .TP +.B EFBIG +.I mode +is +.BR FALLOC_FL_INSERT_RANGE , +the current file size+len excceds the maximum file size. +.TP .B EINTR A signal was caught during execution. .TP @@ -270,7 +326,17 @@ reaches or passes the end of the file. .B EINVAL .I mode is -.BR FALLOC_FL_COLLAPSE_RANGE , +.BR FALLOC_FL_INSERT_RANGE +and the range specified by +.I offset +reaches or passes the end of the file. +.TP +.B EINVAL +.I mode +is +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but either .I offset or @@ -279,18 +345,24 @@ is not a multiple of the filesystem block size. .TP .B EINVAL .I mode -contains both +contains either of .B FALLOC_FL_COLLAPSE_RANGE +or +.B FALLOC_FL_INSERT_RANGE and other flags; no other flags are permitted with -.BR FALLOC_FL_COLLAPSE_RANGE . +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE . .TP .B EINVAL .I mode is .BR FALLOC_FL_COLLAPSE_RANGE or -.BR FALLOC_FL_ZERO_RANGE , +.BR FALLOC_FL_ZERO_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but the file referred to by .I fd is not a regular file. @@ -342,6 +414,8 @@ specifies .BR FALLOC_FL_PUNCH_HOLE or .BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE and the file referred to by .I fd @@ -360,7 +434,9 @@ refers to a pipe or FIFO. .B ETXTBSY .I mode specifies -.BR FALLOC_FL_COLLAPSE_RANGE , +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but the file referred to by .IR fd is currently being executed. -- 1.7.9.5 From linkinjeon@gmail.com Mon Feb 16 09:49:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3E0167F59 for ; Mon, 16 Feb 2015 09:49:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0ABF1304043 for ; Mon, 16 Feb 2015 07:49:57 -0800 (PST) X-ASG-Debug-ID: 1424101781-04bdf06a5c3c5a10001-NocioJ Received: from mail-pd0-f178.google.com (mail-pd0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id qZDdPZUALKUTXS5t (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Feb 2015 07:49:41 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjp10 with SMTP id p10so36802156pdj.3 for ; Mon, 16 Feb 2015 07:49:41 -0800 (PST) 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=LsZ/CANCN0u/+xr3xWs3Dd7TPCa0SCYxCMTjb2oO0G4=; b=HXKcZfyvKfCdOSYm6Wnorukl4BtrL9OdhXXvoey9NchxJpIpjJfSnphg2eQ4g0DN3I zFeJhyvDycprg3RA6nOaTsWAPJh/MWXNHoGLjfg+OpCPe3cal3MktpmX7z8q8RCUtnse whu/+COq5o91n3CL2gnW68HYuZTIZ+t5N7RpEz0TkUqNcPu/Cqyc9CY+tdSsEXj3Z7rJ Yzd//7sPSOf8eHYGK6kQsBHDgLaAmo+iMo2Z8qzAT9psyGfWMz6aQRgrSUOd5X0lk16s 6UCQIHNWjT8FqxmHxDnXHM+eYQRux6Kdks2NEkqepKgsa96zMm3SYPvhSxwKvcdWJItX gHKw== X-Received: by 10.66.154.162 with SMTP id vp2mr40605385pab.73.1424101781166; Mon, 16 Feb 2015 07:49:41 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id iy1sm10971973pbb.14.2015.02.16.07.49.37 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 16 Feb 2015 07:49:40 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation Date: Tue, 17 Feb 2015 00:47:58 +0900 X-ASG-Orig-Subj: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation Message-Id: <1424101680-3301-12-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1424101781 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15392 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 From: Namjae Jeon This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- ltp/fsx.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 114 insertions(+), 10 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 3709419..9fed5b2 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -95,7 +95,8 @@ int logcount = 0; /* total ops */ #define OP_PUNCH_HOLE 6 #define OP_ZERO_RANGE 7 #define OP_COLLAPSE_RANGE 8 -#define OP_MAX_FULL 9 +#define OP_INSERT_RANGE 9 +#define OP_MAX_FULL 10 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -145,6 +146,7 @@ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ int collapse_range_calls = 1; /* -C flag disables */ +int insert_range_calls = 1; /* -i flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -339,6 +341,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******CCCC"); break; + case OP_INSERT_RANGE: + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******CCCC"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_INSERT_RANGE +void +do_insert_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_INSERT_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length insert range\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + if ((loff_t)offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping insert range behind EOF\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + log4(OP_INSERT_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + end_offset = offset + length; + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("insert range: %x to %x\n", offset, length); + prterr("do_insert_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + end_offset, good_buf + offset, + file_size - offset); + memset(good_buf + offset, '\0', length); + file_size += length; +} + +#else +void +do_insert_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1117,14 +1180,25 @@ docloseopen(void) } } -#define TRIM_OFF_LEN(off, len, size) \ -do { \ - if (size) \ - (off) %= (size); \ - else \ - (off) = 0; \ - if ((off) + (len) > (size)) \ - (len) = (size) - (off); \ + +#define TRIM_OFF(off, size) \ +do { \ + if (size) \ + (off) %= (size); \ + else \ + (off) = 0; \ +} while (0) + +#define TRIM_LEN(off, len, size) \ +do { \ + if ((off) + (len) > (size)) \ + (len) = (size) - (off); \ +} while (0) + +#define TRIM_OFF_LEN(off, len, size) \ +do { \ + TRIM_OFF(off, size); \ + TRIM_LEN(off, len, size); \ } while (0) void @@ -1192,6 +1266,12 @@ test(void) goto out; } break; + case OP_INSERT_RANGE: + if (!insert_range_calls) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1244,6 +1324,22 @@ test(void) } do_collapse_range(offset, size); break; + case OP_INSERT_RANGE: + TRIM_OFF(offset, file_size); + TRIM_LEN(file_size, size, maxfilelen); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + if (file_size + size > maxfilelen) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + + do_insert_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1307,6 +1403,9 @@ usage(void) #ifdef FALLOC_FL_COLLAPSE_RANGE " -C: Do not use collapse range calls\n" #endif +#ifdef FALLOC_FL_INSERT_RANGE +" -i: Do not use insert range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1493,7 +1592,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCiLN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1599,6 +1698,9 @@ main(int argc, char **argv) case 'C': collapse_range_calls = 0; break; + case 'i': + insert_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1758,6 +1860,8 @@ main(int argc, char **argv) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); if (collapse_range_calls) collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); + if (insert_range_calls) + insert_range_calls = test_fallocate(FALLOC_FL_INSERT_RANGE); while (numops == -1 || numops--) test(); -- 1.7.9.5 From tinguely@sgi.com Mon Feb 16 11:35:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1838A7F4E for ; Mon, 16 Feb 2015 11:35:53 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay2.corp.sgi.com (Postfix) with ESMTP id 74485304039; Mon, 16 Feb 2015 09:35:49 -0800 (PST) Message-ID: <54E22A76.40106@sgi.com> Date: Mon, 16 Feb 2015 11:35:50 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Michael L. Semon" CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> <54E16667.1050200@gmail.com> In-Reply-To: <54E16667.1050200@gmail.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 02/15/15 21:39, Michael L. Semon wrote: > On 02/14/15 18:29, Dave Chinner wrote: >> On Fri, Feb 13, 2015 at 05:40:29PM -0600, Mark Tinguely wrote: >>> On 02/12/15 17:14, Dave Chinner wrote: >>>> From: Dave Chinner >>>> >>>> Test generic/224 is failing with a corruption being detected on one >>>> of Michael's test boxes. Debug that Michael added is indicating >>>> that the minleft trimming is resulting in an underflow: >>>> >>>> ..... >>>> before fixup: rlen 1 args->len 0 >>>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>>> before goto out_nominleft: rlen 1 args->len 0 >>>> before fixup: rlen 1 args->len 0 >>>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>>> after fixup: rlen 1 args->len 1 >>>> before fixup: rlen 1 args->len 0 >>>> after xfs_alloc_fix_len : rlen 1 args->len 1 >>>> after fixup: rlen 4294967295 args->len 4294967295 >>>> XFS: Assertion failed: fs_is_ok, file: fs/xfs/libxfs/xfs_alloc.c, line: 1424 >>>> >>>> The "goto out_nominleft:" indicates that we are getting close to >>>> ENOSPC in the AG, and a couple of allocations later we underflow >>>> and the corruption check fires in xfs_alloc_ag_vextent_size(). >>>> >>>> The issue is that the extent length fixups comaprisons are done >>>> with variables of xfs_extlen_t types. These are unsigned so an >>>> underflow looks like a really big value and hence is not detected >>>> as being smaller than the minimum length allowed for the extent. >>>> Hence the corruption check fires as it is noticing that the returned >>>> length is longer than the original extent length passed in. >>>> >>>> This can be easily fixed by ensuring we do the underflow test on >>>> signed values, the same way xfs_alloc_fix_len() prevents underflow. >>>> So we realise in future that these casts prevent underflows from >>>> going undetected, add comments to the code indicating this. >>>> >>>> Reported-by: Michael L. Semon >>>> Tested-by: Michael L. Semon >>>> Signed-off-by: Dave Chinner >>>> --- >>>> fs/xfs/libxfs/xfs_alloc.c | 4 +++- >>>> 1 file changed, 3 insertions(+), 1 deletion(-) >>> >>> >>> int diff = be32_to_cpu(agf->agf_freeblks) >>> - args->len - args->minleft; >>> >> >> Preconditions: >> >> agf->agf_freeblks = 1 >> args->len = 1 >> args->minleft = 2 >> >> Therefore, diff = -2 >> >>>> @@ -286,7 +287,8 @@ xfs_alloc_fix_minleft( >>>> if (diff>= 0) >>>> return 1; >>> >>> If the diff math was done correctly, wouldn't it get caught here? >> >> No, diff< 0. Hee, what was I thinking? sdrawkcab ylsouivbO >> >> >>>> args->len += diff; /* shrink the allocated space */ >> >> 1 += -2 >> = -1 >> >>>> - if (args->len>= args->minlen) >> >> if (0xffffffff>= 1) >> >> broken. >> >>>> + /* casts to (int) catch length underflows */ >>>> + if ((int)args->len >= (int)args->minlen) >> >> if (-1>= 1) >> >> correct. >> >>>> return 1; >>>> args->agbno = NULLAGBLOCK; >>>> return 0; >>> >>> We can and should fix the wrap in xfs_alloc_fix_minleft() but this >>> also points to the fact that xfs_alloc_fix_freelist() is incorrectly >>> choosing AGs that will later fail the allocation alignment, minlen, >>> and minleft requirements. >> >> I don't think there's a problem there. At least, not the problem I >> think you trying to describe. >> >>> You can connect the dots to see how this can lead to a deadlock with >>> extent frees. We have seen them. I hacked the XFS code to lead to >>> this situation. >> >> You should post the test cases and the patch that exposes the issues >> you are concerned about. Otherwise we have no real idea of what >> problems you are talking about, and certainly can't reproduce them. >> >>> Also bad is xfs_alloc_vextent() will temporally ignore the minleft >>> for the xfs_alloc_fix_freelist() but makes the ag allocator enforce >>> the minleft. >> >> Hmmm - I suspect you haven't understood the underlying reason for >> setting minleft to zero for the call to xfs_alloc_fix_freelist(). >> There's are two places we do this: single AG constrainted >> allocation, and the "any AG, but near ENOSPC" allocation. >> >> For single AG constrained allocation, minleft is something we can >> ignore because we must select that AG for allocation. minleft is >> applied against the total allocation requirement, not the minimum >> length of allocation that can be done. Hence we might be able to do >> a minlen allocation, but we'd reject it because we can't do a maxlen >> allocation due to minleft requirements. >> >> Hence we switch off minleft in that case when doing freelist checks >> so that we don't reject allocations that could do a minlen >> allocation successfully. This requires the low level allocator to be >> able to trim back the selected extent from whatever length it finds >> to repesect minleft, and if it can't then fail the allocation. >> That is the function of xfs_alloc_fix_minleft() - constrain the >> allocated extent to the required minleft or fail the allocation. >> >> And for the lowspace algorithm, the reasoning is similar. After two >> attempts to allocate in AGs that have enough space for a maxlen >> allocation, we switch off minleft so that we only constrain the AG >> search to AGs that can definitely satisfy a minlen allocation, hence >> improving the chance we can do an allocation successfully near >> ENOSPC. >> >> Cheers, >> >> Dave. > > I took something out of Mark's argument. The original condition was > hit using fstests generic/224 on RAID-0, while sizing up an old Core > 2 PC for a new purpose. With Mark mentioning AGs, I looked around a > little bit. The case can be hit more easily with this test on 16-GB > $TEST_DEV and $SCRATCH_DEV: > > while true; do MKFS_OPTIONS='-d agcount=16' ./check generic/224; done > > That may not mean anything--a 50 MB/s Caviar SE on a SATA-1 controller > may just make the original test too slow for my patience--but the > extra AGs do make things seem rather repeatable. > > I'll be happy to leave both the Core 2 PC and the i686 Pentium 4 PC > in an unpatched state, should you or Mark want me to fetch more > values via printk debugging. Everything else XFS is in pretty good > shape for the "small or few" purposes here. > > Thanks! > > Michael Thanks Michael, you don't need to hold your test box for me. I do have a way to recreate these ABBA AGF buffer allocation deadlocks and understand the whys and hows very well. I don't have a community way to make a xfstest for it but I think your test is getting close. I am certain that with Dave's patch alone, and pushed long enough you will hit the ABBA AGF buffer deadlock. It needs to do that allocation to the last AG while freeing an extent to that AG. --Mark. From david@fromorbit.com Mon Feb 16 17:23:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5CD977F3F for ; Mon, 16 Feb 2015 17:23:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CD91304039 for ; Mon, 16 Feb 2015 15:22:58 -0800 (PST) X-ASG-Debug-ID: 1424128975-04cbb011633c9cf0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id j1PUDkTm5CoSYvCU for ; Mon, 16 Feb 2015 15:22:56 -0800 (PST) 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: A2DWCwA3e+JUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQQCAoESRAEBAQEBAQUBAQEBODuEDQEFJxMcIxAIAxgJJQ8FJQMHGhMUiBjOQQEBAQcCAR8YhWyFCIRtB4MWgRQBBJUig0yBGYMNhi2EfYM+hCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 09:47:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNUui-0003nN-HZ; Tue, 17 Feb 2015 10:17:16 +1100 Date: Tue, 17 Feb 2015 10:17:16 +1100 From: Dave Chinner To: Mark Tinguely Cc: "Michael L. Semon" , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Message-ID: <20150216231716.GB4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> <54E16667.1050200@gmail.com> <54E22A76.40106@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E22A76.40106@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424128976 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 16, 2015 at 11:35:50AM -0600, Mark Tinguely wrote: > Thanks Michael, you don't need to hold your test box for me. I do > have a way to recreate these ABBA AGF buffer allocation deadlocks > and understand the whys and hows very well. I don't have a community > way to make a xfstest for it but I think your test is getting close. If you know what is causing them, then please explain how it occurs and how you think it needs to be fixed. Just telling us that you know something that we don't doesn't help us solve the problem. :( In general, the use of the args->firstblock is supposed to avoid the ABBA locking order issues with multiple allocations in the one transaction by preventing AG selection loops from looping back into AGs with a lower index than the first allocation that was made. So if you are seeing deadlocks, then it may be that we aren't following this constraint correctly in all locations.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 17:48:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D81167F50 for ; Mon, 16 Feb 2015 17:48:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55192AC004 for ; Mon, 16 Feb 2015 15:48:47 -0800 (PST) X-ASG-Debug-ID: 1424130520-04cb6c6b0b416220001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id eRm0YI6GHMXoRHex for ; Mon, 16 Feb 2015 15:48:40 -0800 (PST) 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: A2DYCwAUgeJUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQQCAoESRAEBAQEBAQUBAQEBODuEDAEBAQMBJxMcIwULCAMOCgklDwUlAwcaE4glB85PAQEBAQYCAR8YhWyFCIRtB4MWgRQFhVqTFIpTiDuEJCoxgQIkgR0BAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 10:18:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNVP4-0003rJ-Sl; Tue, 17 Feb 2015 10:48:38 +1100 Date: Tue, 17 Feb 2015 10:48:38 +1100 From: Dave Chinner To: Dhruvesh Rathore Cc: xfs@oss.sgi.com Subject: Re: [RFD] : Allowing xfs_fsr to defragment portions of a file Message-ID: <20150216234838.GC4251@dastard> X-ASG-Orig-Subj: Re: [RFD] : Allowing xfs_fsr to defragment portions of a file References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424130520 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 15, 2015 at 08:08:46PM +0530, Dhruvesh Rathore wrote: > Hi, > > The xfs_fsr utility in its current state does not support defragmentation of > parts of file. Either the entire file is defragmented, or if free space is not > available then the operation is not performed. > We would like to enhance the utility allowing it to defragment parts > of the file, ins such a condition. > --------------------------------------------------------------------------------------------------------------- > > Our initial task was to understand how xfs_fsr currently defragments the file: > > 1) In /fsr/xfs_fsr.c from main() the control is passed to fsrfile(). > In fsrfile(), we > open the original file and collect bstat information. A call is then made to > fsrfile_common() > > 2) In fsrfile_common() we check if sufficient free space is available to > defragment the file, and if not then we exit. If free space is available, then a > call is made to packfile() > > 3) In packfile(), read_fd_bmap() function provides us with the current number of > extents used by the file (cur_nextents) and the ideal number of extents needed > to save the file (nextents). In function read_fd_bmap() the the > outmap[ ] structure > is also populated. > > 4) packfile() will initially allocate new extents (nextents) to the > temporary file and > then copy(swap) extents form the existing file. We then fchown() the new temp > file and space occupied by the prev fragmented copy is then freed. > > --------------------------------------------------------------------------------------------------------------- > > Our understanding to the approach of defragmenting portions of a file > is as follows: > > 1) In fsrfile_common(), a new function will be called when the code > determines that > there is insufficient free space to defragment the entire file. > > 2) The new function performs the following tasks: > > ---> Call read_fd_bmap() to get cur_nextents and nextents(ideal). Using > nextents we will > then have to determine how many extents can be defragmented against > the free space > available. > > ---> Creating a temp file will not be feasible as it will create a > problem when we want to > change owners. fsr runs as root. There is no issue with changing owners, though that should not be necessary with extent swap operations between two files. The tempfile creation is the same as fsr is currently already doing for full file defragmentation, so you shouldn't need to be doing anything different here. > ---> The function will have to hence focus on swapping the existing > extents from the > fragmented file. For this a swap_extent() function will be needed, > which will take arguments > as the current extent and the location(in free space) where it needs > to be swapped to. You can't swap an in use extent with a free space location. You need to preallocate space in a temporary file, copy the data across to it, and then swap the extent ranges between the two files. > For the above functionality Dave suggested that we have a look at > EXT4_IOC_MOVE_EXT > and its usage. The extent swap between two files is exactly what that ioctl does. Look at the API, especially the struct move_extent that defines the information passed to the kernel to perform the extent swap operation. The XFS APi will be similar. > We are however unsure of how to compress the extents which have been chosen for > defragmentation and keep the other extents untouched. We are also in > doubt about how to > proceed without creating a temp file for defragmentation. The process in fsr is this: 1. bulkstat original file inode [bstat] for change detection whilst doing copying operation. 2. get block map of range [off, len] of orignal file that needs to be swapped 3. create temp file 4. preallocate extent [toff, tlen] in temp file 5. check the number of extents in [toff, tlen] is less than the number of extents in [off, len] in the original file. If it's not an improvement, abort. 6. copy data from [orig, off, len] to [temp, toff, tlen] 7. ioctl(orig_fd, XFS_IOC_SWAPEXT_RANGE, [bstat, off, len, temp, toff]) The kernel side of the ioctl is somewhat more complex, and we'll get to that once the fsr infrastructure is ready to use it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 17:53:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7076C7F54 for ; Mon, 16 Feb 2015 17:53:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FCB18F8037 for ; Mon, 16 Feb 2015 15:53:51 -0800 (PST) X-ASG-Debug-ID: 1424130828-04cbb011653cac90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id L4W4sKeYa7sbQNeH for ; Mon, 16 Feb 2015 15:53:49 -0800 (PST) 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: A2CQFQA5guJUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQICAQECgRJEAQEBAQEBBQEBAQE4O4QMAQEBBDocIxAIAw4HAwklDwUlAwcaE4gszlQBAQEBBgIBHxiFbIUIhAlkB4MWgRQFhFYHlBGKU4g7hCQqMYECgUEBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 10:23:47 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNVU3-0003s2-22; Tue, 17 Feb 2015 10:53:47 +1100 Date: Tue, 17 Feb 2015 10:53:47 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20150216235346.GD4251@dastard> X-ASG-Orig-Subj: Re: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-2-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424101680-3301-2-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424130828 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 17, 2015 at 12:47:48AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > FALLOC_FL_INSERT_RANGE command is the opposite command of > FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to > add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space > for writing new data within a file after shifting extents to right as given > length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, > that is block boundary and use ftruncate(2) for crosses EOF. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Cc: Brian Foster > --- > fs/open.c | 8 +++++++- > include/uapi/linux/falloc.h | 17 +++++++++++++++++ > 2 files changed, 24 insertions(+), 1 deletion(-) > > diff --git a/fs/open.c b/fs/open.c > index 813be03..762fb45 100644 > --- a/fs/open.c > +++ b/fs/open.c > @@ -232,7 +232,8 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) > > /* Return error if mode is not supported */ > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; Can we create a FALLOC_FL_SUPPORTED_MASK define in falloc.h so that we only need to add new flags to the mask in rather than change this code every time we add a new flag? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 18:54:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 465397F56 for ; Mon, 16 Feb 2015 18:54:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4AF0AC004 for ; Mon, 16 Feb 2015 16:54:17 -0800 (PST) X-ASG-Debug-ID: 1424134451-04bdf06a5b3f7460001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HfNufaL9U3NW7jhc for ; Mon, 16 Feb 2015 16:54:11 -0800 (PST) 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: A2CWFQBekOJUPDkjLHlTCIMGgSyCNIN5qTkBAQEBAQEGgUiWcQICAQECgRJEAQEBAQEBBQEBAQE4O4QMAQEBAwEnExwjBQsIAw4HAwklDwUlAwcaE4glB842AQEBAQYBAQEBHhiFbIUIhBdLCweDFoEUBYRWB4hviyKBGYMNgkuDYoF0hkeCIR+BZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 11:24:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNWQS-0003xg-DZ; Tue, 17 Feb 2015 11:54:08 +1100 Date: Tue, 17 Feb 2015 11:54:08 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20150217005408.GE4251@dastard> X-ASG-Orig-Subj: Re: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-3-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424101680-3301-3-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424134451 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15408 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 17, 2015 at 12:47:49AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Reviewed-by: Brian Foster > --- > fs/xfs/libxfs/xfs_bmap.c | 358 ++++++++++++++++++++++++++++++++++++++++------ > fs/xfs/libxfs/xfs_bmap.h | 13 +- > fs/xfs/xfs_bmap_util.c | 126 +++++++++++----- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 38 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 455 insertions(+), 83 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 61ec015..6699e53 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -5518,50 +5518,86 @@ xfs_bmse_shift_one( > int *current_ext, > struct xfs_bmbt_rec_host *gotp, > struct xfs_btree_cur *cur, > - int *logflags) > + int *logflags, > + enum SHIFT_DIRECTION SHIFT) Please don't shout. ;) Lower case for types and variables, upper case for the enum values. I also think the "shift" variable should be named "direction", too, so the code reads "if (direction == SHIFT_LEFT)" and so is clearly self documenting... (only commenting once on this, please change it in other places) as well ;) > { > struct xfs_ifork *ifp; > xfs_fileoff_t startoff; > - struct xfs_bmbt_rec_host *leftp; > + struct xfs_bmbt_rec_host *contp; > struct xfs_bmbt_irec got; > - struct xfs_bmbt_irec left; > + struct xfs_bmbt_irec cont; Not sure what "cont" is short for. It's used as the "adjacent extent" record, so that would be a better name IMO. > int error; > int i; > + int total_extents; > > ifp = XFS_IFORK_PTR(ip, whichfork); > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > xfs_bmbt_get_all(gotp, &got); > - startoff = got.br_startoff - offset_shift_fsb; > > /* delalloc extents should be prevented by caller */ > XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); > > - /* > - * Check for merge if we've got an extent to the left, otherwise make > - * sure there's enough room at the start of the file for the shift. > - */ > - if (*current_ext) { > - /* grab the left extent and check for a large enough hole */ > - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); > - xfs_bmbt_get_all(leftp, &left); > + if (SHIFT == SHIFT_LEFT) { > + startoff = got.br_startoff - offset_shift_fsb; > > - if (startoff < left.br_startoff + left.br_blockcount) > + /* > + * Check for merge if we've got an extent to the left, > + * otherwise make sure there's enough room at the start > + * of the file for the shift. > + */ > + if (*current_ext) { > + /* > + * grab the left extent and check for a large > + * enough hole. > + */ > + contp = xfs_iext_get_ext(ifp, *current_ext - 1); > + xfs_bmbt_get_all(contp, &cont); > + > + if (startoff < cont.br_startoff + cont.br_blockcount) > + return -EINVAL; > + > + /* check whether to merge the extent or shift it down */ > + if (xfs_bmse_can_merge(&cont, &got, offset_shift_fsb)) { > + return xfs_bmse_merge(ip, whichfork, > + offset_shift_fsb, > + *current_ext, gotp, contp, > + cur, logflags); > + } > + } else if (got.br_startoff < offset_shift_fsb) > return -EINVAL; This would be better written: if (!*current_ext) { if (got.br_startoff < offset_shift_fsb) return -EINVAL; goto update_current_ext; } and then the rest of the code in the shift left branch can drop a level of indent and hence become less congested and easier to read. > + } else { > + startoff = got.br_startoff + offset_shift_fsb; > + /* > + * If this is not the last extent in the file, make sure there's > + * enough room between current extent and next extent for > + * accommodating the shift. > + */ > + if (*current_ext < (total_extents - 1)) { > + contp = xfs_iext_get_ext(ifp, *current_ext + 1); > + xfs_bmbt_get_all(contp, &cont); > + if (startoff + got.br_blockcount > cont.br_startoff) > + return -EINVAL; > > - /* check whether to merge the extent or shift it down */ > - if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { > - return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, > - *current_ext, gotp, leftp, cur, > - logflags); > + /* > + * Unlike a left shift (which involves a hole punch), > + * a right shift does not modify extent neighbors > + * in any way. We should never find mergeable extents > + * in this scenario. Check anyways and warn if we > + * encounter two extents that could be one. > + */ > + if (xfs_bmse_can_merge(&got, &cont, offset_shift_fsb)) > + WARN_ON_ONCE(1); > } Similarly: /* nothing to move if this is the last extent */ if (*current_ext >= total_extents) goto update_current_ext; > - } else if (got.br_startoff < offset_shift_fsb) > - return -EINVAL; > - > + } > /* > * Increment the extent index for the next iteration, update the start > * offset of the in-core extent and update the btree if applicable. > */ > - (*current_ext)++; update_current_ext: > + if (SHIFT == SHIFT_LEFT) > + (*current_ext)++; > + else > + (*current_ext)--; > xfs_bmbt_set_startoff(gotp, startoff); > *logflags |= XFS_ILOG_CORE; > if (!cur) { > @@ -5581,10 +5617,10 @@ xfs_bmse_shift_one( > } > > /* > - * Shift extent records to the left to cover a hole. > + * Shift extent records to the left/right to cover/create a hole. > * > * The maximum number of extents to be shifted in a single operation is > - * @num_exts. @start_fsb specifies the file offset to start the shift and the > + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the > * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb > * is the length by which each extent is shifted. If there is no hole to shift > * the extents into, this will be considered invalid operation and we abort > @@ -5594,12 +5630,13 @@ int > xfs_bmap_shift_extents( > struct xfs_trans *tp, > struct xfs_inode *ip, > - xfs_fileoff_t start_fsb, > + xfs_fileoff_t *next_fsb, > xfs_fileoff_t offset_shift_fsb, > int *done, > - xfs_fileoff_t *next_fsb, > + xfs_fileoff_t stop_fsb, > xfs_fsblock_t *firstblock, > struct xfs_bmap_free *flist, > + enum SHIFT_DIRECTION SHIFT, > int num_exts) > { > struct xfs_btree_cur *cur = NULL; > @@ -5609,10 +5646,11 @@ xfs_bmap_shift_extents( > struct xfs_ifork *ifp; > xfs_extnum_t nexts = 0; > xfs_extnum_t current_ext; > + xfs_extnum_t total_extents; > + xfs_extnum_t stop_extent; > int error = 0; > int whichfork = XFS_DATA_FORK; > int logflags = 0; > - int total_extents; > > if (unlikely(XFS_TEST_ERROR( > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > @@ -5628,6 +5666,7 @@ xfs_bmap_shift_extents( > > ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); > > ifp = XFS_IFORK_PTR(ip, whichfork); > if (!(ifp->if_flags & XFS_IFEXTENTS)) { > @@ -5645,43 +5684,85 @@ xfs_bmap_shift_extents( > } > > /* > + * There may be delalloc extents in the data fork before the range we > + * are collapsing out, so we cannot use the count of real extents here. > + * Instead we have to calculate it from the incore fork. > + */ > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > + if (total_extents == 0) { > + *done = 1; > + goto del_cursor; > + } > + > + /* > + * In case of first right shift, we need to initialize next_fsb > + */ > + if (*next_fsb == NULLFSBLOCK) { > + ASSERT(SHIFT == SHIFT_RIGHT); This should be at the top of the function. i.e. ASSERT(*next_fsb != NULLFSBLOCK || direction == SHIFT_RIGHT) > + gotp = xfs_iext_get_ext(ifp, total_extents - 1); > + xfs_bmbt_get_all(gotp, &got); > + *next_fsb = got.br_startoff; > + if (stop_fsb > *next_fsb) { > + *done = 1; > + goto del_cursor; > + } > + } > + > + /* Lookup the extent index at which we have to stop */ > + if (SHIFT == SHIFT_RIGHT) { > + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); > + /* Make stop_extent exclusive of shift range */ > + stop_extent--; > + } else > + stop_extent = total_extents; > + > + /* > * Look up the extent index for the fsb where we start shifting. We can > * henceforth iterate with current_ext as extent list changes are locked > * out via ilock. > * > * gotp can be null in 2 cases: 1) if there are no extents or 2) > - * start_fsb lies in a hole beyond which there are no extents. Either > + * *next_fsb lies in a hole beyond which there are no extents. Either > * way, we are done. > */ > - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); > + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); > if (!gotp) { > *done = 1; > goto del_cursor; > } > > - /* > - * There may be delalloc extents in the data fork before the range we > - * are collapsing out, so we cannot use the count of real extents here. > - * Instead we have to calculate it from the incore fork. > - */ > - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > - while (nexts++ < num_exts && current_ext < total_extents) { > + /* some sanity checking before we finally start shifting extents */ > + if ((SHIFT == SHIFT_LEFT && current_ext >= stop_extent) || > + (SHIFT == SHIFT_RIGHT && current_ext <= stop_extent)) { > + error = EIO; error = -EIO; > + goto del_cursor; > + } > + > + while (nexts++ < num_exts) { > error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, > - ¤t_ext, gotp, cur, &logflags); > + ¤t_ext, gotp, cur, &logflags, > + SHIFT); > if (error) > goto del_cursor; > + /* > + * In case there was an extent merge after shifting extent, > + * extent numbers would change. > + * Update total extent count and grab the next record. > + */ /* * If there was an extent merge during the shift, the extent * count can change. Update the total and grade the next record. */ > + if (SHIFT == SHIFT_LEFT) { > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > + stop_extent = total_extents; > + } > > - /* update total extent count and grab the next record */ > - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > - if (current_ext >= total_extents) > + if (current_ext == stop_extent) { > + *done = 1; > + *next_fsb = NULLFSBLOCK; > break; > + } > gotp = xfs_iext_get_ext(ifp, current_ext); > } > > - /* Check if we are done */ > - if (current_ext == total_extents) { > - *done = 1; > - } else if (next_fsb) { > + if (!*done) { > xfs_bmbt_get_all(gotp, &got); > *next_fsb = got.br_startoff; > } > @@ -5696,3 +5777,192 @@ del_cursor: > > return error; > } > + > +/* > + * Splits an extent into two extents at split_fsb block that it is > + * the first block of the current_ext. @current_ext is a target extent > + * to be split. @split_fsb is a block where the extents is split. > + * If split_fsb lies in a hole or the first block of extents, just return 0. > + */ > +STATIC int > +xfs_bmap_split_extent_at( > + struct xfs_trans *tp, > + struct xfs_inode *ip, > + xfs_fileoff_t split_fsb, > + xfs_fsblock_t *firstfsb, > + struct xfs_bmap_free *free_list) > +{ > + int whichfork = XFS_DATA_FORK; > + struct xfs_btree_cur *cur = NULL; > + struct xfs_bmbt_rec_host *gotp; > + struct xfs_bmbt_irec got; > + struct xfs_bmbt_irec new; /* split extent */ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_ifork *ifp; > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > + xfs_extnum_t current_ext; > + int error = 0; > + int logflags = 0; > + int i = 0; > + > + if (unlikely(XFS_TEST_ERROR( > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > + XFS_ERRLEVEL_LOW, mp); > + return -EFSCORRUPTED; > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; > + > + ifp = XFS_IFORK_PTR(ip, whichfork); > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > + /* Read in all the extents */ > + error = xfs_iread_extents(tp, ip, whichfork); > + if (error) > + return error; > + } > + > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); > + /* > + * gotp can be null in 2 cases: 1) if there are no extents > + * or 2) split_fsb lies in a hole beyond which there are > + * no extents. Either way, we are done. > + */ > + if (!gotp) > + return 0; Comment can go before the call to xfs_iext_bno_to_ext(). > + > + xfs_bmbt_get_all(gotp, &got); > + > + /* > + * Check split_fsb lies in a hole or the start boundary offset > + * of the extent. > + */ > + if (got.br_startoff >= split_fsb) > + return 0; > + > + gotblkcnt = split_fsb - got.br_startoff; > + new.br_startoff = split_fsb; > + new.br_startblock = got.br_startblock + gotblkcnt; > + new.br_blockcount = got.br_blockcount - gotblkcnt; > + new.br_state = got.br_state; > + > + if (ifp->if_flags & XFS_IFBROOT) { > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > + cur->bc_private.b.firstblock = *firstfsb; > + cur->bc_private.b.flist = free_list; > + cur->bc_private.b.flags = 0; > + } > + > + if (cur) { No need to close the XFS_IFBROOT branch and then check for cur; we just allocated it inside the XFS_IFBROOT branch! > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > + got.br_startblock, > + got.br_blockcount, > + &i); > + if (error) > + goto del_cursor; > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > + } .... > @@ -1427,20 +1429,23 @@ xfs_collapse_file_space( > > /* > * Writeback and invalidate cache for the remainder of the file as we're > - * about to shift down every extent from the collapse range to EOF. The > - * free of the collapse range above might have already done some of > - * this, but we shouldn't rely on it to do anything outside of the range > - * that was freed. > + * about to shift down every extent from offset to EOF. > */ > error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > - offset + len, -1); > + offset, -1); > if (error) > return error; > error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > - (offset + len) >> PAGE_CACHE_SHIFT, -1); > + offset >> PAGE_CACHE_SHIFT, -1); > if (error) > return error; > > + if (SHIFT == SHIFT_RIGHT) { > + error = xfs_bmap_split_extent(ip, stop_fsb); > + if (error) > + return error; > + } This needs a comment explaining why we are splitting an extent here. > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1cdba95..222a91a 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -823,11 +823,13 @@ xfs_file_fallocate( > long error; > enum xfs_prealloc_flags flags = 0; > loff_t new_size = 0; > + int do_file_insert = 0; bool rather than int. > > if (!S_ISREG(inode->i_mode)) > return -EINVAL; > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > + FALLOC_FL_INSERT_RANGE)) > return -EOPNOTSUPP; This should use a local define before the function such as: #define XFS_FALLOC_FL_SUPPORTED \ (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \ FALLOC_FL_INSERT_RANGE) This is similar to how we define supported checks for FIEMAP operations in xfs_vn_fiemap(). > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > @@ -857,6 +859,28 @@ xfs_file_fallocate( > error = xfs_collapse_file_space(ip, offset, len); > if (error) > goto out_unlock; > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > + > + if (offset & blksize_mask || len & blksize_mask) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + /* Check for wrap through zero */ > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > + error = -EFBIG; > + goto out_unlock; > + } At first I thought that was a duplicate check of what is in vfs_fallocate() (i.e. off + len > s_maxbytes). Can you change the comment to read something like: /* check the new inode size does not wrap through zero */ > + > + /* Offset should be less than i_size */ > + if (offset >= i_size_read(inode)) { > + error = -EINVAL; > + goto out_unlock; > + } > + > + new_size = i_size_read(inode) + len; > + do_file_insert = 1; Why do you use inode->i_size onthe wrap check, yet i_size_read() twice here? > } else { > flags |= XFS_PREALLOC_SET; > > @@ -891,8 +915,20 @@ xfs_file_fallocate( > iattr.ia_valid = ATTR_SIZE; > iattr.ia_size = new_size; > error = xfs_setattr_size(ip, &iattr); > + if (error) > + goto out_unlock; > } > > + /* > + * Some operations are performed after the inode size is updated. For > + * example, insert range expands the address space of the file, shifts > + * all subsequent extents to create a hole inside the file. Updating > + * the size first ensures that shifted extents aren't left hanging > + * past EOF in the event of a crash or failure. > + */ /* * Perform hole insertion now that the file size has been * updated so that if we crash during the operation we don't * leave shifted extents past EOF and hence losing access to * the data that is contained within them. */ > + if (do_file_insert) > + error = xfs_insert_file_space(ip, offset, len); > + > out_unlock: > xfs_iunlock(ip, XFS_IOLOCK_EXCL); > return error; Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 18:56:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 45B777F59 for ; Mon, 16 Feb 2015 18:56:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3465130405F for ; Mon, 16 Feb 2015 16:56:04 -0800 (PST) X-ASG-Debug-ID: 1424134562-04cb6c6b0b4185c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id J9ENX9tKSaPGCwRJ for ; Mon, 16 Feb 2015 16:56:02 -0800 (PST) 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: A2CQFQBekOJUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQICAQECgRJEAQEBAQEBBQEBAQE4O4QMAQEBBDocIxAIAw4HAwklDwUlAwcaE4gszjYBAQgCAR8YhWyFCIRtB4MWgRQBBIRWB5QRgRmJOoF0hkeCVIFQKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 11:26:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNWSG-0003yC-Lp; Tue, 17 Feb 2015 11:56:00 +1100 Date: Tue, 17 Feb 2015 11:56:00 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH RESEND 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-ID: <20150217005600.GF4251@dastard> X-ASG-Orig-Subj: Re: [PATCH RESEND 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-5-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424101680-3301-5-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424134562 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15407 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 17, 2015 at 12:47:51AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan Looks good. That'll fix up the complaining fstest ;) Reviewed-by: Dave Chinner -Dave -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 19:00:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A2FC17F5D for ; Mon, 16 Feb 2015 19:00:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7EB60304059 for ; Mon, 16 Feb 2015 17:00:37 -0800 (PST) X-ASG-Debug-ID: 1424134834-04bdf06a5b3f7740001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id BjNFNNor67SMPm43 for ; Mon, 16 Feb 2015 17:00:35 -0800 (PST) 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: A2CRFQC4keJUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQICAQECgRJEAQEBAQEBBQEBAQE4O4QMAQEBBCcTHCMQCAMOBwMJJQ8FJQMHGhOILM46AQEBBwIBHxiFbIUIhG0HhCoBBIRWB5QRkw6CIQMcgWQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 11:30:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNWWf-0003yz-9A; Tue, 17 Feb 2015 12:00:33 +1100 Date: Tue, 17 Feb 2015 12:00:33 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation Message-ID: <20150217010033.GG4251@dastard> X-ASG-Orig-Subj: Re: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-12-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424101680-3301-12-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424134834 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15408 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 17, 2015 at 12:47:58AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Reviewed-by: Brian Foster > --- > ltp/fsx.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 114 insertions(+), 10 deletions(-) ..... > @@ -339,6 +341,14 @@ logdump(void) > lp->args[0] + lp->args[1]) > prt("\t******CCCC"); > break; > + case OP_INSERT_RANGE: > + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", > + lp->args[0], lp->args[0] + lp->args[1] - 1, > + lp->args[1]); > + if (badoff >= lp->args[0] && badoff < > + lp->args[0] + lp->args[1]) > + prt("\t******CCCC"); Probably should output "*****IIII" so we can distinguish it from collapse operations easily. > @@ -1307,6 +1403,9 @@ usage(void) > #ifdef FALLOC_FL_COLLAPSE_RANGE > " -C: Do not use collapse range calls\n" > #endif > +#ifdef FALLOC_FL_INSERT_RANGE > +" -i: Do not use insert range calls\n" > +#endif I'd make that "-I" rather than "-i" so it matches with the "-C" of collapse range. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 19:03:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 64BD47F61 for ; Mon, 16 Feb 2015 19:03:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8835AC001 for ; Mon, 16 Feb 2015 17:03:11 -0800 (PST) X-ASG-Debug-ID: 1424134983-04cbb011633cce80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Us7uzAPG6IhEV8jn for ; Mon, 16 Feb 2015 17:03:04 -0800 (PST) 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: A2CQFQDgkuJUPDkjLHlbgwaBLII0g3mpOQEBAQEBAQaYOQICAQECgRJEAQEBAQEBBQEBAQE4O4QMAQEBBDocIxAIAw4HAwklDwUlAwcaE4gszjsBAQgCAR8YhWyFCIRtB4QqBYRWB5QRgRmJOoF0hkeCIR+BZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 11:32:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNWYO-0003zK-V8; Tue, 17 Feb 2015 12:02:21 +1100 Date: Tue, 17 Feb 2015 12:02:20 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH RESEND 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20150217010220.GH4251@dastard> X-ASG-Orig-Subj: Re: [PATCH RESEND 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-4-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424101680-3301-4-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424134983 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15408 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 17, 2015 at 12:47:50AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. > > 1) Make sure that both offset and len are block size aligned. > 2) Update the i_size of inode by len bytes. > 3) Compute the file's logical block number against offset. If the computed > block number is not the starting block of the extent, split the extent > such that the block number is the starting block of the extent. > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > towards right by len bytes. This step will make a hole of len bytes > at offset. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan I'll leave this for the ext4 folk to review. If I don't get a review by the time we're ready to merge the VFS and XFS code, then I'll leave it out and let Ted merge it inhis own time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 16 19:38:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AE8617F60 for ; Mon, 16 Feb 2015 19:38:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F7CF8F8039 for ; Mon, 16 Feb 2015 17:38:55 -0800 (PST) X-ASG-Debug-ID: 1424137132-04bdf06a593f8ab0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3EDo1eGaeE7lgPE6 for ; Mon, 16 Feb 2015 17:38:52 -0800 (PST) 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: A2DoCwASm+JUPDkjLHlbgwZSWoI0rScMAQEBAQEBBpJOhWsEAgKBEkQBAQEBAQEFAQEBATg7hAwBAQEDATocIwULCAMYCSUPBSUDBxoTiCUHDs4pAQEBBwIgGIVshQiEbQeEKgWNTIVDhV+BGTiCVYYtiDuEJCoxgQQkgRsBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Feb 2015 12:08:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNX7h-00041S-ES; Tue, 17 Feb 2015 12:38:49 +1100 Date: Tue, 17 Feb 2015 12:38:49 +1100 From: Dave Chinner To: Alexander Tsvetkov Cc: Eric Sandee , xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log Message-ID: <20150217013849.GI4251@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> <20150211205406.GT4251@dastard> <54DC940D.4030009@oracle.com> <20150212230940.GD12722@dastard> <54E1F6C2.4060105@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E1F6C2.4060105@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424137132 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15409 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 16, 2015 at 04:55:14PM +0300, Alexander Tsvetkov wrote: > > On 02/13/2015 02:09 AM, Dave Chinner wrote: > >On Thu, Feb 12, 2015 at 02:52:45PM +0300, Alexander Tsvetkov wrote: > >>On 02/11/2015 11:54 PM, Dave Chinner wrote: > >>>On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: > >>>>Hello, > >>>> > >>>>I've obtained corrupted xfs log after some sanity xfs testing: > >>>> > >>>>"log=logfile > >>>>log_size=855 > >>>> > >>>>dd if=/dev/zero "of=$log" bs=4096 count=$log_size > >>>>loopdev=$(losetup -f) > >>>>losetup $loopdev $log > >>>> > >>>>mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV > >>>>mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT > >>>>./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT > >>>>sync > >>>>umount $SCRATCH_MNT > >>>> > >>>>xfs_logprint -l $loopdev $SCRATCH_DEV" > >>>> > >>>>Test makes crc enabled xfs filesystem with the external log of > >>>>minimal allowed size and then creates on this fs the small directory > >>>>tree > >>>>with sub directories and files of fixed depth and size with help of > >>>>fdtree utility: > >>>>https://computing.llnl.gov/?set=code&page=sio_downloads > >>>Just take metadump image and put it somewhere we can down load it. > >>> > >>>>After that xfs_logprint stably reports bad data in log: > >Please try the patch below, it fixes the problem on the image you > >provided. > > I've restored provided image to filesystem with the same log file, > applied patch to latest xfsprogs and have stable pass runs > of xfs_logprint on that filesystem and running with xfsprogs without > this patch results to xfs_logprint segfaults reported that means > patch is working. Good. > The problem that it is not working for repeated test runs where > xfs_logprint still continue to report bad log data. It seems it is xfs_logprint is not a tool that is intended for validation of the log contents. It's a triage tool that was written in a hurry, and as such it's neither reliable or maintainable. Indeed, there's a comment in the code saying it really needs to be rewritten. ;) I'll have a look the image, but really spending lots of time on fixing minor issues with logprint really isn't the best use of my time right now... Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Mon Feb 16 19:43:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 542807F63 for ; Mon, 16 Feb 2015 19:43:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 419C58F8039 for ; Mon, 16 Feb 2015 17:43:57 -0800 (PST) X-ASG-Debug-ID: 1424137433-04cbb011653ce100001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id E9RCUEudKSKIs0W5 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Mon, 16 Feb 2015 17:43:55 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW00MZ57H4YCC0@mailout1.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 10:43:52 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm2.samsung.com ( [172.20.52.112]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id A0.FD.18484.8DC92E45; Tue, 17 Feb 2015 10:43:52 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-26-54e29cd86dcf Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 63.F2.09430.8DC92E45; Tue, 17 Feb 2015 10:43:52 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW000XT7H4KC00@mmp2.samsung.com>; Tue, 17 Feb 2015 10:43:52 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' , 'Namjae Jeon' Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-12-git-send-email-linkinjeon@gmail.com> <20150217010033.GG4251@dastard> In-reply-to: <20150217010033.GG4251@dastard> Subject: RE: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation Date: Tue, 17 Feb 2015 10:43:52 +0900 X-ASG-Orig-Subj: RE: [PATCH RESEND 11/12] xfstests: fsx: Add fallocate insert range operation Message-id: <001101d04a53$2ed730a0$8c8591e0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQGaVtWSDPBxtr7DbKzudLHsKzAINAJe2lRNAOmO1q6dRbTsAA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBIsWRmVeSWpSXmKPExsWyRsSkQPfGnEchBncf61osnXiJ2eLd5yqL LcfuMVpcv3uL2WLz9w42i5nz7rBZ7Nl7ksXi8q45bBZr1s9gtzg14QG7RWvPT3aLRX23GB14 PE4tkvDYOesuu0fTmaPMHqsvbGX0eL/vKptH35ZVjB6fN8kFsEdx2aSk5mSWpRbp2yVwZTRO 2sZY8Jm7YvfrHrYGxkmcXYwcHBICJhLH1vF0MXICmWISF+6tZ+ti5OIQEljKKHHq8252iISJ xPqrm9ghEtMZJS5OfwZV9ZdRov3kdFaQSWwC2hJ/toiCNIgI+EkcfH0SrIFZ4BejxOm7Vxgh GhYwStxYs5AJpIpTQEfiyotnzCDNwgLhEme+VYOEWQRUJQ4eeMMMYvMKWEpcaTjCCGELSvyY fI8FxGYW0JJYv/M4E4QtL7F5zVtmiEsVJHacfc0IcYSTxPwjG5ghakQk9r14B3aDhMBcDomT H98yQiwTkPg2+RALJChkJTYdgJojKXFwxQ2WCYwSs5CsnoVk9Swkq2chWbGAkWUVo2hqQXJB cVJ6kbFecWJucWleul5yfu4mRmACOP3vWf8OxrsHrA8xCnAwKvHwTpj0KESINbGsuDL3EKMp 0EUTmaVEk/OBaSavJN7Q2MzIwtTE1NjI3NJMSZx3odTPYCGB9MSS1OzU1ILUovii0pzU4kOM TBycUg2Ms0Nk4ze3rjJQd+H79YRP8Z/M9dWn/TdNOv1vnzbXnRX2WxaezOz/9J+7ZcPZois3 y/qfqC94Xnj0fHbOKsmeia7r2RuUTrrrTTod8emc81q+Gbn+L4JvM0v6aQjn9iy80xX564DS QZ0Vnz9wxUXNb06olFSb9ur3lx32ciFJNfp/BB5+OdZ5VomlOCPRUIu5qDgRAAueiFH7AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrMKsWRmVeSWpSXmKPExsVy+t9jQd0bcx6FGOxeo2KxdOIlZot3n6ss thy7x2hx/e4tZovN3zvYLGbOu8NmsWfvSRaLy7vmsFmsWT+D3eLUhAfsFq09P9ktFvXdYnTg 8Ti1SMJj56y77B5NZ44ye6y+sJXR4/2+q2wefVtWMXp83iQXwB7VwGiTkZqYklqkkJqXnJ+S mZduq+QdHO8cb2pmYKhraGlhrqSQl5ibaqvk4hOg65aZA3SokkJZYk4pUCggsbhYSd8O04TQ EDddC5jGCF3fkCC4HiMDNJCwhjGjcdI2xoLP3BW7X/ewNTBO4uxi5OSQEDCRWH91EzuELSZx 4d56ti5GLg4hgemMEhenP4Ny/jJKtJ+cztrFyMHBJqAt8WeLKEiDiICfxMHXJ9lBapgFfjFK nL57hRGiYQGjxI01C5lAqjgFdCSuvHjGDNIsLBAuceZbNUiYRUBV4uCBN8wgNq+ApcSVhiOM ELagxI/J91hAbGYBLYn1O48zQdjyEpvXvGWGuFRBYsfZ14wQRzhJzD+ygRmiRkRi34t3jBMY hWYhGTULyahZSEbNQtKygJFlFaNoakFyQXFSeq6RXnFibnFpXrpecn7uJkZwgnkmvYNxVYPF IUYBDkYlHt4Jkx6FCLEmlhVX5h5ilOBgVhLhfZUHFOJNSaysSi3Kjy8qzUktPsRoCvTpRGYp 0eR8YPLLK4k3NDYxM7I0Mje0MDI2VxLnVbJvCxESSE8sSc1OTS1ILYLpY+LglGpglOhNDTxx RP12V/nFTTNrd33f/yZcM2tVGWdtb5r/Sdk9/JJ3j2fwVmX/9pqckbj55peVCdsz1jTcl4pM uSxY8//1fL3I/qu/P6/7U2QnO7/UKm1dWfOmk3sv1P9jqNnbz7g3ZOOF47/mFbNP3JHesVJ4 9zSpHtui6tkOnq3vldl+RBidvuxupMRSnJFoqMVcVJwIAMndkT9GAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1424137434 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > > On Tue, Feb 17, 2015 at 12:47:58AM +0900, Namjae Jeon wrote: > > From: Namjae Jeon > > > > This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > Reviewed-by: Brian Foster > > --- > > ltp/fsx.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- > > 1 file changed, 114 insertions(+), 10 deletions(-) > ..... > > @@ -339,6 +341,14 @@ logdump(void) > > lp->args[0] + lp->args[1]) > > prt("\t******CCCC"); > > break; > > + case OP_INSERT_RANGE: > > + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", > > + lp->args[0], lp->args[0] + lp->args[1] - 1, > > + lp->args[1]); > > + if (badoff >= lp->args[0] && badoff < > > + lp->args[0] + lp->args[1]) > > + prt("\t******CCCC"); > Hi Dave, > Probably should output "*****IIII" so we can distinguish it from > collapse operations easily. Right. I will change it. > > > @@ -1307,6 +1403,9 @@ usage(void) > > #ifdef FALLOC_FL_COLLAPSE_RANGE > > " -C: Do not use collapse range calls\n" > > #endif > > +#ifdef FALLOC_FL_INSERT_RANGE > > +" -i: Do not use insert range calls\n" > > +#endif > > I'd make that "-I" rather than "-i" so it matches with the "-C" of > collapse range. Okay. Thanks for your review! > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From namjae.jeon@samsung.com Mon Feb 16 19:47:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1974B7F69 for ; Mon, 16 Feb 2015 19:47:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B8DAFAC006 for ; Mon, 16 Feb 2015 17:47:15 -0800 (PST) X-ASG-Debug-ID: 1424137632-04bdf06a5a3f8f60001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id AZvRpE46rR3BkCgM (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Mon, 16 Feb 2015 17:47:13 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW002277MNXM10@mailout2.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 10:47:11 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 5D.F6.17016.F9D92E45; Tue, 17 Feb 2015 10:47:11 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-85-54e29d9f33c5 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id B1.D3.09430.F9D92E45; Tue, 17 Feb 2015 10:47:11 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW00BQN7MMZQA0@mmp1.samsung.com>; Tue, 17 Feb 2015 10:47:11 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, 'Namjae Jeon' References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-3-git-send-email-linkinjeon@gmail.com> <20150217005408.GE4251@dastard> In-reply-to: <20150217005408.GE4251@dastard> Subject: RE: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 10:47:10 +0900 X-ASG-Orig-Subj: RE: [PATCH RESEND 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001201d04a53$a54c81e0$efe585a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQGaVtWSDPBxtr7DbKzudLHsKzAINAGjU/DGAfrht12dQwcX8A== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrBIsWRmVeSWpSXmKPExsWyRsSkRHf+3EchBo8eqVgsnXiJ2eLd5yqL LcfuMVpcv3uL2WLz9w42i5nz7rBZ7Nl7ksXi8q45bBZr1s9gtzg14QG7RWvPT3aLRX23GB14 PE4tkvDYOesuu0fTmaPMHqsvbGX0eL/vKptH35ZVjB6fN8kFsEdx2aSk5mSWpRbp2yVwZfzu 38ZUcHQeY8WLba+ZGhjnlHUxcnJICJhIfNjdwQ5hi0lcuLeerYuRi0NIYCmjxKpffawwRQ9n TIBKLGKUuPr6OguE85dRYmnvdCCHg4NNQFvizxZRkAYRAQ2JaXuPMIPUMAssYJJY/nwZE0hC SGA+o8SZIwpdjOwcnAI6EqttQaLCAhESxzongh3BIqAqcWD9eTCbV8BSYs+6dhYIW1Dix+R7 YDazgJbE+p3HmSBseYnNa94yQ9ypILHj7GtGiBOcJA5+2sIGUSMise/FO0aQcyQE5nJI9Lfu Z4RYJiDxbfIhsPMlBGQlNh2AmiMpcXDFDZYJjBKzkKyehWT1LCSrZyFZsYCRZRWjaGpBckFx UnqRoV5xYm5xaV66XnJ+7iZGYAI4/e9Z7w7G2wesDzEKcDAq8fBOmPQoRIg1say4MvcQoynQ RROZpUST84FpJq8k3tDYzMjC1MTU2Mjc0kxJnFdR6mewkEB6YklqdmpqQWpRfFFpTmrxIUYm Dk6pBsYr7ryvzt/MPxWyUfGC0oEbLburliYLOeXM6MzpKH/EfHA673rvT/IlTilGqdoJIksX PpzVxflJNkXMb238u5Mb3Xg3Onxn0+4R6DRdFs37u/nFJZnFRqIbYx2llX97q3mob5sn/4nz 2P8uzW0n/xj94rjqGyIy9W/VsW+e0/7LzjSa0v6G2V2JpTgj0VCLuag4EQDuPX/g+wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEKsWRmVeSWpSXmKPExsVy+t9jAd35cx+FGPzaKm6xdOIlZot3n6ss thy7x2hx/e4tZovN3zvYLGbOu8NmsWfvSRaLy7vmsFmsWT+D3eLUhAfsFq09P9ktFvXdYnTg 8Ti1SMJj56y77B5NZ44ye6y+sJXR4/2+q2wefVtWMXp83iQXwB7VwGiTkZqYklqkkJqXnJ+S mZduq+QdHO8cb2pmYKhraGlhrqSQl5ibaqvk4hOg65aZA3SokkJZYk4pUCggsbhYSd8O04TQ EDddC5jGCF3fkCC4HiMDNJCwhjHjd/82poKj8xgrXmx7zdTAOKesi5GTQ0LAROLhjAlsELaY xIV764FsLg4hgUWMEldfX2eBcP4ySiztnQ7kcHCwCWhL/NkiCtIgIqAhMW3vEWaQGmaBBUwS y58vYwJJCAnMZ5Q4c0Shi5Gdg1NAR2K1LUhUWCBC4ljnRHYQm0VAVeLA+vNgNq+ApcSede0s ELagxI/J98BsZgEtifU7jzNB2PISm9e8ZYa4U0Fix9nXjBAnOEkc/LSFDaJGRGLfi3eMExiF ZiEZNQvJqFlIRs1C0rKAkWUVo2hqQXJBcVJ6rpFecWJucWleul5yfu4mRnB6eSa9g3FVg8Uh RgEORiUe3gmTHoUIsSaWFVfmHmKU4GBWEuF9lQcU4k1JrKxKLcqPLyrNSS0+xGgK9OlEZinR 5Hxg6ssriTc0NjEzsjQyN7QwMjZXEudVsm8LERJITyxJzU5NLUgtgulj4uCUamAU+rZac8Kv 7Udy65lYXrm8qpz6c/oPtzUMCXdsrQukli6uMrw/l7dbfSpPWn1V0McyE70z+85OelYqlcu/ c8ZRNb2ss2cY2drf/E8I9VzwWNeWT+jvw73Vbg98Mq6a90pmLr72Qrc5uv5jr9ktobL/bNJL +dy/pV/ftGuyeUFecV/71S8Mk6qUWIozEg21mIuKEwFkfr8JRQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1424137633 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Dave, I did totally check your review points. I will share the patch soon. Thanks for your review! > On Tue, Feb 17, 2015 at 12:47:49AM +0900, Namjae Jeon wrote: > > From: Namjae Jeon > > > > This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. > > > > 1) Make sure that both offset and len are block size aligned. > > 2) Update the i_size of inode by len bytes. > > 3) Compute the file's logical block number against offset. If the computed > > block number is not the starting block of the extent, split the extent > > such that the block number is the starting block of the extent. > > 4) Shift all the extents which are lying bewteen [offset, last allocated extent] > > towards right by len bytes. This step will make a hole of len bytes > > at offset. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > Reviewed-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_bmap.c | 358 ++++++++++++++++++++++++++++++++++++++++------ > > fs/xfs/libxfs/xfs_bmap.h | 13 +- > > fs/xfs/xfs_bmap_util.c | 126 +++++++++++----- > > fs/xfs/xfs_bmap_util.h | 2 + > > fs/xfs/xfs_file.c | 38 ++++- > > fs/xfs/xfs_trace.h | 1 + > > 6 files changed, 455 insertions(+), 83 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > > index 61ec015..6699e53 100644 > > --- a/fs/xfs/libxfs/xfs_bmap.c > > +++ b/fs/xfs/libxfs/xfs_bmap.c > > @@ -5518,50 +5518,86 @@ xfs_bmse_shift_one( > > int *current_ext, > > struct xfs_bmbt_rec_host *gotp, > > struct xfs_btree_cur *cur, > > - int *logflags) > > + int *logflags, > > + enum SHIFT_DIRECTION SHIFT) > > Please don't shout. ;) > > Lower case for types and variables, upper case for the enum values. > I also think the "shift" variable should be named "direction", > too, so the code reads "if (direction == SHIFT_LEFT)" and so is > clearly self documenting... > > (only commenting once on this, please change it in other places) > as well ;) > > > { > > struct xfs_ifork *ifp; > > xfs_fileoff_t startoff; > > - struct xfs_bmbt_rec_host *leftp; > > + struct xfs_bmbt_rec_host *contp; > > struct xfs_bmbt_irec got; > > - struct xfs_bmbt_irec left; > > + struct xfs_bmbt_irec cont; > > Not sure what "cont" is short for. It's used as the "adjacent > extent" record, so that would be a better name IMO. > > > int error; > > int i; > > + int total_extents; > > > > ifp = XFS_IFORK_PTR(ip, whichfork); > > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > > > xfs_bmbt_get_all(gotp, &got); > > - startoff = got.br_startoff - offset_shift_fsb; > > > > /* delalloc extents should be prevented by caller */ > > XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); > > > > - /* > > - * Check for merge if we've got an extent to the left, otherwise make > > - * sure there's enough room at the start of the file for the shift. > > - */ > > - if (*current_ext) { > > - /* grab the left extent and check for a large enough hole */ > > - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); > > - xfs_bmbt_get_all(leftp, &left); > > + if (SHIFT == SHIFT_LEFT) { > > + startoff = got.br_startoff - offset_shift_fsb; > > > > - if (startoff < left.br_startoff + left.br_blockcount) > > + /* > > + * Check for merge if we've got an extent to the left, > > + * otherwise make sure there's enough room at the start > > + * of the file for the shift. > > + */ > > + if (*current_ext) { > > + /* > > + * grab the left extent and check for a large > > + * enough hole. > > + */ > > + contp = xfs_iext_get_ext(ifp, *current_ext - 1); > > + xfs_bmbt_get_all(contp, &cont); > > + > > + if (startoff < cont.br_startoff + cont.br_blockcount) > > + return -EINVAL; > > + > > + /* check whether to merge the extent or shift it down */ > > + if (xfs_bmse_can_merge(&cont, &got, offset_shift_fsb)) { > > + return xfs_bmse_merge(ip, whichfork, > > + offset_shift_fsb, > > + *current_ext, gotp, contp, > > + cur, logflags); > > + } > > + } else if (got.br_startoff < offset_shift_fsb) > > return -EINVAL; > > This would be better written: > > if (!*current_ext) { > if (got.br_startoff < offset_shift_fsb) > return -EINVAL; > goto update_current_ext; > } > > and then the rest of the code in the shift left branch can drop a > level of indent and hence become less congested and easier to read. > > > > + } else { > > + startoff = got.br_startoff + offset_shift_fsb; > > + /* > > + * If this is not the last extent in the file, make sure there's > > + * enough room between current extent and next extent for > > + * accommodating the shift. > > + */ > > + if (*current_ext < (total_extents - 1)) { > > + contp = xfs_iext_get_ext(ifp, *current_ext + 1); > > + xfs_bmbt_get_all(contp, &cont); > > + if (startoff + got.br_blockcount > cont.br_startoff) > > + return -EINVAL; > > > > - /* check whether to merge the extent or shift it down */ > > - if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { > > - return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, > > - *current_ext, gotp, leftp, cur, > > - logflags); > > + /* > > + * Unlike a left shift (which involves a hole punch), > > + * a right shift does not modify extent neighbors > > + * in any way. We should never find mergeable extents > > + * in this scenario. Check anyways and warn if we > > + * encounter two extents that could be one. > > + */ > > + if (xfs_bmse_can_merge(&got, &cont, offset_shift_fsb)) > > + WARN_ON_ONCE(1); > > } > > Similarly: > /* nothing to move if this is the last extent */ > if (*current_ext >= total_extents) > goto update_current_ext; > > > - } else if (got.br_startoff < offset_shift_fsb) > > - return -EINVAL; > > - > > + } > > /* > > * Increment the extent index for the next iteration, update the start > > * offset of the in-core extent and update the btree if applicable. > > */ > > - (*current_ext)++; > > update_current_ext: > > + if (SHIFT == SHIFT_LEFT) > > + (*current_ext)++; > > + else > > + (*current_ext)--; > > xfs_bmbt_set_startoff(gotp, startoff); > > *logflags |= XFS_ILOG_CORE; > > if (!cur) { > > @@ -5581,10 +5617,10 @@ xfs_bmse_shift_one( > > } > > > > /* > > - * Shift extent records to the left to cover a hole. > > + * Shift extent records to the left/right to cover/create a hole. > > * > > * The maximum number of extents to be shifted in a single operation is > > - * @num_exts. @start_fsb specifies the file offset to start the shift and the > > + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the > > * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb > > * is the length by which each extent is shifted. If there is no hole to shift > > * the extents into, this will be considered invalid operation and we abort > > @@ -5594,12 +5630,13 @@ int > > xfs_bmap_shift_extents( > > struct xfs_trans *tp, > > struct xfs_inode *ip, > > - xfs_fileoff_t start_fsb, > > + xfs_fileoff_t *next_fsb, > > xfs_fileoff_t offset_shift_fsb, > > int *done, > > - xfs_fileoff_t *next_fsb, > > + xfs_fileoff_t stop_fsb, > > xfs_fsblock_t *firstblock, > > struct xfs_bmap_free *flist, > > + enum SHIFT_DIRECTION SHIFT, > > int num_exts) > > { > > struct xfs_btree_cur *cur = NULL; > > @@ -5609,10 +5646,11 @@ xfs_bmap_shift_extents( > > struct xfs_ifork *ifp; > > xfs_extnum_t nexts = 0; > > xfs_extnum_t current_ext; > > + xfs_extnum_t total_extents; > > + xfs_extnum_t stop_extent; > > int error = 0; > > int whichfork = XFS_DATA_FORK; > > int logflags = 0; > > - int total_extents; > > > > if (unlikely(XFS_TEST_ERROR( > > (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > > @@ -5628,6 +5666,7 @@ xfs_bmap_shift_extents( > > > > ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > > ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > > + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); > > > > ifp = XFS_IFORK_PTR(ip, whichfork); > > if (!(ifp->if_flags & XFS_IFEXTENTS)) { > > @@ -5645,43 +5684,85 @@ xfs_bmap_shift_extents( > > } > > > > /* > > + * There may be delalloc extents in the data fork before the range we > > + * are collapsing out, so we cannot use the count of real extents here. > > + * Instead we have to calculate it from the incore fork. > > + */ > > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > + if (total_extents == 0) { > > + *done = 1; > > + goto del_cursor; > > + } > > + > > + /* > > + * In case of first right shift, we need to initialize next_fsb > > + */ > > + if (*next_fsb == NULLFSBLOCK) { > > + ASSERT(SHIFT == SHIFT_RIGHT); > > This should be at the top of the function. i.e. > > ASSERT(*next_fsb != NULLFSBLOCK || direction == SHIFT_RIGHT) > > > + gotp = xfs_iext_get_ext(ifp, total_extents - 1); > > + xfs_bmbt_get_all(gotp, &got); > > + *next_fsb = got.br_startoff; > > + if (stop_fsb > *next_fsb) { > > + *done = 1; > > + goto del_cursor; > > + } > > + } > > + > > + /* Lookup the extent index at which we have to stop */ > > + if (SHIFT == SHIFT_RIGHT) { > > + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); > > + /* Make stop_extent exclusive of shift range */ > > + stop_extent--; > > + } else > > + stop_extent = total_extents; > > + > > + /* > > * Look up the extent index for the fsb where we start shifting. We can > > * henceforth iterate with current_ext as extent list changes are locked > > * out via ilock. > > * > > * gotp can be null in 2 cases: 1) if there are no extents or 2) > > - * start_fsb lies in a hole beyond which there are no extents. Either > > + * *next_fsb lies in a hole beyond which there are no extents. Either > > * way, we are done. > > */ > > - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); > > + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); > > if (!gotp) { > > *done = 1; > > goto del_cursor; > > } > > > > - /* > > - * There may be delalloc extents in the data fork before the range we > > - * are collapsing out, so we cannot use the count of real extents here. > > - * Instead we have to calculate it from the incore fork. > > - */ > > - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > - while (nexts++ < num_exts && current_ext < total_extents) { > > + /* some sanity checking before we finally start shifting extents */ > > + if ((SHIFT == SHIFT_LEFT && current_ext >= stop_extent) || > > + (SHIFT == SHIFT_RIGHT && current_ext <= stop_extent)) { > > + error = EIO; > > error = -EIO; > > > + goto del_cursor; > > + } > > + > > + while (nexts++ < num_exts) { > > error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, > > - ¤t_ext, gotp, cur, &logflags); > > + ¤t_ext, gotp, cur, &logflags, > > + SHIFT); > > if (error) > > goto del_cursor; > > + /* > > + * In case there was an extent merge after shifting extent, > > + * extent numbers would change. > > + * Update total extent count and grab the next record. > > + */ > > /* > * If there was an extent merge during the shift, the extent > * count can change. Update the total and grade the next record. > */ > > > + if (SHIFT == SHIFT_LEFT) { > > + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > + stop_extent = total_extents; > > + } > > > > - /* update total extent count and grab the next record */ > > - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > > - if (current_ext >= total_extents) > > + if (current_ext == stop_extent) { > > + *done = 1; > > + *next_fsb = NULLFSBLOCK; > > break; > > + } > > gotp = xfs_iext_get_ext(ifp, current_ext); > > } > > > > - /* Check if we are done */ > > - if (current_ext == total_extents) { > > - *done = 1; > > - } else if (next_fsb) { > > + if (!*done) { > > xfs_bmbt_get_all(gotp, &got); > > *next_fsb = got.br_startoff; > > } > > @@ -5696,3 +5777,192 @@ del_cursor: > > > > return error; > > } > > + > > +/* > > + * Splits an extent into two extents at split_fsb block that it is > > + * the first block of the current_ext. @current_ext is a target extent > > + * to be split. @split_fsb is a block where the extents is split. > > + * If split_fsb lies in a hole or the first block of extents, just return 0. > > + */ > > +STATIC int > > +xfs_bmap_split_extent_at( > > + struct xfs_trans *tp, > > + struct xfs_inode *ip, > > + xfs_fileoff_t split_fsb, > > + xfs_fsblock_t *firstfsb, > > + struct xfs_bmap_free *free_list) > > +{ > > + int whichfork = XFS_DATA_FORK; > > + struct xfs_btree_cur *cur = NULL; > > + struct xfs_bmbt_rec_host *gotp; > > + struct xfs_bmbt_irec got; > > + struct xfs_bmbt_irec new; /* split extent */ > > + struct xfs_mount *mp = ip->i_mount; > > + struct xfs_ifork *ifp; > > + xfs_fsblock_t gotblkcnt; /* new block count for got */ > > + xfs_extnum_t current_ext; > > + int error = 0; > > + int logflags = 0; > > + int i = 0; > > + > > + if (unlikely(XFS_TEST_ERROR( > > + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && > > + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), > > + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { > > + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", > > + XFS_ERRLEVEL_LOW, mp); > > + return -EFSCORRUPTED; > > + } > > + > > + if (XFS_FORCED_SHUTDOWN(mp)) > > + return -EIO; > > + > > + ifp = XFS_IFORK_PTR(ip, whichfork); > > + if (!(ifp->if_flags & XFS_IFEXTENTS)) { > > + /* Read in all the extents */ > > + error = xfs_iread_extents(tp, ip, whichfork); > > + if (error) > > + return error; > > + } > > + > > + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); > > + /* > > + * gotp can be null in 2 cases: 1) if there are no extents > > + * or 2) split_fsb lies in a hole beyond which there are > > + * no extents. Either way, we are done. > > + */ > > + if (!gotp) > > + return 0; > > Comment can go before the call to xfs_iext_bno_to_ext(). > > > + > > + xfs_bmbt_get_all(gotp, &got); > > + > > + /* > > + * Check split_fsb lies in a hole or the start boundary offset > > + * of the extent. > > + */ > > + if (got.br_startoff >= split_fsb) > > + return 0; > > + > > + gotblkcnt = split_fsb - got.br_startoff; > > + new.br_startoff = split_fsb; > > + new.br_startblock = got.br_startblock + gotblkcnt; > > + new.br_blockcount = got.br_blockcount - gotblkcnt; > > + new.br_state = got.br_state; > > + > > + if (ifp->if_flags & XFS_IFBROOT) { > > + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > > + cur->bc_private.b.firstblock = *firstfsb; > > + cur->bc_private.b.flist = free_list; > > + cur->bc_private.b.flags = 0; > > + } > > + > > + if (cur) { > > No need to close the XFS_IFBROOT branch and then check for cur; > we just allocated it inside the XFS_IFBROOT branch! > > > + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > > + got.br_startblock, > > + got.br_blockcount, > > + &i); > > + if (error) > > + goto del_cursor; > > + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); > > + } > > .... > > > @@ -1427,20 +1429,23 @@ xfs_collapse_file_space( > > > > /* > > * Writeback and invalidate cache for the remainder of the file as we're > > - * about to shift down every extent from the collapse range to EOF. The > > - * free of the collapse range above might have already done some of > > - * this, but we shouldn't rely on it to do anything outside of the range > > - * that was freed. > > + * about to shift down every extent from offset to EOF. > > */ > > error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > > - offset + len, -1); > > + offset, -1); > > if (error) > > return error; > > error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > > - (offset + len) >> PAGE_CACHE_SHIFT, -1); > > + offset >> PAGE_CACHE_SHIFT, -1); > > if (error) > > return error; > > > > + if (SHIFT == SHIFT_RIGHT) { > > + error = xfs_bmap_split_extent(ip, stop_fsb); > > + if (error) > > + return error; > > + } > > This needs a comment explaining why we are splitting an extent here. > > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > index 1cdba95..222a91a 100644 > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -823,11 +823,13 @@ xfs_file_fallocate( > > long error; > > enum xfs_prealloc_flags flags = 0; > > loff_t new_size = 0; > > + int do_file_insert = 0; > > bool rather than int. > > > > > if (!S_ISREG(inode->i_mode)) > > return -EINVAL; > > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > > + FALLOC_FL_INSERT_RANGE)) > > return -EOPNOTSUPP; > > This should use a local define before the function such as: > > #define XFS_FALLOC_FL_SUPPORTED \ > (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ > FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \ > FALLOC_FL_INSERT_RANGE) > > This is similar to how we define supported checks for FIEMAP > operations in xfs_vn_fiemap(). > > > > > xfs_ilock(ip, XFS_IOLOCK_EXCL); > > @@ -857,6 +859,28 @@ xfs_file_fallocate( > > error = xfs_collapse_file_space(ip, offset, len); > > if (error) > > goto out_unlock; > > + } else if (mode & FALLOC_FL_INSERT_RANGE) { > > + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; > > + > > + if (offset & blksize_mask || len & blksize_mask) { > > + error = -EINVAL; > > + goto out_unlock; > > + } > > + > > + /* Check for wrap through zero */ > > + if (inode->i_size + len > inode->i_sb->s_maxbytes) { > > + error = -EFBIG; > > + goto out_unlock; > > + } > > At first I thought that was a duplicate check of what is in > vfs_fallocate() (i.e. off + len > s_maxbytes). Can you change the > comment to read something like: > > /* check the new inode size does not wrap through zero */ > > > + > > + /* Offset should be less than i_size */ > > + if (offset >= i_size_read(inode)) { > > + error = -EINVAL; > > + goto out_unlock; > > + } > > + > > + new_size = i_size_read(inode) + len; > > + do_file_insert = 1; > > Why do you use inode->i_size onthe wrap check, yet i_size_read() > twice here? > > > } else { > > flags |= XFS_PREALLOC_SET; > > > > @@ -891,8 +915,20 @@ xfs_file_fallocate( > > iattr.ia_valid = ATTR_SIZE; > > iattr.ia_size = new_size; > > error = xfs_setattr_size(ip, &iattr); > > + if (error) > > + goto out_unlock; > > } > > > > + /* > > + * Some operations are performed after the inode size is updated. For > > + * example, insert range expands the address space of the file, shifts > > + * all subsequent extents to create a hole inside the file. Updating > > + * the size first ensures that shifted extents aren't left hanging > > + * past EOF in the event of a crash or failure. > > + */ > > /* > * Perform hole insertion now that the file size has been > * updated so that if we crash during the operation we don't > * leave shifted extents past EOF and hence losing access to > * the data that is contained within them. > */ > > + if (do_file_insert) > > + error = xfs_insert_file_space(ip, offset, len); > > + > > out_unlock: > > xfs_iunlock(ip, XFS_IOLOCK_EXCL); > > return error; > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From namjae.jeon@samsung.com Mon Feb 16 19:49:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F56A7F6B for ; Mon, 16 Feb 2015 19:49:42 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E19F8F8039 for ; Mon, 16 Feb 2015 17:49:41 -0800 (PST) X-ASG-Debug-ID: 1424137778-04cb6c6b0a41a0e0001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id FfyrnHTBoxwdgxHM (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Mon, 16 Feb 2015 17:49:40 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW003VP7QQIB00@mailout3.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 10:49:38 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.113]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 2E.C5.11124.23E92E45; Tue, 17 Feb 2015 10:49:38 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-52-54e29e32390d Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 30.84.09430.13E92E45; Tue, 17 Feb 2015 10:49:38 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW00KDN7QP2R90@mmp2.samsung.com>; Tue, 17 Feb 2015 10:49:37 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, 'Namjae Jeon' References: <1424101680-3301-1-git-send-email-linkinjeon@gmail.com> <1424101680-3301-2-git-send-email-linkinjeon@gmail.com> <20150216235346.GD4251@dastard> In-reply-to: <20150216235346.GD4251@dastard> Subject: RE: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 10:49:37 +0900 X-ASG-Orig-Subj: RE: [PATCH RESEND 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001301d04a53$fcd91310$f68b3930$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQGaVtWSDPBxtr7DbKzudLHsKzAINAELNmj0AmQFOo6dRH/qsA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrJIsWRmVeSWpSXmKPExsWyRsSkUNdo3qMQg4YmToulEy8xW7z7XGWx 5dg9Rovrd28xW2z+3sFmMXPeHTaLPXtPslhc3jWHzWLN+hnsFqcmPGC3aO35yW6xqO8WowOP x6lFEh47Z91l92g6c5TZY/WFrYwe7/ddZfPo27KK0ePzJrkA9igum5TUnMyy1CJ9uwSujMfX 7jMVzOWrmDxjDVMD4zTuLkZODgkBE4kTs9cxQthiEhfurWfrYuTiEBJYyijRd/wHO0zR5Ic7 mCAS0xkl1n/+ywrh/GWUeLT5A1ALBwebgLbEny2iIA0iAhoS0/YeYQapYRZYwCSx/PkyqO75 jBJnz29lAqniFNCRmHj+BQuILSwQLrFx6lVWEJtFQFXieOdcMJtXwFJiQvdaRghbUOLH5Htg 9cwCWhLrdx5ngrDlJTavecsMcaqCxI6zrxlBDhIRcJI4t98IokREYt+Ld4wgN0gIzOWQeP1x ByPELgGJb5MPsYDUSwjISmw6ADVGUuLgihssExglZiHZPAvJ5llINs9CsmIBI8sqRtHUguSC 4qT0IiO94sTc4tK8dL3k/NxNjMAUcPrfs74djDcPWB9iFOBgVOLhnTDpUYgQa2JZcWXuIUZT oIsmMkuJJucDE01eSbyhsZmRhamJqbGRuaWZkjhvgtTPYCGB9MSS1OzU1ILUovii0pzU4kOM TBycUg2MyyU2qDJe67mWo+a01efd8VU7fLVebLbRk5c7x7vud0pz0bk4i7ucjJVx72by5rT6 uf0Q65x9/6ZRw/Vn+YnvNwmtdfhey1W1+NOnmluLox3u8j5+vf/msrzdh43n/j96LXrthfWV HI18NyP/Osw6djlv+4bJzZHhMhKLDG48sXuTejyXW/ZUgRJLcUaioRZzUXEiAMV2EsL8AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEKsWRmVeSWpSXmKPExsVy+t9jQV2jeY9CDI7IWSydeInZ4t3nKost x+4xWly/e4vZYvP3DjaLmfPusFns2XuSxeLyrjlsFmvWz2C3ODXhAbtFa89PdotFfbcYHXg8 Ti2S8Ng56y67R9OZo8weqy9sZfR4v+8qm0ffllWMHp83yQWwRzUw2mSkJqakFimk5iXnp2Tm pdsqeQfHO8ebmhkY6hpaWpgrKeQl5qbaKrn4BOi6ZeYA3amkUJaYUwoUCkgsLlbSt8M0ITTE TdcCpjFC1zckCK7HyAANJKxhzHh87T5TwVy+iskz1jA1ME7j7mLk5JAQMJGY/HAHE4QtJnHh 3nq2LkYuDiGB6YwS6z//ZYVw/jJKPNr8ASjDwcEmoC3xZ4soSIOIgIbEtL1HmEFqmAUWMEks f76MCaJhPqPE2fNbwcZyCuhITDz/ggXEFhYIl9g49SoriM0ioCpxvHMumM0rYCkxoXstI4Qt KPFj8j2wemYBLYn1O48zQdjyEpvXvGWGOFVBYsfZ14wgB4kIOEmc228EUSIise/FO8YJjEKz kEyahWTSLCSTZiFpWcDIsopRNLUguaA4KT3XSK84Mbe4NC9dLzk/dxMjOL08k97BuKrB4hCj AAejEg/vhEmPQoRYE8uKK3MPMUpwMCuJ8L7KAwrxpiRWVqUW5ccXleakFh9iNAV6dCKzlGhy PjD15ZXEGxqbmBlZGpkbWhgZmyuJ8yrZt4UICaQnlqRmp6YWpBbB9DFxcEo1MJrbrLxlm6vx Yp3avGv/Zzeo3Fna4TL/TmTLDebSp8+iz/v9vTD7aejGDRm3/snlKps/CPKWdIzkf7xdJ4i7 N4Ll/4dfrU9zWcu1Vz4p/pMf/FB/DzPbnFdG3j+EMvX38JUdXndtyaa5XmYO1ZvebeidYXI8 61lk6pobruc//p1b8Eh63w6Pg31KLMUZiYZazEXFiQBzoXJNRQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1424137779 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15409 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== > On Tue, Feb 17, 2015 at 12:47:48AM +0900, Namjae Jeon wrote: > > From: Namjae Jeon > > > > FALLOC_FL_INSERT_RANGE command is the opposite command of > > FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to > > add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space > > for writing new data within a file after shifting extents to right as given > > length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, > > that is block boundary and use ftruncate(2) for crosses EOF. > > > > Signed-off-by: Namjae Jeon > > Signed-off-by: Ashish Sangwan > > Cc: Brian Foster > > --- > > fs/open.c | 8 +++++++- > > include/uapi/linux/falloc.h | 17 +++++++++++++++++ > > 2 files changed, 24 insertions(+), 1 deletion(-) > > > > diff --git a/fs/open.c b/fs/open.c > > index 813be03..762fb45 100644 > > --- a/fs/open.c > > +++ b/fs/open.c > > @@ -232,7 +232,8 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) > > > > /* Return error if mode is not supported */ > > if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | > > - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > > + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | > > + FALLOC_FL_INSERT_RANGE)) > > return -EOPNOTSUPP; > > Can we create a FALLOC_FL_SUPPORTED_MASK define in falloc.h > so that we only need to add new flags to the mask in rather than > change this code every time we add a new flag? Sure, I will do it. and share the patch with the others you gave me review points soon. Thanks for review! > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From jack@suse.cz Tue Feb 17 02:52:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1AD277F3F for ; Tue, 17 Feb 2015 02:52:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8CF40AC002 for ; Tue, 17 Feb 2015 00:52:09 -0800 (PST) X-ASG-Debug-ID: 1424163125-04cb6c6b09422df0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id v8IBYDXVNt4C2FfX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 17 Feb 2015 00:52:06 -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 00499AB08; Tue, 17 Feb 2015 08:52:03 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id F37AF81C26; Tue, 17 Feb 2015 09:52:00 +0100 (CET) Date: Tue, 17 Feb 2015 09:52:00 +0100 From: Jan Kara To: "Wilcox, Matthew R" Cc: Jan Kara , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "david@fromorbit.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Matthew Wilcox , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150217085200.GA23192@quack.suse.cz> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150119141858.GF5662@quack.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424163126 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15423 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Matthew, I think I still didn't see response to this. I think we can fixup things after they are merged (since Andrew sent this patch to Linus) but IMHO it needs some action... Honza On Mon 19-01-15 15:18:58, Jan Kara wrote: > On Fri 16-01-15 21:16:03, Wilcox, Matthew R wrote: > > On Mon 12-01-15 15:11:17, Andrew Morton wrote: > > > > +#ifdef CONFIG_FS_DAX > > > > +static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) > > > > +{ > > > > + return dax_fault(vma, vmf, ext4_get_block); > > > > + /* Is this the right get_block? */ > > > You can remove the comment. It is the right get_block function. > > > > Are you sure it shouldn't be ext4_get_block_write, or _write_nolock? > > According to the comments, ext4_get_block() doesn't allocate > > uninitialized extents, which we do want it to do. > Hum, so if I understand the code right dax_fault() will allocate a block > (== page in persistent memory) for a faulted address and will map this > block directly into process' address space. Thus that block has to be > zeroed out before the fault finishes no matter what (so that userspace > doesn't see garbage) - unwritten block handling in the filesystem doesn't > really matter (and would only cause unnecessary overhead) because of the > direct mapping of the block to process' address space. So I would think > that it would be easiest if dax_fault() simply zeroed out blocks which got > allocated. You could rewrite part of dax_fault() to something like: > > create = !vmf->cow_page && (vmf->flags & FAULT_FLAG_WRITE); > error = get_block(inode, block, &bh, create); > if (!error && (bh.b_size < PAGE_SIZE)) > error = -EIO; > if (error) > goto unlock_page; > > if (buffer_new(&bh)) { > count_vm_event(PGMAJFAULT); > mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); > major = VM_FAULT_MAJOR; > dax_clear_blocks(inode, bh->b_blocknr, PAGE_SIZE); > } else if (!buffer_mapped(&bh)) > return dax_load_hole(mapping, page, vmf); > > Note, that we also avoided calling get_block() callback twice on major fault > as that's relatively expensive due to locking, extent tree lookups, etc. > > Also note that ext2 then doesn't have to call dax_clear_blocks() at all if > I understand the code right. > > And with this change to dax_fault() using ext4_get_block() is the right > function to call. It will just allocate a block if necessary and attach it > to an appropriate place in the extent tree which is all you need. > > > > > @@ -694,6 +706,11 @@ static int _ext4_get_block(struct inode > > > > > > > > map_bh(bh, inode->i_sb, map.m_pblk); > > > > bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; > > > > + if (IS_DAX(inode) && buffer_unwritten(bh) && !io_end) { > > > > + bh->b_assoc_map = inode->i_mapping; > > > > + bh->b_private = (void *)(unsigned long)iblock; > > > > + bh->b_end_io = ext4_end_io_unwritten; > > > > + } > > > So why is this needed? It would deserve a comment. It confuses me in > > > particular because: > > > 1) This is a often a phony bh used just as a container for passed data and > > > b_end_io is just ignored. > > > 2) Even if it was real bh attached to a page, for DAX we don't do any > > > writeback and thus ->b_end_io will never get called? > > > 3) And if it does get called, you certainly cannot call > > > ext4_convert_unwritten_extents() from softirq context where ->b_end_io > > > gets called. > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > the allocated extent to either be zeroed (as ext2 does), or marked as > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > uninitialized data. If it's marked as unwritten, we need to convert it > > to a written extent after we've initialised the contents. We use the > > b_end_io() callback to do this, and it's called from the DAX code, not in > > softirq context. > OK, I see. But I didn't find where ->b_end_io gets called from dax code > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > point me please? > > Also abusing b_end_io of a phony buffer for that looks ugly to me (we are > trying to get away from passing phony bh around and this would entangle us > even more into that mess). Normally I would think that end_io() callback > passed into dax_do_io() should perform necessary conversions and for > dax_fault() we could do necessary conversions inside foofs_page_mkwrite()... > > Honza > -- > Jan Kara > SUSE Labs, CR -- Jan Kara SUSE Labs, CR From namjae.jeon@samsung.com Tue Feb 17 03:22:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BC8057F3F for ; Tue, 17 Feb 2015 03:22:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33609AC003 for ; Tue, 17 Feb 2015 01:22:06 -0800 (PST) X-ASG-Debug-ID: 1424164923-04cbb011643da0e0001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id qwlt8JrDIxd8dewd (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Tue, 17 Feb 2015 01:22:04 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW00FTJSOQCS80@mailout2.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 18:22:02 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 2A.C1.18484.A3803E45; Tue, 17 Feb 2015 18:22:02 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-93-54e3083a8fbd Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id E1.C2.09430.A3803E45; Tue, 17 Feb 2015 18:22:02 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW00C8KSOQJ800@mmp2.samsung.com>; Tue, 17 Feb 2015 18:22:02 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Brian Foster , Ashish Sangwan Subject: [PATCH v10 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 18:22:02 +0900 X-ASG-Orig-Subj: [PATCH v10 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003801d04a93$3026ee10$9074ca30$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdBKj+yEirRICLAnRF2AIwjME+JZgQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrOIsWRmVeSWpSXmKPExsWyRsSkWNeK43GIweunShZLJ15itnj3ucpi y7F7jBZ79p5ksbi8aw6bxaK+W4wObB6nFkl4rL6wldHj/b6rbB59W1YxenzeJBfAGsVlk5Ka k1mWWqRvl8CV8W17D2NBh1TF3DfNzA2MHaJdjJwcEgImEjtf3GWDsMUkLtxbD2RzcQgJLGWU mHHmBAtM0fGrM9hBbCGB6YwSsxbHQhT9ZZT49WEmcxcjBwebgLbEny1gQ0UE1CQmTdrBDFLD LDCfUaKhdz8jSEJYwE/ix5PFYENZBFQljt5bBRbnFbCUuNCxggXCFpT4MfkemM0soCWxfudx JghbXmLzmrfMEAcpSOw4+5oRYpmexIJ3z1khakQk9r14xwhRc4xdYuk0c4hdAhLfJh9iAblT QkBWYtMBqDGSEgdX3GCZwCg2C8nmWUg2z0KyeRaSDQsYWVYxiqYWJBcUJ6UXGesVJ+YWl+al 6yXn525iBMbf6X/P+ncw3j1gfYhRgINRiYd3wqRHIUKsiWXFlbmHGE2BLprILCWanA+M8ryS eENjMyMLUxNTYyNzSzMlcd6FUj+DhQTSE0tSs1NTC1KL4otKc1KLDzEycXBKNTCmsPdMzwg5 0Lx9ufvVQq19vM43BPM/FN5IM1zNry6gzBVtq7fzf00Hl58M68ryA55vJSb3hFzq26Ln01l8 vrTrmlJl0lelLb7cB5v+MjpJWk5dx6XRMfeWhXl2VtbCU+uTPrquPX33+5KuSbMEjizPrq7/ 7v93qouazTapo3svbPeKEzzsslCJpTgj0VCLuag4EQD+/kOEugIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrEIsWRmVeSWpSXmKPExsVy+t9jQV0rjschBrM+SFksnXiJ2eLd5yqL LcfuMVrs2XuSxeLyrjlsFov6bjE6sHmcWiThsfrCVkaP9/uusnn0bVnF6PF5k1wAa1QDo01G amJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0AFKCmWJOaVA oYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxoxv23sYCzqkKua+aWZuYOwQ7WLk5JAQ MJE4fnUGO4QtJnHh3no2EFtIYDqjxKzFsV2MXED2X0aJXx9mMncxcnCwCWhL/NkC1isioCYx adIOZpAaZoH5jBINvfsZQRLCAn4SP54sZgGxWQRUJY7eWwUW5xWwlLjQsYIFwhaU+DH5HpjN LKAlsX7ncSYIW15i85q3zBAHKUjsOPuaEWKZnsSCd89ZIWpEJPa9eMc4gVFgFpJRs5CMmoVk 1CwkLQsYWVYxiqYWJBcUJ6XnGukVJ+YWl+al6yXn525iBMf3M+kdjKsaLA4xCnAwKvHwTpj0 KESINbGsuDL3EKMEB7OSCO+u10Ah3pTEyqrUovz4otKc1OJDjKZAn05klhJNzgemnrySeENj EzMjSyNzQwsjY3MlcV4l+7YQIYH0xJLU7NTUgtQimD4mDk6pBkYGxe/59Q47glMPWxl7PeFY /W7pbQPNvPjyLNuMFEvfS9cyZjCxXpBlCzDcoMsltPmlUMrX8xM2CcyelLeFs1hxJftepkR2 8dmzqtbK8P75OOd2oYb8Nd8dxQ57/I6sjWl0u/F1TvqkoPS5LzmEFxlPudHGMf29dNWEm3tz vTO85x2oz/p5qliJpTgj0VCLuag4EQBnLzbWBQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1424164924 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 8 ++++++-- include/linux/falloc.h | 6 ++++++ include/uapi/linux/falloc.h | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/fs/open.c b/fs/open.c index 33f9cbf..b724cc0 100644 --- a/fs/open.c +++ b/fs/open.c @@ -231,8 +231,7 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) return -EINVAL; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + if (mode & ~FALLOC_FL_SUPPORTED_MASK) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +249,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; diff --git a/include/linux/falloc.h b/include/linux/falloc.h index 3159168..9961110 100644 --- a/include/linux/falloc.h +++ b/include/linux/falloc.h @@ -21,4 +21,10 @@ struct space_resv { #define FS_IOC_RESVSP _IOW('X', 40, struct space_resv) #define FS_IOC_RESVSP64 _IOW('X', 42, struct space_resv) +#define FALLOC_FL_SUPPORTED_MASK (FALLOC_FL_KEEP_SIZE | \ + FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_COLLAPSE_RANGE | \ + FALLOC_FL_ZERO_RANGE | \ + FALLOC_FL_INSERT_RANGE) + #endif /* _FALLOC_H_ */ diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..3e445a7 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,21 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to insert space within the file size without + * overwriting any existing data. The contents of the file beyond offset are + * shifted towards right by len bytes to create a hole. As such, this + * operation will increase the size of the file by len bytes. + * + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * + * Attempting to insert space using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.8.5.5 From namjae.jeon@samsung.com Tue Feb 17 03:22:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA9D27F51 for ; Tue, 17 Feb 2015 03:22:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3AB32AC003 for ; Tue, 17 Feb 2015 01:22:15 -0800 (PST) X-ASG-Debug-ID: 1424164931-04cb6c6b0a423870001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id IlQdWbeboZ9D5rVT (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Tue, 17 Feb 2015 01:22:13 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.24 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW00KFDSOZU150@mailout1.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 18:22:11 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.24] Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 6B.09.17016.34803E45; Tue, 17 Feb 2015 18:22:11 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-32-54e308433aab Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id B8.7E.20081.34803E45; Tue, 17 Feb 2015 18:22:11 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW002LWSOXL530@mmp1.samsung.com>; Tue, 17 Feb 2015 18:22:11 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Ashish Sangwan , Brian Foster Subject: [PATCH v10 11/12] xfstests: fsx: Add fallocate insert range operation Date: Tue, 17 Feb 2015 18:22:11 +0900 X-ASG-Orig-Subj: [PATCH v10 11/12] xfstests: fsx: Add fallocate insert range operation Message-id: <003a01d04a93$357f0870$a07d1950$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdBKkA0edhO+hCH6RuyZx82pRdf8cg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrBIsWRmVeSWpSXmKPExsWyRsSkRNeZ43GIwfVDMhZLJ15itnj3ucpi y7F7jBZ79p5ksbi8aw6bxaK+W4wObB6nFkl4rL6wldHj/b6rbB59W1YxenzeJBfAGsVlk5Ka k1mWWqRvl8CVcW37SuaCrfoVu66cZm1g3KnSxcjJISFgIvFtYiszhC0mceHeerYuRi4OIYGl jBILr7xhhSm6vGcxE0RiEaPEsbmNjBDOX0aJKytOArVzcLAJaEv82SIK0iAioCYxadIOZpAa ZoH5jBITul+xgySEBfwkFmxvZgKxWQRUJSa/3MwIYvMKWEq8/f+EGcIWlPgx+R4LiM0soCWx fudxJghbXmLzmrdQpypI7Dj7mhFimZ5ET38HM0SNiMS+F+8YIWpOsUssuFkJsUtA4tvkQywg d0oIyEpsOgA1RlLi4IobLBMYxWYh2TwLyeZZSDbPQrJhASPLKkbR1ILkguKk9CJDveLE3OLS vHS95PzcTYzACDz971nvDsbbB6wPMQpwMCrx8E6Y9ChEiDWxrLgy9xCjKdBFE5mlRJPzgXGe VxJvaGxmZGFqYmpsZG5ppiTOqyj1M1hIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDY1fGq/2T TvG4SbGusPIpW+8iK2VYc/K14UrnQzx72aLLexrXNEyPu8V8UTUxOkDC8HCTst/FG/vOaajp B5Wacb7dr1zLXMFwRfHu4aoqXdXZ7JM3tIcIzZU7oti731/zhrz97k+L9sn2Sah36yy3EZpV 5PP1iG46u9eUbMnHaWdWi///WWWnxFKckWioxVxUnAgA2E3WlrsCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMIsWRmVeSWpSXmKPExsVy+t9jAV1njschBr82i1gsnXiJ2eLd5yqL LcfuMVrs2XuSxeLyrjlsFov6bjE6sHmcWiThsfrCVkaP9/uusnn0bVnF6PF5k1wAa1QDo01G amJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0AFKCmWJOaVA oYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxoxr21cyF2zVr9h15TRrA+NOlS5GTg4J AROJy3sWM0HYYhIX7q1n62Lk4hASWMQocWxuIyOE85dR4sqKk8xdjBwcbALaEn+2iII0iAio SUyatIMZpIZZYD6jxITuV+wgCWEBP4kF25vBprIIqEpMfrmZEcTmFbCUePv/CTOELSjxY/I9 FhCbWUBLYv3O40wQtrzE5jVvmSEuUpDYcfY1I8QyPYme/g5miBoRiX0v3jFOYBSYhWTULCSj ZiEZNQtJywJGllWMoqkFyQXFSem5hnrFibnFpXnpesn5uZsYwRH+TGoH48oGi0OMAhyMSjy8 EyY9ChFiTSwrrsw9xCjBwawkwrvrNVCINyWxsiq1KD++qDQntfgQoynQpxOZpUST84HJJ68k 3tDYxMzI0sjc0MLI2FxJnFfJvi1ESCA9sSQ1OzW1ILUIpo+Jg1OqgVE75dsrM49TXksq//w7 Ot1tav4UQb+5Cv8+GaxcuevtO0ehC5NV2tjWsqy1T9P4N/MZ17/ZT3zVnry6Ml3S9AaP8o/E /BtPGbuYw/fp2PqVn302t8GywC8snunhPfa1ezNkVfI5Dh22Zuj1fnxHUb+VP0D6eJXcy0WR WnVSBjNTnP9ezgjLWKXEUpyRaKjFXFScCACuFLKeBgMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout1.samsung.com[203.254.224.24] X-Barracuda-Start-Time: 1424164933 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- ltp/fsx.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 114 insertions(+), 10 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 3709419..9fed5b2 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -95,7 +95,8 @@ int logcount = 0; /* total ops */ #define OP_PUNCH_HOLE 6 #define OP_ZERO_RANGE 7 #define OP_COLLAPSE_RANGE 8 -#define OP_MAX_FULL 9 +#define OP_INSERT_RANGE 9 +#define OP_MAX_FULL 10 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -145,6 +146,7 @@ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ int collapse_range_calls = 1; /* -C flag disables */ +int insert_range_calls = 1; /* -I flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -339,6 +341,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******CCCC"); break; + case OP_INSERT_RANGE: + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******IIII"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_INSERT_RANGE +void +do_insert_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_INSERT_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length insert range\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + if ((loff_t)offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping insert range behind EOF\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + log4(OP_INSERT_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + end_offset = offset + length; + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("insert range: %x to %x\n", offset, length); + prterr("do_insert_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + end_offset, good_buf + offset, + file_size - offset); + memset(good_buf + offset, '\0', length); + file_size += length; +} + +#else +void +do_insert_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1117,14 +1180,25 @@ docloseopen(void) } } -#define TRIM_OFF_LEN(off, len, size) \ -do { \ - if (size) \ - (off) %= (size); \ - else \ - (off) = 0; \ - if ((off) + (len) > (size)) \ - (len) = (size) - (off); \ + +#define TRIM_OFF(off, size) \ +do { \ + if (size) \ + (off) %= (size); \ + else \ + (off) = 0; \ +} while (0) + +#define TRIM_LEN(off, len, size) \ +do { \ + if ((off) + (len) > (size)) \ + (len) = (size) - (off); \ +} while (0) + +#define TRIM_OFF_LEN(off, len, size) \ +do { \ + TRIM_OFF(off, size); \ + TRIM_LEN(off, len, size); \ } while (0) void @@ -1192,6 +1266,12 @@ test(void) goto out; } break; + case OP_INSERT_RANGE: + if (!insert_range_calls) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1244,6 +1324,22 @@ test(void) } do_collapse_range(offset, size); break; + case OP_INSERT_RANGE: + TRIM_OFF(offset, file_size); + TRIM_LEN(file_size, size, maxfilelen); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + if (file_size + size > maxfilelen) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + + do_insert_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1307,6 +1403,9 @@ usage(void) #ifdef FALLOC_FL_COLLAPSE_RANGE " -C: Do not use collapse range calls\n" #endif +#ifdef FALLOC_FL_INSERT_RANGE +" -I: Do not use insert range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1493,7 +1592,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCILN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1599,6 +1698,9 @@ main(int argc, char **argv) case 'C': collapse_range_calls = 0; break; + case 'I': + insert_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1758,6 +1860,8 @@ main(int argc, char **argv) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); if (collapse_range_calls) collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); + if (insert_range_calls) + insert_range_calls = test_fallocate(FALLOC_FL_INSERT_RANGE); while (numops == -1 || numops--) test(); -- 1.7.9.5 From namjae.jeon@samsung.com Tue Feb 17 03:22:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE2367F56 for ; Tue, 17 Feb 2015 03:22:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C52F30406A for ; Tue, 17 Feb 2015 01:22:14 -0800 (PST) X-ASG-Debug-ID: 1424164930-04bdf06a59402ae0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id FRdLMAgAtmr3HPAq (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Tue, 17 Feb 2015 01:22:11 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NJW005YASOXUB70@mailout4.samsung.com> for xfs@oss.sgi.com; Tue, 17 Feb 2015 18:22:09 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.114]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id FE.A7.11124.14803E45; Tue, 17 Feb 2015 18:22:09 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-0d-54e30841f344 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id F0.D2.09430.14803E45; Tue, 17 Feb 2015 18:22:09 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NJW002LWSOXL530@mmp1.samsung.com>; Tue, 17 Feb 2015 18:22:09 +0900 (KST) From: Namjae Jeon To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Brian Foster , Ashish Sangwan Subject: [PATCH v10 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Tue, 17 Feb 2015 18:22:09 +0900 X-ASG-Orig-Subj: [PATCH v10 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <003901d04a93$3451fa20$9cf5ee60$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdBKj/VTOBS9tZDdQ12mm82J/pfkcg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrJIsWRmVeSWpSXmKPExsWyRsSkSNeR43GIwZEOHYulEy8xW7z7XGWx 5dg9Ros9e0+yWFzeNYfNYlHfLUYHNo9TiyQ8Vl/Yyujxft9VNo++LasYPT5vkgtgjeKySUnN ySxLLdK3S+DKOHN2BlvB17OMFb8fXWFrYPy9kLGLkZNDQsBEYvnNVWwQtpjEhXvrgWwuDiGB pYwSe5oXsMIUnXjeDpVYxCjxdtZNZpCEkMBfRokjnwO7GDk42AS0Jf5sEQUJiwioSUyatIMZ pJ5ZYD6jREPvfrBtwgL+EoueXwEbyiKgKjH1+EWwOK+ApUTHx9PMELagxI/J91hAbGYBLYn1 O48zQdjyEpvXvGWGOEhBYsfZ14wge0UE9CROLcqEKBGR2PfiHSPIXgmBU+wSP+d0skDsEpD4 NvkQC0i9hICsxKYDUGMkJQ6uuMEygVFsFpLNs5BsnoVk8ywkKxYwsqxiFE0tSC4oTkovMtIr TswtLs1L10vOz93ECIzB0/+e9e1gvHnA+hCjAAejEg/vhEmPQoRYE8uKK3MPMZoCXTSRWUo0 OR8Y6Xkl8YbGZkYWpiamxkbmlmZK4rwJUj+DhQTSE0tSs1NTC1KL4otKc1KLDzEycXBKNTBO WjtxkZYLj9n50scarYdjNzR4mQZVT/2s4zD7h3TvVsX91k8vPdlledh1Y93RHyE7nOqE93UI zPl7feehtclXLP2eVId4LPm5oe3+Dj/P//vfhwUcnZZuN8GN5W1Wn9/fDVM2lLXOjP2tlj/x 7Wpbz/CU81d2Jd59PqHpwB+NR8sj+/N1it9tVmIpzkg01GIuKk4EAJIvmZe8AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMIsWRmVeSWpSXmKPExsVy+t9jAV1HjschBofPyVosnXiJ2eLd5yqL LcfuMVrs2XuSxeLyrjlsFov6bjE6sHmcWiThsfrCVkaP9/uusnn0bVnF6PF5k1wAa1QDo01G amJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0AFKCmWJOaVA oYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxowzZ2ewFXw9y1jx+9EVtgbG3wsZuxg5 OSQETCROPG9ng7DFJC7cWw9kc3EICSxilHg76yYzSEJI4C+jxJHPgV2MHBxsAtoSf7aIgoRF BNQkJk3awQxSzywwn1GioXc/2FBhAX+JRc+vsILYLAKqElOPXwSL8wpYSnR8PM0MYQtK/Jh8 jwXEZhbQkli/8zgThC0vsXnNW2aIgxQkdpx9zQiyV0RAT+LUokyIEhGJfS/eMU5gFJiFZNIs JJNmIZk0C0nLAkaWVYyiqQXJBcVJ6blGesWJucWleel6yfm5mxjBEf5MegfjqgaLQ4wCHIxK PLwTJj0KEWJNLCuuzD3EKMHBrCTCu+s1UIg3JbGyKrUoP76oNCe1+BCjKdCjE5mlRJPzgckn ryTe0NjEzMjSyNzQwsjYXEmcV8m+LURIID2xJDU7NbUgtQimj4mDU6qBsWvb3Z1xMj8MxVbs OKT89OO70++sMzbmz1vOLWMScWWRDP8JPZ4g/ycxM7WmeQa8C7v+oMe+V8+jM+hjrdup3Z5t t58eOeb/7tP0a/+OBC6+tNm3axGH97bOX/+LrszjzdB+mRfHrGFYlXDaoa/04JGgD1Hdj2rr zqxp2ez379icKS1SrWcya5VYijMSDbWYi4oTAenj270GAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1424164931 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 356 +++++++++++++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_bmap.h | 13 +- fs/xfs/xfs_bmap_util.c | 131 ++++++++++++----- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 41 +++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 461 insertions(+), 83 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015..e4e95b4 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5518,50 +5518,90 @@ xfs_bmse_shift_one( int *current_ext, struct xfs_bmbt_rec_host *gotp, struct xfs_btree_cur *cur, - int *logflags) + int *logflags, + enum shift_direction direction) { struct xfs_ifork *ifp; xfs_fileoff_t startoff; - struct xfs_bmbt_rec_host *leftp; + struct xfs_bmbt_rec_host *adj_irecp; struct xfs_bmbt_irec got; - struct xfs_bmbt_irec left; + struct xfs_bmbt_irec adj_irec; int error; int i; + int total_extents; ifp = XFS_IFORK_PTR(ip, whichfork); + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); xfs_bmbt_get_all(gotp, &got); - startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); - /* - * Check for merge if we've got an extent to the left, otherwise make - * sure there's enough room at the start of the file for the shift. - */ - if (*current_ext) { - /* grab the left extent and check for a large enough hole */ - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); - xfs_bmbt_get_all(leftp, &left); + if (direction == SHIFT_LEFT) { + startoff = got.br_startoff - offset_shift_fsb; + + /* + * Check for merge if we've got an extent to the left, + * otherwise make sure there's enough room at the start + * of the file for the shift. + */ + if (!*current_ext) { + if (got.br_startoff < offset_shift_fsb) + return -EINVAL; + goto update_current_ext; + } + /* + * grab the left extent and check for a large + * enough hole. + */ + adj_irecp = xfs_iext_get_ext(ifp, *current_ext - 1); + xfs_bmbt_get_all(adj_irecp, &adj_irec); - if (startoff < left.br_startoff + left.br_blockcount) + if (startoff < + adj_irec.br_startoff + adj_irec.br_blockcount) return -EINVAL; /* check whether to merge the extent or shift it down */ - if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { + if (xfs_bmse_can_merge(&adj_irec, &got, + offset_shift_fsb)) { return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, - *current_ext, gotp, leftp, cur, - logflags); + *current_ext, gotp, adj_irecp, + cur, logflags); } - } else if (got.br_startoff < offset_shift_fsb) - return -EINVAL; - + } else { + startoff = got.br_startoff + offset_shift_fsb; + /* nothing to move if this is the last extent */ + if (*current_ext >= (total_extents - 1)) + goto update_current_ext; + /* + * If this is not the last extent in the file, make sure there + * is enough room between current extent and next extent for + * accommodating the shift. + */ + adj_irecp = xfs_iext_get_ext(ifp, *current_ext + 1); + xfs_bmbt_get_all(adj_irecp, &adj_irec); + if (startoff + got.br_blockcount > adj_irec.br_startoff) + return -EINVAL; + /* + * Unlike a left shift (which involves a hole punch), + * a right shift does not modify extent neighbors + * in any way. We should never find mergeable extents + * in this scenario. Check anyways and warn if we + * encounter two extents that could be one. + */ + if (xfs_bmse_can_merge(&got, &adj_irec, offset_shift_fsb)) + WARN_ON_ONCE(1); + } /* * Increment the extent index for the next iteration, update the start * offset of the in-core extent and update the btree if applicable. */ - (*current_ext)++; +update_current_ext: + if (direction == SHIFT_LEFT) + (*current_ext)++; + else + (*current_ext)--; xfs_bmbt_set_startoff(gotp, startoff); *logflags |= XFS_ILOG_CORE; if (!cur) { @@ -5577,14 +5617,14 @@ xfs_bmse_shift_one( got.br_startoff = startoff; return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, - got.br_blockcount, got.br_state); + got.br_blockcount, got.br_state); } /* - * Shift extent records to the left to cover a hole. + * Shift extent records to the left/right to cover/create a hole. * * The maximum number of extents to be shifted in a single operation is - * @num_exts. @start_fsb specifies the file offset to start the shift and the + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb * is the length by which each extent is shifted. If there is no hole to shift * the extents into, this will be considered invalid operation and we abort @@ -5594,12 +5634,13 @@ int xfs_bmap_shift_extents( struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, int *done, - xfs_fileoff_t *next_fsb, + xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + enum shift_direction direction, int num_exts) { struct xfs_btree_cur *cur = NULL; @@ -5609,10 +5650,11 @@ xfs_bmap_shift_extents( struct xfs_ifork *ifp; xfs_extnum_t nexts = 0; xfs_extnum_t current_ext; + xfs_extnum_t total_extents; + xfs_extnum_t stop_extent; int error = 0; int whichfork = XFS_DATA_FORK; int logflags = 0; - int total_extents; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5628,6 +5670,8 @@ xfs_bmap_shift_extents( ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT); + ASSERT(*next_fsb != NULLFSBLOCK || direction == SHIFT_RIGHT); ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS)) { @@ -5645,43 +5689,83 @@ xfs_bmap_shift_extents( } /* + * There may be delalloc extents in the data fork before the range we + * are collapsing out, so we cannot use the count of real extents here. + * Instead we have to calculate it from the incore fork. + */ + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (total_extents == 0) { + *done = 1; + goto del_cursor; + } + + /* + * In case of first right shift, we need to initialize next_fsb + */ + if (*next_fsb == NULLFSBLOCK) { + gotp = xfs_iext_get_ext(ifp, total_extents - 1); + xfs_bmbt_get_all(gotp, &got); + *next_fsb = got.br_startoff; + if (stop_fsb > *next_fsb) { + *done = 1; + goto del_cursor; + } + } + + /* Lookup the extent index at which we have to stop */ + if (direction == SHIFT_RIGHT) { + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); + /* Make stop_extent exclusive of shift range */ + stop_extent--; + } else + stop_extent = total_extents; + + /* * Look up the extent index for the fsb where we start shifting. We can * henceforth iterate with current_ext as extent list changes are locked * out via ilock. * * gotp can be null in 2 cases: 1) if there are no extents or 2) - * start_fsb lies in a hole beyond which there are no extents. Either + * *next_fsb lies in a hole beyond which there are no extents. Either * way, we are done. */ - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); if (!gotp) { *done = 1; goto del_cursor; } - /* - * There may be delalloc extents in the data fork before the range we - * are collapsing out, so we cannot use the count of real extents here. - * Instead we have to calculate it from the incore fork. - */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - while (nexts++ < num_exts && current_ext < total_extents) { + /* some sanity checking before we finally start shifting extents */ + if ((direction == SHIFT_LEFT && current_ext >= stop_extent) || + (direction == SHIFT_RIGHT && current_ext <= stop_extent)) { + error = -EIO; + goto del_cursor; + } + + while (nexts++ < num_exts) { error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, - ¤t_ext, gotp, cur, &logflags); + ¤t_ext, gotp, cur, &logflags, + direction); if (error) goto del_cursor; + /* + * If there was an extent merge during the shift, the extent + * count can change. Update the total and grade the next record. + */ + if (direction == SHIFT_LEFT) { + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + stop_extent = total_extents; + } - /* update total extent count and grab the next record */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - if (current_ext >= total_extents) + if (current_ext == stop_extent) { + *done = 1; + *next_fsb = NULLFSBLOCK; break; + } gotp = xfs_iext_get_ext(ifp, current_ext); } - /* Check if we are done */ - if (current_ext == total_extents) { - *done = 1; - } else if (next_fsb) { + if (!*done) { xfs_bmbt_get_all(gotp, &got); *next_fsb = got.br_startoff; } @@ -5696,3 +5780,189 @@ del_cursor: return error; } + +/* + * Splits an extent into two extents at split_fsb block such that it is + * the first block of the current_ext. @current_ext is a target extent + * to be split. @split_fsb is a block where the extents is split. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur = NULL; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* split extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + xfs_extnum_t current_ext; + int error = 0; + int logflags = 0; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + + logflags = XFS_ILOG_CORE; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } else + logflags |= XFS_ILOG_DEXT; + + /* Add new extent */ + current_ext++; + xfs_iext_insert(ip, current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) { + cur->bc_private.b.allocated = 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + } + + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, + &firstfsb, &free_list); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return error; +} diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index b9d8a49..6aaa0c1 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -166,6 +166,11 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) */ #define XFS_BMAP_MAX_SHIFT_EXTENTS 1 +enum shift_direction { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + #ifdef DEBUG void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int whichfork, unsigned long caller_ip); @@ -211,8 +216,10 @@ int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, - int *done, xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, - struct xfs_bmap_free *flist, int num_exts); + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, + int *done, xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, enum shift_direction direction, + int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 22a5dcb..fe1f11b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1376,22 +1376,19 @@ out: } /* - * xfs_collapse_file_space() - * This routine frees disk space and shift extent for the given file. - * The first thing we do is to free data blocks in the specified range - * by calling xfs_free_file_space(). It would also sync dirty data - * and invalidate page cache over the region on which collapse range - * is working. And Shift extent records to the left to cover a hole. - * RETURNS: - * 0 on success - * errno on error - * + * @next_fsb will keep track of the extent currently undergoing shift. + * @stop_fsb will keep track of the extent at which we have to stop. + * If we are shifting left, we will start with block (offset + len) and + * shift each extent till last extent. + * If we are shifting right, we will start with last extent inside file space + * and continue until we reach the block corresponding to offset. */ int -xfs_collapse_file_space( - struct xfs_inode *ip, - xfs_off_t offset, - xfs_off_t len) +xfs_shift_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len, + enum shift_direction direction) { int done = 0; struct xfs_mount *mp = ip->i_mount; @@ -1400,21 +1397,26 @@ xfs_collapse_file_space( struct xfs_bmap_free free_list; xfs_fsblock_t first_block; int committed; - xfs_fileoff_t start_fsb; + xfs_fileoff_t stop_fsb; xfs_fileoff_t next_fsb; xfs_fileoff_t shift_fsb; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT); - trace_xfs_collapse_file_space(ip); + if (direction == SHIFT_LEFT) { + next_fsb = XFS_B_TO_FSB(mp, offset + len); + stop_fsb = XFS_B_TO_FSB(mp, VFS_I(ip)->i_size); + } else { + /* + * If right shift, delegate the work of initialization of + * next_fsb to xfs_bmap_shift_extent as it has ilock held. + */ + next_fsb = NULLFSBLOCK; + stop_fsb = XFS_B_TO_FSB(mp, offset); + } - next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); - error = xfs_free_file_space(ip, offset, len); - if (error) - return error; - /* * Trim eofblocks to avoid shifting uninitialized post-eof preallocation * into the accessible region of the file. @@ -1427,20 +1429,28 @@ xfs_collapse_file_space( /* * Writeback and invalidate cache for the remainder of the file as we're - * about to shift down every extent from the collapse range to EOF. The - * free of the collapse range above might have already done some of - * this, but we shouldn't rely on it to do anything outside of the range - * that was freed. + * about to shift down every extent from offset to EOF. */ error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - offset + len, -1); + offset, -1); if (error) return error; error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - (offset + len) >> PAGE_CACHE_SHIFT, -1); + offset >> PAGE_CACHE_SHIFT, -1); if (error) return error; + /* + * The extent shiting code works on extent granularity. So, if + * stop_fsb is not the starting block of extent, we need to split + * the extent at stop_fsb. + */ + if (direction == SHIFT_RIGHT) { + error = xfs_bmap_split_extent(ip, stop_fsb); + if (error) + return error; + } + while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); /* @@ -1464,7 +1474,7 @@ xfs_collapse_file_space( if (error) goto out; - xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_bmap_init(&free_list, &first_block); @@ -1472,10 +1482,9 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - start_fsb = next_fsb; - error = xfs_bmap_shift_extents(tp, ip, start_fsb, shift_fsb, - &done, &next_fsb, &first_block, &free_list, - XFS_BMAP_MAX_SHIFT_EXTENTS); + error = xfs_bmap_shift_extents(tp, ip, &next_fsb, shift_fsb, + &done, stop_fsb, &first_block, &free_list, + direction, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; @@ -1484,18 +1493,70 @@ xfs_collapse_file_space( goto out; error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_iunlock(ip, XFS_ILOCK_EXCL); } return error; out: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } /* + * xfs_collapse_file_space() + * This routine frees disk space and shift extent for the given file. + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. And Shift extent records to the left to cover a hole. + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + int error; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_collapse_file_space(ip); + + error = xfs_free_file_space(ip, offset, len); + if (error) + return error; + + return xfs_shift_file_space(ip, offset, len, SHIFT_LEFT); +} + +/* + * xfs_insert_file_space() + * This routine create hole space by shifting extents for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. + * RETURNS: + * 0 on success + * errno on error + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + return xfs_shift_file_space(ip, offset, len, SHIFT_RIGHT); +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 736429a..af97d9a 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -63,6 +63,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1cdba95..174687c 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -811,6 +811,11 @@ xfs_file_write_iter( return ret; } +#define XFS_FALLOC_FL_SUPPORTED \ + (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \ + FALLOC_FL_INSERT_RANGE) + STATIC long xfs_file_fallocate( struct file *file, @@ -823,11 +828,11 @@ xfs_file_fallocate( long error; enum xfs_prealloc_flags flags = 0; loff_t new_size = 0; + bool do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + if (mode & ~XFS_FALLOC_FL_SUPPORTED) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -857,6 +862,27 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + new_size = i_size_read(inode) + len; + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* check the new inode size does not wrap through zero */ + if (new_size > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + do_file_insert = 1; } else { flags |= XFS_PREALLOC_SET; @@ -891,8 +917,19 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Perform hole insertion now that the file size has been + * updated so that if we crash during the operation we don't + * leave shifted extents past EOF and hence losing access to + * the data that is contained within them. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); return error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..7e45fa1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -664,6 +664,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.8.5.5 From alexander.tsvetkov@oracle.com Tue Feb 17 03:24:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8CB9D7F3F for ; Tue, 17 Feb 2015 03:24:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5D64C8F8059 for ; Tue, 17 Feb 2015 01:24:50 -0800 (PST) X-ASG-Debug-ID: 1424165087-04bdf06a59402bd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Cacg2vRT3nx9XVR3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 17 Feb 2015 01:24:47 -0800 (PST) X-Barracuda-Envelope-From: alexander.tsvetkov@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 t1H9OfMC020629 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 17 Feb 2015 09:24:42 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id t1H9OfoV016645 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 17 Feb 2015 09:24:41 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1H9Ofqg016105; Tue, 17 Feb 2015 09:24:41 GMT Received: from [10.162.81.109] (/10.162.81.109) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 17 Feb 2015 01:24:41 -0800 Message-ID: <54E3092D.9060604@oracle.com> Date: Tue, 17 Feb 2015 12:26:05 +0300 From: Alexander Tsvetkov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandee , xfs@oss.sgi.com Subject: Re: xfs_logprint segfault with external log References: <54DB5E70.80607@oracle.com> <20150211205406.GT4251@dastard> <54DC940D.4030009@oracle.com> <20150212230940.GD12722@dastard> <54E1F6C2.4060105@oracle.com> <20150217013849.GI4251@dastard> X-ASG-Orig-Subj: Re: xfs_logprint segfault with external log In-Reply-To: <20150217013849.GI4251@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed 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: 1424165087 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 02/17/2015 04:38 AM, Dave Chinner wrote: > On Mon, Feb 16, 2015 at 04:55:14PM +0300, Alexander Tsvetkov wrote: >> On 02/13/2015 02:09 AM, Dave Chinner wrote: >>> On Thu, Feb 12, 2015 at 02:52:45PM +0300, Alexander Tsvetkov wrote: >>>> On 02/11/2015 11:54 PM, Dave Chinner wrote: >>>>> On Wed, Feb 11, 2015 at 04:51:44PM +0300, Alexander Tsvetkov wrote: >>>>>> Hello, >>>>>> >>>>>> I've obtained corrupted xfs log after some sanity xfs testing: >>>>>> >>>>>> "log=logfile >>>>>> log_size=855 >>>>>> >>>>>> dd if=/dev/zero "of=$log" bs=4096 count=$log_size >>>>>> loopdev=$(losetup -f) >>>>>> losetup $loopdev $log >>>>>> >>>>>> mkfs.xfs -f -m crc=1 -llogdev=$loopdev,size=${log_size}b $SCRATCH_DEV >>>>>> mount -t xfs -ologdev=$loopdev $SCRATCH_DEV $SCRATCH_MNT >>>>>> ./fdtree.sh -l 4 -d 4 -C -o $SCRATCH_MNT >>>>>> sync >>>>>> umount $SCRATCH_MNT >>>>>> >>>>>> xfs_logprint -l $loopdev $SCRATCH_DEV" >>>>>> >>>>>> Test makes crc enabled xfs filesystem with the external log of >>>>>> minimal allowed size and then creates on this fs the small directory >>>>>> tree >>>>>> with sub directories and files of fixed depth and size with help of >>>>>> fdtree utility: >>>>>> https://computing.llnl.gov/?set=code&page=sio_downloads >>>>> Just take metadump image and put it somewhere we can down load it. >>>>> >>>>>> After that xfs_logprint stably reports bad data in log: >>> Please try the patch below, it fixes the problem on the image you >>> provided. >> I've restored provided image to filesystem with the same log file, >> applied patch to latest xfsprogs and have stable pass runs >> of xfs_logprint on that filesystem and running with xfsprogs without >> this patch results to xfs_logprint segfaults reported that means >> patch is working. > Good. > >> The problem that it is not working for repeated test runs where >> xfs_logprint still continue to report bad log data. It seems it is > xfs_logprint is not a tool that is intended for validation of the > log contents. It's a triage tool that was written in a hurry, and as > such it's neither reliable or maintainable. Indeed, there's a > comment in the code saying it really needs to be rewritten. ;) > > I'll have a look the image, but really spending lots of time on > fixing minor issues with logprint really isn't the best use of my > time right now... Thank you, really xfs_logprint was not a subject here. It's used by me to understand xfs log data format to verify some cases related to xfs log recovery functionality, just tried to simulate some cases with log corruptions and have no expected specific xfs alert from the kernel source that I would like to see for that test case. xfs journaling para is marked as TODO in documentation currently, so I thought xfs_logprint would put more clarity how xfs journal data organized. > > Cheers, > > Dave. Thanks, Alexander Tsvetkov From willy@linux.intel.com Tue Feb 17 07:37:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B3317F3F for ; Tue, 17 Feb 2015 07:37:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 17CDD8F8039 for ; Tue, 17 Feb 2015 05:37:52 -0800 (PST) X-ASG-Debug-ID: 1424180270-04cbb011623fd740001-NocioJ Received: from mga14.intel.com ([192.55.52.115]) by cuda.sgi.com with ESMTP id 7Zgj9ToySBE0A2po for ; Tue, 17 Feb 2015 05:37:50 -0800 (PST) X-Barracuda-Envelope-From: willy@linux.intel.com X-Barracuda-Apparent-Source-IP: 192.55.52.115 Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP; 17 Feb 2015 05:30:20 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,594,1418112000"; d="scan'208";a="528623236" Received: from amitchou-mobl.amr.corp.intel.com (HELO thog) ([10.252.136.231]) by orsmga003.jf.intel.com with ESMTP; 17 Feb 2015 05:29:13 -0800 Received: from willy by thog with local (Exim 4.84) (envelope-from ) id 1YNiLR-0007y3-7d; Tue, 17 Feb 2015 08:37:45 -0500 Date: Tue, 17 Feb 2015 08:37:45 -0500 From: Matthew Wilcox To: Jan Kara Cc: "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "david@fromorbit.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Matthew Wilcox , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150217133745.GG3364@wil.cx> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217085200.GA23192@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: UNKNOWN[192.55.52.115] X-Barracuda-Start-Time: 1424180270 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15433 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > Matthew, I think I still didn't see response to this. I think we can > fixup things after they are merged (since Andrew sent this patch to Linus) > but IMHO it needs some action... Sorry, I thought I'd replied to this. > On Mon 19-01-15 15:18:58, Jan Kara wrote: > > On Fri 16-01-15 21:16:03, Wilcox, Matthew R wrote: > > > Are you sure it shouldn't be ext4_get_block_write, or _write_nolock? > > > According to the comments, ext4_get_block() doesn't allocate > > > uninitialized extents, which we do want it to do. > > Hum, so if I understand the code right dax_fault() will allocate a block > > (== page in persistent memory) for a faulted address and will map this > > block directly into process' address space. Thus that block has to be > > zeroed out before the fault finishes no matter what (so that userspace > > doesn't see garbage) - unwritten block handling in the filesystem doesn't > > really matter (and would only cause unnecessary overhead) because of the > > direct mapping of the block to process' address space. So I would think > > that it would be easiest if dax_fault() simply zeroed out blocks which got > > allocated. You could rewrite part of dax_fault() to something like: > > > > create = !vmf->cow_page && (vmf->flags & FAULT_FLAG_WRITE); > > error = get_block(inode, block, &bh, create); > > if (!error && (bh.b_size < PAGE_SIZE)) > > error = -EIO; > > if (error) > > goto unlock_page; > > > > if (buffer_new(&bh)) { > > count_vm_event(PGMAJFAULT); > > mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); > > major = VM_FAULT_MAJOR; > > dax_clear_blocks(inode, bh->b_blocknr, PAGE_SIZE); > > } else if (!buffer_mapped(&bh)) > > return dax_load_hole(mapping, page, vmf); > > > > Note, that we also avoided calling get_block() callback twice on major fault > > as that's relatively expensive due to locking, extent tree lookups, etc. > > > > Also note that ext2 then doesn't have to call dax_clear_blocks() at all if > > I understand the code right. I think you've missed the case where we lose power after ext2 has allocated the block and before dax_clear_blocks() is called. After power returns, ext4 will show an unwritten extent in the tree, which will be zeroed before being handed to a user. ext2 must have zeroed the block before linking it into the inode's data blocks. I didn't realise that calling get_block() was an expensive operation; I'm open to reworking this piece of code to only call it once. > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > to a written extent after we've initialised the contents. We use the > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > softirq context. > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > point me please? For faults, we call it in dax_insert_mapping(), the very last thing before returning in the fault path. The normal I/O path gets to use the dio_iodone_t for the same purpose. > > Also abusing b_end_io of a phony buffer for that looks ugly to me (we are > > trying to get away from passing phony bh around and this would entangle us > > even more into that mess). Normally I would think that end_io() callback > > passed into dax_do_io() should perform necessary conversions and for > > dax_fault() we could do necessary conversions inside foofs_page_mkwrite()... Dave sees to be the one trying the hardest to get rid of the phony BHs ... and it was his idea to (ab)use b_end_io for this. The problem with doing the conversion in ext4_page_mkwrite() is that we don't know at that point whether the BH is unwritten or not. From mlsemon35@gmail.com Tue Feb 17 09:37:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 EBCC17F4E for ; Tue, 17 Feb 2015 09:37:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D7A3B8F8039 for ; Tue, 17 Feb 2015 07:37:05 -0800 (PST) X-ASG-Debug-ID: 1424187424-04cb6c6b0b45e1b0001-NocioJ Received: from mail-qa0-f52.google.com (mail-qa0-f52.google.com [209.85.216.52]) by cuda.sgi.com with ESMTP id eMRETFiFTYRkvhhC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 17 Feb 2015 07:37:04 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.52 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.52] Received: by mail-qa0-f52.google.com with SMTP id v10so26739857qac.11 for ; Tue, 17 Feb 2015 07:37:03 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.52] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.52] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=KMpjsc61pWT2EKkCxwi8I3g7IsJDKNbzrosPGwYWuH4=; b=QQyZQR6dg54qIBEq05Ah6pYzgG155OOflG5FR9BF1g9qS66CidpHkzQjsDEThlL6Vn Ns/m278ClgW7mE4QHEUcP9eObJwiOQo8fdff3cmF+4HQMDkLB7QDqg1E57ddRo2GrD8C 01Gfp2sL1yQt6XcpxUFAAtXU/7fTF6hdjeF/2sIV1gopBIuajyIviX4OpxsVzsN8BIXT WVgpN9D6qsRluDReTtPPCPY5u/J40VIUN6YY8zIus993Xk4BHM49sraYIbQ8GB48wHPR hv25l+GK2NDM23E/6GJOPTs+8skHDN5vshDdNDZapbn1ay4wMDKIQnwkYc3x2/0ZUihP mxuQ== X-Received: by 10.140.201.84 with SMTP id w81mr990650qha.19.1424187423824; Tue, 17 Feb 2015 07:37:03 -0800 (PST) Received: from yholen.ds (rrcs-97-76-23-49.se.biz.rr.com. [97.76.23.49]) by mx.google.com with ESMTPSA id 3sm5996498qhq.23.2015.02.17.07.37.03 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Feb 2015 07:37:03 -0800 (PST) Message-ID: <54E36016.20908@gmail.com> Date: Tue, 17 Feb 2015 10:36:54 -0500 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner , Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> <54E16667.1050200@gmail.com> <54E22A76.40106@sgi.com> <20150216231716.GB4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC In-Reply-To: <20150216231716.GB4251@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-qa0-f52.google.com[209.85.216.52] X-Barracuda-Start-Time: 1424187424 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15437 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 02/16/15 18:17, Dave Chinner wrote: > On Mon, Feb 16, 2015 at 11:35:50AM -0600, Mark Tinguely wrote: >> Thanks Michael, you don't need to hold your test box for me. I do >> have a way to recreate these ABBA AGF buffer allocation deadlocks >> and understand the whys and hows very well. I don't have a community >> way to make a xfstest for it but I think your test is getting close. > > If you know what is causing them, then please explain how it occurs > and how you think it needs to be fixed. Just telling us that you know > something that we don't doesn't help us solve the problem. :( > > In general, the use of the args->firstblock is supposed to avoid the > ABBA locking order issues with multiple allocations in the one > transaction by preventing AG selection loops from looping back into > AGs with a lower index than the first allocation that was made. > > So if you are seeing deadlocks, then it may be that we aren't > following this constraint correctly in all locations.... > > Cheers, > > Dave. Will this be a classic deadlock that will cause problems when trying to kill processes and unmount filesystems? If so, then I was unable to use generic/224 to trigger a deadlock. If not, then I'll need a better way of looking at the problem. The longest generic/224 loop lasted only 3-1/2 hours, though. The fstests enospc group was given some consideration as well. If this issue does not require a lot of files, I might see if fio can be helpful here. Hints on whether to us a fast kernel or a miserably slow kernel would be rather helpful. My test setup is torn because most of the recent warning messages are coming from the CONFIG_XFS_WARN kernels. The i686 Pentium 4 box will be left that way. However, the Core 2 box was configured per Documentation/SubmitChecklist from the kernel source, adding debug XFS and locktorture. The locktorture settings are in flux, exercising spinlocks at present. There was a mild halt in I/O for generic/017, but that was XFS waiting on kmem-something waiting on a kmemleak function. kmemleak was removed, and I'll continue from there. Thanks! Michael From jack@suse.cz Tue Feb 17 09:57:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ADF1A7F55 for ; Tue, 17 Feb 2015 09:57:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D8D130405F for ; Tue, 17 Feb 2015 07:57:21 -0800 (PST) X-ASG-Debug-ID: 1424188638-04bdf06a5b4538a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id qUJQ2Gh4RK6T71bZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 17 Feb 2015 07:57:19 -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 CFA2FADC7; Tue, 17 Feb 2015 15:57:17 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 983DF81C26; Tue, 17 Feb 2015 16:57:15 +0100 (CET) From: Jan Kara To: xfs@oss.sgi.com Cc: Al Viro , Jan Kara , stable@vger.kernel.org Subject: [PATCH] xfs: Fix quota type in quota structures when reusing quota file Date: Tue, 17 Feb 2015 16:57:10 +0100 X-ASG-Orig-Subj: [PATCH] xfs: Fix quota type in quota structures when reusing quota file Message-Id: <1424188630-1111-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424188639 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15438 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For filesystems without separate project quota inode field in the superblock we just reuse project quota file for group quotas (and vice versa) if project quota file is allocated and we need group quota file. When we reuse the file, quota structures on disk suddenly have wrong type stored in d_flags though. Nobody really cares about this (although structure type reported to userspace was wrong as well) except that after commit 14bf61ffe6ac (quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units) assertion in xfs_qm_scall_getquota() started to trigger on xfs/106 test (apparently I was testing without XFS_DEBUG so I didn't notice when submitting the above commit). Fix the problem by properly resetting ddq->d_flags when running quotacheck for a quota file. CC: stable@vger.kernel.org Reported-by: Al Viro Signed-off-by: Jan Kara --- fs/xfs/xfs_qm.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 3e8186279541..dd0dcc7b76cd 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -836,6 +836,11 @@ xfs_qm_reset_dqcounts( */ xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, "xfs_quotacheck"); + /* + * Reset type in case we are reusing group quota file for + * project quotas or vice versa + */ + ddq->d_flags = type; ddq->d_bcount = 0; ddq->d_icount = 0; ddq->d_rtbcount = 0; -- 2.1.4 From sandeen@redhat.com Tue Feb 17 11:49:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 752647F5A for ; Tue, 17 Feb 2015 11:49:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 61F38304059 for ; Tue, 17 Feb 2015 09:49:28 -0800 (PST) X-ASG-Debug-ID: 1424195366-04cb6c6b0b46aba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AWZkwF5BaZlTeXno (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 17 Feb 2015 09:49:27 -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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1HHnPQL019904 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 17 Feb 2015 12:49:26 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1HHnNrV013644 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 17 Feb 2015 12:49:25 -0500 Message-ID: <54E37F24.10300@redhat.com> Date: Tue, 17 Feb 2015 11:49:24 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: remove deprecated mount options Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: remove deprecated mount options 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: 1424195367 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We recently removed deprecated sysctls; may as well remove deprecated mount options as well, we've stated that they'd be gone by now in the docs. Signed-off-by: Eric Sandeen --- diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 7077103..03a3d03 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -228,30 +228,19 @@ default behaviour. Deprecated Mount Options ======================== - delaylog/nodelaylog - Delayed logging is the only logging method that XFS supports - now, so these mount options are now ignored. - - Due for removal in 3.12. - - ihashsize=value - In memory inode hashes have been removed, so this option has - no function as of August 2007. Option is deprecated. - - Due for removal in 3.12. +None at present. - irixsgid - This behaviour is now controlled by a sysctl, so the mount - option is ignored. - Due for removal in 3.12. +Removed Mount Options +===================== - osyncisdsync - osyncisosync - O_SYNC and O_DSYNC are fully supported, so there is no need - for these options any more. + Name Removed + ---- ------- + delaylog/nodelaylog v3.20 + ihashsize v3.20 + irixsgid v3.20 + osyncisdsync/osyncisosync v3.20 - Due for removal in 3.12. sysctls ======= diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 5ce76d0..31852cc 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -109,8 +109,6 @@ static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */ #define MNTOPT_GQUOTANOENF "gqnoenforce"/* group quota limit enforcement */ #define MNTOPT_PQUOTANOENF "pqnoenforce"/* project quota limit enforcement */ #define MNTOPT_QUOTANOENF "qnoenforce" /* same as uqnoenforce */ -#define MNTOPT_DELAYLOG "delaylog" /* Delayed logging enabled */ -#define MNTOPT_NODELAYLOG "nodelaylog" /* Delayed logging disabled */ #define MNTOPT_DISCARD "discard" /* Discard unused blocks */ #define MNTOPT_NODISCARD "nodiscard" /* Do not discard unused blocks */ @@ -361,28 +359,10 @@ xfs_parseargs( } else if (!strcmp(this_char, MNTOPT_GQUOTANOENF)) { mp->m_qflags |= (XFS_GQUOTA_ACCT | XFS_GQUOTA_ACTIVE); mp->m_qflags &= ~XFS_GQUOTA_ENFD; - } else if (!strcmp(this_char, MNTOPT_DELAYLOG)) { - xfs_warn(mp, - "delaylog is the default now, option is deprecated."); - } else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) { - xfs_warn(mp, - "nodelaylog support has been removed, option is deprecated."); } else if (!strcmp(this_char, MNTOPT_DISCARD)) { mp->m_flags |= XFS_MOUNT_DISCARD; } else if (!strcmp(this_char, MNTOPT_NODISCARD)) { mp->m_flags &= ~XFS_MOUNT_DISCARD; - } else if (!strcmp(this_char, "ihashsize")) { - xfs_warn(mp, - "ihashsize no longer used, option is deprecated."); - } else if (!strcmp(this_char, "osyncisdsync")) { - xfs_warn(mp, - "osyncisdsync has no effect, option is deprecated."); - } else if (!strcmp(this_char, "osyncisosync")) { - xfs_warn(mp, - "osyncisosync has no effect, option is deprecated."); - } else if (!strcmp(this_char, "irixsgid")) { - xfs_warn(mp, - "irixsgid is now a sysctl(2) variable, option is deprecated."); } else { xfs_warn(mp, "unknown mount option [%s].", this_char); return -EINVAL; From barrister.labuso2@gmail.com Tue Feb 17 11:50:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLY,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 447A27F61 for ; Tue, 17 Feb 2015 11:50:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5520AC001 for ; Tue, 17 Feb 2015 09:50:13 -0800 (PST) X-ASG-Debug-ID: 1424195411-04bdf06a5c4595d0001-NocioJ Received: from mail-qa0-f65.google.com (mail-qa0-f65.google.com [209.85.216.65]) by cuda.sgi.com with ESMTP id SJGUoHGd9IyTxvR0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 17 Feb 2015 09:50:12 -0800 (PST) X-Barracuda-Envelope-From: barrister.labuso2@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.65 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.65] Received: by mail-qa0-f65.google.com with SMTP id j7so8284314qaq.0 for ; Tue, 17 Feb 2015 09:50:11 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.65] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.65] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=T3Xyhu+V5Nb13h277nwSf5QSJNGBmPuQaKebHx9v/fA=; b=iH0zL2Yp1si/mour07N2xsN8w+l0r3pQgxh9BBto+AWbcB6hH310aCr+NK5awV2FA6 eDiPvO9E7WqLqPjCRoLG2EE+t461ZE4USz7AACSntuHNFSvcTd+KUlO61aTFNEE6u9l3 +5Xrs6b1O9c0CDv743VPZTPDiHC47dZTh499uRfS6JlJ+9iQSuYFN1TqaFM9WOuqm3Uh SB74vgLI9Kzgc7AfxFlhSMZubNCVkS8M37m9V4RhGjDO4jUY3whPVDc7Fv4X33E7KWXh vfNIpOq5EvoZ3UYY07LLYUrUttiW3aPhIYOhU7fO4jqZtPCAuieRx3RFANd/pm/3299z Yvmg== MIME-Version: 1.0 X-Received: by 10.140.40.70 with SMTP id w64mr687454qgw.14.1424195411007; Tue, 17 Feb 2015 09:50:11 -0800 (PST) Sender: barrister.labuso2@gmail.com Received: by 10.229.159.202 with HTTP; Tue, 17 Feb 2015 09:50:10 -0800 (PST) Date: Tue, 17 Feb 2015 17:50:10 +0000 X-Google-Sender-Auth: C4n7beIlFHE6NCFYtrBHQ__petU Message-ID: Subject: From: Philips Nansoka X-ASG-Orig-Subj: To: undisclosed-recipients:; Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f65.google.com[209.85.216.65] X-Barracuda-Start-Time: 1424195412 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.29 X-Barracuda-Spam-Status: No, SCORE=1.29 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header Hello,. I'm very sorry as we have not been able to communicate all these time, meanwhile I just need to inform you that the bank here has finally approve to release your late cousin estate, kindly provide information for the transfer. Sincerely, Philips Nansoka (ESQ). Email: barr.philipsnansoka@yahoo.com From david@fromorbit.com Tue Feb 17 16:54:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C171E7F60 for ; Tue, 17 Feb 2015 16:54:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 738D0304032 for ; Tue, 17 Feb 2015 14:54:36 -0800 (PST) X-ASG-Debug-ID: 1424213672-04bdf06a59479dc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id QNrC7AIE5hbxNHvs for ; Tue, 17 Feb 2015 14:54:33 -0800 (PST) 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: A2AjDwAlxuNUPDkjLHlbgwaBLII0g32pRQEBAQEBAQaYOgQCAoEZRAEBAQEBAQUBAQEBODuEDQEFHR0cIxAIAw4KCSUPBSUDBxoTiC7RQAEBAQcCIBiFbIULhG4HhCoFlSKDTIEZiTqEfYM+giQcgWQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Feb 2015 09:24:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNr2E-0006JY-Af; Wed, 18 Feb 2015 09:54:30 +1100 Date: Wed, 18 Feb 2015 09:54:30 +1100 From: Dave Chinner To: Johannes Weiner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150217225430.GJ4251@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217125315.GA14287@phnom.home.cmpxchg.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424213672 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [ cc xfs list - experienced kernel devs should not have to be reminded to do this ] On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: > On Tue, Feb 17, 2015 at 09:23:26PM +0900, Tetsuo Handa wrote: > > Tetsuo Handa wrote: > > > Johannes Weiner wrote: > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > > > index 8e20f9c2fa5a..f77c58ebbcfa 100644 > > > > --- a/mm/page_alloc.c > > > > +++ b/mm/page_alloc.c > > > > @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > > > if (high_zoneidx < ZONE_NORMAL) > > > > goto out; > > > > /* The OOM killer does not compensate for light reclaim */ > > > > - if (!(gfp_mask & __GFP_FS)) > > > > + if (!(gfp_mask & __GFP_FS)) { > > > > + /* > > > > + * XXX: Page reclaim didn't yield anything, > > > > + * and the OOM killer can't be invoked, but > > > > + * keep looping as per should_alloc_retry(). > > > > + */ > > > > + *did_some_progress = 1; > > > > goto out; > > > > + } > > > > > > Why do you omit out_of_memory() call for GFP_NOIO / GFP_NOFS allocations? > > > > I can see "possible memory allocation deadlock in %s (mode:0x%x)" warnings > > at kmem_alloc() in fs/xfs/kmem.c . I think commit 9879de7373fcfb46 "mm: > > page_alloc: embed OOM killing naturally into allocation slowpath" introduced > > a regression and below one is the fix. > > > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2381,9 +2381,6 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > /* The OOM killer does not needlessly kill tasks for lowmem */ > > if (high_zoneidx < ZONE_NORMAL) > > goto out; > > - /* The OOM killer does not compensate for light reclaim */ > > - if (!(gfp_mask & __GFP_FS)) > > - goto out; > > /* > > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > Again, we don't want to OOM kill on behalf of allocations that can't > initiate IO, or even actively prevent others from doing it. Not per > default anyway, because most callers can deal with the failure without > having to resort to killing tasks, and NOFS reclaim *can* easily fail. > It's the exceptions that should be annotated instead: > > void * > kmem_alloc(size_t size, xfs_km_flags_t flags) > { > int retries = 0; > gfp_t lflags = kmem_flags_convert(flags); > void *ptr; > > do { > ptr = kmalloc(size, lflags); > if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > return ptr; > if (!(++retries % 100)) > xfs_err(NULL, > "possible memory allocation deadlock in %s (mode:0x%x)", > __func__, lflags); > congestion_wait(BLK_RW_ASYNC, HZ/50); > } while (1); > } > > This should use __GFP_NOFAIL, which is not only designed to annotate > broken code like this, but also recognizes that endless looping on a > GFP_NOFS allocation needs the OOM killer after all to make progress. > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > index a7a3a63bb360..17ced1805d3a 100644 > --- a/fs/xfs/kmem.c > +++ b/fs/xfs/kmem.c > @@ -45,20 +45,12 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) > void * > kmem_alloc(size_t size, xfs_km_flags_t flags) > { > - int retries = 0; > gfp_t lflags = kmem_flags_convert(flags); > - void *ptr; > > - do { > - ptr = kmalloc(size, lflags); > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > - return ptr; > - if (!(++retries % 100)) > - xfs_err(NULL, > - "possible memory allocation deadlock in %s (mode:0x%x)", > - __func__, lflags); > - congestion_wait(BLK_RW_ASYNC, HZ/50); > - } while (1); > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > + lflags |= __GFP_NOFAIL; > + > + return kmalloc(size, lflags); > } Hmmm - the only reason there is a focus on this loop is that it emits warnings about allocations failing. It's obvious that the problem being dealt with here is a fundamental design issue w.r.t. to locking and the OOM killer, but the proposed special casing hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code in XFS started emitting warnings about allocations failing more often. So the answer is to remove the warning? That's like killing the canary to stop the methane leak in the coal mine. No canary? No problems! Right now, the oom killer is a liability. Over the past 6 months I've slowly had to exclude filesystem regression tests from running on small memory machines because the OOM killer is now so unreliable that it kills the test harness regularly rather than the process generating memory pressure. That's a big red flag to me that all this hacking around the edges is not solving the underlying problem, but instead is breaking things that did once work. And, well, then there's this (gfp.h): * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller * cannot handle allocation failures. This modifier is deprecated and no new * users should be added. So, is this another policy relevation from the mm developers about the kmalloc API? i.e. that __GFP_NOFAIL is no longer deprecated? Or just another symptom of frantic thrashing because nobody actually understands the problem or those that do are unwilling to throw out the broken crap and redesign it? If you are changing allocator behaviour and constraints, then you better damn well think through that changes fully, then document those changes, change all the relevant code to use the new API (not just those that throw warnings in your face) and make sure *everyone* knows about it. e.g. a LWN article explaining the changes and how memory allocation is going to work into the future would be a good start. Otherwise, this just looks like another knee-jerk band aid for an architectural problem that needs more than special case hacks to solve. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 17 17:35:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 437227F66 for ; Tue, 17 Feb 2015 17:35:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3C65AC003 for ; Tue, 17 Feb 2015 15:35:55 -0800 (PST) X-ASG-Debug-ID: 1424216153-04bdf06a5b47a940001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id bkaaaZjStQIBBs9t for ; Tue, 17 Feb 2015 15:35:53 -0800 (PST) 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: A2AjDwC7z+NUPDkjLHlbgwaBLII0g32pRQEBAQEBAQaYOgQCAoEZRAEBAQEBAQUBAQEBODuEDQEFOhwjEAgDDgoJJQ8FJQMHGhOILtFJAQEBBwIgGIVshQuEbgeEKgWVIoNMilOIO4IkHIFkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Feb 2015 10:02:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNrdD-0006O4-P5; Wed, 18 Feb 2015 10:32:43 +1100 Date: Wed, 18 Feb 2015 10:32:43 +1100 From: Dave Chinner To: Johannes Weiner Cc: Tetsuo Handa , dchinner@redhat.com, oleg@redhat.com, xfs@oss.sgi.com, mhocko@suse.cz, linux-mm@kvack.org, mgorman@suse.de, rientjes@google.com, akpm@linux-foundation.org, torvalds@linux-foundation.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150217233243.GL4251@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217225430.GJ4251@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: 1424216153 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 09:54:30AM +1100, Dave Chinner wrote: > On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: > > On Tue, Feb 17, 2015 at 09:23:26PM +0900, Tetsuo Handa wrote: > > > --- a/mm/page_alloc.c > > > +++ b/mm/page_alloc.c > > > @@ -2381,9 +2381,6 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > > /* The OOM killer does not needlessly kill tasks for lowmem */ > > > if (high_zoneidx < ZONE_NORMAL) > > > goto out; > > > - /* The OOM killer does not compensate for light reclaim */ > > > - if (!(gfp_mask & __GFP_FS)) > > > - goto out; > > > /* > > > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > > > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > > > Again, we don't want to OOM kill on behalf of allocations that can't > > initiate IO, or even actively prevent others from doing it. Not per > > default anyway, because most callers can deal with the failure without > > having to resort to killing tasks, and NOFS reclaim *can* easily fail. > > It's the exceptions that should be annotated instead: > > > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > void *ptr; > > > > do { > > ptr = kmalloc(size, lflags); > > if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > return ptr; > > if (!(++retries % 100)) > > xfs_err(NULL, > > "possible memory allocation deadlock in %s (mode:0x%x)", > > __func__, lflags); > > congestion_wait(BLK_RW_ASYNC, HZ/50); > > } while (1); > > } > > > > This should use __GFP_NOFAIL, which is not only designed to annotate > > broken code like this, but also recognizes that endless looping on a > > GFP_NOFS allocation needs the OOM killer after all to make progress. > > > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > > index a7a3a63bb360..17ced1805d3a 100644 > > --- a/fs/xfs/kmem.c > > +++ b/fs/xfs/kmem.c > > @@ -45,20 +45,12 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > - int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > - void *ptr; > > > > - do { > > - ptr = kmalloc(size, lflags); > > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > - return ptr; > > - if (!(++retries % 100)) > > - xfs_err(NULL, > > - "possible memory allocation deadlock in %s (mode:0x%x)", > > - __func__, lflags); > > - congestion_wait(BLK_RW_ASYNC, HZ/50); > > - } while (1); > > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > > + lflags |= __GFP_NOFAIL; > > + > > + return kmalloc(size, lflags); > > } > > Hmmm - the only reason there is a focus on this loop is that it > emits warnings about allocations failing. It's obvious that the > problem being dealt with here is a fundamental design issue w.r.t. > to locking and the OOM killer, but the proposed special casing > hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code > in XFS started emitting warnings about allocations failing more > often. > > So the answer is to remove the warning? That's like killing the > canary to stop the methane leak in the coal mine. No canary? No > problems! I'll also point out that there are two other identical allocation loops in XFS, one of which is only 30 lines below this one. That's further indication that this is a "silence the warning" patch rather than something that actually fixes a problem.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 17 18:48:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BF857F6B for ; Tue, 17 Feb 2015 18:48:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A9E9304032 for ; Tue, 17 Feb 2015 16:48:43 -0800 (PST) X-ASG-Debug-ID: 1424220520-04cb6c6b0948b900001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id VJ7h5ok0M8pqz3I1 for ; Tue, 17 Feb 2015 16:48:41 -0800 (PST) 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: A2AjDwAi4ONUPDkjLHlbgwaBLII0g32pRwEBAQEBAQaYOgQCAoEbRAEBAQEBAQUBAQEBODuEDQEFJxMcIxAIAxgJJQ8FJQMHGhMUiBrRGwEBAQcCIBiFbIULhG4HhCoBBJUig0yBGYMNhi2EfYM+hCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Feb 2015 11:18:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YNsog-0006UZ-JS; Wed, 18 Feb 2015 11:48:38 +1100 Date: Wed, 18 Feb 2015 11:48:38 +1100 From: Dave Chinner To: "Michael L. Semon" Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC Message-ID: <20150218004838.GM4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> <54E16667.1050200@gmail.com> <54E22A76.40106@sgi.com> <20150216231716.GB4251@dastard> <54E36016.20908@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E36016.20908@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424220520 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Feb 17, 2015 at 10:36:54AM -0500, Michael L. Semon wrote: > On 02/16/15 18:17, Dave Chinner wrote: > > On Mon, Feb 16, 2015 at 11:35:50AM -0600, Mark Tinguely wrote: > >> Thanks Michael, you don't need to hold your test box for me. I do > >> have a way to recreate these ABBA AGF buffer allocation deadlocks > >> and understand the whys and hows very well. I don't have a community > >> way to make a xfstest for it but I think your test is getting close. > > > > If you know what is causing them, then please explain how it occurs > > and how you think it needs to be fixed. Just telling us that you know > > something that we don't doesn't help us solve the problem. :( > > > > In general, the use of the args->firstblock is supposed to avoid the > > ABBA locking order issues with multiple allocations in the one > > transaction by preventing AG selection loops from looping back into > > AGs with a lower index than the first allocation that was made. > > > > So if you are seeing deadlocks, then it may be that we aren't > > following this constraint correctly in all locations.... > > Will this be a classic deadlock that will cause problems when trying to > kill processes and unmount filesystems? If so, then I was unable to use > generic/224 to trigger a deadlock. If not, then I'll need a better way > of looking at the problem. Yes, it will hang the filesystem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mhocko@suse.cz Wed Feb 18 02:25:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 449B97F72 for ; Wed, 18 Feb 2015 02:25:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 163508F8049 for ; Wed, 18 Feb 2015 00:25:09 -0800 (PST) X-ASG-Debug-ID: 1424247904-04bdf06a5c4a5cd0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6bXxjCjnWvEpW58q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 00:25:07 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 5E21EAB09; Wed, 18 Feb 2015 08:25:03 +0000 (UTC) Date: Wed, 18 Feb 2015 09:25:02 +0100 From: Michal Hocko To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150218082502.GA4478@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217225430.GJ4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424247906 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15472 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 18-02-15 09:54:30, Dave Chinner wrote: > [ cc xfs list - experienced kernel devs should not have to be > reminded to do this ] > > On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: [...] > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > void *ptr; > > > > do { > > ptr = kmalloc(size, lflags); > > if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > return ptr; > > if (!(++retries % 100)) > > xfs_err(NULL, > > "possible memory allocation deadlock in %s (mode:0x%x)", > > __func__, lflags); > > congestion_wait(BLK_RW_ASYNC, HZ/50); > > } while (1); > > } > > > > This should use __GFP_NOFAIL, which is not only designed to annotate > > broken code like this, but also recognizes that endless looping on a > > GFP_NOFS allocation needs the OOM killer after all to make progress. > > > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > > index a7a3a63bb360..17ced1805d3a 100644 > > --- a/fs/xfs/kmem.c > > +++ b/fs/xfs/kmem.c > > @@ -45,20 +45,12 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > - int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > - void *ptr; > > > > - do { > > - ptr = kmalloc(size, lflags); > > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > - return ptr; > > - if (!(++retries % 100)) > > - xfs_err(NULL, > > - "possible memory allocation deadlock in %s (mode:0x%x)", > > - __func__, lflags); > > - congestion_wait(BLK_RW_ASYNC, HZ/50); > > - } while (1); > > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > > + lflags |= __GFP_NOFAIL; > > + > > + return kmalloc(size, lflags); > > } > > Hmmm - the only reason there is a focus on this loop is that it > emits warnings about allocations failing. Such a warning should be part of the allocator and the whole point why I like the patch is that we should really warn at a single place. I was thinking about a simple warning (e.g. like the above) and having something more sophisticated when lockdep is enabled. > It's obvious that the > problem being dealt with here is a fundamental design issue w.r.t. > to locking and the OOM killer, but the proposed special casing > hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code > in XFS started emitting warnings about allocations failing more > often. > > So the answer is to remove the warning? That's like killing the > canary to stop the methane leak in the coal mine. No canary? No > problems! Not at all. I cannot speak for Johannes but I am pretty sure his motivation wasn't to simply silence the warning. The thing is that no kernel code paths except for the page allocator shouldn't emulate behavior for which we have a gfp flag. > Right now, the oom killer is a liability. Over the past 6 months > I've slowly had to exclude filesystem regression tests from running > on small memory machines because the OOM killer is now so unreliable > that it kills the test harness regularly rather than the process > generating memory pressure. It would be great to get bug reports. > That's a big red flag to me that all > this hacking around the edges is not solving the underlying problem, > but instead is breaking things that did once work. I am heavily trying to discourage people from adding random hacks to the already complicated and subtle OOM code. > And, well, then there's this (gfp.h): > > * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller > * cannot handle allocation failures. This modifier is deprecated and no new > * users should be added. > > So, is this another policy relevation from the mm developers about > the kmalloc API? i.e. that __GFP_NOFAIL is no longer deprecated? It is deprecated and shouldn't be used. But that doesn't mean that users should workaround this by developing their own alternative. I agree the wording could be more clear and mention that if the allocation failure is absolutely unacceptable then the flags can be used rather than creating the loop around. What do you think about the following? diff --git a/include/linux/gfp.h b/include/linux/gfp.h index b840e3b2770d..ee6440ccb75d 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -57,8 +57,12 @@ struct vm_area_struct; * _might_ fail. This depends upon the particular VM implementation. * * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller - * cannot handle allocation failures. This modifier is deprecated and no new - * users should be added. + * cannot handle allocation failures. This modifier is deprecated for allocation + * with order > 1. Besides that this modifier is very dangerous when allocation + * happens under a lock because it creates a lock dependency invisible for the + * OOM killer so it can livelock. If the allocation failure is _absolutely_ + * unacceptable then the flags has to be used rather than looping around + * allocator. * * __GFP_NORETRY: The VM implementation must not retry indefinitely. * > Or just another symptom of frantic thrashing because nobody actually > understands the problem or those that do are unwilling to throw out > the broken crap and redesign it? > > If you are changing allocator behaviour and constraints, then you > better damn well think through that changes fully, then document > those changes, change all the relevant code to use the new API (not > just those that throw warnings in your face) and make sure > *everyone* knows about it. e.g. a LWN article explaining the changes > and how memory allocation is going to work into the future would be > a good start. Well, I think the first step is to change the users of the allocator to not lie about gfp flags. So if the code is infinitely trying then it really should use GFP_NOFAIL flag. In the meantime page allocator should develop a proper diagnostic to help identify all the potential dependencies. Next we should start thinking whether all the existing GFP_NOFAIL paths are really necessary or the code can be refactored/reimplemented to accept allocation failures. > Otherwise, this just looks like another knee-jerk band aid for an > architectural problem that needs more than special case hacks to > solve. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Michal Hocko SUSE Labs From cmaiolino@redhat.com Wed Feb 18 03:29:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6EE0A7F66 for ; Wed, 18 Feb 2015 03:29:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4F3E58F8037 for ; Wed, 18 Feb 2015 01:29:52 -0800 (PST) X-ASG-Debug-ID: 1424251790-04cbb01165465240001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2VWdfgGwgY75EgBr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 01:29:51 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1I9To1k006707 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 18 Feb 2015 04:29:50 -0500 Received: from hades.maiolino.org (dhcp-1-103.brq.redhat.com [10.34.1.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1I9TlLT015717 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Wed, 18 Feb 2015 04:29:49 -0500 Date: Wed, 18 Feb 2015 07:29:46 -0200 From: Carlos Maiolino To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: remove deprecated mount options Message-ID: <20150218092946.GA29058@hades.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove deprecated mount options Mail-Followup-To: Eric Sandeen , xfs-oss References: <54E37F24.10300@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E37F24.10300@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424251791 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Looks good to me, also tested it, and there is no need anymore to keep warnings about these deprecated functions IMHO Consider it Reviewed-by: Carlos Maiolino Tested-by: Carlos Maiolino On Tue, Feb 17, 2015 at 11:49:24AM -0600, Eric Sandeen wrote: > We recently removed deprecated sysctls; may as well > remove deprecated mount options as well, we've stated > that they'd be gone by now in the docs. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt > index 7077103..03a3d03 100644 > --- a/Documentation/filesystems/xfs.txt > +++ b/Documentation/filesystems/xfs.txt > @@ -228,30 +228,19 @@ default behaviour. > Deprecated Mount Options > ======================== > -- Carlos From jack@suse.cz Wed Feb 18 04:40:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75AFC7F5E for ; Wed, 18 Feb 2015 04:40:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04554AC001 for ; Wed, 18 Feb 2015 02:40:18 -0800 (PST) X-ASG-Debug-ID: 1424256015-04cb6c6b094bc130001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id mAxXJxj4vmnVEl3f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 02:40:16 -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 1E154AB12; Wed, 18 Feb 2015 10:40:14 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id F132681FC3; Wed, 18 Feb 2015 11:40:09 +0100 (CET) Date: Wed, 18 Feb 2015 11:40:09 +0100 From: Jan Kara To: Matthew Wilcox Cc: Jan Kara , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "david@fromorbit.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150218104009.GB4614@quack.suse.cz> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217133745.GG3364@wil.cx> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424256016 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > Matthew, I think I still didn't see response to this. I think we can > > fixup things after they are merged (since Andrew sent this patch to Linus) > > but IMHO it needs some action... > > Sorry, I thought I'd replied to this. > > > On Mon 19-01-15 15:18:58, Jan Kara wrote: > > > On Fri 16-01-15 21:16:03, Wilcox, Matthew R wrote: > > > > Are you sure it shouldn't be ext4_get_block_write, or _write_nolock? > > > > According to the comments, ext4_get_block() doesn't allocate > > > > uninitialized extents, which we do want it to do. > > > Hum, so if I understand the code right dax_fault() will allocate a block > > > (== page in persistent memory) for a faulted address and will map this > > > block directly into process' address space. Thus that block has to be > > > zeroed out before the fault finishes no matter what (so that userspace > > > doesn't see garbage) - unwritten block handling in the filesystem doesn't > > > really matter (and would only cause unnecessary overhead) because of the > > > direct mapping of the block to process' address space. So I would think > > > that it would be easiest if dax_fault() simply zeroed out blocks which got > > > allocated. You could rewrite part of dax_fault() to something like: > > > > > > create = !vmf->cow_page && (vmf->flags & FAULT_FLAG_WRITE); > > > error = get_block(inode, block, &bh, create); > > > if (!error && (bh.b_size < PAGE_SIZE)) > > > error = -EIO; > > > if (error) > > > goto unlock_page; > > > > > > if (buffer_new(&bh)) { > > > count_vm_event(PGMAJFAULT); > > > mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); > > > major = VM_FAULT_MAJOR; > > > dax_clear_blocks(inode, bh->b_blocknr, PAGE_SIZE); > > > } else if (!buffer_mapped(&bh)) > > > return dax_load_hole(mapping, page, vmf); > > > > > > Note, that we also avoided calling get_block() callback twice on major fault > > > as that's relatively expensive due to locking, extent tree lookups, etc. > > > > > > Also note that ext2 then doesn't have to call dax_clear_blocks() at all if > > > I understand the code right. > > I think you've missed the case where we lose power after ext2 has > allocated the block and before dax_clear_blocks() is called. After power > returns, ext4 will show an unwritten extent in the tree, which will be > zeroed before being handed to a user. ext2 must have zeroed the block > before linking it into the inode's data blocks. So the way ext4 traditionally deals with this is that we remember inode data needs to be flushed before transaction doing the allocation commits. So to handle this it can start transaction in ext4_dax_fault() / ext4_dax_mkwrite() if write is requested and call ext4_jbd2_file_inode() after dax_fault() / dax_mkwrite() returns. Complete function will look something like follows: static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { handle_t *handle; int create = !vmf->cow_page && (vmf->flags & FAULT_FLAG_WRITE); struct inode *inode = file_inode(vma->vm_file); int ret; int retries = 0; if (create) { sb_start_pagefault(inode->i_sb); file_update_time(vma->vm_file); retry_alloc: handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, ext4_writepage_trans_blocks(inode)); if (IS_ERR(handle)) { ret = PTR_ERR(handle); goto out; } } ret = do_dax_fault(vma, vmf, ext4_get_block); if (create) { if (!ret && ext4_test_inode_state(inode, EXT4_STATE_ORDERED_MODE)) ret = ext4_jbd2_file_inode(handle, inode); ext4_journal_stop(handle); if (ret == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) goto retry_alloc; } out: if (create) sb_end_pagefault(sb); return block_page_mkwrite_return(ret); } This will be much faster than dances with unwritten extents. It seems more complex but as a bonus you get proper retry logic on ENOSPC (ext4 can see temporary ENOSPC errors due to pending transaction commit) and also you won't rely on _ext4_get_block() to start a transaction for you - looking at that current code has a lock ordering violation (at least for the case where the page exists) because page lock ranks under transaction start but you end up calling ext4_get_block() with create == 1 and without transaction started under page lock (we don't have lockdep instrumentation for page locks so these problems show up only as deadlocks under load). You may notice that for this to work, I need do_dax_fault() exported (that's due to lock ordering of sb_start_pagefault() which ranks above transaction start). I also need do_dax_fault() to return standard errno (similarly to __block_page_mkwrite()) which the caller then converts to fault handler return value via block_page_mkwrite_return() (or you could create your own dax_fault_return()). > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > to a written extent after we've initialised the contents. We use the > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > softirq context. > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > point me please? > > For faults, we call it in dax_insert_mapping(), the very last thing > before returning in the fault path. The normal I/O path gets to use > the dio_iodone_t for the same purpose. I see. I didn't think of races with reads (hum, I actually wonder whether we don't have this data exposure problem for ext4 for mmapped write into a hole vs direct read as well). So I guess we do need those unwritten extent dances after all (or we would need to have a page covering hole when writing to it via mmap but I guess unwritten extent dances are somewhat more standard). So in that case you need ext4_get_block_write() in the above call to do_dax_fault() (note that we still do need ext4 version of the fault function like above due to lock ranking and retry on ENOSPC). And please comment about the read races at that call site so that we have that subtlety documented somewhere. > > > Also abusing b_end_io of a phony buffer for that looks ugly to me (we are > > > trying to get away from passing phony bh around and this would entangle us > > > even more into that mess). Normally I would think that end_io() callback > > > passed into dax_do_io() should perform necessary conversions and for > > > dax_fault() we could do necessary conversions inside foofs_page_mkwrite()... > > Dave sees to be the one trying the hardest to get rid of the phony BHs > ... and it was his idea to (ab)use b_end_io for this. The problem with > doing the conversion in ext4_page_mkwrite() is that we don't know at > that point whether the BH is unwritten or not. I see, thanks for explanation. So it would be enough to pass a bit of information (unwritten / written) to a caller of do_dax_fault() and that can then call conversion function. IMO doing that (either in a return value or in a separate argument of do_dax_fault()) would be cleaner and more readable than playing with b_private and b_end_io... Thoughts? Honza -- Jan Kara SUSE Labs, CR From david@fromorbit.com Wed Feb 18 04:49:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4ECDF7F6B for ; Wed, 18 Feb 2015 04:49:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A3B9304053 for ; Wed, 18 Feb 2015 02:49:06 -0800 (PST) X-ASG-Debug-ID: 1424256543-04bdf06a5c4a9550001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id pdCyqHWeRu349wGh for ; Wed, 18 Feb 2015 02:49:03 -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: A2DIDwB3beRUPDkjLHlRCoMGUlqCOa1CAQEBAQEBBpJThWcEAgKBG0QBAQEBAQEFAQEBATg7hAwBAQEDATocIwULCAMOCgklDwUlAwcaE4gnBw7RTywYhWyEDX6EElwHhCoFkxyCFoNMgRqJPBGEboM+giQcgWQqMQEBA4I+AQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 18 Feb 2015 21:19:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YO2Bf-0007K1-Vr; Wed, 18 Feb 2015 21:49:00 +1100 Date: Wed, 18 Feb 2015 21:48:59 +1100 From: Dave Chinner To: Michal Hocko Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150218104859.GM12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218082502.GA4478@dhcp22.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1424256543 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > On Wed 18-02-15 09:54:30, Dave Chinner wrote: > > [ cc xfs list - experienced kernel devs should not have to be > > reminded to do this ] > > > > On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: > [...] > > > void * > > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > > { > > > int retries = 0; > > > gfp_t lflags = kmem_flags_convert(flags); > > > void *ptr; > > > > > > do { > > > ptr = kmalloc(size, lflags); > > > if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > > return ptr; > > > if (!(++retries % 100)) > > > xfs_err(NULL, > > > "possible memory allocation deadlock in %s (mode:0x%x)", > > > __func__, lflags); > > > congestion_wait(BLK_RW_ASYNC, HZ/50); > > > } while (1); > > > } > > > > > > This should use __GFP_NOFAIL, which is not only designed to annotate > > > broken code like this, but also recognizes that endless looping on a > > > GFP_NOFS allocation needs the OOM killer after all to make progress. > > > > > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > > > index a7a3a63bb360..17ced1805d3a 100644 > > > --- a/fs/xfs/kmem.c > > > +++ b/fs/xfs/kmem.c > > > @@ -45,20 +45,12 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) > > > void * > > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > > { > > > - int retries = 0; > > > gfp_t lflags = kmem_flags_convert(flags); > > > - void *ptr; > > > > > > - do { > > > - ptr = kmalloc(size, lflags); > > > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > > - return ptr; > > > - if (!(++retries % 100)) > > > - xfs_err(NULL, > > > - "possible memory allocation deadlock in %s (mode:0x%x)", > > > - __func__, lflags); > > > - congestion_wait(BLK_RW_ASYNC, HZ/50); > > > - } while (1); > > > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > > > + lflags |= __GFP_NOFAIL; > > > + > > > + return kmalloc(size, lflags); > > > } > > > > Hmmm - the only reason there is a focus on this loop is that it > > emits warnings about allocations failing. > > Such a warning should be part of the allocator and the whole point why > I like the patch is that we should really warn at a single place. I > was thinking about a simple warning (e.g. like the above) and having > something more sophisticated when lockdep is enabled. > > > It's obvious that the > > problem being dealt with here is a fundamental design issue w.r.t. > > to locking and the OOM killer, but the proposed special casing > > hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code > > in XFS started emitting warnings about allocations failing more > > often. > > > > So the answer is to remove the warning? That's like killing the > > canary to stop the methane leak in the coal mine. No canary? No > > problems! > > Not at all. I cannot speak for Johannes but I am pretty sure his > motivation wasn't to simply silence the warning. The thing is that no > kernel code paths except for the page allocator shouldn't emulate > behavior for which we have a gfp flag. > > > Right now, the oom killer is a liability. Over the past 6 months > > I've slowly had to exclude filesystem regression tests from running > > on small memory machines because the OOM killer is now so unreliable > > that it kills the test harness regularly rather than the process > > generating memory pressure. > > It would be great to get bug reports. I thought we were talking about a manifestation of the problems I've been seeing.... > > That's a big red flag to me that all > > this hacking around the edges is not solving the underlying problem, > > but instead is breaking things that did once work. > > I am heavily trying to discourage people from adding random hacks to > the already complicated and subtle OOM code. > > > And, well, then there's this (gfp.h): > > > > * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller > > * cannot handle allocation failures. This modifier is deprecated and no new > > * users should be added. > > > > So, is this another policy relevation from the mm developers about > > the kmalloc API? i.e. that __GFP_NOFAIL is no longer deprecated? > > It is deprecated and shouldn't be used. But that doesn't mean that users > should workaround this by developing their own alternative. I'm kinda sick of hearing that, as if saying it enough times will make reality change. We have a *hard requirement* for memory allocation to make forwards progress, otherwise we *fail catastrophically*. History lesson - June 2004: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=b30a2f7bf90593b12dbc912e4390b1b8ee133ea9 So, we're hardly working around the deprecation of GFP_NOFAIL when the code existed 5 years before GFP_NOFAIL was deprecated. Indeed, GFP_NOFAIL was shiny and new back then, having been introduced by Andrew Morton back in 2003. > I agree the > wording could be more clear and mention that if the allocation failure > is absolutely unacceptable then the flags can be used rather than > creating the loop around. What do you think about the following? > > diff --git a/include/linux/gfp.h b/include/linux/gfp.h > index b840e3b2770d..ee6440ccb75d 100644 > --- a/include/linux/gfp.h > +++ b/include/linux/gfp.h > @@ -57,8 +57,12 @@ struct vm_area_struct; > * _might_ fail. This depends upon the particular VM implementation. > * > * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller > - * cannot handle allocation failures. This modifier is deprecated and no new > - * users should be added. > + * cannot handle allocation failures. This modifier is deprecated for allocation > + * with order > 1. Besides that this modifier is very dangerous when allocation > + * happens under a lock because it creates a lock dependency invisible for the > + * OOM killer so it can livelock. If the allocation failure is _absolutely_ > + * unacceptable then the flags has to be used rather than looping around > + * allocator. Doesn't change anything from an XFS point of view. We do order >1 allocations through kmem_alloc() wrapper, and so we are still doing something that is "not supported" even if we use GFP_NOFAIL rather than our own loop. Also, this reads as an excuse for the OOM killer being broken and not fixing it. Keep in mind that we tell the memory alloc/reclaim subsystem that *we hold locks* when we call into it. That's what GFP_NOFS originally meant, and it's what it still means today in an XFS context. If the OOM killer is not obeying GFP_NOFS and deadlocking on locks that the invoking context holds, then that is a OOM killer bug, not a bug in the subsystem calling kmalloc(GFP_NOFS). > * > * __GFP_NORETRY: The VM implementation must not retry indefinitely. > * > > > Or just another symptom of frantic thrashing because nobody actually > > understands the problem or those that do are unwilling to throw out > > the broken crap and redesign it? > > > > If you are changing allocator behaviour and constraints, then you > > better damn well think through that changes fully, then document > > those changes, change all the relevant code to use the new API (not > > just those that throw warnings in your face) and make sure > > *everyone* knows about it. e.g. a LWN article explaining the changes > > and how memory allocation is going to work into the future would be > > a good start. > > Well, I think the first step is to change the users of the allocator > to not lie about gfp flags. So if the code is infinitely trying then > it really should use GFP_NOFAIL flag. That's a complete non-issue when it comes to deciding whether it is safe to invoke the OOM killer or not! > In the meantime page allocator > should develop a proper diagnostic to help identify all the potential > dependencies. Next we should start thinking whether all the existing > GFP_NOFAIL paths are really necessary or the code can be > refactored/reimplemented to accept allocation failures. Last time the "just make filesystems handle memory allocation failures" I pointed out what that meant for XFS: dirty transaction rollback is required. That's freakin' complex, will double the memory footprint of transactions, roughly double the CPU cost, and greatly increase the complexity of the transaction subsystem. It's a *major* rework of a significant amount of the XFS codebase and will take at least a couple of years design, test and stabilise before it could be rolled out to production. I'm not about to spend a couple of years rewriting XFS just so the VM can get rid of a GFP_NOFAIL user. Especially as the we already tell the Hammer of Last Resort the context in which it can work. Move the OOM killer to kswapd - get it out of the direct reclaim path altogether. If the system is that backed up on locks that it cannot free any memory and has no reserves to satisfy the allocation that kicked the OOM killer, then the OOM killer was not invoked soon enough. Hell, if you want a better way to proceed, then how about you allow us to tell the MM subsystem how much memory reserve a specific set of operations is going to require to complete? That's something that we can do rough calculations for, and it integrates straight into the existing transaction reservation system we already use for log space and disk space, and we can tell the mm subsystem when the reserve is no longer needed (i.e. last thing in transaction commit). That way we don't start a transaction until the mm subsystem has reserved enough pages for us to work with, and the reserve only needs to be used when normal allocation has already failed. i.e rather than looping we get a page allocated from the reserve pool. The reservations wouldn't be perfect, but the majority of the time we'd be able to make progress and not need the OOM killer. And best of all, there's no responsibilty on the MM subsystem for preventing OOM - getting the reservations right is the responsibiity of the subsystem using them. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mhocko@suse.cz Wed Feb 18 06:16:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C75A7F63 for ; Wed, 18 Feb 2015 06:16:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B2788F8054 for ; Wed, 18 Feb 2015 04:16:06 -0800 (PST) X-ASG-Debug-ID: 1424261763-04cb6c6b0b4c4860001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id NJEByq0H6rPH46io (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 04:16:04 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 C3A25ABF6; Wed, 18 Feb 2015 12:16:02 +0000 (UTC) Date: Wed, 18 Feb 2015 13:16:02 +0100 From: Michal Hocko To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150218121602.GC4478@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218104859.GM12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424261764 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15478 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 18-02-15 21:48:59, Dave Chinner wrote: > On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > > On Wed 18-02-15 09:54:30, Dave Chinner wrote: [...] > Also, this reads as an excuse for the OOM killer being broken and > not fixing it. Keep in mind that we tell the memory alloc/reclaim > subsystem that *we hold locks* when we call into it. That's what > GFP_NOFS originally meant, and it's what it still means today in an > XFS context. Sure, and OOM killer will not be invoked in NOFS context. See __alloc_pages_may_oom and __GFP_FS check in there. So I do not see where is the OOM killer broken. The crucial problem we are dealing with is not GFP_NOFAIL triggering the OOM killer but a lock dependency introduced by the following sequence: taskA taskB taskC lock(A) alloc() alloc(gfp | __GFP_NOFAIL) lock(A) out_of_memory # looping for ever if we select_bad_process # cannot make any progress victim = taskB There is no way OOM killer can tell taskB is blocked and that there is dependency between A and B (without lockdep). That is why I call NOFAIL under a lock as dangerous and a bug. > If the OOM killer is not obeying GFP_NOFS and deadlocking on locks > that the invoking context holds, then that is a OOM killer bug, not > a bug in the subsystem calling kmalloc(GFP_NOFS). I guess we are talking about different things here or what am I missing? [...] > > In the meantime page allocator > > should develop a proper diagnostic to help identify all the potential > > dependencies. Next we should start thinking whether all the existing > > GFP_NOFAIL paths are really necessary or the code can be > > refactored/reimplemented to accept allocation failures. > > Last time the "just make filesystems handle memory allocation > failures" I pointed out what that meant for XFS: dirty transaction > rollback is required. That's freakin' complex, will double the > memory footprint of transactions, roughly double the CPU cost, and > greatly increase the complexity of the transaction subsystem. It's a > *major* rework of a significant amount of the XFS codebase and will > take at least a couple of years design, test and stabilise before > it could be rolled out to production. > > I'm not about to spend a couple of years rewriting XFS just so the > VM can get rid of a GFP_NOFAIL user. Especially as the we already > tell the Hammer of Last Resort the context in which it can work. > > Move the OOM killer to kswapd - get it out of the direct reclaim > path altogether. This doesn't change anything as explained in other email. The triggering path doesn't wait for the victim to die. > If the system is that backed up on locks that it > cannot free any memory and has no reserves to satisfy the allocation > that kicked the OOM killer, then the OOM killer was not invoked soon > enough. > > Hell, if you want a better way to proceed, then how about you allow > us to tell the MM subsystem how much memory reserve a specific set > of operations is going to require to complete? That's something that > we can do rough calculations for, and it integrates straight into > the existing transaction reservation system we already use for log > space and disk space, and we can tell the mm subsystem when the > reserve is no longer needed (i.e. last thing in transaction commit). > > That way we don't start a transaction until the mm subsystem has > reserved enough pages for us to work with, and the reserve only > needs to be used when normal allocation has already failed. i.e > rather than looping we get a page allocated from the reserve pool. I am not sure I understand the above but isn't the mempools a tool for this purpose? > The reservations wouldn't be perfect, but the majority of the time > we'd be able to make progress and not need the OOM killer. And best > of all, there's no responsibilty on the MM subsystem for preventing > OOM - getting the reservations right is the responsibiity of the > subsystem using them. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Michal Hocko SUSE Labs From projectabg@bgdeals.org Wed Feb 18 07:29:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 128247F6A for ; Wed, 18 Feb 2015 07:29:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB0878F8035 for ; Wed, 18 Feb 2015 05:29:01 -0800 (PST) X-ASG-Debug-ID: 1424266131-04bdf06a5a4b4620001-NocioJ Received: from bgdeals.org (bgdeals.org [37.157.188.204]) by cuda.sgi.com with ESMTP id lu0PFFo0F3nXVKWj for ; Wed, 18 Feb 2015 05:28:52 -0800 (PST) X-Barracuda-Envelope-From: projectabg@bgdeals.org X-Barracuda-Apparent-Source-IP: 37.157.188.204 Received: from ideabg.eu by bgdeals.org (MDaemon PRO v9.6.1) with ESMTP id md50000591538.msg for ; Wed, 18 Feb 2015 15:26:05 +0200 To: xfs@oss.sgi.com Subject: =?UTF-8?B?4oCe0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQv9GA0L7QtdC60YLQuOKAnCDQuCDQldCy0YDQvtC/0LXQudGB0LrQuCDQv9GA0L7Qs9GA0LDQvNC4?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?B?4oCe0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQv9GA0L7QtdC60YLQuOKAnCDQuCDQldCy0YDQvtC/0LXQudGB0LrQuCDQv9GA0L7Qs9GA0LDQvNC4?= Date: Wed, 18 Feb 2015 12:54:21 +0200 From: "=?UTF-8?B?0J/RgNC+0LTQttC10LrRgtCw?=" Reply-To: projectabg@mail.bg MIME-Version: 1.0 X-Mailer-LID: 78 List-Unsubscribe: X-Mailer-RecptId: 3084648 X-Mailer-SID: 113 X-Mailer-Sent-By: 1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Authenticated-Sender: projectabg@bgdeals.org X-MDRemoteIP: 37.157.188.203 X-Return-Path: projectabg@bgdeals.org X-Envelope-From: projectabg@bgdeals.org X-MDaemon-Deliver-To: xfs@oss.sgi.com X-Barracuda-Connect: bgdeals.org[37.157.188.204] X-Barracuda-Start-Time: 1424266131 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 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

Здравейте,

Знаете ли защо водещи български компании обучават десетки и стотици свои служители по Управление на проекти? Защото доброто управление на проекти е ключово за тяхното развитие и ефективност. В рамките на нашите консултантски услуги, вече 10 години организираме най-успешните обучения по Управление на проекти в България за хиляди представители на малки, средни и големи организации. През следващите два месеца можете да се възползвате от нашата най-добра селекция:
 

 1.     Основно обучение по Управление на проекти – фундамент за цял живот: 

Управление на проекти - Preparation for Success (3 дни; 24 PDUs), София, 26-28.02.2015 
с лектор Александър Апостолов, PMP®, TSPM - управител на Проджекта и TenStep България. Най-успешното обучение по Управление на проекти в България, проведено досега повече от 110 пъти!

Съвременни компетенции за управление на проекти (40 PDUs) 
Онлайн курс. Задължително обучение за всички, които практикуват или сериозно се интересуват от Управление на проекти!

 2.     Международно признати сертификати по Управление на проекти. Опит със стотици сертифицирани по нашите програми:

Accredited PRINCE2® Foundation Certificate Programme, 19-21.03.2015 
с лектор
Петер Кришел, PRINCE2® and Agile PM Approved Trainer, Scrum Master (Холандия)

Accredited PRINCE2® Practitioner Certificate Programme с изпит на 21.03.2015  
Онлайн подготовка и присъствен изпит

Project Management Professional (PMP®)/CAPM® Exam Preparation, 11-14.03.2015 
с лектор Франк Нинов, PMP® (Германия)

Agile Project Management™ (AgilePM®) Foundation Certification, 16-18.03.2015 
с лектор
Петер Кришел, PRINCE2® and Agile PM Approved Trainer, Scrum Master (Холандия)

Professional Scrum Master Certification Course (PSM-I), 23-24.03.2015 
с лектор Петер Кришел, PRINCE2® and Agile PM Approved Trainer, Scrum Master (Холандия)

Подготовка за сертифициране по управление на проекти за Нива C и D на Международната асоциация по управление на проекти (IPMA) - онлайн курс
 
 3.     Европейски проекти – от А до Я:

Разработване на проекти за финансиране от Европейския съюз, 19-21 февруари 2015 
с лектор Александър Апостолов, PMP®, TSPM - управител на Проджекта и TenStep България. Най-пълното и най-подробно обучение по темата, с представяне на реални проекти.

Зелен пояс по Изготвяне и изпълнение на проекти по програмите на ЕС (2014-2020) 
Сертификационна програма.

Изготвяне и изпълнение на проекти по програмите на ЕС: Модул 1, Модул 2, Модул 3, Модул 4, Модул 5 
Онлайн обучения.
 
 4.     Инвестиране – край на митовете и легендите:

Семинар "Машина за пари за милионери" на Роберт Ролих на  31.03.2015 г.  
Мегасъбитие в София
, НДК. НЕ инвестирайте дори 1 лев повече, преди да посетите този семинар! Защото той ще направи на пух и прах всяко ваше разбиране и вярване относно инвестирането. Научете как да постигнете по-добра възвръщаемост от 95% от инвеститорите, като спестите 95% от времето си.

 

 5.     Книги по Управление на проекти – вижте всички книги тук

  

Какво още правим за нашите клиенти - свържете се с нас за повече информация:

-          Вътрешни обучения, адаптирани към Вашите нужди

-          Разработване и въвеждане на методологии за управление на проекти

-          Съдействие при разработване и изпълнение на проекти по програмите на ЕС

  

 

С пожелание за успешни проекти,

ПРОДЖЕКТА ООД

ул. Веслец 45, офис 13, София, 1202; тел./факс +359 (2) 983 53 24; 489 44 58

info@projecta.bg; www.projecta.bg


Намерете ни във Facebook: www.facebook.com/UpravlenieNaProekti

 

Проджекта:

  • Разработване на проекти и управление на проекти за бизнеса и администрацията
  • Лидер в сертифицирането по управление на проекти – PRINCE2, PMP®, IPMA, Agile, Scrum
  • Съдействие за реализация на проекти по програмите на Европейския съюз
  • Разработване и въвеждане на методологии за управление на проекти
  • Най-успешните обучения по управление на проекти

   

     

    

Съгласно закона за електронна търговия Чл. 6, ал. 1 Ви уведомяваме, че е възможно това да е непоискано търговско съобщение. 
То е еднократно изпратено писмо до Вашия e-mail адрес, който е взет от публичното пространство. 
Извиняваме се за причиненото неудобство, ако сме Ви притеснили с нашето предложение. 
Ако не желаете да получавате съобщения от "Проджекта"моля кликнете ТУК за автоматично отписване! 


From jack@suse.cz Wed Feb 18 07:48:24 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2D4BD7F6F for ; Wed, 18 Feb 2015 07:48:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BA688F8037 for ; Wed, 18 Feb 2015 05:48:23 -0800 (PST) X-ASG-Debug-ID: 1424267300-04cb6c6b0c4c6b20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id CBSPaxfLKmtTNFNB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:21 -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 5C1FCAC27; Wed, 18 Feb 2015 13:48:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 7DDA4829A2; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 3/8] xfs: Convert to using ->get_state callback Date: Wed, 18 Feb 2015 14:47:49 +0100 X-ASG-Orig-Subj: [PATCH 3/8] xfs: Convert to using ->get_state callback Message-Id: <1424267274-11836-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267301 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Convert xfs to use ->get_state callback instead of ->get_xstate and ->get_xstatev. Signed-off-by: Jan Kara --- fs/xfs/xfs_qm.h | 4 -- fs/xfs/xfs_qm_syscalls.c | 176 ----------------------------------------------- fs/xfs/xfs_quotaops.c | 98 +++++++++++++++++++------- 3 files changed, 72 insertions(+), 206 deletions(-) diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 0d4d3590cf85..996a04064894 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -168,10 +168,6 @@ extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, uint, struct qc_dqblk *); extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, struct qc_dqblk *); -extern int xfs_qm_scall_getqstat(struct xfs_mount *, - struct fs_quota_stat *); -extern int xfs_qm_scall_getqstatv(struct xfs_mount *, - struct fs_quota_statv *); extern int xfs_qm_scall_quotaon(struct xfs_mount *, uint); extern int xfs_qm_scall_quotaoff(struct xfs_mount *, uint); diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 9b965db45800..9a25c9275fb3 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -38,7 +38,6 @@ STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, uint); -STATIC uint xfs_qm_export_flags(uint); /* * Turn off quota accounting and/or enforcement for all udquots and/or @@ -389,159 +388,6 @@ xfs_qm_scall_quotaon( return 0; } - -/* - * Return quota status information, such as uquota-off, enforcements, etc. - * for Q_XGETQSTAT command. - */ -int -xfs_qm_scall_getqstat( - struct xfs_mount *mp, - struct fs_quota_stat *out) -{ - struct xfs_quotainfo *q = mp->m_quotainfo; - struct xfs_inode *uip = NULL; - struct xfs_inode *gip = NULL; - struct xfs_inode *pip = NULL; - bool tempuqip = false; - bool tempgqip = false; - bool temppqip = false; - - memset(out, 0, sizeof(fs_quota_stat_t)); - - out->qs_version = FS_QSTAT_VERSION; - out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & - (XFS_ALL_QUOTA_ACCT| - XFS_ALL_QUOTA_ENFD)); - uip = q->qi_uquotaip; - gip = q->qi_gquotaip; - pip = q->qi_pquotaip; - if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip) == 0) - tempuqip = true; - } - if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip) == 0) - tempgqip = true; - } - /* - * Q_XGETQSTAT doesn't have room for both group and project quotas. - * So, allow the project quota values to be copied out only if - * there is no group quota information available. - */ - if (!gip) { - if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino, - 0, 0, &pip) == 0) - temppqip = true; - } - } else - pip = NULL; - if (uip) { - out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; - out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; - out->qs_uquota.qfs_nextents = uip->i_d.di_nextents; - if (tempuqip) - IRELE(uip); - } - - if (gip) { - out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; - out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks; - out->qs_gquota.qfs_nextents = gip->i_d.di_nextents; - if (tempgqip) - IRELE(gip); - } - if (pip) { - out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; - out->qs_gquota.qfs_nblks = pip->i_d.di_nblocks; - out->qs_gquota.qfs_nextents = pip->i_d.di_nextents; - if (temppqip) - IRELE(pip); - } - out->qs_incoredqs = q->qi_dquots; - out->qs_btimelimit = q->qi_btimelimit; - out->qs_itimelimit = q->qi_itimelimit; - out->qs_rtbtimelimit = q->qi_rtbtimelimit; - out->qs_bwarnlimit = q->qi_bwarnlimit; - out->qs_iwarnlimit = q->qi_iwarnlimit; - - return 0; -} - -/* - * Return quota status information, such as uquota-off, enforcements, etc. - * for Q_XGETQSTATV command, to support separate project quota field. - */ -int -xfs_qm_scall_getqstatv( - struct xfs_mount *mp, - struct fs_quota_statv *out) -{ - struct xfs_quotainfo *q = mp->m_quotainfo; - struct xfs_inode *uip = NULL; - struct xfs_inode *gip = NULL; - struct xfs_inode *pip = NULL; - bool tempuqip = false; - bool tempgqip = false; - bool temppqip = false; - - out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags & - (XFS_ALL_QUOTA_ACCT| - XFS_ALL_QUOTA_ENFD)); - out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino; - out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino; - out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino; - - uip = q->qi_uquotaip; - gip = q->qi_gquotaip; - pip = q->qi_pquotaip; - if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, - 0, 0, &uip) == 0) - tempuqip = true; - } - if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, - 0, 0, &gip) == 0) - tempgqip = true; - } - if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) { - if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino, - 0, 0, &pip) == 0) - temppqip = true; - } - if (uip) { - out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; - out->qs_uquota.qfs_nextents = uip->i_d.di_nextents; - if (tempuqip) - IRELE(uip); - } - - if (gip) { - out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks; - out->qs_gquota.qfs_nextents = gip->i_d.di_nextents; - if (tempgqip) - IRELE(gip); - } - if (pip) { - out->qs_pquota.qfs_nblks = pip->i_d.di_nblocks; - out->qs_pquota.qfs_nextents = pip->i_d.di_nextents; - if (temppqip) - IRELE(pip); - } - out->qs_incoredqs = q->qi_dquots; - out->qs_btimelimit = q->qi_btimelimit; - out->qs_itimelimit = q->qi_itimelimit; - out->qs_rtbtimelimit = q->qi_rtbtimelimit; - out->qs_bwarnlimit = q->qi_bwarnlimit; - out->qs_iwarnlimit = q->qi_iwarnlimit; - - return 0; -} - #define XFS_QC_MASK \ (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK) @@ -873,28 +719,6 @@ out_put: return error; } -STATIC uint -xfs_qm_export_flags( - uint flags) -{ - uint uflags; - - uflags = 0; - if (flags & XFS_UQUOTA_ACCT) - uflags |= FS_QUOTA_UDQ_ACCT; - if (flags & XFS_GQUOTA_ACCT) - uflags |= FS_QUOTA_GDQ_ACCT; - if (flags & XFS_PQUOTA_ACCT) - uflags |= FS_QUOTA_PDQ_ACCT; - if (flags & XFS_UQUOTA_ENFD) - uflags |= FS_QUOTA_UDQ_ENFD; - if (flags & XFS_GQUOTA_ENFD) - uflags |= FS_QUOTA_GDQ_ENFD; - if (flags & XFS_PQUOTA_ENFD) - uflags |= FS_QUOTA_PDQ_ENFD; - return uflags; -} - STATIC int xfs_dqrele_inode( diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 6923905ab33d..df9835396c4f 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -23,45 +23,92 @@ #include "xfs_inode.h" #include "xfs_quota.h" #include "xfs_trans.h" +#include "xfs_trace.h" +#include "xfs_icache.h" #include "xfs_qm.h" #include -STATIC int -xfs_quota_type(int type) +static void +xfs_qm_fill_state( + struct qc_type_state *tstate, + struct xfs_mount *mp, + struct xfs_inode *ip, + xfs_ino_t ino) { - switch (type) { - case USRQUOTA: - return XFS_DQ_USER; - case GRPQUOTA: - return XFS_DQ_GROUP; - default: - return XFS_DQ_PROJ; + struct xfs_quotainfo *q = mp->m_quotainfo; + bool tempqip = false; + + tstate->ino = ino; + if (!ip && ino == NULLFSINO) + return; + if (!ip) { + if (xfs_iget(mp, NULL, ino, 0, 0, &ip)) + return; + tempqip = true; } + tstate->flags |= QCI_SYSFILE; + tstate->blocks = ip->i_d.di_nblocks; + tstate->nextents = ip->i_d.di_nextents; + tstate->spc_timelimit = q->qi_btimelimit; + tstate->ino_timelimit = q->qi_itimelimit; + tstate->rt_spc_timelimit = q->qi_rtbtimelimit; + tstate->spc_warnlimit = q->qi_bwarnlimit; + tstate->ino_warnlimit = q->qi_iwarnlimit; + tstate->rt_spc_warnlimit = q->qi_rtbwarnlimit; + if (tempqip) + IRELE(ip); } -STATIC int -xfs_fs_get_xstate( - struct super_block *sb, - struct fs_quota_stat *fqs) +/* + * Return quota status information, such as enforcements, quota file inode + * numbers etc. + */ +static int +xfs_fs_get_quota_state( + struct super_block *sb, + struct qc_state *state) { - struct xfs_mount *mp = XFS_M(sb); + struct xfs_mount *mp = XFS_M(sb); + struct xfs_quotainfo *q = mp->m_quotainfo; + memset(state, 0, sizeof(*state)); if (!XFS_IS_QUOTA_RUNNING(mp)) - return -ENOSYS; - return xfs_qm_scall_getqstat(mp, fqs); + return 0; + state->s_incoredqs = q->qi_dquots; + if (XFS_IS_UQUOTA_RUNNING(mp)) + state->s_state[USRQUOTA].flags |= QCI_ACCT_ENABLED; + if (XFS_IS_UQUOTA_ENFORCED(mp)) + state->s_state[USRQUOTA].flags |= QCI_LIMITS_ENFORCED; + if (XFS_IS_GQUOTA_RUNNING(mp)) + state->s_state[GRPQUOTA].flags |= QCI_ACCT_ENABLED; + if (XFS_IS_GQUOTA_ENFORCED(mp)) + state->s_state[GRPQUOTA].flags |= QCI_LIMITS_ENFORCED; + if (XFS_IS_PQUOTA_RUNNING(mp)) + state->s_state[PRJQUOTA].flags |= QCI_ACCT_ENABLED; + if (XFS_IS_PQUOTA_ENFORCED(mp)) + state->s_state[PRJQUOTA].flags |= QCI_LIMITS_ENFORCED; + + xfs_qm_fill_state(&state->s_state[USRQUOTA], mp, q->qi_uquotaip, + mp->m_sb.sb_uquotino); + xfs_qm_fill_state(&state->s_state[GRPQUOTA], mp, q->qi_gquotaip, + mp->m_sb.sb_gquotino); + xfs_qm_fill_state(&state->s_state[PRJQUOTA], mp, q->qi_pquotaip, + mp->m_sb.sb_pquotino); + return 0; } STATIC int -xfs_fs_get_xstatev( - struct super_block *sb, - struct fs_quota_statv *fqs) +xfs_quota_type(int type) { - struct xfs_mount *mp = XFS_M(sb); - - if (!XFS_IS_QUOTA_RUNNING(mp)) - return -ENOSYS; - return xfs_qm_scall_getqstatv(mp, fqs); + switch (type) { + case USRQUOTA: + return XFS_DQ_USER; + case GRPQUOTA: + return XFS_DQ_GROUP; + default: + return XFS_DQ_PROJ; + } } static unsigned int @@ -178,8 +225,7 @@ xfs_fs_set_dqblk( } const struct quotactl_ops xfs_quotactl_operations = { - .get_xstatev = xfs_fs_get_xstatev, - .get_xstate = xfs_fs_get_xstate, + .get_state = xfs_fs_get_quota_state, .quota_enable = xfs_quota_enable, .quota_disable = xfs_quota_disable, .rm_xquota = xfs_fs_rm_xquota, -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF5797F72 for ; Wed, 18 Feb 2015 07:48:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DB1DAC001 for ; Wed, 18 Feb 2015 05:48:24 -0800 (PST) X-ASG-Debug-ID: 1424267300-04cb6c6b094c6b10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0FZGeDmblbH681wJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:21 -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 58F8DABF6; Wed, 18 Feb 2015 13:48:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 73B5F82184; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 0/8 v5] quota: Unify VFS and XFS quota interfaces Date: Wed, 18 Feb 2015 14:47:46 +0100 X-ASG-Orig-Subj: [PATCH 0/8 v5] quota: Unify VFS and XFS quota interfaces Message-Id: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267301 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, these are outstanding patches in my series unifying VFS and XFS quota interfaces so that XFS quotactls work for filesystems with VFS quotas and vice versa. This is useful so that userspace doesn't have to care that much about which filesystem it is using at least when using basic quota functionality. In particular we should be able to reuse project quota tests in xfstests for ext4. The patches are based on top of Linus' tree from few days ago which already contains initial part of the original series. The patch series can also be pulled from 'quota_interface' branch of my tree [1]. I'm sending the series as there are two XFS and one GFS2 patches which still need review before I can add them to my tree for the next merge window. Honza [1] git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs.git From jack@suse.cz Wed Feb 18 07:48:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8988A7F6F for ; Wed, 18 Feb 2015 07:48:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A193304043 for ; Wed, 18 Feb 2015 05:48:25 -0800 (PST) X-ASG-Debug-ID: 1424267303-04cb6c6b0a4c6b20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id bXLrHxVAk9nf9nrR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:24 -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 69A76AC34; Wed, 18 Feb 2015 13:48:23 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 8CAB1829A5; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 7/8] xfs: Add support for Q_SETINFO Date: Wed, 18 Feb 2015 14:47:53 +0100 X-ASG-Orig-Subj: [PATCH 7/8] xfs: Add support for Q_SETINFO Message-Id: <1424267274-11836-8-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Add support to XFS so that time limits can be set through Q_SETINFO quotactl. Signed-off-by: Jan Kara --- fs/xfs/xfs_quotaops.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index df9835396c4f..bbe8ddf1f700 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -111,6 +111,42 @@ xfs_quota_type(int type) } } +#define XFS_QC_SETINFO_MASK (QC_TIMER_MASK | QC_WARNS_MASK) + +/* + * Adjust quota timers & warnings + */ +static int +xfs_fs_set_info( + struct super_block *sb, + int type, + struct qc_info *info) +{ + struct xfs_mount *mp = XFS_M(sb); + struct qc_dqblk newlim; + + if (sb->s_flags & MS_RDONLY) + return -EROFS; + if (!XFS_IS_QUOTA_RUNNING(mp)) + return -ENOSYS; + if (!XFS_IS_QUOTA_ON(mp)) + return -ESRCH; + if (info->i_fieldmask & ~XFS_QC_SETINFO_MASK) + return -EINVAL; + if ((info->i_fieldmask & XFS_QC_SETINFO_MASK) == 0) + return 0; + + newlim.d_fieldmask = info->i_fieldmask; + newlim.d_spc_timer = info->i_spc_timelimit; + newlim.d_ino_timer = info->i_ino_timelimit; + newlim.d_rt_spc_timer = info->i_rt_spc_timelimit; + newlim.d_ino_warns = info->i_ino_warnlimit; + newlim.d_spc_warns = info->i_spc_warnlimit; + newlim.d_rt_spc_warns = info->i_rt_spc_warnlimit; + + return xfs_qm_scall_setqlim(mp, 0, xfs_quota_type(type), &newlim); +} + static unsigned int xfs_quota_flags(unsigned int uflags) { @@ -226,6 +262,7 @@ xfs_fs_set_dqblk( const struct quotactl_ops xfs_quotactl_operations = { .get_state = xfs_fs_get_quota_state, + .set_info = xfs_fs_set_info, .quota_enable = xfs_quota_enable, .quota_disable = xfs_quota_disable, .rm_xquota = xfs_fs_rm_xquota, -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 59DE27F76 for ; Wed, 18 Feb 2015 07:48:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA3D8AC002 for ; Wed, 18 Feb 2015 05:48:25 -0800 (PST) X-ASG-Debug-ID: 1424267303-04cb6c6b094c6b20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 2GspBAvHylqzhtsv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:24 -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 7133CAC76; Wed, 18 Feb 2015 13:48:23 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 918C7829A6; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 8/8] quota: Hook up Q_XSETQLIM for id 0 to ->set_info Date: Wed, 18 Feb 2015 14:47:54 +0100 X-ASG-Orig-Subj: [PATCH 8/8] quota: Hook up Q_XSETQLIM for id 0 to ->set_info Message-Id: <1424267274-11836-9-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Setting timers or warning counts for id 0 via Q_XSETQLIM is used to actually set time limits and warning limits for all users. Hook up ->set_info to this so that VFS quota time limits get set the same way as XFS ones. When doing this Q_XSETQLIM for XFS is effectively split into two independent transactions - one for setting timers and warning limits and one for setting space and inode limits. Although this is inefficient, it is rare enough that it does not matter. Signed-off-by: Jan Kara --- fs/quota/quota.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 741d5a178268..86ded7375c21 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -517,6 +517,30 @@ static void copy_from_xfs_dqblk(struct qc_dqblk *dst, struct fs_disk_quota *src) dst->d_fieldmask |= QC_RT_SPACE; } +static void copy_qcinfo_from_xfs_dqblk(struct qc_info *dst, + struct fs_disk_quota *src) +{ + memset(dst, 0, sizeof(*dst)); + dst->i_spc_timelimit = src->d_btimer; + dst->i_ino_timelimit = src->d_itimer; + dst->i_rt_spc_timelimit = src->d_rtbtimer; + dst->i_ino_warnlimit = src->d_iwarns; + dst->i_spc_warnlimit = src->d_bwarns; + dst->i_rt_spc_warnlimit = src->d_rtbwarns; + if (src->d_fieldmask & FS_DQ_BWARNS) + dst->i_fieldmask |= QC_SPC_WARNS; + if (src->d_fieldmask & FS_DQ_IWARNS) + dst->i_fieldmask |= QC_INO_WARNS; + if (src->d_fieldmask & FS_DQ_RTBWARNS) + dst->i_fieldmask |= QC_RT_SPC_WARNS; + if (src->d_fieldmask & FS_DQ_BTIMER) + dst->i_fieldmask |= QC_SPC_TIMER; + if (src->d_fieldmask & FS_DQ_ITIMER) + dst->i_fieldmask |= QC_INO_TIMER; + if (src->d_fieldmask & FS_DQ_RTBTIMER) + dst->i_fieldmask |= QC_RT_SPC_TIMER; +} + static int quota_setxquota(struct super_block *sb, int type, qid_t id, void __user *addr) { @@ -531,6 +555,21 @@ static int quota_setxquota(struct super_block *sb, int type, qid_t id, qid = make_kqid(current_user_ns(), type, id); if (!qid_valid(qid)) return -EINVAL; + /* Are we actually setting timer / warning limits for all users? */ + if (from_kqid(&init_user_ns, qid) == 0 && + fdq.d_fieldmask & (FS_DQ_WARNS_MASK | FS_DQ_TIMER_MASK)) { + struct qc_info qinfo; + int ret; + + if (!sb->s_qcop->set_info) + return -EINVAL; + copy_qcinfo_from_xfs_dqblk(&qinfo, &fdq); + ret = sb->s_qcop->set_info(sb, type, &qinfo); + if (ret) + return ret; + /* These are already done */ + fdq.d_fieldmask &= ~(FS_DQ_WARNS_MASK | FS_DQ_TIMER_MASK); + } copy_from_xfs_dqblk(&qdq, &fdq); return sb->s_qcop->set_dqblk(sb, qid, &qdq); } -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 61BBA7F78 for ; Wed, 18 Feb 2015 07:48:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DB1BAC003 for ; Wed, 18 Feb 2015 05:48:25 -0800 (PST) X-ASG-Debug-ID: 1424267303-04bdf06a5a4b4f20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id xXxR00J4yqLRCy84 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:24 -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 7116EAC47; Wed, 18 Feb 2015 13:48:23 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 8867D829A3; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS Date: Wed, 18 Feb 2015 14:47:52 +0100 X-ASG-Orig-Subj: [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS Message-Id: <1424267274-11836-7-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Change ->set_info to take new qc_info structure which contains all the necessary information both for XFS and VFS. Convert Q_SETINFO handler to use this structure. Signed-off-by: Jan Kara --- fs/quota/dquot.c | 27 ++++++++++++++++----------- fs/quota/quota.c | 21 ++++++++++++++++++++- include/linux/quota.h | 21 +++++++++++++++++++-- include/linux/quotaops.h | 2 +- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index cf4edd87e854..f37b74eab807 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2649,33 +2649,38 @@ int dquot_get_state(struct super_block *sb, struct qc_state *state) EXPORT_SYMBOL(dquot_get_state); /* Generic routine for setting common part of quota file information */ -int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) +int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii) { struct mem_dqinfo *mi; int err = 0; + if ((ii->i_fieldmask & QC_WARNS_MASK) || + (ii->i_fieldmask & QC_RT_SPC_TIMER)) + return -EINVAL; mutex_lock(&sb_dqopt(sb)->dqonoff_mutex); if (!sb_has_quota_active(sb, type)) { err = -ESRCH; goto out; } mi = sb_dqopt(sb)->info + type; - if (ii->dqi_valid & IIF_FLAGS) { - if (ii->dqi_flags & ~DQF_SETINFO_MASK || - (ii->dqi_flags & DQF_ROOT_SQUASH && + if (ii->i_fieldmask & QC_FLAGS) { + if ((ii->i_flags & QCI_ROOT_SQUASH && mi->dqi_format->qf_fmt_id != QFMT_VFS_OLD)) { err = -EINVAL; goto out; } } spin_lock(&dq_data_lock); - if (ii->dqi_valid & IIF_BGRACE) - mi->dqi_bgrace = ii->dqi_bgrace; - if (ii->dqi_valid & IIF_IGRACE) - mi->dqi_igrace = ii->dqi_igrace; - if (ii->dqi_valid & IIF_FLAGS) - mi->dqi_flags = (mi->dqi_flags & ~DQF_SETINFO_MASK) | - (ii->dqi_flags & DQF_SETINFO_MASK); + if (ii->i_fieldmask & QC_SPC_TIMER) + mi->dqi_bgrace = ii->i_spc_timelimit; + if (ii->i_fieldmask & QC_INO_TIMER) + mi->dqi_igrace = ii->i_ino_timelimit; + if (ii->i_fieldmask & QC_FLAGS) { + if (ii->i_flags & QCI_ROOT_SQUASH) + mi->dqi_flags |= DQF_ROOT_SQUASH; + else + mi->dqi_flags &= ~DQF_ROOT_SQUASH; + } spin_unlock(&dq_data_lock); mark_info_dirty(sb, type); /* Force write to disk */ diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 20d11cd21247..741d5a178268 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -149,12 +149,31 @@ static int quota_getinfo(struct super_block *sb, int type, void __user *addr) static int quota_setinfo(struct super_block *sb, int type, void __user *addr) { struct if_dqinfo info; + struct qc_info qinfo; if (copy_from_user(&info, addr, sizeof(info))) return -EFAULT; if (!sb->s_qcop->set_info) return -ENOSYS; - return sb->s_qcop->set_info(sb, type, &info); + if (info.dqi_valid & ~(IIF_FLAGS | IIF_BGRACE | IIF_IGRACE)) + return -EINVAL; + memset(&qinfo, 0, sizeof(qinfo)); + if (info.dqi_valid & IIF_FLAGS) { + if (info.dqi_flags & ~DQF_SETINFO_MASK) + return -EINVAL; + if (info.dqi_flags & DQF_ROOT_SQUASH) + qinfo.i_flags |= QCI_ROOT_SQUASH; + qinfo.i_fieldmask |= QC_FLAGS; + } + if (info.dqi_valid & IIF_BGRACE) { + qinfo.i_spc_timelimit = info.dqi_bgrace; + qinfo.i_fieldmask |= QC_SPC_TIMER; + } + if (info.dqi_valid & IIF_IGRACE) { + qinfo.i_ino_timelimit = info.dqi_igrace; + qinfo.i_fieldmask |= QC_INO_TIMER; + } + return sb->s_qcop->set_info(sb, type, &qinfo); } static inline qsize_t qbtos(qsize_t blocks) diff --git a/include/linux/quota.h b/include/linux/quota.h index a07f2ed25284..3d521199a0bd 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -344,7 +344,10 @@ struct qc_dqblk { int d_rt_spc_warns; /* # warnings issued wrt RT space */ }; -/* Field specifiers for ->set_dqblk() in struct qc_dqblk */ +/* + * Field specifiers for ->set_dqblk() in struct qc_dqblk and also for + * ->set_info() in struct qc_info + */ #define QC_INO_SOFT (1<<0) #define QC_INO_HARD (1<<1) #define QC_SPC_SOFT (1<<2) @@ -365,6 +368,7 @@ struct qc_dqblk { #define QC_INO_COUNT (1<<13) #define QC_RT_SPACE (1<<14) #define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) +#define QC_FLAGS (1<<15) #define QCI_SYSFILE (1 << 0) /* Quota file is hidden from userspace */ #define QCI_ROOT_SQUASH (1 << 1) /* Root squash turned on */ @@ -397,6 +401,19 @@ struct qc_state { struct qc_type_state s_state[XQM_MAXQUOTAS]; }; +/* Structure for communicating via ->set_info */ +struct qc_info { + int i_fieldmask; /* mask of fields to change in ->set_info() */ + unsigned int i_flags; /* Flags QCI_* */ + unsigned int i_spc_timelimit; /* Time after which space softlimit is + * enforced */ + unsigned int i_ino_timelimit; /* Ditto for inode softlimit */ + unsigned int i_rt_spc_timelimit;/* Ditto for real-time space */ + unsigned int i_spc_warnlimit; /* Limit for number of space warnings */ + unsigned int i_ino_warnlimit; /* Limit for number of inode warnings */ + unsigned int i_rt_spc_warnlimit; /* Ditto for real-time space */ +}; + /* Operations handling requests from userspace */ struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, struct path *); @@ -404,7 +421,7 @@ struct quotactl_ops { int (*quota_enable)(struct super_block *, unsigned int); int (*quota_disable)(struct super_block *, unsigned int); int (*quota_sync)(struct super_block *, int); - int (*set_info)(struct super_block *, int, struct if_dqinfo *); + int (*set_info)(struct super_block *, int, struct qc_info *); int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*get_state)(struct super_block *, struct qc_state *); diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 6509a29523e2..9f4b07ba9e8c 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -96,7 +96,7 @@ int dquot_quota_off(struct super_block *sb, int type); int dquot_writeback_dquots(struct super_block *sb, int type); int dquot_quota_sync(struct super_block *sb, int type); int dquot_get_state(struct super_block *sb, struct qc_state *state); -int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); +int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii); int dquot_get_dqblk(struct super_block *sb, struct kqid id, struct qc_dqblk *di); int dquot_set_dqblk(struct super_block *sb, struct kqid id, -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2BC0A7F76 for ; Wed, 18 Feb 2015 07:48:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA49DAC001 for ; Wed, 18 Feb 2015 05:48:23 -0800 (PST) X-ASG-Debug-ID: 1424267300-04bdf06a5b4b4f20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0UeRQJlnH5KIuGDV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:21 -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 58CC0ABED; Wed, 18 Feb 2015 13:48:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 836BF82183; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 4/8] gfs2: Convert to using ->get_state callback Date: Wed, 18 Feb 2015 14:47:50 +0100 X-ASG-Orig-Subj: [PATCH 4/8] gfs2: Convert to using ->get_state callback Message-Id: <1424267274-11836-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267301 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Convert gfs2 to use ->get_state callback instead of ->get_xstate. Signed-off-by: Jan Kara --- fs/gfs2/quota.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 3e193cb36996..c76e031ccbb4 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1467,32 +1467,34 @@ int gfs2_quotad(void *data) return 0; } -static int gfs2_quota_get_xstate(struct super_block *sb, - struct fs_quota_stat *fqs) +static int gfs2_quota_get_state(struct super_block *sb, struct qc_state *state) { struct gfs2_sbd *sdp = sb->s_fs_info; - memset(fqs, 0, sizeof(struct fs_quota_stat)); - fqs->qs_version = FS_QSTAT_VERSION; + memset(state, 0, sizeof(*state)); switch (sdp->sd_args.ar_quota) { case GFS2_QUOTA_ON: - fqs->qs_flags |= (FS_QUOTA_UDQ_ENFD | FS_QUOTA_GDQ_ENFD); + state->s_state[USRQUOTA].flags |= QCI_LIMITS_ENFORCED; + state->s_state[GRPQUOTA].flags |= QCI_LIMITS_ENFORCED; /*FALLTHRU*/ case GFS2_QUOTA_ACCOUNT: - fqs->qs_flags |= (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT); + state->s_state[USRQUOTA].flags |= QCI_ACCT_ENABLED | + QCI_SYSFILE; + state->s_state[GRPQUOTA].flags |= QCI_ACCT_ENABLED | + QCI_SYSFILE; break; case GFS2_QUOTA_OFF: break; } - if (sdp->sd_quota_inode) { - fqs->qs_uquota.qfs_ino = GFS2_I(sdp->sd_quota_inode)->i_no_addr; - fqs->qs_uquota.qfs_nblks = sdp->sd_quota_inode->i_blocks; + state->s_state[USRQUOTA].ino = + GFS2_I(sdp->sd_quota_inode)->i_no_addr; + state->s_state[USRQUOTA].blocks = sdp->sd_quota_inode->i_blocks; } - fqs->qs_uquota.qfs_nextents = 1; /* unsupported */ - fqs->qs_gquota = fqs->qs_uquota; /* its the same inode in both cases */ - fqs->qs_incoredqs = list_lru_count(&gfs2_qd_lru); + state->s_state[USRQUOTA].nextents = 1; /* unsupported */ + state->s_state[GRPQUOTA] = state->s_state[USRQUOTA]; + state->s_incoredqs = list_lru_count(&gfs2_qd_lru); return 0; } @@ -1637,7 +1639,7 @@ out_put: const struct quotactl_ops gfs2_quotactl_ops = { .quota_sync = gfs2_quota_sync, - .get_xstate = gfs2_quota_get_xstate, + .get_state = gfs2_quota_get_state, .get_dqblk = gfs2_get_dqblk, .set_dqblk = gfs2_set_dqblk, }; -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2CA3E7F78 for ; Wed, 18 Feb 2015 07:48:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BBC05AC002 for ; Wed, 18 Feb 2015 05:48:23 -0800 (PST) X-ASG-Debug-ID: 1424267300-04bdf06a594b4f10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id f3CYHePgA5qbVqqw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:21 -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 58C3BABBD; Wed, 18 Feb 2015 13:48:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 801B28256D; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 2/8] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state Date: Wed, 18 Feb 2015 14:47:48 +0100 X-ASG-Orig-Subj: [PATCH 2/8] quota: Wire up Q_GETXSTATE and Q_GETXSTATV calls to work with ->get_state Message-Id: <1424267274-11836-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267301 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Add appropriate conversion functions so that filesystems supporting ->get_state() method can be queried using Q_GETXSTATE and Q_GETXSTATV calls. Reviewed-by: Christoph Hellwig Signed-off-by: Jan Kara --- fs/quota/quota.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 134 insertions(+), 4 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 00d50fca1005..83939ff4c444 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -269,25 +269,152 @@ static int quota_disable(struct super_block *sb, void __user *addr) return sb->s_qcop->quota_disable(sb, flags); } +static int quota_state_to_flags(struct qc_state *state) +{ + int flags = 0; + + if (state->s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) + flags |= FS_QUOTA_UDQ_ACCT; + if (state->s_state[USRQUOTA].flags & QCI_LIMITS_ENFORCED) + flags |= FS_QUOTA_UDQ_ENFD; + if (state->s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) + flags |= FS_QUOTA_GDQ_ACCT; + if (state->s_state[GRPQUOTA].flags & QCI_LIMITS_ENFORCED) + flags |= FS_QUOTA_GDQ_ENFD; + if (state->s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) + flags |= FS_QUOTA_PDQ_ACCT; + if (state->s_state[PRJQUOTA].flags & QCI_LIMITS_ENFORCED) + flags |= FS_QUOTA_PDQ_ENFD; + return flags; +} + +static int quota_getstate(struct super_block *sb, struct fs_quota_stat *fqs) +{ + int type; + struct qc_state state; + int ret; + + ret = sb->s_qcop->get_state(sb, &state); + if (ret < 0) + return ret; + + memset(fqs, 0, sizeof(*fqs)); + fqs->qs_version = FS_QSTAT_VERSION; + fqs->qs_flags = quota_state_to_flags(&state); + /* No quota enabled? */ + if (!fqs->qs_flags) + return -ENOSYS; + fqs->qs_incoredqs = state.s_incoredqs; + /* + * GETXSTATE quotactl has space for just one set of time limits so + * report them for the first enabled quota type + */ + for (type = 0; type < XQM_MAXQUOTAS; type++) + if (state.s_state[type].flags & QCI_ACCT_ENABLED) + break; + BUG_ON(type == XQM_MAXQUOTAS); + fqs->qs_btimelimit = state.s_state[type].spc_timelimit; + fqs->qs_itimelimit = state.s_state[type].ino_timelimit; + fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit; + fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit; + fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit; + if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) { + fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino; + fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks; + fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents; + } + if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) { + fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino; + fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks; + fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents; + } + if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) { + /* + * Q_XGETQSTAT doesn't have room for both group and project + * quotas. So, allow the project quota values to be copied out + * only if there is no group quota information available. + */ + if (!(state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED)) { + fqs->qs_gquota.qfs_ino = state.s_state[PRJQUOTA].ino; + fqs->qs_gquota.qfs_nblks = + state.s_state[PRJQUOTA].blocks; + fqs->qs_gquota.qfs_nextents = + state.s_state[PRJQUOTA].nextents; + } + } + return 0; +} + static int quota_getxstate(struct super_block *sb, void __user *addr) { struct fs_quota_stat fqs; int ret; - if (!sb->s_qcop->get_xstate) + if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state) return -ENOSYS; - ret = sb->s_qcop->get_xstate(sb, &fqs); + if (sb->s_qcop->get_state) + ret = quota_getstate(sb, &fqs); + else + ret = sb->s_qcop->get_xstate(sb, &fqs); if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) return -EFAULT; return ret; } +static int quota_getstatev(struct super_block *sb, struct fs_quota_statv *fqs) +{ + int type; + struct qc_state state; + int ret; + + ret = sb->s_qcop->get_state(sb, &state); + if (ret < 0) + return ret; + + memset(fqs, 0, sizeof(*fqs)); + fqs->qs_version = FS_QSTAT_VERSION; + fqs->qs_flags = quota_state_to_flags(&state); + /* No quota enabled? */ + if (!fqs->qs_flags) + return -ENOSYS; + fqs->qs_incoredqs = state.s_incoredqs; + /* + * GETXSTATV quotactl has space for just one set of time limits so + * report them for the first enabled quota type + */ + for (type = 0; type < XQM_MAXQUOTAS; type++) + if (state.s_state[type].flags & QCI_ACCT_ENABLED) + break; + BUG_ON(type == XQM_MAXQUOTAS); + fqs->qs_btimelimit = state.s_state[type].spc_timelimit; + fqs->qs_itimelimit = state.s_state[type].ino_timelimit; + fqs->qs_rtbtimelimit = state.s_state[type].rt_spc_timelimit; + fqs->qs_bwarnlimit = state.s_state[type].spc_warnlimit; + fqs->qs_iwarnlimit = state.s_state[type].ino_warnlimit; + if (state.s_state[USRQUOTA].flags & QCI_ACCT_ENABLED) { + fqs->qs_uquota.qfs_ino = state.s_state[USRQUOTA].ino; + fqs->qs_uquota.qfs_nblks = state.s_state[USRQUOTA].blocks; + fqs->qs_uquota.qfs_nextents = state.s_state[USRQUOTA].nextents; + } + if (state.s_state[GRPQUOTA].flags & QCI_ACCT_ENABLED) { + fqs->qs_gquota.qfs_ino = state.s_state[GRPQUOTA].ino; + fqs->qs_gquota.qfs_nblks = state.s_state[GRPQUOTA].blocks; + fqs->qs_gquota.qfs_nextents = state.s_state[GRPQUOTA].nextents; + } + if (state.s_state[PRJQUOTA].flags & QCI_ACCT_ENABLED) { + fqs->qs_pquota.qfs_ino = state.s_state[PRJQUOTA].ino; + fqs->qs_pquota.qfs_nblks = state.s_state[PRJQUOTA].blocks; + fqs->qs_pquota.qfs_nextents = state.s_state[PRJQUOTA].nextents; + } + return 0; +} + static int quota_getxstatev(struct super_block *sb, void __user *addr) { struct fs_quota_statv fqs; int ret; - if (!sb->s_qcop->get_xstatev) + if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state) return -ENOSYS; memset(&fqs, 0, sizeof(fqs)); @@ -301,7 +428,10 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) default: return -EINVAL; } - ret = sb->s_qcop->get_xstatev(sb, &fqs); + if (sb->s_qcop->get_state) + ret = quota_getstatev(sb, &fqs); + else + ret = sb->s_qcop->get_xstatev(sb, &fqs); if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) return -EFAULT; return ret; -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 62BD67F86 for ; Wed, 18 Feb 2015 07:48:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2DCCAC003 for ; Wed, 18 Feb 2015 05:48:23 -0800 (PST) X-ASG-Debug-ID: 1424267300-04bdf06a5c4b4f20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id LsllZulHlRUsMRwe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:21 -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 5A18EAC16; Wed, 18 Feb 2015 13:48:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 7A66D81C79; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 1/8] quota: Make VFS quotas use new interface for getting quota info Date: Wed, 18 Feb 2015 14:47:47 +0100 X-ASG-Orig-Subj: [PATCH 1/8] quota: Make VFS quotas use new interface for getting quota info Message-Id: <1424267274-11836-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267301 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Create new internal interface for getting information about quota which contains everything needed for both VFS quotas and XFS quotas. Make VFS use this and hook it up to Q_GETINFO. Reviewed-by: Christoph Hellwig Signed-off-by: Jan Kara --- fs/ext3/super.c | 2 +- fs/ext4/super.c | 2 +- fs/quota/dquot.c | 41 +++++++++++++++++++++++++++-------------- fs/quota/quota.c | 25 +++++++++++++++++++++---- fs/reiserfs/super.c | 2 +- include/linux/quota.h | 33 ++++++++++++++++++++++++++++++++- include/linux/quotaops.h | 2 +- 7 files changed, 84 insertions(+), 23 deletions(-) diff --git a/fs/ext3/super.c b/fs/ext3/super.c index d4dbf3c259b3..f037b4b27300 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -789,7 +789,7 @@ static const struct quotactl_ops ext3_qctl_operations = { .quota_on = ext3_quota_on, .quota_off = dquot_quota_off, .quota_sync = dquot_quota_sync, - .get_info = dquot_get_dqinfo, + .get_state = dquot_get_state, .set_info = dquot_set_dqinfo, .get_dqblk = dquot_get_dqblk, .set_dqblk = dquot_set_dqblk diff --git a/fs/ext4/super.c b/fs/ext4/super.c index ac64edbe501d..c6e70831e135 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1076,7 +1076,7 @@ static const struct quotactl_ops ext4_qctl_operations = { .quota_on = ext4_quota_on, .quota_off = ext4_quota_off, .quota_sync = dquot_quota_sync, - .get_info = dquot_get_dqinfo, + .get_state = dquot_get_state, .set_info = dquot_set_dqinfo, .get_dqblk = dquot_get_dqblk, .set_dqblk = dquot_set_dqblk diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 0ccd4ba3a246..cf4edd87e854 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2614,26 +2614,39 @@ out: EXPORT_SYMBOL(dquot_set_dqblk); /* Generic routine for getting common part of quota file information */ -int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) +int dquot_get_state(struct super_block *sb, struct qc_state *state) { struct mem_dqinfo *mi; + struct qc_type_state *tstate; + struct quota_info *dqopt = sb_dqopt(sb); + int type; mutex_lock(&sb_dqopt(sb)->dqonoff_mutex); - if (!sb_has_quota_active(sb, type)) { - mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); - return -ESRCH; + memset(state, 0, sizeof(*state)); + for (type = 0; type < MAXQUOTAS; type++) { + if (!sb_has_quota_active(sb, type)) + continue; + tstate = state->s_state + type; + mi = sb_dqopt(sb)->info + type; + tstate->flags = QCI_ACCT_ENABLED; + spin_lock(&dq_data_lock); + if (mi->dqi_flags & DQF_SYS_FILE) + tstate->flags |= QCI_SYSFILE; + if (mi->dqi_flags & DQF_ROOT_SQUASH) + tstate->flags |= QCI_ROOT_SQUASH; + if (sb_has_quota_limits_enabled(sb, type)) + tstate->flags |= QCI_LIMITS_ENFORCED; + tstate->spc_timelimit = mi->dqi_bgrace; + tstate->ino_timelimit = mi->dqi_igrace; + tstate->ino = dqopt->files[type]->i_ino; + tstate->blocks = dqopt->files[type]->i_blocks; + tstate->nextents = 1; /* We don't know... */ + spin_unlock(&dq_data_lock); } - mi = sb_dqopt(sb)->info + type; - spin_lock(&dq_data_lock); - ii->dqi_bgrace = mi->dqi_bgrace; - ii->dqi_igrace = mi->dqi_igrace; - ii->dqi_flags = mi->dqi_flags & DQF_GETINFO_MASK; - ii->dqi_valid = IIF_ALL; - spin_unlock(&dq_data_lock); mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex); return 0; } -EXPORT_SYMBOL(dquot_get_dqinfo); +EXPORT_SYMBOL(dquot_get_state); /* Generic routine for setting common part of quota file information */ int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) @@ -2677,7 +2690,7 @@ const struct quotactl_ops dquot_quotactl_ops = { .quota_on = dquot_quota_on, .quota_off = dquot_quota_off, .quota_sync = dquot_quota_sync, - .get_info = dquot_get_dqinfo, + .get_state = dquot_get_state, .set_info = dquot_set_dqinfo, .get_dqblk = dquot_get_dqblk, .set_dqblk = dquot_set_dqblk @@ -2688,7 +2701,7 @@ const struct quotactl_ops dquot_quotactl_sysfile_ops = { .quota_enable = dquot_quota_enable, .quota_disable = dquot_quota_disable, .quota_sync = dquot_quota_sync, - .get_info = dquot_get_dqinfo, + .get_state = dquot_get_state, .set_info = dquot_set_dqinfo, .get_dqblk = dquot_get_dqblk, .set_dqblk = dquot_set_dqblk diff --git a/fs/quota/quota.c b/fs/quota/quota.c index d14a799c7785..00d50fca1005 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -118,13 +118,30 @@ static int quota_getfmt(struct super_block *sb, int type, void __user *addr) static int quota_getinfo(struct super_block *sb, int type, void __user *addr) { - struct if_dqinfo info; + struct qc_state state; + struct qc_type_state *tstate; + struct if_dqinfo uinfo; int ret; - if (!sb->s_qcop->get_info) + /* This checks whether qc_state has enough entries... */ + BUILD_BUG_ON(MAXQUOTAS > XQM_MAXQUOTAS); + if (!sb->s_qcop->get_state) return -ENOSYS; - ret = sb->s_qcop->get_info(sb, type, &info); - if (!ret && copy_to_user(addr, &info, sizeof(info))) + ret = sb->s_qcop->get_state(sb, &state); + if (ret) + return ret; + tstate = state.s_state + type; + if (!(tstate->flags & QCI_ACCT_ENABLED)) + return -ESRCH; + memset(&uinfo, 0, sizeof(uinfo)); + uinfo.dqi_bgrace = tstate->spc_timelimit; + uinfo.dqi_igrace = tstate->ino_timelimit; + if (tstate->flags & QCI_SYSFILE) + uinfo.dqi_flags |= DQF_SYS_FILE; + if (tstate->flags & QCI_ROOT_SQUASH) + uinfo.dqi_flags |= DQF_ROOT_SQUASH; + uinfo.dqi_valid = IIF_ALL; + if (!ret && copy_to_user(addr, &uinfo, sizeof(uinfo))) return -EFAULT; return ret; } diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 71fbbe3e2dab..68b5f182984e 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -805,7 +805,7 @@ static const struct quotactl_ops reiserfs_qctl_operations = { .quota_on = reiserfs_quota_on, .quota_off = dquot_quota_off, .quota_sync = dquot_quota_sync, - .get_info = dquot_get_dqinfo, + .get_state = dquot_get_state, .set_info = dquot_set_dqinfo, .get_dqblk = dquot_get_dqblk, .set_dqblk = dquot_set_dqblk, diff --git a/include/linux/quota.h b/include/linux/quota.h index d534e8ed308a..6ecac0f3b2ca 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -366,6 +366,37 @@ struct qc_dqblk { #define QC_RT_SPACE (1<<14) #define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) +#define QCI_SYSFILE (1 << 0) /* Quota file is hidden from userspace */ +#define QCI_ROOT_SQUASH (1 << 1) /* Root squash turned on */ +#define QCI_ACCT_ENABLED (1 << 2) /* Quota accounting enabled */ +#define QCI_LIMITS_ENFORCED (1 << 3) /* Quota limits enforced */ + +/* Structures for communicating via ->get_state */ +struct qc_type_state { + unsigned int flags; /* Flags QCI_* */ + unsigned int spc_timelimit; /* Time after which space softlimit is + * enforced */ + unsigned int ino_timelimit; /* Ditto for inode softlimit */ + unsigned int rt_spc_timelimit; /* Ditto for real-time space */ + unsigned int spc_warnlimit; /* Limit for number of space warnings */ + unsigned int ino_warnlimit; /* Ditto for inodes */ + unsigned int rt_spc_warnlimit; /* Ditto for real-time space */ + unsigned long long ino; /* Inode number of quota file */ + blkcnt_t blocks; /* Number of 512-byte blocks in the file */ + blkcnt_t nextents; /* Number of extents in the file */ +}; + +struct qc_state { + unsigned int s_incoredqs; /* Number of dquots in core */ + /* + * Per quota type information. The array should really have + * max(MAXQUOTAS, XQM_MAXQUOTAS) entries. BUILD_BUG_ON in + * quota_getinfo() makes sure XQM_MAXQUOTAS is large enough. Once VFS + * supports project quotas, this can be changed to MAXQUOTAS + */ + struct qc_type_state s_state[XQM_MAXQUOTAS]; +}; + /* Operations handling requests from userspace */ struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, struct path *); @@ -373,10 +404,10 @@ struct quotactl_ops { int (*quota_enable)(struct super_block *, unsigned int); int (*quota_disable)(struct super_block *, unsigned int); int (*quota_sync)(struct super_block *, int); - int (*get_info)(struct super_block *, int, struct if_dqinfo *); int (*set_info)(struct super_block *, int, struct if_dqinfo *); int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*get_state)(struct super_block *, struct qc_state *); int (*get_xstate)(struct super_block *, struct fs_quota_stat *); int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); int (*rm_xquota)(struct super_block *, unsigned int); diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index df73258cca47..6509a29523e2 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -95,7 +95,7 @@ int dquot_quota_on_mount(struct super_block *sb, char *qf_name, int dquot_quota_off(struct super_block *sb, int type); int dquot_writeback_dquots(struct super_block *sb, int type); int dquot_quota_sync(struct super_block *sb, int type); -int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); +int dquot_get_state(struct super_block *sb, struct qc_state *state); int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int dquot_get_dqblk(struct super_block *sb, struct kqid id, struct qc_dqblk *di); -- 2.1.4 From jack@suse.cz Wed Feb 18 07:48:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 766C57FA3 for ; Wed, 18 Feb 2015 07:48:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04CA0AC002 for ; Wed, 18 Feb 2015 05:48:30 -0800 (PST) X-ASG-Debug-ID: 1424267303-04cbb011654707d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id JcrjQaG091vfUKvJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:48:24 -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 67EA2ABF6; Wed, 18 Feb 2015 13:48:23 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 8633981FC3; Wed, 18 Feb 2015 14:48:16 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Jan Kara Subject: [PATCH 5/8] quota: Remove ->get_xstate and ->get_xstatev callbacks Date: Wed, 18 Feb 2015 14:47:51 +0100 X-ASG-Orig-Subj: [PATCH 5/8] quota: Remove ->get_xstate and ->get_xstatev callbacks Message-Id: <1424267274-11836-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1424267274-11836-1-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424267304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header These callbacks are now unused. Remove them. Reviewed-by: Christoph Hellwig Signed-off-by: Jan Kara --- fs/quota/quota.c | 14 ++++---------- include/linux/quota.h | 2 -- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 83939ff4c444..20d11cd21247 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -350,12 +350,9 @@ static int quota_getxstate(struct super_block *sb, void __user *addr) struct fs_quota_stat fqs; int ret; - if (!sb->s_qcop->get_xstate && !sb->s_qcop->get_state) + if (!sb->s_qcop->get_state) return -ENOSYS; - if (sb->s_qcop->get_state) - ret = quota_getstate(sb, &fqs); - else - ret = sb->s_qcop->get_xstate(sb, &fqs); + ret = quota_getstate(sb, &fqs); if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) return -EFAULT; return ret; @@ -414,7 +411,7 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) struct fs_quota_statv fqs; int ret; - if (!sb->s_qcop->get_xstatev && !sb->s_qcop->get_state) + if (!sb->s_qcop->get_state) return -ENOSYS; memset(&fqs, 0, sizeof(fqs)); @@ -428,10 +425,7 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) default: return -EINVAL; } - if (sb->s_qcop->get_state) - ret = quota_getstatev(sb, &fqs); - else - ret = sb->s_qcop->get_xstatev(sb, &fqs); + ret = quota_getstatev(sb, &fqs); if (!ret && copy_to_user(addr, &fqs, sizeof(fqs))) return -EFAULT; return ret; diff --git a/include/linux/quota.h b/include/linux/quota.h index 6ecac0f3b2ca..a07f2ed25284 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -408,8 +408,6 @@ struct quotactl_ops { int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*get_state)(struct super_block *, struct qc_state *); - int (*get_xstate)(struct super_block *, struct fs_quota_stat *); - int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); int (*rm_xquota)(struct super_block *, unsigned int); }; -- 2.1.4 From rpeterso@redhat.com Wed Feb 18 07:55:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 20E6529DF7 for ; Wed, 18 Feb 2015 07:55:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E6A318F8035 for ; Wed, 18 Feb 2015 05:55:54 -0800 (PST) X-ASG-Debug-ID: 1424267752-04bdf06a5a4b5260001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id 0Gn9I3uokfowJhnM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 05:55:52 -0800 (PST) X-Barracuda-Envelope-From: rpeterso@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail12.collab.prod.int.phx2.redhat.com (zmail12.collab.prod.int.phx2.redhat.com [10.5.83.14]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1IDtqMd001945; Wed, 18 Feb 2015 08:55:52 -0500 Date: Wed, 18 Feb 2015 08:55:51 -0500 (EST) From: Bob Peterson To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Message-ID: <1764373464.15185536.1424267751253.JavaMail.zimbra@redhat.com> In-Reply-To: <1424267274-11836-5-git-send-email-jack@suse.cz> References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-5-git-send-email-jack@suse.cz> Subject: Re: [Cluster-devel] [PATCH 4/8] gfs2: Convert to using ->get_state callback MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 4/8] gfs2: Convert to using ->get_state callback Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.82.6] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF35 (Linux)/8.0.6_GA_5922) Thread-Topic: gfs2: Convert to using ->get_state callback Thread-Index: jc9kqRMBNzICAgAkBgVghsq5bPDEpA== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1424267752 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... ----- Original Message ----- > Convert gfs2 to use ->get_state callback instead of ->get_xstate. > > Signed-off-by: Jan Kara > --- > fs/gfs2/quota.c | 28 +++++++++++++++------------- > 1 file changed, 15 insertions(+), 13 deletions(-) > > diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c > index 3e193cb36996..c76e031ccbb4 100644 > --- a/fs/gfs2/quota.c > +++ b/fs/gfs2/quota.c > @@ -1467,32 +1467,34 @@ int gfs2_quotad(void *data) > return 0; > } > > -static int gfs2_quota_get_xstate(struct super_block *sb, > - struct fs_quota_stat *fqs) > +static int gfs2_quota_get_state(struct super_block *sb, struct qc_state > *state) > { > struct gfs2_sbd *sdp = sb->s_fs_info; > > - memset(fqs, 0, sizeof(struct fs_quota_stat)); > - fqs->qs_version = FS_QSTAT_VERSION; > + memset(state, 0, sizeof(*state)); > > switch (sdp->sd_args.ar_quota) { > case GFS2_QUOTA_ON: > - fqs->qs_flags |= (FS_QUOTA_UDQ_ENFD | FS_QUOTA_GDQ_ENFD); > + state->s_state[USRQUOTA].flags |= QCI_LIMITS_ENFORCED; > + state->s_state[GRPQUOTA].flags |= QCI_LIMITS_ENFORCED; > /*FALLTHRU*/ > case GFS2_QUOTA_ACCOUNT: > - fqs->qs_flags |= (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT); > + state->s_state[USRQUOTA].flags |= QCI_ACCT_ENABLED | > + QCI_SYSFILE; > + state->s_state[GRPQUOTA].flags |= QCI_ACCT_ENABLED | > + QCI_SYSFILE; > break; > case GFS2_QUOTA_OFF: > break; > } > - > if (sdp->sd_quota_inode) { > - fqs->qs_uquota.qfs_ino = GFS2_I(sdp->sd_quota_inode)->i_no_addr; > - fqs->qs_uquota.qfs_nblks = sdp->sd_quota_inode->i_blocks; > + state->s_state[USRQUOTA].ino = > + GFS2_I(sdp->sd_quota_inode)->i_no_addr; > + state->s_state[USRQUOTA].blocks = sdp->sd_quota_inode->i_blocks; > } > - fqs->qs_uquota.qfs_nextents = 1; /* unsupported */ > - fqs->qs_gquota = fqs->qs_uquota; /* its the same inode in both cases */ > - fqs->qs_incoredqs = list_lru_count(&gfs2_qd_lru); > + state->s_state[USRQUOTA].nextents = 1; /* unsupported */ > + state->s_state[GRPQUOTA] = state->s_state[USRQUOTA]; > + state->s_incoredqs = list_lru_count(&gfs2_qd_lru); > return 0; > } > > @@ -1637,7 +1639,7 @@ out_put: > > const struct quotactl_ops gfs2_quotactl_ops = { > .quota_sync = gfs2_quota_sync, > - .get_xstate = gfs2_quota_get_xstate, > + .get_state = gfs2_quota_get_state, > .get_dqblk = gfs2_get_dqblk, > .set_dqblk = gfs2_set_dqblk, > }; > -- > 2.1.4 > > ACK Looks right. Bob Peterson Red Hat File Systems From psilvao@gmail.com Wed Feb 18 08:13:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, 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 0A0C47F7E for ; Wed, 18 Feb 2015 08:13:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0D9C304053 for ; Wed, 18 Feb 2015 06:13:27 -0800 (PST) X-ASG-Debug-ID: 1424268804-04bdf06a5c4b5a50001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id ReFthUegiwHeCJK9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 18 Feb 2015 06:13:25 -0800 (PST) X-Barracuda-Envelope-From: psilvao@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] Received: by mail-wi0-f181.google.com with SMTP id r20so2464031wiv.2 for ; Wed, 18 Feb 2015 06:13:24 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=Mainzt3PCFi1vu99yxJVZrS0PS2b+aIoSJ+alNfRM8w=; b=o41ptt6r9U142c02pAeNWogBmvYjTvJpV6ySIFMiw1ID26erSuXc8Qn63oMhTeiX1R yPUv9dQWh+WlItj2Ys1lnnYKZ8GKKtkKGlagVj9zIVLurFpkp+4pfB9QX/Ab+CbXXxYs pif6CN44FbRlLxz8mMDGHeQTxJlQG3nd2S0lgG/e8B004ck1Xrwi0wJjgJ7me1bte0aL LBSABVSf1hyOBDdGa3bIObVM7UQIRc3a3Osw3/rMqrwgBx4O3yVorjcv3GRbq2T/s9/H IEbDpoRA915ufHL6j9ruNenvHu6+J+vPrrvuk6MLrLQuNVapZrF3nQWTzQtGZIGof7+Z Omjg== MIME-Version: 1.0 X-Received: by 10.194.192.167 with SMTP id hh7mr9566707wjc.151.1424268804072; Wed, 18 Feb 2015 06:13:24 -0800 (PST) Received: by 10.194.234.10 with HTTP; Wed, 18 Feb 2015 06:13:23 -0800 (PST) In-Reply-To: <20150216141039.GA48651@bfoster.bfoster> References: <20150216141039.GA48651@bfoster.bfoster> Date: Wed, 18 Feb 2015 11:13:23 -0300 Message-ID: Subject: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c From: Pablo Silva X-ASG-Orig-Subj: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b8743f821ad02050f5d6c9a X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1424268805 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15483 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 --047d7b8743f821ad02050f5d6c9a Content-Type: text/plain; charset=UTF-8 Hi Brian! Thanks for your time!, i've just to run xfs_repair -n the result you can see --> http://pastebin.centos.org/16106/ and as you can see there was problems, but why this problems occurs?, we have xfs partition used for one KVM where running Amanda with Centos 7, perhaps it was a bad configuration inside KVM or perhaps a bug?, the host server is running centos 6 [root@vtl ~]# uname -a Linux vtl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux But the KVM running centos 7 Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux The KVM config is this --> http://pastebin.centos.org/16111/ And /etc/fstab is this---> http://pastebin.centos.org/16116/ Thanks in advance, for any hint. -Pablo On Mon, Feb 16, 2015 at 11:10 AM, Brian Foster wrote: > On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote: > > Hi ! > > > > We have a server with centos 6.6, kernel version: > > 2.6.32-431.17.1.el6.x86_64, where we got the following message: > > > > Feb 12 19:22:15 vtl kernel: > > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted > > 2.6.32-431.17.1.el6.x86_64 #1 > > Feb 12 19:22:15 vtl kernel: Call Trace: > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_error_report+0x3f/0x50 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 > [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_dialloc+0x43e/0x850 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 > [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > > kmem_zone_zalloc+0x3a/0x50 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_dir_ialloc+0x74/0x2b0 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_create+0x440/0x640 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_vn_mknod+0xad/0x1c0 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_vn_create+0x10/0x20 [xfs] > > Feb 12 19:22:15 vtl kernel: [] ? vfs_create+0xe6/0x110 > > Feb 12 19:22:15 vtl kernel: [] ? > do_filp_open+0xa8e/0xd20 > > Feb 12 19:22:15 vtl kernel: [] ? alloc_fd+0x92/0x160 > > Feb 12 19:22:15 vtl kernel: XFS: Internal error > > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. > > Caller 0xffffffffa0422980 > > > > /* > * None left in the last group, search the whole AG > */ > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); > if (error) > goto error0; > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > for (;;) { > error = xfs_inobt_get_rec(cur, &rec, &i); > if (error) > goto error0; > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > if (rec.ir_freecount > 0) > break; > error = xfs_btree_increment(cur, 0, &i); > if (error) > goto error0; > ---> XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > } > > That corresponds to the check above. This code is part of the inode > allocator where we expect an AG to have free inodes and we're doing a > brute force search for a record. Apparently we go off the AG or some > other problem occurs before we find a free inode record. > > Does 'xfs_repair -n' report any problems with this fs? Have there been > any other storage errors reported in the logs? Is the problem > reproducible or was it a one off occurrence? > > Brian > > > I can't find more information for this..., perhaps a bug or other > > thing ..., welcome any hint for to research.. > > > > Thanks in advance! > > > > -Pablo > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > --047d7b8743f821ad02050f5d6c9a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi Brian!

=C2=A0Thanks fo= r your time!, i've just to run xfs_repair -n the result you can see --&= gt; http://pastebin.centos.or= g/16106/ and as you can see there was problems, but why this problems o= ccurs?, we have xfs partition used for one KVM where running Amanda with Ce= ntos 7, perhaps it was a bad configuration inside KVM or perhaps a bug?, th= e host server is running centos 6

[root@vtl ~]# uname -a
Linux v= tl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 UTC 20= 15 x86_64 x86_64 x86_64 GNU/Linux


But the KVM running cent= os 7

Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:= 58 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

The KVM config= is this --> http://pasteb= in.centos.org/16111/

And /etc/fstab is this---> http://pastebin.centos.org/1611= 6/


Thanks in advance, for any hint.

=
-Pablo

=
On Mon, Feb 16, 2015 at 11:10 AM, Brian Fost= er <bfoster@redhat.com> wrote:
On Fri, Feb 13, 2015 at 03:44= :57PM -0300, Pablo Silva wrote:
> Hi !
>
>=C2=A0 =C2=A0 =C2=A0We have a server with centos 6.6, kernel version: > 2.6.32-431.17.1.el6.x86_64, where we got the following message:
>
> Feb 12 19:22:15 vtl kernel:
> Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted
> 2.6.32-431.17.1.el6.x86_64 #1
> Feb 12 19:22:15 vtl kernel: Call Trace:
> Feb 12 19:22:15 vtl kernel: [<ffffffffa041ae5f>] ?
> xfs_error_report+0x3f/0x50 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs_ialloc+0x= 60/0x6e0 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa041ec2e>] ? xfs_dialloc+0= x43e/0x850 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs_ialloc+0x= 60/0x6e0 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa044007a>] ?
> kmem_zone_zalloc+0x3a/0x50 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa043b814>] ?
> xfs_dir_ialloc+0x74/0x2b0 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa043d900>] ? xfs_create+0x= 440/0x640 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa044aa5d>] ? xfs_vn_mknod+= 0xad/0x1c0 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffffa044aba0>] ? xfs_vn_create= +0x10/0x20 [xfs]
> Feb 12 19:22:15 vtl kernel: [<ffffffff81198086>] ? vfs_create+0x= e6/0x110
> Feb 12 19:22:15 vtl kernel: [<ffffffff8119bb9e>] ? do_filp_open+= 0xa8e/0xd20
> Feb 12 19:22:15 vtl kernel: [<ffffffff811a7ea2>] ? alloc_fd+0x92= /0x160
> Feb 12 19:22:15 vtl kernel: XFS: Internal error
> XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c.
> Caller 0xffffffffa0422980
>

=C2=A0 =C2=A0 =C2=A0 =C2=A0 /*
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* None left in the last group, search the= whole AG
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/
=C2=A0 =C2=A0 =C2=A0 =C2=A0 error =3D xfs_inobt_lookup(cur, 0, XFS_LOOKUP_G= E, &i);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (error)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto error0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 XFS_WANT_CORRUPTED_GOTO(i =3D=3D 1, error0);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (;;) {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 error =3D xfs_inobt= _get_rec(cur, &rec, &i);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (error)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 goto error0;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 XFS_WANT_CORRUPTED_= GOTO(i =3D=3D 1, error0);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (rec.ir_freecoun= t > 0)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 break;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 error =3D xfs_btree= _increment(cur, 0, &i);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (error)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 goto error0;
--->=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 XFS_WANT_CORRUPTED_GOTO(i = =3D=3D 1, error0);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }

That corresponds to the check above. This code is part of the inode
allocator where we expect an AG to have free inodes and we're doing a brute force search for a record. Apparently we go off the AG or some
other problem occurs before we find a free inode record.

Does 'xfs_repair -n' report any problems with this fs? Have there b= een
any other storage errors reported in the logs? Is the problem
reproducible or was it a one off occurrence?

Brian

> I can't find more information for this..., perhaps a bug or other<= br> > thing ..., welcome any hint for to research..
>
> Thanks in advance!
>
> -Pablo

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


--047d7b8743f821ad02050f5d6c9a-- From bfoster@redhat.com Wed Feb 18 08:58:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4DD0E7F84 for ; Wed, 18 Feb 2015 08:58:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D1268F8035 for ; Wed, 18 Feb 2015 06:58:51 -0800 (PST) X-ASG-Debug-ID: 1424271529-04cbb01165471f20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 41ou4In0cLRKCzaX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 06:58:50 -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 (8.14.4/8.14.4) with ESMTP id t1IEwks5007803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 18 Feb 2015 09:58:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1IEwjdZ028766; Wed, 18 Feb 2015 09:58:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id DEE601256B4; Wed, 18 Feb 2015 09:58:44 -0500 (EST) Date: Wed, 18 Feb 2015 09:58:44 -0500 From: Brian Foster To: Pablo Silva Cc: xfs@oss.sgi.com Subject: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c Message-ID: <20150218145844.GA62927@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c References: <20150216141039.GA48651@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424271529 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 18, 2015 at 11:13:23AM -0300, Pablo Silva wrote: > Hi Brian! > > Thanks for your time!, i've just to run xfs_repair -n the result you can > see --> http://pastebin.centos.org/16106/ and as you can see there was > problems, but why this problems occurs?, we have xfs partition used for one > KVM where running Amanda with Centos 7, perhaps it was a bad configuration > inside KVM or perhaps a bug?, the host server is running centos 6 > Can you elaborate? You have an isolated XFS filesystem that is accessed by the host system, the kvm guest, or both? How is the fs used? Also, can you answer my other questions related to how this occurred? Are there any other errors in the logs that precede the one below? I assume the fs shut down at the point of the error below. Has it been mounted since? If not, that might be worth a try to replay the log. If the log is dirty and replayed, that should be indicated by the output in the log at mount time. You'll also want to re-run xfs_repair -n in that case. Brian > [root@vtl ~]# uname -a > Linux vtl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:11:36 > UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > > > But the KVM running centos 7 > > Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC 2014 > x86_64 x86_64 x86_64 GNU/Linux > > The KVM config is this --> http://pastebin.centos.org/16111/ > > And /etc/fstab is this---> http://pastebin.centos.org/16116/ > > > Thanks in advance, for any hint. > > -Pablo > > > On Mon, Feb 16, 2015 at 11:10 AM, Brian Foster wrote: > > > On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote: > > > Hi ! > > > > > > We have a server with centos 6.6, kernel version: > > > 2.6.32-431.17.1.el6.x86_64, where we got the following message: > > > > > > Feb 12 19:22:15 vtl kernel: > > > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted > > > 2.6.32-431.17.1.el6.x86_64 #1 > > > Feb 12 19:22:15 vtl kernel: Call Trace: > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_error_report+0x3f/0x50 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 > > [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_dialloc+0x43e/0x850 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? xfs_ialloc+0x60/0x6e0 > > [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > > kmem_zone_zalloc+0x3a/0x50 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_dir_ialloc+0x74/0x2b0 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_create+0x440/0x640 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_vn_mknod+0xad/0x1c0 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_vn_create+0x10/0x20 [xfs] > > > Feb 12 19:22:15 vtl kernel: [] ? vfs_create+0xe6/0x110 > > > Feb 12 19:22:15 vtl kernel: [] ? > > do_filp_open+0xa8e/0xd20 > > > Feb 12 19:22:15 vtl kernel: [] ? alloc_fd+0x92/0x160 > > > Feb 12 19:22:15 vtl kernel: XFS: Internal error > > > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. > > > Caller 0xffffffffa0422980 > > > > > > > /* > > * None left in the last group, search the whole AG > > */ > > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); > > if (error) > > goto error0; > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > > for (;;) { > > error = xfs_inobt_get_rec(cur, &rec, &i); > > if (error) > > goto error0; > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > if (rec.ir_freecount > 0) > > break; > > error = xfs_btree_increment(cur, 0, &i); > > if (error) > > goto error0; > > ---> XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > } > > > > That corresponds to the check above. This code is part of the inode > > allocator where we expect an AG to have free inodes and we're doing a > > brute force search for a record. Apparently we go off the AG or some > > other problem occurs before we find a free inode record. > > > > Does 'xfs_repair -n' report any problems with this fs? Have there been > > any other storage errors reported in the logs? Is the problem > > reproducible or was it a one off occurrence? > > > > Brian > > > > > I can't find more information for this..., perhaps a bug or other > > > thing ..., welcome any hint for to research.. > > > > > > Thanks in advance! > > > > > > -Pablo > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > From psilvao@gmail.com Wed Feb 18 09:19:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 62F1D7F7B for ; Wed, 18 Feb 2015 09:19:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 51AE68F8037 for ; Wed, 18 Feb 2015 07:19:07 -0800 (PST) X-ASG-Debug-ID: 1424272744-04cb6c6b0b4c94e0001-NocioJ Received: from mail-we0-f175.google.com (mail-we0-f175.google.com [74.125.82.175]) by cuda.sgi.com with ESMTP id xb5Ys0YaxVscUjq4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 18 Feb 2015 07:19:05 -0800 (PST) X-Barracuda-Envelope-From: psilvao@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.175 Received: by wesk11 with SMTP id k11so1743184wes.11 for ; Wed, 18 Feb 2015 07:19:03 -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:content-type; bh=c9P7e+cWgVw/uQSN8P+vhl7ZgBl5yEDUw6WuS1C91e8=; b=sxQLBShklMvpXcbkrIcY2eb23ptGoSwUE9v/YCcE2mS4Bw2Y/A+zTBRLbyo78NXLU/ IxmhD8RqQRy5sOjvei+72OYX6YihNg41CGsAFXmh1X407jHcaZ/EZ1QnYla5U4ccNzkv QCGUjOSi5ft91Z4VNrYgFtC4mpEUnnPMJnvXU06XsatkV84vsVSqBYLMc2/wHtEYq3ml JaJ7q/xjfe1xZd0Cy9ODgUW7ZXRoz8eH5d3+ee0LXA9LJH18b5chjhVBwy0fS1WJ26VM fOM4xg5BniOfQDDGXPuBSEIRpo0qU0wtqbTLH3vaTjtmV/CcBl8riKBCgAjAw0AHx1OQ +dIg== MIME-Version: 1.0 X-Received: by 10.194.192.167 with SMTP id hh7mr10164014wjc.151.1424272743800; Wed, 18 Feb 2015 07:19:03 -0800 (PST) Received: by 10.194.234.10 with HTTP; Wed, 18 Feb 2015 07:19:03 -0800 (PST) In-Reply-To: <20150218145844.GA62927@bfoster.bfoster> References: <20150216141039.GA48651@bfoster.bfoster> <20150218145844.GA62927@bfoster.bfoster> Date: Wed, 18 Feb 2015 12:19:03 -0300 Message-ID: Subject: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c From: Pablo Silva X-ASG-Orig-Subj: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b8743f8f52832050f5e564a X-Barracuda-Connect: mail-we0-f175.google.com[74.125.82.175] X-Barracuda-Start-Time: 1424272744 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15486 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 --047d7b8743f8f52832050f5e564a Content-Type: text/plain; charset=UTF-8 The XFS filesystem is only access by kvm guest, the objetive is store the backup's amanda that running in kvm host. Now, i answer your questions: * Have there been any other storage errors reported in the logs?, ans: No, no information inside /var/log/messages , dmesg about xfs., can you suggest other log file for to find any information? * Is the problem reproducible or was it a one off occurrence? ans: It is only the first occurrence, and the server has a little use, because we are working yet for to complete the amanda backups, it isn't in production yet. -Pablo On Wed, Feb 18, 2015 at 11:58 AM, Brian Foster wrote: > On Wed, Feb 18, 2015 at 11:13:23AM -0300, Pablo Silva wrote: > > Hi Brian! > > > > Thanks for your time!, i've just to run xfs_repair -n the result you can > > see --> http://pastebin.centos.org/16106/ and as you can see there was > > problems, but why this problems occurs?, we have xfs partition used for > one > > KVM where running Amanda with Centos 7, perhaps it was a bad > configuration > > inside KVM or perhaps a bug?, the host server is running centos 6 > > > > Can you elaborate? You have an isolated XFS filesystem that is accessed > by the host system, the kvm guest, or both? How is the fs used? > > Also, can you answer my other questions related to how this occurred? > Are there any other errors in the logs that precede the one below? > > I assume the fs shut down at the point of the error below. Has it been > mounted since? If not, that might be worth a try to replay the log. If > the log is dirty and replayed, that should be indicated by the output in > the log at mount time. You'll also want to re-run xfs_repair -n in that > case. > > Brian > > > [root@vtl ~]# uname -a > > Linux vtl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 > 21:11:36 > > UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > > > > > > But the KVM running centos 7 > > > > Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC > 2014 > > x86_64 x86_64 x86_64 GNU/Linux > > > > The KVM config is this --> http://pastebin.centos.org/16111/ > > > > And /etc/fstab is this---> http://pastebin.centos.org/16116/ > > > > > > Thanks in advance, for any hint. > > > > -Pablo > > > > > > On Mon, Feb 16, 2015 at 11:10 AM, Brian Foster > wrote: > > > > > On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote: > > > > Hi ! > > > > > > > > We have a server with centos 6.6, kernel version: > > > > 2.6.32-431.17.1.el6.x86_64, where we got the following message: > > > > > > > > Feb 12 19:22:15 vtl kernel: > > > > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted > > > > 2.6.32-431.17.1.el6.x86_64 #1 > > > > Feb 12 19:22:15 vtl kernel: Call Trace: > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_error_report+0x3f/0x50 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_ialloc+0x60/0x6e0 > > > [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_dialloc+0x43e/0x850 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > xfs_ialloc+0x60/0x6e0 > > > [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > kmem_zone_zalloc+0x3a/0x50 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_dir_ialloc+0x74/0x2b0 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_create+0x440/0x640 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_vn_mknod+0xad/0x1c0 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > xfs_vn_create+0x10/0x20 [xfs] > > > > Feb 12 19:22:15 vtl kernel: [] ? > vfs_create+0xe6/0x110 > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > do_filp_open+0xa8e/0xd20 > > > > Feb 12 19:22:15 vtl kernel: [] ? > alloc_fd+0x92/0x160 > > > > Feb 12 19:22:15 vtl kernel: XFS: Internal error > > > > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. > > > > Caller 0xffffffffa0422980 > > > > > > > > > > /* > > > * None left in the last group, search the whole AG > > > */ > > > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); > > > if (error) > > > goto error0; > > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > > > > for (;;) { > > > error = xfs_inobt_get_rec(cur, &rec, &i); > > > if (error) > > > goto error0; > > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > if (rec.ir_freecount > 0) > > > break; > > > error = xfs_btree_increment(cur, 0, &i); > > > if (error) > > > goto error0; > > > ---> XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > } > > > > > > That corresponds to the check above. This code is part of the inode > > > allocator where we expect an AG to have free inodes and we're doing a > > > brute force search for a record. Apparently we go off the AG or some > > > other problem occurs before we find a free inode record. > > > > > > Does 'xfs_repair -n' report any problems with this fs? Have there been > > > any other storage errors reported in the logs? Is the problem > > > reproducible or was it a one off occurrence? > > > > > > Brian > > > > > > > I can't find more information for this..., perhaps a bug or other > > > > thing ..., welcome any hint for to research.. > > > > > > > > Thanks in advance! > > > > > > > > -Pablo > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > --047d7b8743f8f52832050f5e564a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
The XFS filesystem is only access by kvm gu= est, the objetive is store the backup's amanda that running in kvm host= .

Now, i answer your questions:

* Have there been any o= ther storage errors reported in the logs?,

ans: No, no information = inside /var/log/messages , dmesg about xfs., can you suggest other log file= for to find any information?

* Is the problem reproducible or was = it a one off occurrence?

ans: It = is only the first occurrence, and the server has a = little use, because we are working yet for to complete the amanda backups, = it isn't in production yet.

-Pablo






=C2=A0

On Wed, Feb 18, 2015 at 11:58 AM, Brian Foster <bfoste= r@redhat.com> wrote:
On Wed, Feb 18, 2015 at 11:13:23AM -0300, Pablo Silva wrote:
> Hi Brian!
>
>=C2=A0 Thanks for your time!, i've just to run xfs_repair -n the re= sult you can
> see --> http://pastebin.centos.org/16106/ and as you can see there was
> problems, but why this problems occurs?, we have xfs partition used fo= r one
> KVM where running Amanda with Centos 7, perhaps it was a bad configura= tion
> inside KVM or perhaps a bug?, the host server is running centos 6
>

Can you elaborate? You have an isolated XFS filesystem that is acces= sed
by the host system, the kvm guest, or both? How is the fs used?

Also, can you answer my other questions related to how this occurred?
Are there any other errors in the logs that precede the one below?

I assume the fs shut down at the point of the error below. Has it been
mounted since? If not, that might be worth a try to replay the log. If
the log is dirty and replayed, that should be indicated by the output in the log at mount time. You'll also want to re-run xfs_repair -n in that=
case.

Brian

> [root@vtl ~]# uname -a
> Linux vtl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 21:= 11:36
> UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
>
>
> But the KVM running centos 7
>
> Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC = 2014
> x86_64 x86_64 x86_64 GNU/Linux
>
> The KVM config is this --> http://pastebin.centos.org/16111/
>
> And /etc/fstab is this---> http://pastebin.centos.org/16116/
>
>
> Thanks in advance, for any hint.
>
> -Pablo
>
>
> On Mon, Feb 16, 2015 at 11:10 AM, Brian Foster <bfoster@redhat.com> wrote:
>
> > On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote:
> > > Hi !
> > >
> > >=C2=A0 =C2=A0 =C2=A0We have a server with centos 6.6, kernel = version:
> > > 2.6.32-431.17.1.el6.x86_64, where we got the following messa= ge:
> > >
> > > Feb 12 19:22:15 vtl kernel:
> > > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not taint= ed
> > > 2.6.32-431.17.1.el6.x86_64 #1
> > > Feb 12 19:22:15 vtl kernel: Call Trace:
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa041ae5f>] ?
> > > xfs_error_report+0x3f/0x50 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs= _ialloc+0x60/0x6e0
> > [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa041ec2e>] ?
> > xfs_dialloc+0x43e/0x850 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa0422980>] ? xfs= _ialloc+0x60/0x6e0
> > [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa044007a>] ?
> > > kmem_zone_zalloc+0x3a/0x50 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa043b814>] ?
> > > xfs_dir_ialloc+0x74/0x2b0 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa043d900>] ?
> > xfs_create+0x440/0x640 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa044aa5d>] ?
> > xfs_vn_mknod+0xad/0x1c0 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffffa044aba0>] ?
> > xfs_vn_create+0x10/0x20 [xfs]
> > > Feb 12 19:22:15 vtl kernel: [<ffffffff81198086>] ? vfs= _create+0xe6/0x110
> > > Feb 12 19:22:15 vtl kernel: [<ffffffff8119bb9e>] ?
> > do_filp_open+0xa8e/0xd20
> > > Feb 12 19:22:15 vtl kernel: [<ffffffff811a7ea2>] ? all= oc_fd+0x92/0x160
> > > Feb 12 19:22:15 vtl kernel: XFS: Internal error
> > > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_iallo= c.c.
> > > Caller 0xffffffffa0422980
> > >
> >
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * None left in the last group, = search the whole AG
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0error =3D xfs_inobt_lookup(cur, = 0, XFS_LOOKUP_GE, &i);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (error)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto= error0;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0XFS_WANT_CORRUPTED_GOTO(i =3D=3D= 1, error0);
> >
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for (;;) {
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0erro= r =3D xfs_inobt_get_rec(cur, &rec, &i);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (= error)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0goto error0;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0XFS_= WANT_CORRUPTED_GOTO(i =3D=3D 1, error0);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (= rec.ir_freecount > 0)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0break;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0erro= r =3D xfs_btree_increment(cur, 0, &i);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (= error)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0goto error0;
> > --->=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 XFS_WANT_CORRUPT= ED_GOTO(i =3D=3D 1, error0);
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> >
> > That corresponds to the check above. This code is part of the ino= de
> > allocator where we expect an AG to have free inodes and we're= doing a
> > brute force search for a record. Apparently we go off the AG or s= ome
> > other problem occurs before we find a free inode record.
> >
> > Does 'xfs_repair -n' report any problems with this fs? Ha= ve there been
> > any other storage errors reported in the logs? Is the problem
> > reproducible or was it a one off occurrence?
> >
> > Brian
> >
> > > I can't find more information for this..., perhaps a bug= or other
> > > thing ..., welcome any hint for to research..
> > >
> > > Thanks in advance!
> > >
> > > -Pablo
> >
> > > _______________________________________________
> > > xfs mailing list
> > > xfs@oss.sgi.com
> > > http://oss.sgi.com/mailman/listinfo/xfs
> >
> >

--047d7b8743f8f52832050f5e564a-- From mlsemon35@gmail.com Wed Feb 18 09:32:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 8361729DF7 for ; Wed, 18 Feb 2015 09:32:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CCE48F8035 for ; Wed, 18 Feb 2015 07:32:38 -0800 (PST) X-ASG-Debug-ID: 1424273553-04bdf06a5c4b8540001-NocioJ Received: from mail-qc0-f178.google.com (mail-qc0-f178.google.com [209.85.216.178]) by cuda.sgi.com with ESMTP id 2XVPb8Cwxl7XabZu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 18 Feb 2015 07:32:33 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.178] Received: by mail-qc0-f178.google.com with SMTP id p6so1367598qcv.9 for ; Wed, 18 Feb 2015 07:32:33 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=lO/lY9pZInDoUD8jUZDiExk+mNsqmgcIZ16l3h8TynY=; b=FhQq7hxFOy532RUXex76ob7L2yAELhwjcIoDgvVZgF14C0gIrk7bQCjjB0YpxnTBpQ gtWxYr3SiCtKJshoNLMuR+SQ831hC50xmXkb6P66Omm7zi3KodGz+7q6q2ZOTb7IZUeh MD4QnDj/n7K+joSzBvN5BLU+PWAbYQU8nij0Gd5b1Y9RRiyuCV3y8VK1Wkd6V3XKMut6 ke0fobbt/G1oJZimD2fj83rhDrdiVUyE4dwhTo/mgpQttUw8hw0yLE7EN8rJQAWNydfD Dy6GfiAbJ8R1TZ3MlCuH6EzLzQS5AIqL2ez+74mxhMTOEi0YFFQsc2+dkAh2dqiHK8O7 /zZw== X-Received: by 10.140.102.205 with SMTP id w71mr1196269qge.104.1424273552974; Wed, 18 Feb 2015 07:32:32 -0800 (PST) Received: from yholen.ds (rrcs-97-76-23-49.se.biz.rr.com. [97.76.23.49]) by mx.google.com with ESMTPSA id h8sm4150201qaq.44.2015.02.18.07.32.32 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 18 Feb 2015 07:32:32 -0800 (PST) Message-ID: <54E4B08B.5050801@gmail.com> Date: Wed, 18 Feb 2015 10:32:27 -0500 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner CC: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC References: <1423782857-11800-1-git-send-email-david@fromorbit.com> <54DE8B6D.8010401@sgi.com> <20150214232951.GW4251@dastard> <54E16667.1050200@gmail.com> <54E22A76.40106@sgi.com> <20150216231716.GB4251@dastard> <54E36016.20908@gmail.com> <20150218004838.GM4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC In-Reply-To: <20150218004838.GM4251@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-qc0-f178.google.com[209.85.216.178] X-Barracuda-Start-Time: 1424273553 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15486 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 02/17/15 19:48, Dave Chinner wrote: > On Tue, Feb 17, 2015 at 10:36:54AM -0500, Michael L. Semon wrote: >> On 02/16/15 18:17, Dave Chinner wrote: >>> On Mon, Feb 16, 2015 at 11:35:50AM -0600, Mark Tinguely wrote: >>>> Thanks Michael, you don't need to hold your test box for me. I do >>>> have a way to recreate these ABBA AGF buffer allocation deadlocks >>>> and understand the whys and hows very well. I don't have a community >>>> way to make a xfstest for it but I think your test is getting close. >>> >>> If you know what is causing them, then please explain how it occurs >>> and how you think it needs to be fixed. Just telling us that you know >>> something that we don't doesn't help us solve the problem. :( >>> >>> In general, the use of the args->firstblock is supposed to avoid the >>> ABBA locking order issues with multiple allocations in the one >>> transaction by preventing AG selection loops from looping back into >>> AGs with a lower index than the first allocation that was made. >>> >>> So if you are seeing deadlocks, then it may be that we aren't >>> following this constraint correctly in all locations.... >> >> Will this be a classic deadlock that will cause problems when trying to >> kill processes and unmount filesystems? If so, then I was unable to use >> generic/224 to trigger a deadlock. If not, then I'll need a better way >> of looking at the problem. > > Yes, it will hang the filesystem. > > Cheers, > > Dave. Thanks. I'll try again tonight. Last night's attempt was a combination of fio, fsstress, and a shell loop of xfs_io's fcollapse command, all at once on an SSD. At the end of the night, XFS was laughing at me. Therefore, I added the same test on the 3-partition RAID-0 side. This morning, XFS is still laughing at me, but the RAID-0 test is still running. Thanks! Michael From bfoster@redhat.com Wed Feb 18 09:40:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B55029DF7 for ; Wed, 18 Feb 2015 09:40:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89411304064 for ; Wed, 18 Feb 2015 07:40:34 -0800 (PST) X-ASG-Debug-ID: 1424274032-04cb6c6b094c9f20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YMHiDFF1Uz2wUIEe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 07: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 (8.14.4/8.14.4) with ESMTP id t1IFeThY013471 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 18 Feb 2015 10:40:30 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1IFeS0l016993; Wed, 18 Feb 2015 10:40:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E8CB91256B4; Wed, 18 Feb 2015 10:40:27 -0500 (EST) Date: Wed, 18 Feb 2015 10:40:27 -0500 From: Brian Foster To: Pablo Silva Cc: xfs@oss.sgi.com Subject: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c Message-ID: <20150218154026.GB62927@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c References: <20150216141039.GA48651@bfoster.bfoster> <20150218145844.GA62927@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424274033 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 18, 2015 at 12:19:03PM -0300, Pablo Silva wrote: > The XFS filesystem is only access by kvm guest, the objetive is store the > backup's amanda that running in kvm host. > Ok, so you've got an lv on the CentOS 6 host that is mapped through to the CentOS 7 guest. It's not really clear to me whether you've formatted that again with lvm inside the guest, or the raw drive is mapped through, but anyways... If the fs is only accessed by the guest (CentOS 7), why does the error report occur on the CentOS 6 kernel? Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted 2.6.32-431.17.1.el6.x86_64 Brian > Now, i answer your questions: > > * Have there been any other storage errors reported in the logs?, > > ans: No, no information inside /var/log/messages , dmesg about xfs., can > you suggest other log file for to find any information? > > * Is the problem reproducible or was it a one off occurrence? > > ans: It is only the first occurrence, and the server has a little use, > because we are working yet for to complete the amanda backups, it isn't in > production yet. > > -Pablo > > > > > > > > > > On Wed, Feb 18, 2015 at 11:58 AM, Brian Foster wrote: > > > On Wed, Feb 18, 2015 at 11:13:23AM -0300, Pablo Silva wrote: > > > Hi Brian! > > > > > > Thanks for your time!, i've just to run xfs_repair -n the result you can > > > see --> http://pastebin.centos.org/16106/ and as you can see there was > > > problems, but why this problems occurs?, we have xfs partition used for > > one > > > KVM where running Amanda with Centos 7, perhaps it was a bad > > configuration > > > inside KVM or perhaps a bug?, the host server is running centos 6 > > > > > > > Can you elaborate? You have an isolated XFS filesystem that is accessed > > by the host system, the kvm guest, or both? How is the fs used? > > > > Also, can you answer my other questions related to how this occurred? > > Are there any other errors in the logs that precede the one below? > > > > I assume the fs shut down at the point of the error below. Has it been > > mounted since? If not, that might be worth a try to replay the log. If > > the log is dirty and replayed, that should be indicated by the output in > > the log at mount time. You'll also want to re-run xfs_repair -n in that > > case. > > > > Brian > > > > > [root@vtl ~]# uname -a > > > Linux vtl.areaprod.b2b 2.6.32-504.8.1.el6.x86_64 #1 SMP Wed Jan 28 > > 21:11:36 > > > UTC 2015 x86_64 x86_64 x86_64 GNU/Linux > > > > > > > > > But the KVM running centos 7 > > > > > > Linux amanda 3.10.0-123.8.1.el7.x86_64 #1 SMP Mon Sep 22 19:06:58 UTC > > 2014 > > > x86_64 x86_64 x86_64 GNU/Linux > > > > > > The KVM config is this --> http://pastebin.centos.org/16111/ > > > > > > And /etc/fstab is this---> http://pastebin.centos.org/16116/ > > > > > > > > > Thanks in advance, for any hint. > > > > > > -Pablo > > > > > > > > > On Mon, Feb 16, 2015 at 11:10 AM, Brian Foster > > wrote: > > > > > > > On Fri, Feb 13, 2015 at 03:44:57PM -0300, Pablo Silva wrote: > > > > > Hi ! > > > > > > > > > > We have a server with centos 6.6, kernel version: > > > > > 2.6.32-431.17.1.el6.x86_64, where we got the following message: > > > > > > > > > > Feb 12 19:22:15 vtl kernel: > > > > > Feb 12 19:22:15 vtl kernel: Pid: 3502, comm: touch Not tainted > > > > > 2.6.32-431.17.1.el6.x86_64 #1 > > > > > Feb 12 19:22:15 vtl kernel: Call Trace: > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > > xfs_error_report+0x3f/0x50 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_ialloc+0x60/0x6e0 > > > > [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_dialloc+0x43e/0x850 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > xfs_ialloc+0x60/0x6e0 > > > > [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > > kmem_zone_zalloc+0x3a/0x50 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > > xfs_dir_ialloc+0x74/0x2b0 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_create+0x440/0x640 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_vn_mknod+0xad/0x1c0 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > xfs_vn_create+0x10/0x20 [xfs] > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > vfs_create+0xe6/0x110 > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > > > do_filp_open+0xa8e/0xd20 > > > > > Feb 12 19:22:15 vtl kernel: [] ? > > alloc_fd+0x92/0x160 > > > > > Feb 12 19:22:15 vtl kernel: XFS: Internal error > > > > > XFS_WANT_CORRUPTED_GOTO at line 990 of file fs/xfs/xfs_ialloc.c. > > > > > Caller 0xffffffffa0422980 > > > > > > > > > > > > > /* > > > > * None left in the last group, search the whole AG > > > > */ > > > > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i); > > > > if (error) > > > > goto error0; > > > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > > > > > > for (;;) { > > > > error = xfs_inobt_get_rec(cur, &rec, &i); > > > > if (error) > > > > goto error0; > > > > XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > > if (rec.ir_freecount > 0) > > > > break; > > > > error = xfs_btree_increment(cur, 0, &i); > > > > if (error) > > > > goto error0; > > > > ---> XFS_WANT_CORRUPTED_GOTO(i == 1, error0); > > > > } > > > > > > > > That corresponds to the check above. This code is part of the inode > > > > allocator where we expect an AG to have free inodes and we're doing a > > > > brute force search for a record. Apparently we go off the AG or some > > > > other problem occurs before we find a free inode record. > > > > > > > > Does 'xfs_repair -n' report any problems with this fs? Have there been > > > > any other storage errors reported in the logs? Is the problem > > > > reproducible or was it a one off occurrence? > > > > > > > > Brian > > > > > > > > > I can't find more information for this..., perhaps a bug or other > > > > > thing ..., welcome any hint for to research.. > > > > > > > > > > Thanks in advance! > > > > > > > > > > -Pablo > > > > > > > > > _______________________________________________ > > > > > xfs mailing list > > > > > xfs@oss.sgi.com > > > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > > > > From BATV+4b94778fea102255dbd0+4196+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 18 10:52:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 221DA7F89 for ; Wed, 18 Feb 2015 10:52:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B446EAC009 for ; Wed, 18 Feb 2015 08:51:59 -0800 (PST) X-ASG-Debug-ID: 1424278316-04bdf06a5c4bb890001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3aznvsZCZPDH2XNX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 08:51:56 -0800 (PST) X-Barracuda-Envelope-From: BATV+4b94778fea102255dbd0+4196+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 1YO7qs-0001DO-8I; Wed, 18 Feb 2015 16:51:54 +0000 Date: Wed, 18 Feb 2015 08:51:54 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 3/8] xfs: Convert to using ->get_state callback Message-ID: <20150218165154.GA29465@infradead.org> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 3/8] xfs: Convert to using ->get_state callback References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-4-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424267274-11836-4-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424278316 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +static void > +xfs_qm_fill_state( > + struct qc_type_state *tstate, > + struct xfs_mount *mp, > + struct xfs_inode *ip, > + xfs_ino_t ino) > +/* > + * Return quota status information, such as enforcements, quota file inode > + * numbers etc. > + */ > +static int > +xfs_fs_get_quota_state( > + struct super_block *sb, > + struct qc_state *state) We usually tab-align the arguments in XFS prototypes. Otherwise this patch looks good, Reviewed-by: Christoph Hellwig From BATV+4b94778fea102255dbd0+4196+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 18 10:53:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E17EB7F8D for ; Wed, 18 Feb 2015 10:53:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9985304053 for ; Wed, 18 Feb 2015 08:53:40 -0800 (PST) X-ASG-Debug-ID: 1424278417-04cb6c6b0b4cd170001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OAFfXJaFcBdv54n1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 08:53:38 -0800 (PST) X-Barracuda-Envelope-From: BATV+4b94778fea102255dbd0+4196+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 1YO7sU-0001zm-QV; Wed, 18 Feb 2015 16:53:34 +0000 Date: Wed, 18 Feb 2015 08:53:34 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS Message-ID: <20150218165334.GB29465@infradead.org> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-7-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424267274-11836-7-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424278417 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15488 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Feb 18, 2015 at 02:47:52PM +0100, Jan Kara wrote: > Change ->set_info to take new qc_info structure which contains all the > necessary information both for XFS and VFS. Convert Q_SETINFO handler > to use this structure. > > Signed-off-by: Jan Kara > --- > fs/quota/dquot.c | 27 ++++++++++++++++----------- > fs/quota/quota.c | 21 ++++++++++++++++++++- > include/linux/quota.h | 21 +++++++++++++++++++-- > include/linux/quotaops.h | 2 +- > 4 files changed, 56 insertions(+), 15 deletions(-) > > diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c > index cf4edd87e854..f37b74eab807 100644 > --- a/fs/quota/dquot.c > +++ b/fs/quota/dquot.c > @@ -2649,33 +2649,38 @@ int dquot_get_state(struct super_block *sb, struct qc_state *state) > EXPORT_SYMBOL(dquot_get_state); > > /* Generic routine for setting common part of quota file information */ > -int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii) > +int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii) > { > struct mem_dqinfo *mi; > int err = 0; > > + if ((ii->i_fieldmask & QC_WARNS_MASK) || > + (ii->i_fieldmask & QC_RT_SPC_TIMER)) > + return -EINVAL; > mutex_lock(&sb_dqopt(sb)->dqonoff_mutex); > if (!sb_has_quota_active(sb, type)) { > err = -ESRCH; > goto out; > } > mi = sb_dqopt(sb)->info + type; > - if (ii->dqi_valid & IIF_FLAGS) { > - if (ii->dqi_flags & ~DQF_SETINFO_MASK || > - (ii->dqi_flags & DQF_ROOT_SQUASH && > + if (ii->i_fieldmask & QC_FLAGS) { > + if ((ii->i_flags & QCI_ROOT_SQUASH && > mi->dqi_format->qf_fmt_id != QFMT_VFS_OLD)) { > err = -EINVAL; > goto out; > } > } > spin_lock(&dq_data_lock); > - if (ii->dqi_valid & IIF_BGRACE) > - mi->dqi_bgrace = ii->dqi_bgrace; > - if (ii->dqi_valid & IIF_IGRACE) > - mi->dqi_igrace = ii->dqi_igrace; > - if (ii->dqi_valid & IIF_FLAGS) > - mi->dqi_flags = (mi->dqi_flags & ~DQF_SETINFO_MASK) | > - (ii->dqi_flags & DQF_SETINFO_MASK); > + if (ii->i_fieldmask & QC_SPC_TIMER) > + mi->dqi_bgrace = ii->i_spc_timelimit; > + if (ii->i_fieldmask & QC_INO_TIMER) > + mi->dqi_igrace = ii->i_ino_timelimit; > + if (ii->i_fieldmask & QC_FLAGS) { > + if (ii->i_flags & QCI_ROOT_SQUASH) > + mi->dqi_flags |= DQF_ROOT_SQUASH; > + else > + mi->dqi_flags &= ~DQF_ROOT_SQUASH; > + } > spin_unlock(&dq_data_lock); > mark_info_dirty(sb, type); > /* Force write to disk */ > diff --git a/fs/quota/quota.c b/fs/quota/quota.c > index 20d11cd21247..741d5a178268 100644 > --- a/fs/quota/quota.c > +++ b/fs/quota/quota.c > @@ -149,12 +149,31 @@ static int quota_getinfo(struct super_block *sb, int type, void __user *addr) > static int quota_setinfo(struct super_block *sb, int type, void __user *addr) > { > struct if_dqinfo info; > + struct qc_info qinfo; > > if (copy_from_user(&info, addr, sizeof(info))) > return -EFAULT; > if (!sb->s_qcop->set_info) > return -ENOSYS; > - return sb->s_qcop->set_info(sb, type, &info); > + if (info.dqi_valid & ~(IIF_FLAGS | IIF_BGRACE | IIF_IGRACE)) > + return -EINVAL; > + memset(&qinfo, 0, sizeof(qinfo)); > + if (info.dqi_valid & IIF_FLAGS) { > + if (info.dqi_flags & ~DQF_SETINFO_MASK) > + return -EINVAL; > + if (info.dqi_flags & DQF_ROOT_SQUASH) > + qinfo.i_flags |= QCI_ROOT_SQUASH; > + qinfo.i_fieldmask |= QC_FLAGS; > + } > + if (info.dqi_valid & IIF_BGRACE) { > + qinfo.i_spc_timelimit = info.dqi_bgrace; > + qinfo.i_fieldmask |= QC_SPC_TIMER; > + } > + if (info.dqi_valid & IIF_IGRACE) { > + qinfo.i_ino_timelimit = info.dqi_igrace; > + qinfo.i_fieldmask |= QC_INO_TIMER; > + } > + return sb->s_qcop->set_info(sb, type, &qinfo); > } > > static inline qsize_t qbtos(qsize_t blocks) > diff --git a/include/linux/quota.h b/include/linux/quota.h > index a07f2ed25284..3d521199a0bd 100644 > --- a/include/linux/quota.h > +++ b/include/linux/quota.h > @@ -344,7 +344,10 @@ struct qc_dqblk { > int d_rt_spc_warns; /* # warnings issued wrt RT space */ > }; > > -/* Field specifiers for ->set_dqblk() in struct qc_dqblk */ > +/* > + * Field specifiers for ->set_dqblk() in struct qc_dqblk and also for > + * ->set_info() in struct qc_info > + */ > #define QC_INO_SOFT (1<<0) > #define QC_INO_HARD (1<<1) > #define QC_SPC_SOFT (1<<2) > @@ -365,6 +368,7 @@ struct qc_dqblk { > #define QC_INO_COUNT (1<<13) > #define QC_RT_SPACE (1<<14) > #define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) > +#define QC_FLAGS (1<<15) > > #define QCI_SYSFILE (1 << 0) /* Quota file is hidden from userspace */ > #define QCI_ROOT_SQUASH (1 << 1) /* Root squash turned on */ > @@ -397,6 +401,19 @@ struct qc_state { > struct qc_type_state s_state[XQM_MAXQUOTAS]; > }; > > +/* Structure for communicating via ->set_info */ > +struct qc_info { > + int i_fieldmask; /* mask of fields to change in ->set_info() */ > + unsigned int i_flags; /* Flags QCI_* */ > + unsigned int i_spc_timelimit; /* Time after which space softlimit is > + * enforced */ > + unsigned int i_ino_timelimit; /* Ditto for inode softlimit */ > + unsigned int i_rt_spc_timelimit;/* Ditto for real-time space */ > + unsigned int i_spc_warnlimit; /* Limit for number of space warnings */ > + unsigned int i_ino_warnlimit; /* Limit for number of inode warnings */ > + unsigned int i_rt_spc_warnlimit; /* Ditto for real-time space */ > +}; What does the i_ prefix stand for? Otherwise this looks fine to me. From BATV+4b94778fea102255dbd0+4196+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 18 10:54:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A6A4729DFF for ; Wed, 18 Feb 2015 10:54:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42F6FAC002 for ; Wed, 18 Feb 2015 08:54:17 -0800 (PST) X-ASG-Debug-ID: 1424278455-04bdf06a5c4bba30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id v8qQOnjyieGw2Gyu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 08:54:15 -0800 (PST) X-Barracuda-Envelope-From: BATV+4b94778fea102255dbd0+4196+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 1YO7t7-0002Dw-0L; Wed, 18 Feb 2015 16:54:13 +0000 Date: Wed, 18 Feb 2015 08:54:12 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 7/8] xfs: Add support for Q_SETINFO Message-ID: <20150218165412.GC29465@infradead.org> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 7/8] xfs: Add support for Q_SETINFO References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-8-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424267274-11836-8-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424278455 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine except for the cosmetical argument alignment style issue. Reviewed-by: Christoph Hellwig From BATV+4b94778fea102255dbd0+4196+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 18 10:54:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2836829DFF for ; Wed, 18 Feb 2015 10:54:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 086948F8039 for ; Wed, 18 Feb 2015 08:54:43 -0800 (PST) X-ASG-Debug-ID: 1424278482-04bdf06a5c4bba80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 630EDXqCfSTzwpZ5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 08:54:42 -0800 (PST) X-Barracuda-Envelope-From: BATV+4b94778fea102255dbd0+4196+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 1YO7tY-0002MI-Df; Wed, 18 Feb 2015 16:54:40 +0000 Date: Wed, 18 Feb 2015 08:54:40 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 8/8] quota: Hook up Q_XSETQLIM for id 0 to ->set_info Message-ID: <20150218165440.GD29465@infradead.org> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 8/8] quota: Hook up Q_XSETQLIM for id 0 to ->set_info References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-9-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424267274-11836-9-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424278482 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From jack@suse.cz Wed Feb 18 11:11:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4693F29DF7 for ; Wed, 18 Feb 2015 11:11:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26587304032 for ; Wed, 18 Feb 2015 09:11:45 -0800 (PST) X-ASG-Debug-ID: 1424279502-04bdf06a594bc7d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id X5Y8eHv6DGCdHqOf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 09:11:44 -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 4665D75014; Wed, 18 Feb 2015 17:11:42 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id CEA5B81FC3; Wed, 18 Feb 2015 18:11:38 +0100 (CET) Date: Wed, 18 Feb 2015 18:11:38 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 3/8] xfs: Convert to using ->get_state callback Message-ID: <20150218171138.GA11951@quack.suse.cz> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 3/8] xfs: Convert to using ->get_state callback References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-4-git-send-email-jack@suse.cz> <20150218165154.GA29465@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218165154.GA29465@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424279504 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 18-02-15 08:51:54, Christoph Hellwig wrote: > > +static void > > +xfs_qm_fill_state( > > + struct qc_type_state *tstate, > > + struct xfs_mount *mp, > > + struct xfs_inode *ip, > > + xfs_ino_t ino) > > > +/* > > + * Return quota status information, such as enforcements, quota file inode > > + * numbers etc. > > + */ > > +static int > > +xfs_fs_get_quota_state( > > + struct super_block *sb, > > + struct qc_state *state) > > We usually tab-align the arguments in XFS prototypes. OK, fixed. > Otherwise this patch looks good, > > Reviewed-by: Christoph Hellwig Thanks. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Wed Feb 18 11:18:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EBFE729E01 for ; Wed, 18 Feb 2015 11:18:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB05330406B for ; Wed, 18 Feb 2015 09:18:05 -0800 (PST) X-ASG-Debug-ID: 1424279882-04bdf06a5c4bcd20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0O0t5xJDg2hjF2Zv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 09:18:03 -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 50428AABA; Wed, 18 Feb 2015 17:18:02 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id E9E9F81FC3; Wed, 18 Feb 2015 18:17:58 +0100 (CET) Date: Wed, 18 Feb 2015 18:17:58 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS Message-ID: <20150218171758.GB11951@quack.suse.cz> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 6/8] quota: Make ->set_info use structure with neccesary info to VFS and XFS References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-7-git-send-email-jack@suse.cz> <20150218165334.GB29465@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218165334.GB29465@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424279883 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 18-02-15 08:53:34, Christoph Hellwig wrote: > On Wed, Feb 18, 2015 at 02:47:52PM +0100, Jan Kara wrote: > > Change ->set_info to take new qc_info structure which contains all the > > necessary information both for XFS and VFS. Convert Q_SETINFO handler > > to use this structure. ... > > +/* Structure for communicating via ->set_info */ > > +struct qc_info { > > + int i_fieldmask; /* mask of fields to change in ->set_info() */ > > + unsigned int i_flags; /* Flags QCI_* */ > > + unsigned int i_spc_timelimit; /* Time after which space softlimit is > > + * enforced */ > > + unsigned int i_ino_timelimit; /* Ditto for inode softlimit */ > > + unsigned int i_rt_spc_timelimit;/* Ditto for real-time space */ > > + unsigned int i_spc_warnlimit; /* Limit for number of space warnings */ > > + unsigned int i_ino_warnlimit; /* Limit for number of inode warnings */ > > + unsigned int i_rt_spc_warnlimit; /* Ditto for real-time space */ > > +}; > > What does the i_ prefix stand for? It stands for info. I can change it e.g. to qci_ for quotactl info if you think that would be better... Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Wed Feb 18 11:20:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1EADC7F4E for ; Wed, 18 Feb 2015 11:20:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0DBA38F8037 for ; Wed, 18 Feb 2015 09:20:37 -0800 (PST) X-ASG-Debug-ID: 1424280035-04cbb01162476a30001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4JDpcxZaQte5mCuS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 09:20:36 -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 4FF9AABED; Wed, 18 Feb 2015 17:20:35 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id EABF281FC3; Wed, 18 Feb 2015 18:20:31 +0100 (CET) Date: Wed, 18 Feb 2015 18:20:31 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, cluster-devel@redhat.com, xfs@oss.sgi.com Subject: Re: [Cluster-devel] [PATCH 7/8] xfs: Add support for Q_SETINFO Message-ID: <20150218172031.GC11951@quack.suse.cz> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH 7/8] xfs: Add support for Q_SETINFO References: <1424267274-11836-1-git-send-email-jack@suse.cz> <1424267274-11836-8-git-send-email-jack@suse.cz> <20150218165412.GC29465@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218165412.GC29465@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424280036 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 18-02-15 08:54:12, Christoph Hellwig wrote: > Looks fine except for the cosmetical argument alignment style issue. OK, fixed. > Reviewed-by: Christoph Hellwig Honza -- Jan Kara SUSE Labs, CR From david@fromorbit.com Wed Feb 18 15:32:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 66BF77F9C for ; Wed, 18 Feb 2015 15:32:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA799AC004 for ; Wed, 18 Feb 2015 13:32:16 -0800 (PST) X-ASG-Debug-ID: 1424295129-04cbb0116547cbb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hgHaqlhZjYuFWfZe for ; Wed, 18 Feb 2015 13:32:09 -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: A2DwDwBBBOVUPDkjLHlRAgIGgwaBLII5g32pVAEBAQEBAQaYOgQCAoEeRAEBAQEBAQUBAQEBODuEDAEBAQMBOhwjBQsIAw4KCSUPBSUDBxoRAhkCiAwH0wwBCyAYhWyFC4QMBgYFAQ1DB4QqBZUyg0yBGoVag2IRiCyCJByBZCoELYELgTgBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Feb 2015 08:01:19 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOCDG-0000Dw-B4; Thu, 19 Feb 2015 08:31:18 +1100 Date: Thu, 19 Feb 2015 08:31:18 +1100 From: Dave Chinner To: Michal Hocko Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150218213118.GN12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218121602.GC4478@dhcp22.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424295129 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 01:16:02PM +0100, Michal Hocko wrote: > On Wed 18-02-15 21:48:59, Dave Chinner wrote: > > On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > > > On Wed 18-02-15 09:54:30, Dave Chinner wrote: > [...] > > Also, this reads as an excuse for the OOM killer being broken and > > not fixing it. Keep in mind that we tell the memory alloc/reclaim > > subsystem that *we hold locks* when we call into it. That's what > > GFP_NOFS originally meant, and it's what it still means today in an > > XFS context. > > Sure, and OOM killer will not be invoked in NOFS context. See > __alloc_pages_may_oom and __GFP_FS check in there. So I do not see where > is the OOM killer broken. I suspect that the page cache missing the correct GFP_NOFS was one of the sources of the problems I've been seeing. However, the oom killer exceptions are not checked if __GFP_NOFAIL is present and so if we start using __GFP_NOFAIL then it will be called in GFP_NOFS contexts... > The crucial problem we are dealing with is not GFP_NOFAIL triggering the > OOM killer but a lock dependency introduced by the following sequence: > > taskA taskB taskC > lock(A) alloc() > alloc(gfp | __GFP_NOFAIL) lock(A) out_of_memory > # looping for ever if we select_bad_process > # cannot make any progress victim = taskB > > There is no way OOM killer can tell taskB is blocked and that there is > dependency between A and B (without lockdep). That is why I call NOFAIL > under a lock as dangerous and a bug. Sure. However, eventually the OOM killer with select task A to be killed because nothing else is working. That, at least, marks taskA with TIF_MEMDIE and gives us a potential way to break the deadlock. But the bigger problem is this: taskA taskB lock(A) alloc(GFP_NOFS|GFP_NOFAIL) lock(A) out_of_memory select_bad_process victim = taskB Because there is no way to *ever* resolve that dependency because taskA never leaves the allocator. Even if the oom killer selects taskA and set TIF_MEMDIE on it, the allocator ignores TIF_MEMDIE because GFP_NOFAIL is set and continues to loop. This is why GFP_NOFAIL is not a solution to the "never fail" alloation problem. The caller doing the "no fail" allocation _must be able to set failure policy_. i.e. the choice of aborting and shutting down because progress cannot be made, or continuing and hoping for forwards progress is owned by the allocating context, no the allocator. The memory allocation subsystem cannot make that choice for us as it has no concept of the failure characteristics of the allocating context. The situations in which this actually matters are extremely *rare* - we've had these allocaiton loops in XFS for > 13 years, and we might get a one or two reports a year of these "possible allocation deadlock" messages occurring. Changing *everything* for such a rare, unusual event is not an efficient use of time or resources. > > If the OOM killer is not obeying GFP_NOFS and deadlocking on locks > > that the invoking context holds, then that is a OOM killer bug, not > > a bug in the subsystem calling kmalloc(GFP_NOFS). > > I guess we are talking about different things here or what am I missing? >From my perspective, you are tightly focussed on one aspect of the problem and hence are not seeing the bigger picture: this is a corner case of behaviour in a "last hope", brute force memory reclaim technique that no production machine relies on for correct or performant operation. > [...] > > > In the meantime page allocator > > > should develop a proper diagnostic to help identify all the potential > > > dependencies. Next we should start thinking whether all the existing > > > GFP_NOFAIL paths are really necessary or the code can be > > > refactored/reimplemented to accept allocation failures. > > > > Last time the "just make filesystems handle memory allocation > > failures" I pointed out what that meant for XFS: dirty transaction > > rollback is required. That's freakin' complex, will double the > > memory footprint of transactions, roughly double the CPU cost, and > > greatly increase the complexity of the transaction subsystem. It's a > > *major* rework of a significant amount of the XFS codebase and will > > take at least a couple of years design, test and stabilise before > > it could be rolled out to production. > > > > I'm not about to spend a couple of years rewriting XFS just so the > > VM can get rid of a GFP_NOFAIL user. Especially as the we already > > tell the Hammer of Last Resort the context in which it can work. > > > > Move the OOM killer to kswapd - get it out of the direct reclaim > > path altogether. > > This doesn't change anything as explained in other email. The triggering > path doesn't wait for the victim to die. But it does - we wouldn't be talking about deadlocks if there were no blocking dependencies. In this case, allocation keeps retrying until the memory freed by the killed tasks enables it to make forward progress. That's a side effect of the last relevation that was made in this thread that low order allocations never fail... > > If the system is that backed up on locks that it > > cannot free any memory and has no reserves to satisfy the allocation > > that kicked the OOM killer, then the OOM killer was not invoked soon > > enough. > > > > Hell, if you want a better way to proceed, then how about you allow > > us to tell the MM subsystem how much memory reserve a specific set > > of operations is going to require to complete? That's something that > > we can do rough calculations for, and it integrates straight into > > the existing transaction reservation system we already use for log > > space and disk space, and we can tell the mm subsystem when the > > reserve is no longer needed (i.e. last thing in transaction commit). > > > > That way we don't start a transaction until the mm subsystem has > > reserved enough pages for us to work with, and the reserve only > > needs to be used when normal allocation has already failed. i.e > > rather than looping we get a page allocated from the reserve pool. > > I am not sure I understand the above but isn't the mempools a tool for > this purpose? I knew this question would be the next one - I even deleted a one line comment from my last email that said "And no, mempools are not a solution" because that needs a more thorough explanation than a dismissive one-liner. As you know, mempools require a forward progress guarantee on a single type of object and the objects must be slab based. In transaction context we allocate from inode slabs, xfs_buf slabs, log item slabs (6 different ones, IIRC), btree cursor slabs, etc, but then we also have direct page allocations for buffers, vm_map_ram() for mapping multi-page buffers, uncounted heap allocations, etc. We cannot make all of these mempools, nor can me meet the forwards progress requirements of a mempool because other allocations can block and prevent progress. Further, the object have lifetimes that don't correspond to the transaction life cycles, and hence even if we complete the transaction there is no guarantee that the objects allocated within a transaction are going to be returned to the mempool at it's completion. IOWs, we have need for forward allocation progress guarantees on (potentially) several megabytes of allocations from slab caches, the heap and the page allocator, with all allocations all in unpredictable order, with objects of different life times and life cycles, and at which may, at any time, get stuck behind objects locked in other transactions and hence can randomly block until some other thread makes forward progress and completes a transaction and unlocks the object. The reservation would only need to cover the memory we need to allocate and hold in the transaction (i.e. dirtied objects). There is potentially unbound amounts of memory required through demand paging of buffers to find the metadata we need to modify, but demand paged metadata that is read and then released is recoverable. i.e the shrinkers will free it as other memory demand requires, so it's not included in reservation pools because it doesn't deplete the amount of free memory. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Feb 18 15:55:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7BF017F9E for ; Wed, 18 Feb 2015 15:55:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 671B38F8054 for ; Wed, 18 Feb 2015 13:55:48 -0800 (PST) X-ASG-Debug-ID: 1424296545-04cb6c6b0b4d5780001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id xwrctddVnNGnUvKK for ; Wed, 18 Feb 2015 13:55:45 -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: A2DvDwASCuVUPDkjLHlbgwaBLII5g32pVAEBAQEBAQaYOgQCAoEfRAEBAQEBAQUBAQEBODuEDAEBAQMBJxMcIwULCAMOCgklDwUlAwcaE4gnB9MLAQEIIhiFbIQNfoRuB4QqBZh+gRqDD4JLg3OBZYZHgiQcgWQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Feb 2015 08:25:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOCaZ-0000G9-78; Thu, 19 Feb 2015 08:55:23 +1100 Date: Thu, 19 Feb 2015 08:55:23 +1100 From: Dave Chinner To: Jan Kara Cc: Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150218215523.GO12722@dastard> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218104009.GB4614@quack.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424296545 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 11:40:09AM +0100, Jan Kara wrote: > On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > > to a written extent after we've initialised the contents. We use the > > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > > softirq context. > > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > > point me please? > > > > For faults, we call it in dax_insert_mapping(), the very last thing > > before returning in the fault path. The normal I/O path gets to use > > the dio_iodone_t for the same purpose. > I see. I didn't think of races with reads (hum, I actually wonder whether > we don't have this data exposure problem for ext4 for mmapped write into > a hole vs direct read as well). So I guess we do need those unwritten > extent dances after all (or we would need to have a page covering hole when > writing to it via mmap but I guess unwritten extent dances are somewhat > more standard). Right, that was the reason for doing it that way - it leveraged all the existing methods we have for avoiding data exposure races in XFS. but it's also not just for races - it's for ensuring that if we crash between the allocation and the write to the persistent store we don't expose the underlying contents when the system next comes up. These problems were found long ago on XFS and that's one of the reasons why all direct IO block allocation uses unwritten extents - until the data is on disk there is a window for stale data exposure and things like crashing systems running high throughput IO are very good at exposing such small windows of exposure. Hence I thought it best to have DAX close that hole for everyone. > So in that case you need ext4_get_block_write() in the above call to > do_dax_fault() (note that we still do need ext4 version of the fault > function like above due to lock ranking and retry on ENOSPC). And please > comment about the read races at that call site so that we have that > subtlety documented somewhere. Actually, I thought it was obvious that ;) > > > > > Also abusing b_end_io of a phony buffer for that looks ugly to me (we are > > > > trying to get away from passing phony bh around and this would entangle us > > > > even more into that mess). Normally I would think that end_io() callback > > > > passed into dax_do_io() should perform necessary conversions and for > > > > dax_fault() we could do necessary conversions inside foofs_page_mkwrite()... > > > > Dave sees to be the one trying the hardest to get rid of the phony BHs > > ... and it was his idea to (ab)use b_end_io for this. The problem with > > doing the conversion in ext4_page_mkwrite() is that we don't know at > > that point whether the BH is unwritten or not. > I see, thanks for explanation. So it would be enough to pass a bit of > information (unwritten / written) to a caller of do_dax_fault() and that > can then call conversion function. IMO doing that (either in a return value > or in a separate argument of do_dax_fault()) would be cleaner and more > readable than playing with b_private and b_end_io... Thoughts? I'm happy for a better mechanism to be thought up. The current one was expedient, but not pretty. The need for the end_io function was because unwritten conversion needed to happen after the page was zeroed. If we change dax_fault() to also take a "end_io" function callback (already takes a get_blocks callback), then we can avoid the need to use the phony bh for this purpose. i.e filesystems that allocate unwritten extents can pass a completion function I've got to update the XFS DAX patches I have for the next merge cycle, so I'll take another at it when I page that information back into my brain. And speaking of phony BHs, the pnfs block layout changes introduce an struct iomap and a "map_blocks" method to the export_ops in exportfs.h. This is the model what we should be using instead of phony BHs for block mapping/allocation operations... Cheers, Dave. -- Dave Chinner david@fromorbit.com From hch@lst.de Wed Feb 18 15:59:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09F897F9E for ; Wed, 18 Feb 2015 15:59:32 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD2CC304032 for ; Wed, 18 Feb 2015 13:59:28 -0800 (PST) X-ASG-Debug-ID: 1424296765-04bdf06a594c5010001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id FVPHmJ3djZbAACyg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 13:59:27 -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 767A9AAAEC; Wed, 18 Feb 2015 22:59:22 +0100 (CET) Date: Wed, 18 Feb 2015 22:59:22 +0100 From: "hch@lst.de" To: Dave Chinner Cc: Jan Kara , Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150218215922.GA2285@lst.de> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150218215523.GO12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218215523.GO12722@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1424296766 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15501 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 08:55:23AM +1100, Dave Chinner wrote: > And speaking of phony BHs, the pnfs block layout changes introduce > an struct iomap and a "map_blocks" method to the export_ops in > exportfs.h. This is the model what we should be using instead of > phony BHs for block mapping/allocation operations... I've got some WIP patches to move the direct I/O code over to that, DAX would be another natural fit. From roseandlerrson@hotmail.com Wed Feb 18 16:29:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C47D07FA3 for ; Wed, 18 Feb 2015 16:29:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B22788F8033 for ; Wed, 18 Feb 2015 14:29:59 -0800 (PST) X-ASG-Debug-ID: 1424298594-04cb6c6b094d8cd0001-NocioJ Received: from BLU004-OMC4S4.hotmail.com (blu004-omc4s4.hotmail.com [65.55.111.143]) by cuda.sgi.com with ESMTP id o8dSFNdmDi6lZJJC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 18 Feb 2015 14:29:54 -0800 (PST) X-Barracuda-Envelope-From: roseandlerrson@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.143 Received: from BLU171-W67 ([65.55.111.137]) by BLU004-OMC4S4.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Wed, 18 Feb 2015 14:28:50 -0800 X-TMN: [kwJt42HYtFSuq0XHaDSH0b+ekjJnkd+J] X-Originating-Email: [roseandlerrson@hotmail.com] Message-ID: Content-Type: multipart/alternative; boundary="_9ed32711-8381-4135-8043-ada76d184b96_" From: Rose Anderson Sender: To: "roseanderrson101@hotmail.com" Subject: Hello Dear, Date: Wed, 18 Feb 2015 22:28:50 +0000 X-ASG-Orig-Subj: Hello Dear, Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 18 Feb 2015 22:28:50.0666 (UTC) FILETIME=[44FD1CA0:01D04BCA] X-Barracuda-Connect: blu004-omc4s4.hotmail.com[65.55.111.143] X-Barracuda-Start-Time: 1424298594 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --_9ed32711-8381-4135-8043-ada76d184b96_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hello Dear=2C Compliments to you=2C I'm miss Rose Anderson and happy to =0A= contact you and i want you to contact me back so that i will tell you =0A= more about myself as soon as you contact me back. Rose = --_9ed32711-8381-4135-8043-ada76d184b96_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hello Dear=2C
Compliments to = you=2C I'm miss Rose Anderson and happy to =0A= contact you and i want you to contact me back so that i will tell you =0A= more about myself as soon as you contact me back.
Rose
= --_9ed32711-8381-4135-8043-ada76d184b96_-- From dave@fromorbit.com Wed Feb 18 16:32:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6038F7FA4 for ; Wed, 18 Feb 2015 16:32:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1AB368F804C for ; Wed, 18 Feb 2015 14:32:24 -0800 (PST) X-ASG-Debug-ID: 1424298742-04bdf06a594cb0c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id j2LRCgosisb07am7 for ; Wed, 18 Feb 2015 14:32:22 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B2CwA/EuVUPDkjLHlbgwaBLIY2qVYBAQEBAQEGmV9EAQEBAQEBBQEBAQE4O4Q6LzsYagMHLYguqwWoOYYEjioFhV6eB4gsgWcBCwEwHIFkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Feb 2015 09:02:21 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YODAK-0000JV-BA for xfs@oss.sgi.com; Thu, 19 Feb 2015 09:32:20 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YODAK-0006j5-7c for xfs@oss.sgi.com; Thu, 19 Feb 2015 09:32:20 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: Introduce permanent async buffer write IO failures Date: Thu, 19 Feb 2015 09:32:20 +1100 X-ASG-Orig-Subj: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-Id: <1424298740-25821-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424298742 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently we consider all async metadata buffer write failures as transient failures and retry the IO immediately and then again at a a later time. The issue with this is that we can hang forever is the error is not recoverable. An example of this is a device that has been pulled and so is returning ENODEV to all IO. Attempting to unmount the filesystem with the device in this state will result in a hang waiting for the async metadata IO to be flushed and written successfully. In this case, we need metadata writeback to error out and trigger a shutdown state so the unmount can complete. Put simply, we need to consider some errors as permanent and unrecoverable rather than transient. Hence add infrastructure that allows us to classify the async write errors and hence apply different policies to the different failures. In this patch, classify ENODEV as a permanent error but leave all the other types of error handling unchanged. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 110 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 44 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 507d96a..274678f 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1041,14 +1041,13 @@ xfs_buf_do_callbacks( } /* - * This is the iodone() function for buffers which have had callbacks - * attached to them by xfs_buf_attach_iodone(). It should remove each - * log item from the buffer's list and call the callback of each in turn. - * When done, the buffer's fsprivate field is set to NULL and the buffer - * is unlocked with a call to iodone(). + * Process a write IO error on a buffer with active log items. + * + * Returns true if the buffer has been completed and released, false if callback + * processing still needs to be performed and the IO completed. */ -void -xfs_buf_iodone_callbacks( +static bool +xfs_buf_iodone_callback_error( struct xfs_buf *bp) { struct xfs_log_item *lip = bp->b_fspriv; @@ -1056,19 +1055,12 @@ xfs_buf_iodone_callbacks( static ulong lasttime; static xfs_buftarg_t *lasttarg; - if (likely(!bp->b_error)) - goto do_callbacks; - /* * If we've already decided to shutdown the filesystem because of * I/O errors, there's no point in giving this a retry. */ - if (XFS_FORCED_SHUTDOWN(mp)) { - xfs_buf_stale(bp); - XFS_BUF_DONE(bp); - trace_xfs_buf_item_iodone(bp, _RET_IP_); - goto do_callbacks; - } + if (XFS_FORCED_SHUTDOWN(mp)) + goto out_stale; if (bp->b_target != lasttarg || time_after(jiffies, (lasttime + 5*HZ))) { @@ -1077,45 +1069,75 @@ xfs_buf_iodone_callbacks( } lasttarg = bp->b_target; + /* synchronous writes will have callers process the error */ + if (!(bp->b_flags & XBF_ASYNC)) + goto out_stale; + + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + ASSERT(bp->b_iodone != NULL); + xfs_buf_ioerror(bp, 0); + /* * If the write was asynchronous then no one will be looking for the - * error. Clear the error state and write the buffer out again. - * - * XXX: This helps against transient write errors, but we need to find - * a way to shut the filesystem down if the writes keep failing. - * - * In practice we'll shut the filesystem down soon as non-transient - * errors tend to affect the whole device and a failing log write - * will make us give up. But we really ought to do better here. + * error. If this is the first failure, clear the error state and write + * the buffer out again. */ - if (XFS_BUF_ISASYNC(bp)) { - ASSERT(bp->b_iodone != NULL); - - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); - - 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); - } else { - xfs_buf_relse(bp); - } - - return; + 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); + return true; } /* - * If the write of the buffer was synchronous, we want to make - * sure to return the error to the caller of xfs_bwrite(). + * Repeated failure on an async write. + * + * Now we need to classify the error and determine the correct action to + * take. Different types of errors will require different processing, + * but make the default classification "transient" so that we keep + * retrying in these cases. If this is the wrog thing to do, then we'll + * get reports that the filesystem hung in the presence of that type of + * error and we can take appropriate action to remedy the issue for that + * type of error. */ + switch (bp->b_error) { + case ENODEV: + /* permanent error, no recovery possible */ + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + goto out_stale; + default: + /* do nothing, higher layers will retry */ + break; + } + + xfs_buf_relse(bp); + return true; + +out_stale: xfs_buf_stale(bp); XFS_BUF_DONE(bp); - trace_xfs_buf_error_relse(bp, _RET_IP_); + return false; +} + +/* + * This is the iodone() function for buffers which have had callbacks attached + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the + * callback list, mark the buffer as having no more callbacks and then push the + * buffer through IO completion processing. + */ +void +xfs_buf_iodone_callbacks( + struct xfs_buf *bp) +{ + /* + * If there is an error, process it. Some errors require us + * to run callbacks after failure processing is done so we + * detect that and take appropriate action. + */ + if (bp->b_error && xfs_buf_iodone_callback_error(bp)) + return; -do_callbacks: xfs_buf_do_callbacks(bp); bp->b_fspriv = NULL; bp->b_iodone = NULL; -- 2.0.0 From dave@fromorbit.com Wed Feb 18 16:48:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B01A47FA7 for ; Wed, 18 Feb 2015 16:48:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E2FD8F804C for ; Wed, 18 Feb 2015 14:48:50 -0800 (PST) X-ASG-Debug-ID: 1424299726-04cbb01163482750001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 4nHlFVas8aAFAq8m for ; Wed, 18 Feb 2015 14:48:47 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B5CwDEFeVUPDkjLHlbgwaBLIY2qVYBAQEBAQEGmECBIEQBAQEBAQEFAQEBATg7hDovOxhqAwctiC6rBag4hgSJK0OEPAWFXp4HiCyBZwELATAcgWQqMQGCQgEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Feb 2015 09:18:46 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YODQD-0000Kq-Ny for xfs@oss.sgi.com; Thu, 19 Feb 2015 09:48:45 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YODQD-0006n2-Mf for xfs@oss.sgi.com; Thu, 19 Feb 2015 09:48:45 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: ensure truncate forces zeroed blocks to disk Date: Thu, 19 Feb 2015 09:48:45 +1100 X-ASG-Orig-Subj: [PATCH] xfs: ensure truncate forces zeroed blocks to disk Message-Id: <1424299725-26067-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424299727 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner A new fsync vs power fail test in xfstests indicated that XFS can have unreliable data consistency when doing extending truncates that require block zeroing. The blocks beyond EOF get zeroed in memory, but we never force those changes to disk before we run the transaction that extends the file size and exposes those blocks to userspace. This can result in the blocks not being correctly zeroed after a crash. Because in-memory behaviour is correct, tools like fsx don't pick up any coherency problems - it's not until the filesystem is shutdown or the system crashes after writing the truncate transaction to the journal but before the zeroed data in the page cache is flushed that the issue is exposed. Fix this by also flushing the dirty data in memory region between the old size and new size when we've found blocks that need zeroing in the truncate process. Reported-by: Liu Bo cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 14 ++++++++++---- fs/xfs/xfs_inode.h | 9 +++++---- fs/xfs/xfs_iops.c | 36 ++++++++++++++---------------------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ce615d1..a2e1cb8 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -397,7 +397,8 @@ STATIC int /* error (positive) */ xfs_zero_last_block( struct xfs_inode *ip, xfs_fsize_t offset, - xfs_fsize_t isize) + xfs_fsize_t isize, + bool *did_zeroing) { struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t last_fsb = XFS_B_TO_FSBT(mp, isize); @@ -425,6 +426,7 @@ xfs_zero_last_block( zero_len = mp->m_sb.sb_blocksize - zero_offset; if (isize + zero_len > offset) zero_len = offset - isize; + *did_zeroing = true; return xfs_iozero(ip, isize, zero_len); } @@ -443,7 +445,8 @@ int /* error (positive) */ xfs_zero_eof( struct xfs_inode *ip, xfs_off_t offset, /* starting I/O offset */ - xfs_fsize_t isize) /* current inode size */ + xfs_fsize_t isize, /* current inode size */ + bool *did_zeroing) { struct xfs_mount *mp = ip->i_mount; xfs_fileoff_t start_zero_fsb; @@ -465,7 +468,7 @@ xfs_zero_eof( * We only zero a part of that block so it is handled specially. */ if (XFS_B_FSB_OFFSET(mp, isize) != 0) { - error = xfs_zero_last_block(ip, offset, isize); + error = xfs_zero_last_block(ip, offset, isize, did_zeroing); if (error) return error; } @@ -525,6 +528,7 @@ xfs_zero_eof( if (error) return error; + *did_zeroing = true; start_zero_fsb = imap.br_startoff + imap.br_blockcount; ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); } @@ -567,13 +571,15 @@ restart: * having to redo all checks before. */ if (*pos > i_size_read(inode)) { + bool zero = false; + if (*iolock == XFS_IOLOCK_SHARED) { xfs_rw_iunlock(ip, *iolock); *iolock = XFS_IOLOCK_EXCL; xfs_rw_ilock(ip, *iolock); goto restart; } - error = xfs_zero_eof(ip, *pos, i_size_read(inode)); + error = xfs_zero_eof(ip, *pos, i_size_read(inode), &zero); if (error) return error; } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 8e82b41..c73b63d 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -384,10 +384,11 @@ enum xfs_prealloc_flags { XFS_PREALLOC_INVISIBLE = (1 << 4), }; -int xfs_update_prealloc_flags(struct xfs_inode *, - enum xfs_prealloc_flags); -int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); -int xfs_iozero(struct xfs_inode *, loff_t, size_t); +int xfs_update_prealloc_flags(struct xfs_inode *ip, + enum xfs_prealloc_flags flags); +int xfs_zero_eof(struct xfs_inode *ip, xfs_off_t offset, + xfs_fsize_t isize, bool *did_zeroing); +int xfs_iozero(struct xfs_inode *ip, loff_t pos, size_t count); /* from xfs_iops.c */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index d7782ae..3ccc28e 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -756,6 +756,7 @@ xfs_setattr_size( int error; uint lock_flags = 0; uint commit_flags = 0; + bool did_zeroing = false; trace_xfs_setattr(ip); @@ -799,20 +800,16 @@ xfs_setattr_size( return error; /* - * Now we can make the changes. Before we join the inode to the - * transaction, take care of the part of the truncation that must be - * done without the inode lock. 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. + * 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. */ if (newsize > oldsize) { - /* - * Do the first part of growing a file: zero any data in the - * last block that is beyond the old EOF. We need to do this - * before the inode is joined to the transaction to modify - * i_size. - */ - error = xfs_zero_eof(ip, newsize, oldsize); + error = xfs_zero_eof(ip, newsize, oldsize, &did_zeroing); if (error) return error; } @@ -822,23 +819,18 @@ xfs_setattr_size( * any previous writes that are beyond the on disk EOF and the new * EOF that have not been written out need to be written here. If we * do not write the data out, we expose ourselves to the null files - * problem. - * - * Only flush from the on disk size to the smaller of the in memory - * file size or the new size as that's the range we really care about - * here and prevents waiting for other data not within the range we - * care about here. + * problem. Note that this includes any block zeroing we did above; + * otherwise those blocks may not be zeroed after a crash. */ - if (oldsize != ip->i_d.di_size && newsize > ip->i_d.di_size) { + if (newsize > ip->i_d.di_size && + (oldsize != ip->i_d.di_size || did_zeroing)) { error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, ip->i_d.di_size, newsize); if (error) return error; } - /* - * Wait for all direct I/O to complete. - */ + /* Now wait for all direct I/O to complete. */ inode_dio_wait(inode); /* -- 2.0.0 From sandeen@sandeen.net Wed Feb 18 17:14:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D5C897FA9 for ; Wed, 18 Feb 2015 17:14:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5A69304032 for ; Wed, 18 Feb 2015 15:14:18 -0800 (PST) X-ASG-Debug-ID: 1424301256-04cbb01164484150001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3zOvdVAvnsAYfoG9 for ; Wed, 18 Feb 2015 15:14:17 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7615665FC669; Wed, 18 Feb 2015 17:14:16 -0600 (CST) Message-ID: <54E51CC7.8040709@sandeen.net> Date: Wed, 18 Feb 2015 17:14:15 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures In-Reply-To: <1424298740-25821-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1424301256 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/18/15 4:32 PM, Dave Chinner wrote: > /* > - * If the write of the buffer was synchronous, we want to make > - * sure to return the error to the caller of xfs_bwrite(). > + * Repeated failure on an async write. > + * > + * Now we need to classify the error and determine the correct action to > + * take. Different types of errors will require different processing, > + * but make the default classification "transient" so that we keep > + * retrying in these cases. If this is the wrog thing to do, then we'll > + * get reports that the filesystem hung in the presence of that type of > + * error and we can take appropriate action to remedy the issue for that > + * type of error. > */ So, I think this is the tricky part. No errno has a universal meaning, and we don't know what kind of block device we're talking to. One device's ENOSPC may be another's EIO, and either may or may not be permanent, maybe ENODEV *isn't* permanent. (...is it always permanent?) My first feeble hack at this was counting consecutive errors, and hard failing after a set number. Thinking about that later, it seems like something time-based might be better than io-count-based. Can we really simply switch on an error? If nothing else, this might have to be configurable somehow, so that an admin can choose which errors for which device are desired to be "permanent." (I think that's accurately summing up irc-and-side-channel discussions) ;) Thanks, -Eric > + switch (bp->b_error) { > + case ENODEV: > + /* permanent error, no recovery possible */ > + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); > + goto out_stale; > + default: > + /* do nothing, higher layers will retry */ > + break; > + } > + > + xfs_buf_relse(bp); > + return true; From david@fromorbit.com Wed Feb 18 17:52:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A710B7FAB for ; Wed, 18 Feb 2015 17:52:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 866F78F8039 for ; Wed, 18 Feb 2015 15:52:25 -0800 (PST) X-ASG-Debug-ID: 1424303542-04cbb01165486df0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XqR6pXsKnHPQRiUY for ; Wed, 18 Feb 2015 15:52:23 -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: A2DuDwANJeVUPDkjLHlbgwaBLII5g32pVwEBAQEBAQaYOgQCAoEeRAEBAQEBAQUBAQEBODuEDAEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIJwfTFAEBCAIgGIVshQuEbgeEKgWNVosoimeILIQkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Feb 2015 10:22:22 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOEPk-0000Pt-IG; Thu, 19 Feb 2015 10:52:20 +1100 Date: Thu, 19 Feb 2015 10:52:20 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150218235220.GQ4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <54E51CC7.8040709@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E51CC7.8040709@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424303542 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 05:14:15PM -0600, Eric Sandeen wrote: > On 2/18/15 4:32 PM, Dave Chinner wrote: > > /* > > - * If the write of the buffer was synchronous, we want to make > > - * sure to return the error to the caller of xfs_bwrite(). > > + * Repeated failure on an async write. > > + * > > + * Now we need to classify the error and determine the correct action to > > + * take. Different types of errors will require different processing, > > + * but make the default classification "transient" so that we keep > > + * retrying in these cases. If this is the wrog thing to do, then we'll > > + * get reports that the filesystem hung in the presence of that type of > > + * error and we can take appropriate action to remedy the issue for that > > + * type of error. > > */ > > So, I think this is the tricky part. > > No errno has a universal meaning, and we don't know what kind of block device > we're talking to. One device's ENOSPC may be another's EIO, and either may or > may not be permanent, maybe ENODEV *isn't* permanent. (...is it always permanent?) When a device is unplugged and then plugged back in it comes back as a different device. So, AFAICT, if the device goes away then we'll never be able to recover because the underlying block device never comes back... > My first feeble hack at this was counting consecutive errors, and > hard failing after a set number. Thinking about that later, it > seems like something time-based might be better than > io-count-based. Possibly. IOs usually timeout after 30s, so EIO is going to have to be delayed at least for long enough for things like FC transport reconnect periods (worse case is 240s, IIRC) regardless of the number of IOs... > Can we really simply switch on an error? If nothing else, this might have > to be configurable somehow, so that an admin can choose which errors for > which device are desired to be "permanent." Well, the switch is simple characterisation. What we do with that error type can be much more complex, and that's why I haven't tried to address those issues here. When we've sorted out what we need and how we are going to configure the error handling, then we can add it. e.g. if we need configurable error handling, it needs to be configurable for different error types, and it needs to be configurable on a per-mount basis. And it needs to be configurable at runtime, not just at mount time. That kind of leads to using sysfs for this. e.g. for each error type we ned to handle different behaviour for: $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/type [transient] permanent $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_timeout_seconds 300 $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_max_retry_attempts 50 $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/transient_fail_at_umount 1 And then have generic infrastructure to set it up and handle the buffer errors according to the config? > (I think that's accurately summing up irc-and-side-channel discussions) ;) Pretty much. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+aaae1836a4409bf554cc+4197+infradead.org+hch@bombadil.srs.infradead.org Wed Feb 18 18:41:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 718147FAD for ; Wed, 18 Feb 2015 18:41:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F7B78F8033 for ; Wed, 18 Feb 2015 16:41:44 -0800 (PST) X-ASG-Debug-ID: 1424306499-04cb6c6b0c4e8d30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id yqSId3k8BsThuDDp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 16:41:40 -0800 (PST) X-Barracuda-Envelope-From: BATV+aaae1836a4409bf554cc+4197+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 1YOFBT-0001DV-AC; Thu, 19 Feb 2015 00:41:39 +0000 Date: Wed, 18 Feb 2015 16:41:39 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: introduce mmap/truncate lock Message-ID: <20150219004139.GA2916@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: introduce mmap/truncate lock References: <1423083859-28439-1-git-send-email-david@fromorbit.com> <1423083859-28439-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083859-28439-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424306499 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Is there any real benefit hiding this lock behding the ilock/ilock wrappers over just acquiring it manually? From thompsonchik@ultrasexe.com Wed Feb 18 20:59:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A5007FAF for ; Wed, 18 Feb 2015 20:59:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16B688F8033 for ; Wed, 18 Feb 2015 18:59:18 -0800 (PST) X-ASG-Debug-ID: 1424314754-04cb6c6b0c4ee920001-NocioJ Received: from cp422.agava.net (cp422.agava.net [80.78.250.64]) by cuda.sgi.com with ESMTP id bxhmNqEV1lXLha5V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Feb 2015 18:59:15 -0800 (PST) X-Barracuda-Envelope-From: thompsonchik@ultrasexe.com X-Barracuda-Apparent-Source-IP: 80.78.250.64 Received: from [4.59.119.86] (port=32951 helo=RICHMONT.ear1.Dallas1.Level3.net) by cp422.agava.net with esmtpa (Exim 4.82) (envelope-from ) id 1YOHKY-003V1g-Is; Thu, 19 Feb 2015 05:59:13 +0300 Message-ID: <5E5BEDBEB56145C61A1F56DC585683E7@chglx> From: =?koi8-r?Q?=E9=CE=CE=C1_=E1=CC=C5=CB=D3=C1=CE=C4=D2=CF=D7?= =?koi8-r?Q?=CE=C1?= To: , , , Subject: =?koi8-r?Q?=F0=D2=C9=CE=D1=D4_=CE=CF=D7=D9=CA_=D2=C5=C7?= =?koi8-r?Q?=CC=C1=CD=C5=CE=D4?= Date: Thu, 19 Feb 2015 03:58:59 +0100 X-ASG-Orig-Subj: =?koi8-r?Q?=F0=D2=C9=CE=D1=D4_=CE=CF=D7=D9=CA_=D2=C5=C7?= =?koi8-r?Q?=CC=C1=CD=C5=CE=D4?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_039A_01D04BF8.63F61A70" X-Priority: 3 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp422.agava.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - ultrasexe.com X-Get-Message-Sender-Via: cp422.agava.net: authenticated_id: borisov@inatek.ru X-Barracuda-Connect: cp422.agava.net[80.78.250.64] X-Barracuda-Start-Time: 1424314755 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. ------=_NextPart_000_039A_01D04BF8.63F61A70 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: quoted-printable =E9=DA=CD=C5=CE=C5=CE=C9=D1 =C9 =C4=CF=D0=CF=CC=CE=C5=CE=C9=D1 =E7=D2=C1=C4= =CF=D3=D4=D2=CF=C9=D4=C5=CC=D8=CE=CF=C7=CF =CB=CF=C4=C5=CB=D3=C1 2014 - 2= 015 =C7=CF=C4=CF=D7 =CB=CF=D2=C5=CE=CE=D9=CD =CF=C2=D2=C1=DA=CF=CD =C9=DA= =CD=C5=CE=C9=CC=C9 =D0=D2=C1=D7=CF=D7=CF=CA =D3=D4=C1=D4=D5=D3 =D5=DE=C1=D3= =D4=CE=C9=CB=CF=D7 =C9=CE=D7=C5=D3=D4=C9=C3=C9=CF=CE=CE=CF-=D3=D4=D2=CF=C9= =D4=C5=CC=D8=CE=CF=C7=CF =D0=D2=CF=C3=C5=D3=D3=C1. =F0=D2=C9=C7=CC=C1=DB=C1= =C5=CD =F7=C1=D3 =CE=C1 =CD=C5=D2=CF=D0=D2=C9=D1=D4=C9=C5, =CB=CF=D4=CF=D2= =CF=C5 =D0=CF=CD=CF=D6=C5=D4 =D0=D2=CF=C1=CE=C1=CC=C9=DA=C9=D2=CF=D7=C1=D4= =D8 =DC=D4=C9 =C9=DA=CD=C5=CE=C5=CE=C9=D1 =C9 =CF=D0=D2=C5=C4=C5=CC=C9=D4= =D8 =D3=D4=D2=C1=D4=C5=C7=C9=C0 =D0=CF=D7=C5=C4=C5=CE=C9=D1 =D7 =CE=CF=D7= =D9=C8 =CF=D2=C7=C1=CE=C9=DA=C1=C3=C9=CF=CE=CE=CF-=D0=D2=C1=D7=CF=D7=D9=C8= =D5=D3=CC=CF=D7=C9=D1=C8. =F0=D2=C9=C7=CC=C1=DB=C5=CE=C9=C5 =F7=D9 =CE=C1=CA=C4=A3=D4=C5 =D7=CF =D7= =CC=CF=D6=C5=CE=C9=C9. ------=_NextPart_000_039A_01D04BF8.63F61A70 Content-Type: application/octet-stream; name="gradprav_2015.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gradprav_2015.docx" UEsDBBQABgAIAAAAIQDzw/lWjQEAAMEFAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 VEtPwkAQvpv4H5q9mnbBgzGGwkHxqCRiPC/baVnsPrKzKPx7Z0EbJEBR9NKknZ3vMd35eoOFrpM3 8KisyVk367AEjLSFMlXOnsf36TVLMAhTiNoayNkSkA3652e98dIBJtRtMGfTENwN5yinoAVm1oGh Smm9FoFefcWdkK+iAn7Z6VxxaU0AE9IQMVi/dwelmNchGS7o81qJhxpZcrs+GLlyJpyrlRSBlPI3 U2yxpJ8MGXWuzuBUObwgGYzvZIiV/QT7+2au2upTOjqbOagi1SNN06sCkpHw4UFoUs7frS94YeVc k+3sMPMOa7YslYSmP6I5byUg0m/SddZUtFDmy/JeHRiWNeDfq1jjHkn/osJ0WJYg6X60z0NjGk1n a4qN3nY2CIGGdAzJ91ubtg0dP5FbJbzD5OnfVGyAtwopaZvGYlLDERP/4TAa6FYRgSIC+OrZPVnH CuYQJW3GyFuHFDn+F7a/MiV2p7RyDnxQ0KTKrhVrGCmuTvYHMRALKHZw81UA9z8AAAD//wMAUEsD BBQABgAIAAAAIQAekRq38wAAAE4CAAALAAgCX3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9h yH032woi0tneSKF3IusDhJnsAXcOzKTavr2jILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99r eG23iwdQWchbmoJnDUfOsGlub9YvPJGUoTyMMaui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1 jKu6vsf0VwOamabaWQ1pZ+9AtcdYNl/WDl03Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDP JZ2RYqwKNuBpotX1RP9fi46FLAmhCYnP83x1nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD/ /wMAUEsDBBQABgAIAAAAIQB4LeSCOwEAAD0EAAAcAAgBd29yZC9fcmVscy9kb2N1bWVudC54bWwu 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 2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAz/wAARCAL9AfIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl 8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0 9fb3+Pn6/9oADAMBAAIRAxEAPwD9ZP8AgsNrWk+Fv+Cc/wAQ9Z1rXPD/AIbttBbTNWt9R1o34s7e 8ttUtJ7ME2Nza3KyNcxwpGyToFkaMvuQMrflB4B1jxn468M6n4T0L4QajLpaWX/CJ+KbfR7nW9bj 0TVZ4r6O7vDN/aF1YQ2lhqFppqwiGDUTKBqLJGJ5LqzT9aP+CuFjruuf8E8/iHo/hjwta+MPEfiR dP0HTLK405dRS0uL7UbW0j1DyHR1drJpheKGXaGtQSyAb1/Iv4eWHxK02bT73QfB8lzp/wAZ/Dt9 pvxQ8SXeiSQaveyvptxq+qS3WkQ2hLytb3iWsspsdWtUu3EaKbnJvADh9T+EXwu8W/CTxB4e+Cfi fwT4jHgnxLe6n4M16C3SC+ttQisp75rtbea5n0aW0hsImkmFpDb3azafJKlrtukZPoz9kP4j+D/j 5+0pFpnjYSRePfDfizSrCbW9Vg8Q6LD4outP1a00y4C6e2ssYp4n07TEdUWdZJdStJbi3jRLlV8V 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 aAJvDGvWfijw9Zalp8onsL+CO4tpQCPMjdQytzzyCOvNadcP4dgbwB8Q7vR2Vl0nxDJLqemvj5Yr okvd2+fV2JuEGSWLXPRYxXcUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABX44/8FXP+Db/4rfHL4waz8Qf2bvjhrfgt/Ely9/qXg3WvEWo2ul21 y5Z5ZLGeAyGJHc7vs7R7EZm2OibY0/Y6oypPagD+ej9mb/g14/bK8YeP7I/Fb9oyfwb4SjlBvTov i3U9W1WZAclYY2EcKlhkb3kOzOfLfG0/sv4u+Beh/s5/s3eC/A/hoX66L4ahvrWFry6a6urn/iS6 mXlmlb5pJZJHaR3PLO7HvX0BtI964r4/fD/VPiH8N7200OSzi12COWTT/tjMls8rQyQskrKrMqPH LIm9UYoWDBWK7SAeO/tX/sJaH/wUG/Y2n8Dap4h8S+ENRe+udU0TxHoF9JaX+iX3nXASZdjKJYys siPCx2ujtgo4SRPxc+JH/BsN+3r4d8bTWfhv4/aV4k0JpWFtqMvjjV7CXy8kK00DRt5bY5Ko8oGf vGv6JfA3ht/CPhKw0153u5LOEJJO0YQzv1eTaOF3MScDgZx2rV2k9RQB+bf/AARh/wCCFvij9gPx MnxB+Mfxd1/4q/EdYHhsLKPVb2fQfDvmI0ckkIuGD3EzRs6CV44wqSOoTJ31+lFRhSOxqSgAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKK4H4yftNeEPgJ4p8GaL4luNbh1L4gak+kaFDp/ h/UNUF5dJE0zRs1rBKsOIkkkzKUXZFI2cIxDv2c/2lPCP7V3w5PizwTc61d6GL6503zdT0DUNFm8 +3kMUyeRewwy/JIrITsxvR1zlWAI63a6f1+qCXutKWl9vPf/ACf3Psd5RRRQAUUVDqN8ml6fPcyr M0dtG0riGF5pCFGSFRAWduOFUEk8AE0m0ldjSbdkTUV4n8F/+CiPwj/aA1/wtpPhjxDq0+p+NI9Q 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 j3LmLyjblxuAKGPPy7a6DwL8I/hp4k/Z88WSXN/omtT+CPO1LU7iyFgfDdxqU2kRxM9sscap5S4V h8qMswb2FQ52hOf8v46Rf6/l30qMbzjD+b/Nr9Pz7a/aNFfCXxA+Dvw08Kfs+/D3X9PuvA1je+M7 /Q3Mmqw2k2mQNDb+XcSCMbNyFjmfLnLD5iOlbem2/gLRv2F/i5paah4a1aa0thLql5a/Yv7Dn1Z9 PgCHT/KVEA3omBsVhLuwOlXV9xVH/Jp62t/n99u+k0vf9n/fV/Tf/L8+2v2lRXwl478BeGG/Zc8S eLd3wq0jRrzSrDSrXTtDvIr6xuNRjmWT7VKxjhT7WI3kQoqFwhfMhBwO4+G1t8NE8R/ECxvrH4V6 94SXwtFeaxrPg7SHt9OhijmlPkT28c1xEZxgyo6MJcJ935UNOpHlk49r/hd/K6V9ej76Cpy5kpd7 fi0vnq7eq7an1rRXyl8BPhR4W8YeC5/GfinT/Dd34d8H6FN4W0O+vbOFLS9sYXk36gd6hQsilVB4 AAmIyJCTy/7FngPwr4i+GXh3xHe/8Ks0jw94d0GW18SC0vYribWROBtXVUaOOOIIY94WQykt0ZQD uT05vJX+XvW9L2Xpe3QE9vPT8r272u/W1+p9q0V8zfsK/B/4e+JPht4H8YaDDoMfiHw4l3Ddz6Ql sJJpJd6GO6ZFLkiNlZVLAjIPINfTNVJWdgTuFFFFSMKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqDVdNj1jTLi0madIrqJ onaCd4JVDAglZEIdG54ZSCDyCDU9FDV9GCZzfwt+Euh/BjwydH8PQXtrpvnPcCG41C4vdjucttae R2UE5YqCBuLHGSSekooobBIrazYSarpFzbQ3lzp8txE0aXNuI2ltyRgOokVkLDqNysPUGua+Cfwj i+B/gO18O2uta1rOn2CiO0OpC28y2jAwIwYYYsjqcsGbJPOMAddRQtL+YBRRRQAVnWvhPT7PxTea 1HbAapf28VpPcFmZmiiZ2RACcKAZHPAGS3OeK0aKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+afhv8WPjp8U9TtfHWnX 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 NPubS+Qx3iXls1yYb5pVOGkuklc7E+bKJtr63/wTG+FPir4Za74N1mb4s694a8SpDHqFjq3xa8Wa gkyREssatNqTtGhJ+ZUKq4ChwwUAfM/7Vn/BYHWfhh8PfBN/p/xU/Zw+G3iXVvhvqPjbU9A8Xo+p z3dzCtq1lb2hGqWEix3omlMJeJ3dYSQhwwXn7f8A4LO+Lk8D+F7yf4k/s5w6LfeN9U0DU/iPf2Mu m+F7q3tXulgttNgk1hmu53jto55boXX2eBb62jCzSF9hUnyNzk9na/mpNb9Nb7210+JpPSNOUoqf Sze/ld276Lpfa+yufXFx/wAEv/hC3iPWtXtLb4iaLqniDVbvWr260X4meJtKle5u3WS5KNbX8Zij ldEd4Y9sTNHGSmUUih8Qv+CU3wl+KV2DrEvxMFhb+Hl8K2Omab8Rde0iwsNNMaJLbrDZ3cSyCfy4 2mM/mNM0aFy20V8Z+Kv+C+Xi628DfAx1134B+E7nx9JHaeIPFHiC5dvDsxuMqt7pgW/QyW9oRm7V 5m8qbFq0sbCSeP3Mf8FKvES/Ba51GP4ofs9ahpcXjOHw03xitoJj4Csrd9Oa9aWe3GosFlWZUsdp 1MRmW4hYyq7C1NTouKcXtF8vo1aNvKylbW2l0tmjKEveut2m36ayfrs27X11Z7b4Y/4Jp/C3wz4Q 8MaUE8d3lx4XubzUU1aXxzrUeq6tf3lt9mur6/uYrpHvLl4f3YknL+Uh2RCNAFHES/8ABE34DJe6 NNaQ/FayOh3kV7bovxV8TzJvit0t4sCa/fymjSG28uSLZLEbWDY6iMCvJvjN/wAFI/iT8OPgR4M8 Zr8bv2OYPD2taxNpE3jCF5NU0HV3OqWVpCtqp1m2aOaO1mvLu4jEtykQtTGZAB5rWP2ev+Cvmu6d +1s/wk+LN14B1jXNUn0XTtLHgu40i2eC4vbeOQzS28+vz39zC/nRyL9kspEhibc8rhZGSopylG28 mrevRNdPJO26to0Ju0X2V/zs7d9XdtX1v1PqGX9g34fXXw2j8LXNx8Sb6yttUOsWmoXnxJ8R3Ot6 dcmEwM1tqkl819bo0RdGjhnRGWSQFSJH3eifC34Z6b8HvA1l4e0m58Q3dhYbzFLrevX2uXzb3Zz5 l3ezTXEnLEDfI21cKMKAB0FfNf8AwUg/ap8S/sn6R8N9R0fxd8KvA+ieK/Ex8O6zrfj2yupdN0dJ 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 NTaAzrZnUha/YRMYwx2GfOVK/eBFcxpf/BZL9njXr7XYdO8Y+INUi8LXctrrl5Y+CNeurHQxHI0b XN3dR2TQW1oWSXbdyutu4gmKyMIpCswalZx1vqvNaa/ivvXdA01dPpo/J6q33p/c+x9QUVhTfEXT YvGOlaGqatcXWtWct9a3NvpN1Pp3lRlM+ZeJGbaJ28xSiSSK8gDFFYKxG7Tt/X4fmSmnt/XUKKKK BhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV8M/twfs/ax8W/wBqHU9ck+G37UPia1s9 Ai0LT7nwjqfgG20WMia31CK9tP7SvItRS6t72GCRXl2oJbUYR4mIk+5qKVveUuqvbyumn+DaDo4v Z2/Bpr8Umfkn8LfgV+0P4l+MfxZj+KvwF/aSvPht468RWmtS2uj+O/h69z41jtLSwtIk1iFZrY2z P9gE0g066ijbz2hZHjXc3S6D+xJqXg39p9fi5oHwT/bA0LxjHq1/q0d5bD4OyXhN4JVlgmv5bh9Q uoQkzIq3V1KVVY8NlFI/UeimtFFL7Kt8rJfkkvRBL3nK/V3+7/gu/e/yPzXi/Z08Y3H7IPjz4K6n 8LP22db8LfEG+ub++ur3UfhMb61a7vJb29SEpeLCUuZ5pC4lik2htsZjAApnhv8AZr8X/Dm/tbzw X8L/ANubwVeaXBPYaVNpviD4XXA0iwuCklzYQR3eoTxi2kuIo51R1Y27rttjbws0R/Suii2rl1at 8rWt6W0fdN33dx6792/m3e77u+t3s7NbI+V/gp8Z/FH7P3wn0DwX4a/ZH/aGt9D8OWaWdos+veCp 5nVerySN4iLSSOxLM7HLMzE8mvmn4l/sYXPxY/azv/jFq/wA/ayfxPf6zZawdg+EQms/sghWG2td RN2dUtYdkKqfIvY5CGc7wzlj+n1FO79oqv2l/XoKy5HT6PQ+Tv2g/jL8QP2hfgj4o8DXP7NX7Tfh uz8WadLpd1qGj6v8PvtsEEq7JRH9p1uaIFkLJlo2wGJGGAYfFn7UH7MP7R+u/tO/DD4k/Dv4O/tR atqXhv7Faa3N4i8afDPSZbaCx06+srO5skt/tKSXavql7O4nxAxYxmIo6fZ/2EopR92XMvL8L2+6 72s1umW5NwcHs018pWv+S+5H5y2fwJ8U+GTZ6t4Y+Df7a3hL4gefqM+reNrDxD8NLjWfEf294pLp LuO61Oax2F7e3KLDaxeQIFWHy0LqzPgZ+zvqvwH8e6pqVt+z5+1r4l8Nax4ftPDF14O8Q6j8L7/Q 57G0e4ltkkJ1IXcrJNd3MpkkuHeR5mMhkwoX9HaKE2laOitZdktdEtkld2SVld9yGrpp9dX5u6d3 3d0nd9l2Pyg/ZG+DHx5sUuj8Zv2bf2hoNM0/xxqvjfR/CvhT4ieCLvQ2vby/vLyK7lla8sr9J7f7 UFWMXUluzwrN5aOABz+jf8ErB4Y1JrvR/hB+2foVzNDBBdzaZB8E7OXU1gu4LyNrySNw95ILi2ic y3DSSMQ+5mEkgb9f6KUUotOKtb/K1/Wyt6JLZJK5ycpSlLeTb+9uWnZczbt3131PyhT/AIJ56hFr kkkfwr/bvj0SXVk1Z9FHiX4XGBnWzexC/ajf/b8/ZZHj877V9o3N5vneeBMOPtv+CPPh6HxZq+v3 H7Pv7WOta3r0pkvbzXtM+COulhveRUijvnmigVWllP7lEZg4Vy6xxBP2Oop9ebq9L9beor+7ydO3 TTt2+R8raF8fvib4b1Dw39i/Zz/aZt9H8O6WdMOjRXvw4isdRO2NY55QmsCSOSMRkKtu8MOJGBjY BNn1TRRVSk5O7/q+v9fdsRGKirL+ugUUUVJQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXB6L8dYPGXxn1Dwj4f02fWIPDZMXiPWUnjSy0e5MS SR2PUvLdMkschRV2Rxtud1Zo45K37Wf7N+l/tb/s8+J/h/q17e6XDr9sBbajZsVuNKu43WW1vIsE ZkgnSKVQTjdGtW/2bf2ftF/Zf+DOjeC9Cmv7620xXkudR1CRZb/WLuV2lub26kVVElxPM8ksjBQC znAAwAR3bl0287/5fnbdXQT2XL138kv8/wAlLZ8rO4mmS3heSR1jjQFmZjgKB1JPpWJ4e+KHhnxb 5X9leItC1Pz9Nh1mP7JfxTeZYzbvJuxtY5gk2PtkHytsbBODWlr1i+qaHe20ZUSXEDxKW6AspAz7 c18QfB3/AIJFan8NPgb4w8HjxRdCTxt8HtN8BXlzf+JdW8Qx22qQJeLO8MV9I3laeftCAQQmJSu9 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 i++C8DfDj/hDNBv/ABFr2g+K5tcvR4h1u71G21JIYbyBbIJaMJNTdZryK4uHkjhO2BDNiLT8L/8A BLHxd4x0DRbPxZeL4Zsk+IS+K7+00j4l6/r+qW9unhy80tTHr13FBf3MrzzQMYJsQpCjxZdGMbU9 FJrXa3S+2tnt1XLe6aTfuu6z6K+jtK/WzSdo6b3aXvba2Wq1+rPG37Yvwi+Glv4Ym8R/FP4ceH4v G3/IuvqXiWytF17lB/ohkkH2jmSMfu93Lr6im+J/2yvhB4J+MNt8PNa+K3w20jx/eywwW/hm98TW VvrE8k2DCiWjyCZmk3LtAXLZGM5r5G+JP/BMz4keMLnQdT1fSPCPji8vPh9pvgTxJpOmfFfxN8M9 JC2El5iSKPRrZ4rqC4jvGBtpoI0tyjLGzpIQv1P4g/Z6vr/9pP4e+KrGe0s/D/hDwXrvhmaE3Mr3 iyXs+kPA0ZZTvVE0+YMzuGy0fDZYqNW1WqvLyukpNb6q7UVezXveWrteSW10vOzsr7bpNtdHpfVP TQ0b9tD4O+I9d8RaXp/xY+Gl/qfg+ZbbXrS38T2Ms+iStOLdY7pFlLQMZyIgJApLkL97iqEn7fXw Ji+G8HjJ/jV8JV8IXLSpDrh8X6eNNlaKSKOQLced5ZKSTQowDfK0sYOCwB+B/GP/AASy8ffB79n/ AETRU8B6R4v1XwVdeGtF8P6xN8WPFviiC/hj8R6M0rzeHLuBrPTbR4LXzpxbTSi3SHau5F3L6Re/ s5fHzwr/AMFBNC+LFr8P/hRqfjHxPpXiS4vdNbXdRHh3Q18jw5Y24/tgaWZTfTJayvlrJN8SSQqM RmYiV9nf4le1r8sVJaPX3trOzjuy+Rcz7Xf3W+75rR7LU+4rv44eCtPtWnn8X+F4IEisZ2kk1WBV WO+l8mycktjbcSgpEekrfKm48Vx3g/8Ab4+BXxCm8QR6B8afhNrknhOym1PXF0/xfp9ydGtYTiW4 uQkp8mJCQGd8KpPJFfLH/Dn/AMViDw3aS+KfDd1pfhTQfBlra2CRTW1vc6npGrTXc9yy7X2QRQTz JawjdhpQXIMUbj2D4rfsYeLvFOl/GO50u58LXGpeLPiHoPj3w9Y6jPMthef2VaaKgs79liZollm0 uQb40m8sPFJtdlMVOy52m7K789OaKT030cpWW6jZWb0iKTWm+nlfS7Wu2ul3t1Ttr6Tcft5/A20+ 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 EARQTyv7OP7P/wC134f/AGovC+ofEDU/Gd3pllbRxXF/Y3puNIlg/sry3t7iOTxSsaym8Mr+aujX UykxYumUEx/pTRTqrnfM+1vwS/Jeju01ZtExSjHk87/i3+bv3TSs9D4T8O/CT9r7wr8P9Jk1bX9I 8YeIbXRfB0Vpb2LTaHBbXEGph9TTUJJNTuzduLc5nniEf2hFZUjdiFrC+H/7HH7TGjfta+FvFGr+ O/F+q+FvDfixxqCXnii8Ua9YTXOqzSXCWcGopYxWyiazUQT2lxMAESMwpAN36E0VfO+dVFupc34x dvT3bd2m7tuzRNc0JQf2kl90XH9b+UkrWWh8WfG/4Q/HnVf+CsHg/wAVaCnjG4+EdpZabHcfZfEb 2mjwFf7QF6J7cavGjOVltmAbSLwylI1W4tNpkSr+0T8Hf2hNZ/4Kj+G/FHhL/hK5PhjbaZYRB4vE UlpodtMo1Fbv7TbDVo1YnzbVsNo960pSNVntdpkX7doqErRjH+Vt+eu69Px13Kk7uUn9qKj919fX X00Wh+XHwu0D9qD4JfBrxlo/jXSfi/r/AIt+JcumeHLO3sNWtoZGu2+0zapqOmXl34vvDbsLOK4a NY10uPeLbZAhysehoHhX4vfEXwJcaFB4N/aXlj8Bah4k0SHRIPitBaa7oup3U9vqOjXmpaj/AG5n ULSHT7uKPy2u7rYwdWt5RtK/pvRQ1fftZW0t22/l97l6xbTi1yxSXTl80++vXfpLTmW0tea92fB/ ij4GftVv4/1q7i13UrrTtd1Sw1a6+yeIxAtrJpAtBHBZxM6rDb6m3mtNENilbd1kAM5JXxR+yv8A En4lfCL4p6VqOmfH3TfiXJqb31h4ms/i5eadoeuD7fMYF0y3tNYU2USWciq8MlrbIxVc+c6LJX3f RVPXlutlb12V/XRbWWi0JUWr6vXz28vx3evmfm9qv7Mf7Ung39qj4xP4JvPHX/CLTeHL/TvA+o65 4zutQ02L/iU2UVn8txrc7TXIuopsmTTbWUtJJK+oSZ8t/oL/AIJZ/Dr4ofDX4S+JbT4nf8Jpb3Nx rXn6ZZ+JZTcXNpB9niVvLnfxFr80kbSKzYlvF2sXCxKpBP0/RThJxilv7qj5uzvd+be76hKKlJv+ 85el1ay8ktl09AoooqSgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK 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 ------=_NextPart_000_039A_01D04BF8.63F61A70-- From david@fromorbit.com Wed Feb 18 22:32:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A74447FB1 for ; Wed, 18 Feb 2015 22:32:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 683D18F8037 for ; Wed, 18 Feb 2015 20:32:03 -0800 (PST) X-ASG-Debug-ID: 1424320319-04bdf06a5b4e32b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WTa2cQF1iyKdG0hl for ; Wed, 18 Feb 2015 20:32:00 -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: A2B5FwDnZeVUPDkjLHlbgwZSWoI5rVcBAQEBAQaBSZB8CoVrAgIBAQKBHkQBAQEBAQEFAQEBATg7hAwBAQEEAQEBJBMcGBsIAxUDCSUPBRMSAwctiC4O0l4YhWyFC4JhggIShCoFhV6NQH2EZ4EaiT+BdoZJgiQcgWQqMYECBIE9AQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Feb 2015 15:01:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOImK-0000v1-Pa for xfs@oss.sgi.com; Thu, 19 Feb 2015 15:31:56 +1100 Date: Thu, 19 Feb 2015 15:31:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Message-ID: <20150219043156.GQ12722@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support References: <1423653330-25297-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423653330-25297-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1424320319 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15517 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ping? On Wed, Feb 11, 2015 at 10:15:30PM +1100, Dave Chinner wrote: > From: Dave Chinner > > Add a basic implementation of RENAME_WHITEOUT to the XFS rename > code. The implementation options considered are documented in the > code comments; the method chose was "copy ext4" because we are then > bug-for-bug compatible with the implementation done by the > overlayfs developers. > > I have a hacky renameat2 test for whiteouts copied from the existing > renameat2 tests in xfstests, and this code behaves the same as ext4 > in that rename test. I haven't done any testing with overlayfs, so > who knows whether that explodes or not. > > The rename code is getting pretty spaghetti now - I'll end up > spliting this patching whiteout support and cleanup, and I'll set > what possible cleanups I can make that will help make the code a > little more understandable.... > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_inode.c | 261 +++++++++++++++++++++++++++++++++++++++++------------ > fs/xfs/xfs_iops.c | 2 +- > 2 files changed, 205 insertions(+), 58 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index bf2d2c7..eef5db7 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2683,17 +2683,20 @@ xfs_remove( > */ > STATIC void > xfs_sort_for_rename( > - xfs_inode_t *dp1, /* in: old (source) directory inode */ > - xfs_inode_t *dp2, /* in: new (target) directory inode */ > - xfs_inode_t *ip1, /* in: inode of old entry */ > - xfs_inode_t *ip2, /* in: inode of new entry, if it > - already exists, NULL otherwise. */ > - xfs_inode_t **i_tab,/* out: array of inode returned, sorted */ > - int *num_inodes) /* out: number of inodes in array */ > + struct xfs_inode *dp1, /* in: old (source) directory inode */ > + struct xfs_inode *dp2, /* in: new (target) directory inode */ > + struct xfs_inode *ip1, /* in: inode of old entry */ > + struct xfs_inode *ip2, /* in: inode of new entry */ > + struct xfs_inode *wino, /* in: whiteout inode */ > + struct xfs_inode **i_tab,/* out: sorted array of inodes */ > + int *num_inodes) /* out: inodes in array */ > { > xfs_inode_t *temp; > int i, j; > > + ASSERT(*num_inodes == 5); > + memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *)); > + > /* > * i_tab contains a list of pointers to inodes. We initialize > * the table here & we'll sort it. We will then use it to > @@ -2701,20 +2704,19 @@ xfs_sort_for_rename( > * > * Note that the table may contain duplicates. e.g., dp1 == dp2. > */ > - i_tab[0] = dp1; > - i_tab[1] = dp2; > - i_tab[2] = ip1; > - if (ip2) { > - *num_inodes = 4; > - i_tab[3] = ip2; > - } else { > - *num_inodes = 3; > - i_tab[3] = NULL; > - } > + i = 0; > + i_tab[i++] = dp1; > + i_tab[i++] = dp2; > + i_tab[i++] = ip1; > + if (ip2) > + i_tab[i++] = ip2; > + if (wino) > + i_tab[i++] = wino; > + *num_inodes = i; > > /* > * Sort the elements via bubble sort. (Remember, there are at > - * most 4 elements to sort, so this is adequate.) > + * most 5 elements to sort, so this is adequate.) > */ > for (i = 0; i < *num_inodes; i++) { > for (j = 1; j < *num_inodes; j++) { > @@ -2846,6 +2848,101 @@ out: > } > > /* > + * RENAME_WHITEOUT support. > + * > + * Whiteouts are used by overlayfs - it has a convention that a whiteout is a > + * character device inode with a major:minor of 0:0. Somebody has to be in an > + * altered state of mind to think this up, so whiteout inodes from this point at > + * called "wino"s. > + * > + * Now, because it's not documented anywhere, here's what RENAME_WHITEOUT does > + * on ext4: > + > +# echo bar > /mnt/scratch/bar > +# ls -l /mnt/scratch > +total 24 > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > +-rw-r--r-- 1 root root 4 Feb 11 20:22 foo > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > +# src/renameat2 -w /mnt/scratch/foo /mnt/scratch/bar > +# ls -l /mnt/scratch > +total 20 > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > +c--------- 1 root root 0, 0 Feb 11 20:23 foo > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > +# cat /mnt/scratch/bar > +foo > +# > + > + * In XFS rename terms, the operation that has been done is that source (foo) > + * has been moved to the target (bar), which is like a nomal rename operation, > + * but rather than the source being removed, it have been replaced with a wino. > + * > + * We can't allocate winos within the rename transaction due to allocation > + * being a multi-commit transaction, and rename needs to be a single, atomic > + * commit. Hence we have several options here, form most efficient to least > + * efficient: > + * > + * - use DT_WHT in the target dirent and do no wino allocation. > + * The main issue with this approach is that we need hooks in > + * lookup to create a virtual chardev inode to present to userspace > + * and in places where we might need to modify the dirent e.g. unlink. > + * Overlayfs also needs to be taught about DT_WHT. Most invasive change, > + * lowest overhead. > + * > + * - create a special wino in the root directory (e.g. a ".wino" dirent and > + * then hardlink every new whiteout to it. This means we only need to > + * create a single wino, and rename simply creates a hardlink to it. We > + * can use DT_WHT for these, though using DT_CHR means we won't have to > + * modify overlayfs, nor anything in userspace. Downside is we have to > + * look up the wino up on every operation and create it if it doesn't > + * exist. > + * > + * - copy ext4: create a special whiteout chardev inode for every whiteout. > + * This is more complex than the above options because of the lack of > + * atomicity between inode creation and the rename operation, requiring > + * us to create a tmpfile inode and then linking it into the directory > + * structure during the rename. At least with a tmpfile inode crashes > + * between the create and rename doesn't leave unreferenced inodes or > + * directory pollution around. > + * > + * By far the simplest thing to do is copy ext4. It's also the most > + * inefficient way of supporting whiteouts, but as an initial implementation we > + * can simply reuse existing functions and add a small amount of extra code the > + * the rename operation to handle the *fifth* inode in the transaction. > + * > + * Hence that is what is implemented first. When we have time or need we can > + * come back and implement one of the more efficient whiteout methods, but it's > + * not necessary for the first implementation. > + */ > + > +/* > + * xfs_rename_get_wino() > + * > + * Return a referenced, unlinked, unlocked inode that that can be used as a > + * whiteout in a rename transaction. > + */ > +static int > +xfs_rename_get_wino( > + struct xfs_inode *dp, > + struct xfs_inode **wino) > +{ > + struct xfs_inode *tmpfile; > + int error; > + > + error = xfs_create_tmpfile(dp, NULL, S_IFCHR | WHITEOUT_MODE, &tmpfile); > + if (error) > + return error; > + > + /* Satisfy xfs_bumplink that this is a real tmpfile */ > + xfs_finish_inode_setup(tmpfile); > + VFS_I(tmpfile)->i_state |= I_LINKABLE; > + > + *wino = tmpfile; > + return 0; > +} > + > +/* > * xfs_rename > */ > int > @@ -2867,40 +2964,52 @@ xfs_rename( > xfs_fsblock_t first_block; > int cancel_flags; > int committed; > - xfs_inode_t *inodes[4]; > + xfs_inode_t *inodes[5]; > + int num_inodes = 5; > int spaceres; > - int num_inodes; > + struct xfs_inode *wino = NULL; > > trace_xfs_rename(src_dp, target_dp, src_name, target_name); > > + /* > + * If we are doing a whiteout operation, get us the wino we will be > + * placing at the target. > + */ > + if (flags & RENAME_WHITEOUT) { > + ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE))); > + error = xfs_rename_get_wino(target_dp, &wino); > + if (error) > + return error; > + > + /* setup target dirent info as whiteout */ > + src_name->type = XFS_DIR3_FT_CHRDEV; > + } > + > new_parent = (src_dp != target_dp); > src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > > - xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, > + xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wino, > inodes, &num_inodes); > > + cancel_flags = 0; > xfs_bmap_init(&free_list, &first_block); > tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME); > - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > if (error == -ENOSPC) { > spaceres = 0; > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > } > - if (error) { > - xfs_trans_cancel(tp, 0); > - goto std_return; > - } > + if (error) > + goto error_trans_cancel; > + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > /* > * Attach the dquots to the inodes > */ > error = xfs_qm_vop_rename_dqattach(inodes); > - if (error) { > - xfs_trans_cancel(tp, cancel_flags); > - goto std_return; > - } > + if (error) > + goto error_trans_cancel; > > /* > * Lock all the participating inodes. Depending upon whether > @@ -2921,6 +3030,8 @@ xfs_rename( > xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); > if (target_ip) > xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); > + if (wino) > + xfs_trans_ijoin(tp, wino, XFS_ILOCK_EXCL); > > /* > * If we are using project inheritance, we only allow renames > @@ -2930,18 +3041,19 @@ xfs_rename( > if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) { > error = -EXDEV; > - goto error_return; > + goto error_trans_cancel; > } > > /* > * Handle RENAME_EXCHANGE flags > */ > if (flags & RENAME_EXCHANGE) { > + ASSERT(!wino); > error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > target_dp, target_name, target_ip, > &free_list, &first_block, spaceres); > if (error) > - goto abort_return; > + goto error_trans_abort; > goto finish_rename; > } > > @@ -2956,7 +3068,7 @@ xfs_rename( > if (!spaceres) { > error = xfs_dir_canenter(tp, target_dp, target_name); > if (error) > - goto error_return; > + goto error_trans_cancel; > } > /* > * If target does not exist and the rename crosses > @@ -2967,9 +3079,9 @@ xfs_rename( > src_ip->i_ino, &first_block, > &free_list, spaceres); > if (error == -ENOSPC) > - goto error_return; > + goto error_trans_cancel; > if (error) > - goto abort_return; > + goto error_trans_abort; > > xfs_trans_ichgtime(tp, target_dp, > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > @@ -2977,7 +3089,7 @@ xfs_rename( > if (new_parent && src_is_directory) { > error = xfs_bumplink(tp, target_dp); > if (error) > - goto abort_return; > + goto error_trans_abort; > } > } else { /* target_ip != NULL */ > /* > @@ -2992,7 +3104,7 @@ xfs_rename( > if (!(xfs_dir_isempty(target_ip)) || > (target_ip->i_d.di_nlink > 2)) { > error = -EEXIST; > - goto error_return; > + goto error_trans_cancel; > } > } > > @@ -3009,7 +3121,7 @@ xfs_rename( > src_ip->i_ino, > &first_block, &free_list, spaceres); > if (error) > - goto abort_return; > + goto error_trans_abort; > > xfs_trans_ichgtime(tp, target_dp, > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > @@ -3020,7 +3132,7 @@ xfs_rename( > */ > error = xfs_droplink(tp, target_ip); > if (error) > - goto abort_return; > + goto error_trans_abort; > > if (src_is_directory) { > /* > @@ -3028,9 +3140,9 @@ xfs_rename( > */ > error = xfs_droplink(tp, target_ip); > if (error) > - goto abort_return; > + goto error_trans_abort; > } > - } /* target_ip != NULL */ > + } > > /* > * Remove the source. > @@ -3045,7 +3157,7 @@ xfs_rename( > &first_block, &free_list, spaceres); > ASSERT(error != -EEXIST); > if (error) > - goto abort_return; > + goto error_trans_abort; > } > > /* > @@ -3071,13 +3183,21 @@ xfs_rename( > */ > error = xfs_droplink(tp, src_dp); > if (error) > - goto abort_return; > + goto error_trans_abort; > } > > - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > + /* > + * On a whiteout, we only update the source dirent with the wino, > + * otherwise we are removing it. > + */ > + if (wino) { > + error = xfs_dir_replace(tp, src_dp, src_name, wino->i_ino, > + &first_block, &free_list, spaceres); > + } else > + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > &first_block, &free_list, spaceres); > if (error) > - goto abort_return; > + goto error_trans_abort; > > xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > @@ -3090,31 +3210,58 @@ finish_rename: > * rename transaction goes to disk before returning to > * the user. > */ > - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { > + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > xfs_trans_set_sync(tp); > - } > > error = xfs_bmap_finish(&tp, &free_list, &committed); > - if (error) { > - xfs_bmap_cancel(&free_list); > - xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | > - XFS_TRANS_ABORT)); > - goto std_return; > + if (error) > + goto error_trans_abort; > + > + /* > + * Last thing we do is bump the link count on the wino. This means that > + * failures all the way up to this point leave the wino on the unlinked > + * list and so cleanup is a simple matter of dropping the remaining > + * reference to it. If we fail here after bumping the link count, we're > + * shutting down the filesystem so we'll never see the intermediate > + * state on disk. > + */ > + if (wino) { > + ASSERT(wino->i_d.di_nlink == 0); > + error = xfs_bumplink(tp, wino); > + if (error) > + goto error_trans_abort; > + error = xfs_iunlink_remove(tp, wino); > + if (error) > + goto error_trans_abort; > + xfs_trans_log_inode(tp, wino, XFS_ILOG_CORE); > + > + /* > + * now we have a real link, clear the "I'm a tmpfile" state > + * flag from the inode so it doesn't accidentally get misused in > + * future. > + */ > + VFS_I(wino)->i_state &= ~I_LINKABLE; > } > > /* > * trans_commit will unlock src_ip, target_ip & decrement > * the vnode references. > */ > - return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > +out_release_wino: > + if (wino) > + IRELE(wino); > + return error; > > - abort_return: > + > +error_trans_abort: > cancel_flags |= XFS_TRANS_ABORT; > - error_return: > xfs_bmap_cancel(&free_list); > +error_trans_cancel: > xfs_trans_cancel(tp, cancel_flags); > - std_return: > - return error; > + > + /* Dropping the last reference on a tmpfile does the cleanup for us! */ > + goto out_release_wino; > } > > STATIC int > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 6a77ea9..d4442d1 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -393,7 +393,7 @@ xfs_vn_rename( > struct xfs_name oname; > struct xfs_name nname; > > - if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) > return -EINVAL; > > /* if we are exchanging files, we need to set i_mode of both files */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Dave Chinner david@fromorbit.com From mhocko@suse.cz Thu Feb 19 03:40:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18F817FB3 for ; Thu, 19 Feb 2015 03:40:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B7D4DAC003 for ; Thu, 19 Feb 2015 01:40:26 -0800 (PST) X-ASG-Debug-ID: 1424338823-04bdf06a5b504e30001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id k43I2ZlBgxHaHBJ4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 01:40:24 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 87D75AC7B; Thu, 19 Feb 2015 09:40:21 +0000 (UTC) Date: Thu, 19 Feb 2015 10:40:20 +0100 From: Michal Hocko To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219094020.GE28427@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150218213118.GN12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218213118.GN12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424338824 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 19-02-15 08:31:18, Dave Chinner wrote: > On Wed, Feb 18, 2015 at 01:16:02PM +0100, Michal Hocko wrote: > > On Wed 18-02-15 21:48:59, Dave Chinner wrote: > > > On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > > > > On Wed 18-02-15 09:54:30, Dave Chinner wrote: > > [...] > > > Also, this reads as an excuse for the OOM killer being broken and > > > not fixing it. Keep in mind that we tell the memory alloc/reclaim > > > subsystem that *we hold locks* when we call into it. That's what > > > GFP_NOFS originally meant, and it's what it still means today in an > > > XFS context. > > > > Sure, and OOM killer will not be invoked in NOFS context. See > > __alloc_pages_may_oom and __GFP_FS check in there. So I do not see where > > is the OOM killer broken. > > I suspect that the page cache missing the correct GFP_NOFS was one > of the sources of the problems I've been seeing. > > However, the oom killer exceptions are not checked if __GFP_NOFAIL Yes this is true. This is an effect of 9879de7373fc (mm: page_alloc: embed OOM killing naturally into allocation slowpath) and IMO a desirable one. Requiring infinite retrying with a seriously restricted reclaim context calls for troubles (e.g. livelock without no way out because regular reclaim cannot make any progress and OOM killer as the last resort will not happen). > is present and so if we start using __GFP_NOFAIL then it will be > called in GFP_NOFS contexts... > > > The crucial problem we are dealing with is not GFP_NOFAIL triggering the > > OOM killer but a lock dependency introduced by the following sequence: > > > > taskA taskB taskC > > lock(A) alloc() > > alloc(gfp | __GFP_NOFAIL) lock(A) out_of_memory > > # looping for ever if we select_bad_process > > # cannot make any progress victim = taskB > > > > There is no way OOM killer can tell taskB is blocked and that there is > > dependency between A and B (without lockdep). That is why I call NOFAIL > > under a lock as dangerous and a bug. > > Sure. However, eventually the OOM killer with select task A to be > killed because nothing else is working. That would require OOM killer to be able to select another victim while the current one is still alive. There were time based heuristics suggested to do this but I do not think they are the right way to handle the problem and should be considered only if all other options fail. One potential way would be giving access to give GFP_NOFAIL context access to memory reserves when the allocation domain (global/memcg/cpuset) is OOM. Andrea was suggesting something like that IIRC. > That, at least, marks > taskA with TIF_MEMDIE and gives us a potential way to break the > deadlock. > > But the bigger problem is this: > > taskA taskB > lock(A) > alloc(GFP_NOFS|GFP_NOFAIL) lock(A) > out_of_memory > select_bad_process > victim = taskB > > Because there is no way to *ever* resolve that dependency because > taskA never leaves the allocator. Even if the oom killer selects > taskA and set TIF_MEMDIE on it, the allocator ignores TIF_MEMDIE > because GFP_NOFAIL is set and continues to loop. TIF_MEMDIE will at least give the task access to memory reserves. Anyway this is essentially the same category of livelock as above. > This is why GFP_NOFAIL is not a solution to the "never fail" > alloation problem. The caller doing the "no fail" allocation _must > be able to set failure policy_. i.e. the choice of aborting and > shutting down because progress cannot be made, or continuing and > hoping for forwards progress is owned by the allocating context, no > the allocator. I completely agree that the failure policy is the caller responsibility and I would have no objections to something like: do { ptr = kmalloc(size, GFP_NOFS); if (ptr) return ptr; if (fatal_signal_pending(current)) break; if (looping_too_long()) break; } while (1); fallback_solution(); But this is not the case in kmem_alloc which is essentially GFP_NOFAIL allocation with a warning and congestion_wait. There is no failure policy defined there. The warning should be part of the allocator and the NOFAIL policy should be explicit. So why exactly do you oppose to changing kmem_alloc (and others which are doing essentially the same)? > The memory allocation subsystem cannot make that > choice for us as it has no concept of the failure characteristics of > the allocating context. Of course. I wasn't arguing we should change allocation loops which have a fallback policy as well. That is an entirely different thing. My point was we want to turn GFP_NOFAIL equivalents to use GFP_NOFAIL so that the allocator can prevent from livelocks if possible. > The situations in which this actually matters are extremely *rare* - > we've had these allocaiton loops in XFS for > 13 years, and we might > get a one or two reports a year of these "possible allocation > deadlock" messages occurring. Changing *everything* for such a rare, > unusual event is not an efficient use of time or resources. > > > > If the OOM killer is not obeying GFP_NOFS and deadlocking on locks > > > that the invoking context holds, then that is a OOM killer bug, not > > > a bug in the subsystem calling kmalloc(GFP_NOFS). > > > > I guess we are talking about different things here or what am I missing? > > From my perspective, you are tightly focussed on one aspect of the > problem and hence are not seeing the bigger picture: this is a > corner case of behaviour in a "last hope", brute force memory > reclaim technique that no production machine relies on for correct > or performant operation. Of course this is a corner case. And I am trying to prevent heuristics which would optimize for such a corner case (there were multiple of them suggested in this thread). The reason I care about GFP_NOFAIL is that there are apparently code paths which do not tell allocator they are basically GFP_NOFAIL without any fallback. This leads to two main problems 1) we do not have a good overview how many code paths have such a strong requirements and so cannot estimate e.g. how big memory reserves should be and 2) allocator cannot help those paths (e.g. by giving them access to reserves to break out of the livelock). > > [...] > > > > In the meantime page allocator > > > > should develop a proper diagnostic to help identify all the potential > > > > dependencies. Next we should start thinking whether all the existing > > > > GFP_NOFAIL paths are really necessary or the code can be > > > > refactored/reimplemented to accept allocation failures. > > > > > > Last time the "just make filesystems handle memory allocation > > > failures" I pointed out what that meant for XFS: dirty transaction > > > rollback is required. That's freakin' complex, will double the > > > memory footprint of transactions, roughly double the CPU cost, and > > > greatly increase the complexity of the transaction subsystem. It's a > > > *major* rework of a significant amount of the XFS codebase and will > > > take at least a couple of years design, test and stabilise before > > > it could be rolled out to production. > > > > > > I'm not about to spend a couple of years rewriting XFS just so the > > > VM can get rid of a GFP_NOFAIL user. Especially as the we already > > > tell the Hammer of Last Resort the context in which it can work. > > > > > > Move the OOM killer to kswapd - get it out of the direct reclaim > > > path altogether. > > > > This doesn't change anything as explained in other email. The triggering > > path doesn't wait for the victim to die. > > But it does - we wouldn't be talking about deadlocks if there were > no blocking dependencies. In this case, allocation keeps retrying > until the memory freed by the killed tasks enables it to make > forward progress. That's a side effect of the last relevation that > was made in this thread that low order allocations never fail... Sure, low order allocations being almost GFP_NOFAIL makes things much worse of course. And this should be changed. We just have to think about the way how to do it without breaking the universe. I hope we can discuss this at LSF. But even then I do not see how triggering the OOM killer from kswapd would help here. Victims would be looping in the allocator whether the actual killing happens from their or any other context. > > > If the system is that backed up on locks that it > > > cannot free any memory and has no reserves to satisfy the allocation > > > that kicked the OOM killer, then the OOM killer was not invoked soon > > > enough. > > > > > > Hell, if you want a better way to proceed, then how about you allow > > > us to tell the MM subsystem how much memory reserve a specific set > > > of operations is going to require to complete? That's something that > > > we can do rough calculations for, and it integrates straight into > > > the existing transaction reservation system we already use for log > > > space and disk space, and we can tell the mm subsystem when the > > > reserve is no longer needed (i.e. last thing in transaction commit). > > > > > > That way we don't start a transaction until the mm subsystem has > > > reserved enough pages for us to work with, and the reserve only > > > needs to be used when normal allocation has already failed. i.e > > > rather than looping we get a page allocated from the reserve pool. > > > > I am not sure I understand the above but isn't the mempools a tool for > > this purpose? > > I knew this question would be the next one - I even deleted a one > line comment from my last email that said "And no, mempools are not > a solution" because that needs a more thorough explanation than a > dismissive one-liner. > > As you know, mempools require a forward progress guarantee on a > single type of object and the objects must be slab based. > > In transaction context we allocate from inode slabs, xfs_buf slabs, > log item slabs (6 different ones, IIRC), btree cursor slabs, etc, > but then we also have direct page allocations for buffers, vm_map_ram() > for mapping multi-page buffers, uncounted heap allocations, etc. > We cannot make all of these mempools, nor can me meet the forwards > progress requirements of a mempool because other allocations can > block and prevent progress. > > Further, the object have lifetimes that don't correspond to the > transaction life cycles, and hence even if we complete the > transaction there is no guarantee that the objects allocated within > a transaction are going to be returned to the mempool at it's > completion. > > IOWs, we have need for forward allocation progress guarantees on > (potentially) several megabytes of allocations from slab caches, the > heap and the page allocator, with all allocations all in > unpredictable order, with objects of different life times and life > cycles, and at which may, at any time, get stuck behind > objects locked in other transactions and hence can randomly block > until some other thread makes forward progress and completes a > transaction and unlocks the object. Thanks for the clarification, I have to think about it some more, though. My thinking was that mempools could be used for an emergency pool with a pre-allocated memory which would be used in the non failing contexts. > The reservation would only need to cover the memory we need to > allocate and hold in the transaction (i.e. dirtied objects). There > is potentially unbound amounts of memory required through demand > paging of buffers to find the metadata we need to modify, but demand > paged metadata that is read and then released is recoverable. i.e > the shrinkers will free it as other memory demand requires, so it's > not included in reservation pools because it doesn't deplete the > amount of free memory. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Michal Hocko SUSE Labs From hannes@cmpxchg.org Thu Feb 19 04:24:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 84F637FB5 for ; Thu, 19 Feb 2015 04:24:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6488D304043 for ; Thu, 19 Feb 2015 02:24:51 -0800 (PST) X-ASG-Debug-ID: 1424341484-04cb6c6b0a51b780001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id TzrF2GbMamjbwKzc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 02:24:45 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Thu, 19 Feb 2015 05:24:31 -0500 From: Johannes Weiner To: Dave Chinner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219102431.GA15569@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150217225430.GJ4251@dastard> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1424341484 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15529 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 09:54:30AM +1100, Dave Chinner wrote: > [ cc xfs list - experienced kernel devs should not have to be > reminded to do this ] > > On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: > > On Tue, Feb 17, 2015 at 09:23:26PM +0900, Tetsuo Handa wrote: > > > Tetsuo Handa wrote: > > > > Johannes Weiner wrote: > > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > > > > index 8e20f9c2fa5a..f77c58ebbcfa 100644 > > > > > --- a/mm/page_alloc.c > > > > > +++ b/mm/page_alloc.c > > > > > @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > > > > if (high_zoneidx < ZONE_NORMAL) > > > > > goto out; > > > > > /* The OOM killer does not compensate for light reclaim */ > > > > > - if (!(gfp_mask & __GFP_FS)) > > > > > + if (!(gfp_mask & __GFP_FS)) { > > > > > + /* > > > > > + * XXX: Page reclaim didn't yield anything, > > > > > + * and the OOM killer can't be invoked, but > > > > > + * keep looping as per should_alloc_retry(). > > > > > + */ > > > > > + *did_some_progress = 1; > > > > > goto out; > > > > > + } > > > > > > > > Why do you omit out_of_memory() call for GFP_NOIO / GFP_NOFS allocations? > > > > > > I can see "possible memory allocation deadlock in %s (mode:0x%x)" warnings > > > at kmem_alloc() in fs/xfs/kmem.c . I think commit 9879de7373fcfb46 "mm: > > > page_alloc: embed OOM killing naturally into allocation slowpath" introduced > > > a regression and below one is the fix. > > > > > > --- a/mm/page_alloc.c > > > +++ b/mm/page_alloc.c > > > @@ -2381,9 +2381,6 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > > /* The OOM killer does not needlessly kill tasks for lowmem */ > > > if (high_zoneidx < ZONE_NORMAL) > > > goto out; > > > - /* The OOM killer does not compensate for light reclaim */ > > > - if (!(gfp_mask & __GFP_FS)) > > > - goto out; > > > /* > > > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > > > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > > > Again, we don't want to OOM kill on behalf of allocations that can't > > initiate IO, or even actively prevent others from doing it. Not per > > default anyway, because most callers can deal with the failure without > > having to resort to killing tasks, and NOFS reclaim *can* easily fail. > > It's the exceptions that should be annotated instead: > > > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > void *ptr; > > > > do { > > ptr = kmalloc(size, lflags); > > if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > return ptr; > > if (!(++retries % 100)) > > xfs_err(NULL, > > "possible memory allocation deadlock in %s (mode:0x%x)", > > __func__, lflags); > > congestion_wait(BLK_RW_ASYNC, HZ/50); > > } while (1); > > } > > > > This should use __GFP_NOFAIL, which is not only designed to annotate > > broken code like this, but also recognizes that endless looping on a > > GFP_NOFS allocation needs the OOM killer after all to make progress. > > > > diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c > > index a7a3a63bb360..17ced1805d3a 100644 > > --- a/fs/xfs/kmem.c > > +++ b/fs/xfs/kmem.c > > @@ -45,20 +45,12 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) > > void * > > kmem_alloc(size_t size, xfs_km_flags_t flags) > > { > > - int retries = 0; > > gfp_t lflags = kmem_flags_convert(flags); > > - void *ptr; > > > > - do { > > - ptr = kmalloc(size, lflags); > > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > - return ptr; > > - if (!(++retries % 100)) > > - xfs_err(NULL, > > - "possible memory allocation deadlock in %s (mode:0x%x)", > > - __func__, lflags); > > - congestion_wait(BLK_RW_ASYNC, HZ/50); > > - } while (1); > > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > > + lflags |= __GFP_NOFAIL; > > + > > + return kmalloc(size, lflags); > > } > > Hmmm - the only reason there is a focus on this loop is that it > emits warnings about allocations failing. It's obvious that the > problem being dealt with here is a fundamental design issue w.r.t. > to locking and the OOM killer, but the proposed special casing > hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code > in XFS started emitting warnings about allocations failing more > often. > > So the answer is to remove the warning? That's like killing the > canary to stop the methane leak in the coal mine. No canary? No > problems! That's not what happened. The patch that affected behavior here transformed code that an incoherent collection of conditions to something that has an actual model. That model is that we don't loop in the allocator if there are no means to making forward progress. In this case, it was GFP_NOFS triggering an early exit from the allocator because it's not allowed to invoke the OOM killer per default, and there is little point in looping for times to better on their own. So these deadlock warnings happen, ironically, by the page allocator now bailing out of a locked-up state in which it's not making forward progress. They don't strike me as a very useful canary in this case. > Right now, the oom killer is a liability. Over the past 6 months > I've slowly had to exclude filesystem regression tests from running > on small memory machines because the OOM killer is now so unreliable > that it kills the test harness regularly rather than the process > generating memory pressure. That's a big red flag to me that all > this hacking around the edges is not solving the underlying problem, > but instead is breaking things that did once work. > > And, well, then there's this (gfp.h): > > * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller > * cannot handle allocation failures. This modifier is deprecated and no new > * users should be added. > > So, is this another policy relevation from the mm developers about > the kmalloc API? i.e. that __GFP_NOFAIL is no longer deprecated? > Or just another symptom of frantic thrashing because nobody actually > understands the problem or those that do are unwilling to throw out > the broken crap and redesign it? Well, understand our dilemma here. __GFP_NOFAIL is a liability because it can trap tasks with unknown state and locks in a potentially never ending loop, and we don't want people to start using it as a convenient solution to get out of having a fallback strategy. However, if your entire architecture around a particular allocation is that failure is not an option at this point, and you can't reasonably preallocate - although that would always be preferrable - then please do not open code an endless loop around the call to the allocator but use __GFP_NOFAIL instead so that these callsites are annotated and can be reviewed. By giving the allocator this information, it can then also adjust its behavior, like it is the case right here: we don't usually want to OOM kill for regular GFP_NOFS allocations because their reclaim powers are weak and we don't want to kill tasks prematurely. But if your NOFS allocation can not fail under any circumstances, then the OOM killer should very much be employed to make any kind of forward progress at all for this allocation. It's just that the allocator needs to be made aware of this requirement. So yes, we are wary of __GFP_NOFAIL allocations, but this is an instance where it's the right way to communicate with the allocator, it was introduced to replace such open-coded endless loops and have the liability of making progress with the allocator, not the caller. And please understand that this callsite blowing up is a chance to better the code and behavior here. Where previously it would just endlessly loop in the allocator without any means to make progress, converting it to a __GFP_NOFAIL allocation tells the allocator that it's fine to use the OOM killer in such an instance, improving the chances that this caller will actually make headway under heavy load. From hannes@cmpxchg.org Thu Feb 19 05:01:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 903E57FB7 for ; Thu, 19 Feb 2015 05:01:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E60C304053 for ; Thu, 19 Feb 2015 03:01:41 -0800 (PST) X-ASG-Debug-ID: 1424343698-04cbb011634bb490001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id paVujbd2gwiM15eS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 03:01:39 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Thu, 19 Feb 2015 06:01:24 -0500 From: Johannes Weiner To: Michal Hocko Cc: Dave Chinner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219110124.GC15569@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218121602.GC4478@dhcp22.suse.cz> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1424343699 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15530 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 18, 2015 at 01:16:02PM +0100, Michal Hocko wrote: > On Wed 18-02-15 21:48:59, Dave Chinner wrote: > > On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > > > On Wed 18-02-15 09:54:30, Dave Chinner wrote: > [...] > > Also, this reads as an excuse for the OOM killer being broken and > > not fixing it. Keep in mind that we tell the memory alloc/reclaim > > subsystem that *we hold locks* when we call into it. That's what > > GFP_NOFS originally meant, and it's what it still means today in an > > XFS context. > > Sure, and OOM killer will not be invoked in NOFS context. See > __alloc_pages_may_oom and __GFP_FS check in there. So I do not see where > is the OOM killer broken. > > The crucial problem we are dealing with is not GFP_NOFAIL triggering the > OOM killer but a lock dependency introduced by the following sequence: > > taskA taskB taskC > lock(A) alloc() > alloc(gfp | __GFP_NOFAIL) lock(A) out_of_memory > # looping for ever if we select_bad_process > # cannot make any progress victim = taskB You don't even need taskC here. taskA could invoke the OOM killer with lock(A) held, and taskB getting selected as the victim while trying to acquire lock(A). It'll get the signal and TIF_MEMDIE and then wait for lock(A) while taskA is waiting for it to exit. But it doesn't matter who is doing the OOM killing - if the allocating task with the lock/state is waiting for the OOM victim to free memory, and the victim is waiting for same the lock/state, we have a deadlock. > There is no way OOM killer can tell taskB is blocked and that there is > dependency between A and B (without lockdep). That is why I call NOFAIL > under a lock as dangerous and a bug. You keep ignoring that it's also one of the main usecases of this flag. The caller has state that it can't unwind and thus needs the allocation to succeed. Chances are somebody else can get blocked up on that same state. And when that somebody else is the first choice of the OOM killer, we're screwed. This is exactly why I'm proposing that the OOM killer should not wait indefinitely for its first choice to exit, but ultimately move on and try other tasks. There is no other way to resolve this deadlock. Preferrably, we'd get rid of all nofail allocations and replace them with preallocated reserves. But this is not going to happen anytime soon, so what other option do we have than resolving this on the OOM killer side? From mhocko@suse.cz Thu Feb 19 06:29:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4C49D7FB9 for ; Thu, 19 Feb 2015 06:29:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A4A1304059 for ; Thu, 19 Feb 2015 04:29:23 -0800 (PST) X-ASG-Debug-ID: 1424348957-04cb6c6b0c51ec30001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id HzcGpL5GQYEeCK7h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 04:29:18 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 98DC3AD5D; Thu, 19 Feb 2015 12:29:15 +0000 (UTC) Date: Thu, 19 Feb 2015 13:29:14 +0100 From: Michal Hocko To: Johannes Weiner Cc: Dave Chinner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219122914.GH28427@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219110124.GC15569@phnom.home.cmpxchg.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424348958 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 19-02-15 06:01:24, Johannes Weiner wrote: [...] > Preferrably, we'd get rid of all nofail allocations and replace them > with preallocated reserves. But this is not going to happen anytime > soon, so what other option do we have than resolving this on the OOM > killer side? As I've mentioned in other email, we might give GFP_NOFAIL allocator access to memory reserves (by giving it __GFP_HIGH). This is still not a 100% solution because reserves could get depleted but this risk is there even with multiple oom victims. I would still argue that this would be a better approach because selecting more victims might hit pathological case more easily (other victims might be blocked on the very same lock e.g.). Something like the following: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8d52ab18fe0d..4b5cf28a13f4 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2599,6 +2599,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, enum migrate_mode migration_mode = MIGRATE_ASYNC; bool deferred_compaction = false; int contended_compaction = COMPACT_CONTENDED_NONE; + int oom = 0; /* * In the slowpath, we sanity check order to avoid ever trying to @@ -2628,6 +2629,15 @@ retry: wake_all_kswapds(order, ac); /* + * __GFP_NOFAIL allocations cannot fail but yet the current context + * might be blocking resources needed by the OOM victim to terminate. + * Allow the caller to dive into memory reserves to succeed the + * allocation and break out from a potential deadlock. + */ + if (oom > 10 && (gfp_mask & __GFP_NOFAIL)) + gfp_mask |= __GFP_HIGH; + + /* * OK, we're below the kswapd watermark and have kicked background * reclaim. Now things get more complex, so set up alloc_flags according * to how we want to proceed. @@ -2759,6 +2769,8 @@ retry: goto got_pg; if (!did_some_progress) goto nopage; + + oom++; } /* Wait for some write requests to complete then retry */ wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50); -- Michal Hocko SUSE Labs From mhocko@suse.cz Thu Feb 19 06:58:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 241557FBB for ; Thu, 19 Feb 2015 06:58:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C36A5AC001 for ; Thu, 19 Feb 2015 04:58:47 -0800 (PST) X-ASG-Debug-ID: 1424350724-04bdf06a5b509900001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id AUQRwXnZXMTbn6Er (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 04:58:45 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 8AF1CAC47; Thu, 19 Feb 2015 12:58:44 +0000 (UTC) Date: Thu, 19 Feb 2015 13:58:44 +0100 From: Michal Hocko To: Johannes Weiner Cc: Dave Chinner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219125844.GI28427@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219122914.GH28427@dhcp22.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424350725 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 19-02-15 13:29:14, Michal Hocko wrote: [...] > Something like the following. __GFP_HIGH doesn't seem to be sufficient so we would need something slightly else but the idea is still the same: diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8d52ab18fe0d..2d224bbdf8e8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2599,6 +2599,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, enum migrate_mode migration_mode = MIGRATE_ASYNC; bool deferred_compaction = false; int contended_compaction = COMPACT_CONTENDED_NONE; + int oom = 0; /* * In the slowpath, we sanity check order to avoid ever trying to @@ -2635,6 +2636,15 @@ retry: alloc_flags = gfp_to_alloc_flags(gfp_mask); /* + * __GFP_NOFAIL allocations cannot fail but yet the current context + * might be blocking resources needed by the OOM victim to terminate. + * Allow the caller to dive into memory reserves to succeed the + * allocation and break out from a potential deadlock. + */ + if (oom > 10 && (gfp_mask & __GFP_NOFAIL)) + alloc_flags |= ALLOC_NO_WATERMARKS; + + /* * Find the true preferred zone if the allocation is unconstrained by * cpusets. */ @@ -2759,6 +2769,8 @@ retry: goto got_pg; if (!did_some_progress) goto nopage; + + oom++; } /* Wait for some write requests to complete then retry */ wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50); -- Michal Hocko SUSE Labs From panand@redhat.com Thu Feb 19 07:24:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 150DD7FBD for ; Thu, 19 Feb 2015 07:24:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E90648F8033 for ; Thu, 19 Feb 2015 05:24:54 -0800 (PST) X-ASG-Debug-ID: 1424352293-04cbb011624becf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Vvxqa7kFcpnLy7Ev (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 05:24:53 -0800 (PST) X-Barracuda-Envelope-From: panand@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JDOouf019790 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 08:24:51 -0500 Received: from localhost (vpn-58-190.rdu2.redhat.com [10.10.58.190]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JDOiSb028096 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 19 Feb 2015 08:24:47 -0500 From: Pratyush Anand To: david@fromorbit.com, xfs@oss.sgi.com Cc: ddutile@redhat.com, jbastian@redhat.com, Pratyush Anand Subject: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing Date: Thu, 19 Feb 2015 18:54:33 +0530 X-ASG-Orig-Subj: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing Message-Id: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@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: 1424352293 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 My root file system is xfs. As soon as I enable event for xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> /sys/kernel/debug/tracing/set_event`, I see a kernel panic. A little bit of debugging shows that bp->b_fspriv is NULL many a time when trace_xfs_trans_read_buf(bp->b_fspriv) is called. I do not have any idea about xfs filesystem. So, I am not sure, if it is expected to have bp->b_fspriv = NULL at this location. This patch fixes the issue, until we have a better fix. Signed-off-by: Pratyush Anand --- fs/xfs/xfs_trans_buf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 0a4d4ab6d9a9..0b67a20643bf 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -329,7 +329,8 @@ xfs_trans_read_buf_map( if (tp) _xfs_trans_bjoin(tp, bp, 1); - trace_xfs_trans_read_buf(bp->b_fspriv); + if (bp->b_fspriv) + trace_xfs_trans_read_buf(bp->b_fspriv); *bpp = bp; return 0; -- 2.1.0 From penguin-kernel@i-love.sakura.ne.jp Thu Feb 19 07:29:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1291E7FBF for ; Thu, 19 Feb 2015 07:29:55 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A42BEAC003 for ; Thu, 19 Feb 2015 05:29:51 -0800 (PST) X-ASG-Debug-ID: 1424352588-04cb6c6b0b523310001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id 1JgHIjFlcFWGryNX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 05:29:49 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav405.sakura.ne.jp (fsav405.sakura.ne.jp [133.242.250.104]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JDTalV002951; Thu, 19 Feb 2015 22:29:37 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav405.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav405.sakura.ne.jp); Thu, 19 Feb 2015 22:29:36 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav405.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JDTaum002948; Thu, 19 Feb 2015 22:29:36 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: mhocko@suse.cz, hannes@cmpxchg.org Cc: david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> In-Reply-To: <20150219122914.GH28427@dhcp22.suse.cz> Message-Id: <201502192229.FCJ73987.MFQLOHSJFFtOOV@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Thu, 19 Feb 2015 22:29:37 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424352589 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Michal Hocko wrote: > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > [...] > > Preferrably, we'd get rid of all nofail allocations and replace them > > with preallocated reserves. But this is not going to happen anytime > > soon, so what other option do we have than resolving this on the OOM > > killer side? > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > access to memory reserves (by giving it __GFP_HIGH). This is still not a > 100% solution because reserves could get depleted but this risk is there > even with multiple oom victims. I would still argue that this would be a > better approach because selecting more victims might hit pathological > case more easily (other victims might be blocked on the very same lock > e.g.). > Does "multiple OOM victims" mean "select next if first does not die"? Then, I think my timeout patch http://marc.info/?l=linux-mm&m=142002495532320&w=2 does not deplete memory reserves. ;-) If we change to permit invocation of the OOM killer for GFP_NOFS / GFP_NOIO, those who do not want to fail (e.g. journal transaction) will start passing __GFP_NOFAIL? From christlegaard17@hotmail.com Thu Feb 19 08:09:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3BA67FC1 for ; Thu, 19 Feb 2015 08:09:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C235130405F for ; Thu, 19 Feb 2015 06:09:24 -0800 (PST) X-ASG-Debug-ID: 1424354963-04cbb011654c0020001-NocioJ Received: from host.themainserver.com ([192.190.80.34]) by cuda.sgi.com with ESMTP id lsT8EuXJaBAiBFVi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 06:09:23 -0800 (PST) X-Barracuda-Envelope-From: christlegaard17@hotmail.com X-Barracuda-Apparent-Source-IP: 192.190.80.34 Received: from localhost ([::1]:38542 helo=supernovacolor.com) by host.themainserver.com with esmtpa (Exim 4.82) (envelope-from ) id 1YORl4-0004Qg-P3; Thu, 19 Feb 2015 07:07:14 -0700 Received: from 41.138.176.6 ([41.138.176.6]) (SquirrelMail authenticated user info@supernovacolor.com) by supernovacolor.com with HTTP; Thu, 19 Feb 2015 07:07:14 -0700 Message-ID: <8f14e48978ac380d3ba948fe9dd6b472.squirrel@supernovacolor.com> Date: Thu, 19 Feb 2015 07:07:14 -0700 Subject: Delivery of Your Diplomatic Luggage 112 From: "International Monetary Funds" X-ASG-Orig-Subj: Delivery of Your Diplomatic Luggage 112 Reply-To: christlegaard17@gmail.com User-Agent: SquirrelMail/1.5.2 [SVN] MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host.themainserver.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - hotmail.com X-Get-Message-Sender-Via: host.themainserver.com: authenticated_id: info@supernovacolor.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: UNKNOWN[192.190.80.34] X-Barracuda-Start-Time: 1424354963 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.31 X-Barracuda-Spam-Status: No, SCORE=1.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_HEADERS, RDNS_NONE, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15536 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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:; Attention To You: On behalf of the board and management of International Monetary Financial Committee. I Christine Lagarde, the Operations Manager wishes to inform you that your consignment/fund tagged diplomatic luggage 122 with Ref: No1226/X42/206 which was deposited in our vault for safe keeping is due for Immediate collection. Be informed that we have concluded all arrangements to deliver your consignment at your doorstep through diplomatic means. In line with the binding diplomatic consignment delivery policies, kindly furnish us with the following as set forth. . A copy of your international passport or any other means of identification as the true consignee. . The address where the above cargo/funds should be delivered to and your phone number. . List the nearest international airport to your address location. Meanwhile, we urge you to treat the above requirement with utmost urgency to enable us dispense our duties and obligation accordingly thereby allowing us to serve you in a timely fashion. Upon satisfactory receipt of all the above mentioned, you will be further acquainted with the detailed delivery itinerary including information of the diplomat who will accompany your consignment. We pledge our best service at all times. Yours Faithfully, Christine Lagarde Foreign Operations Manager From bfoster@redhat.com Thu Feb 19 08:28:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 861AA7F9A for ; Thu, 19 Feb 2015 08:28:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 157F5AC002 for ; Thu, 19 Feb 2015 06:28:49 -0800 (PST) X-ASG-Debug-ID: 1424356127-04cbb011624c07f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LzhW5ElD4gWrTbVL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 06:28:48 -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 (8.14.4/8.14.4) with ESMTP id t1JESkVM028224 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 09:28:46 -0500 Received: from laptop.bfoster (vpn-62-220.rdu2.redhat.com [10.10.62.220]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JEShd6020778 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 19 Feb 2015 09:28:45 -0500 Date: Thu, 19 Feb 2015 09:28:42 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150219142842.GA2291@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424298740-25821-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424356128 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 19, 2015 at 09:32:20AM +1100, Dave Chinner wrote: > From: Dave Chinner > > Currently we consider all async metadata buffer write failures as > transient failures and retry the IO immediately and then again at a > a later time. The issue with this is that we can hang forever is the > error is not recoverable. > > An example of this is a device that has been pulled and so is > returning ENODEV to all IO. Attempting to unmount the filesystem > with the device in this state will result in a hang waiting for the > async metadata IO to be flushed and written successfully. In this > case, we need metadata writeback to error out and trigger a shutdown > state so the unmount can complete. > > Put simply, we need to consider some errors as permanent and > unrecoverable rather than transient. > > Hence add infrastructure that allows us to classify the async write > errors and hence apply different policies to the different failures. > In this patch, classify ENODEV as a permanent error but leave > all the other types of error handling unchanged. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf_item.c | 110 ++++++++++++++++++++++++++++++-------------------- > 1 file changed, 66 insertions(+), 44 deletions(-) > > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 507d96a..274678f 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1041,14 +1041,13 @@ xfs_buf_do_callbacks( > } > > /* > - * This is the iodone() function for buffers which have had callbacks > - * attached to them by xfs_buf_attach_iodone(). It should remove each > - * log item from the buffer's list and call the callback of each in turn. > - * When done, the buffer's fsprivate field is set to NULL and the buffer > - * is unlocked with a call to iodone(). > + * Process a write IO error on a buffer with active log items. > + * > + * Returns true if the buffer has been completed and released, false if callback > + * processing still needs to be performed and the IO completed. > */ > -void > -xfs_buf_iodone_callbacks( > +static bool > +xfs_buf_iodone_callback_error( > struct xfs_buf *bp) > { > struct xfs_log_item *lip = bp->b_fspriv; > @@ -1056,19 +1055,12 @@ xfs_buf_iodone_callbacks( > static ulong lasttime; > static xfs_buftarg_t *lasttarg; > > - if (likely(!bp->b_error)) > - goto do_callbacks; > - > /* > * If we've already decided to shutdown the filesystem because of > * I/O errors, there's no point in giving this a retry. > */ > - if (XFS_FORCED_SHUTDOWN(mp)) { > - xfs_buf_stale(bp); > - XFS_BUF_DONE(bp); > - trace_xfs_buf_item_iodone(bp, _RET_IP_); > - goto do_callbacks; > - } > + if (XFS_FORCED_SHUTDOWN(mp)) > + goto out_stale; > > if (bp->b_target != lasttarg || > time_after(jiffies, (lasttime + 5*HZ))) { > @@ -1077,45 +1069,75 @@ xfs_buf_iodone_callbacks( > } > lasttarg = bp->b_target; > > + /* synchronous writes will have callers process the error */ > + if (!(bp->b_flags & XBF_ASYNC)) > + goto out_stale; > + So if we get an error we drop into this function. If it's a sync I/O, jump to the state processing and let the callers handle it. > + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > + ASSERT(bp->b_iodone != NULL); > + xfs_buf_ioerror(bp, 0); > + Otherwise it's async... we clear the error here. > /* > * If the write was asynchronous then no one will be looking for the > - * error. Clear the error state and write the buffer out again. > - * > - * XXX: This helps against transient write errors, but we need to find > - * a way to shut the filesystem down if the writes keep failing. > - * > - * In practice we'll shut the filesystem down soon as non-transient > - * errors tend to affect the whole device and a failing log write > - * will make us give up. But we really ought to do better here. > + * error. If this is the first failure, clear the error state and write > + * the buffer out again. > */ > - if (XFS_BUF_ISASYNC(bp)) { > - ASSERT(bp->b_iodone != NULL); > - > - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > - > - 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); > - } else { > - xfs_buf_relse(bp); > - } > - > - return; > + 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); > + return true; ... and retry once via the XBF_WRITE_FAIL flag. > } > > /* > - * If the write of the buffer was synchronous, we want to make > - * sure to return the error to the caller of xfs_bwrite(). > + * Repeated failure on an async write. > + * > + * Now we need to classify the error and determine the correct action to > + * take. Different types of errors will require different processing, > + * but make the default classification "transient" so that we keep > + * retrying in these cases. If this is the wrog thing to do, then we'll > + * get reports that the filesystem hung in the presence of that type of > + * error and we can take appropriate action to remedy the issue for that > + * type of error. > */ > + switch (bp->b_error) { When is this ever true if we clear the error above? > + case ENODEV: > + /* permanent error, no recovery possible */ > + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); > + goto out_stale; If we can't retry, do the error-specific processing. Is doing this after a retry really the intended behavior? E.g., if ENODEV is permanent, the retry seems pointless. > + default: > + /* do nothing, higher layers will retry */ > + break; > + } > + > + xfs_buf_relse(bp); > + return true; > + > +out_stale: > xfs_buf_stale(bp); > XFS_BUF_DONE(bp); > - > trace_xfs_buf_error_relse(bp, _RET_IP_); > + return false; > +} > + > +/* > + * This is the iodone() function for buffers which have had callbacks attached > + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the > + * callback list, mark the buffer as having no more callbacks and then push the > + * buffer through IO completion processing. > + */ > +void > +xfs_buf_iodone_callbacks( > + struct xfs_buf *bp) > +{ > + /* > + * If there is an error, process it. Some errors require us > + * to run callbacks after failure processing is done so we > + * detect that and take appropriate action. > + */ 80 columns? Brian > + if (bp->b_error && xfs_buf_iodone_callback_error(bp)) > + return; > > -do_callbacks: > xfs_buf_do_callbacks(bp); > bp->b_fspriv = NULL; > bp->b_iodone = NULL; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Feb 19 08:28:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F12F7FC6 for ; Thu, 19 Feb 2015 08:28:56 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C20B3AC002 for ; Thu, 19 Feb 2015 06:28:55 -0800 (PST) X-ASG-Debug-ID: 1424356133-04cb6c6b0b524790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JXgKvEmeXvUbRLwv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 06:28:54 -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 (8.14.4/8.14.4) with ESMTP id t1JESqqQ021295 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 09:28:52 -0500 Received: from laptop.bfoster (vpn-62-220.rdu2.redhat.com [10.10.62.220]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JESnKj007867 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 19 Feb 2015 09:28:52 -0500 Date: Thu, 19 Feb 2015 09:28:49 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk Message-ID: <20150219142849.GB2291@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk References: <1424299725-26067-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424299725-26067-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424356134 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 19, 2015 at 09:48:45AM +1100, Dave Chinner wrote: > From: Dave Chinner > > A new fsync vs power fail test in xfstests indicated that XFS can > have unreliable data consistency when doing extending truncates that > require block zeroing. The blocks beyond EOF get zeroed in memory, > but we never force those changes to disk before we run the > transaction that extends the file size and exposes those blocks to > userspace. This can result in the blocks not being correctly zeroed > after a crash. > > Because in-memory behaviour is correct, tools like fsx don't pick up > any coherency problems - it's not until the filesystem is shutdown > or the system crashes after writing the truncate transaction to the > journal but before the zeroed data in the page cache is flushed that > the issue is exposed. > > Fix this by also flushing the dirty data in memory region between > the old size and new size when we've found blocks that need zeroing > in the truncate process. > > Reported-by: Liu Bo > cc: > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 14 ++++++++++---- > fs/xfs/xfs_inode.h | 9 +++++---- > fs/xfs/xfs_iops.c | 36 ++++++++++++++---------------------- > 3 files changed, 29 insertions(+), 30 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index ce615d1..a2e1cb8 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -397,7 +397,8 @@ STATIC int /* error (positive) */ > xfs_zero_last_block( > struct xfs_inode *ip, > xfs_fsize_t offset, > - xfs_fsize_t isize) > + xfs_fsize_t isize, > + bool *did_zeroing) > { > struct xfs_mount *mp = ip->i_mount; > xfs_fileoff_t last_fsb = XFS_B_TO_FSBT(mp, isize); > @@ -425,6 +426,7 @@ xfs_zero_last_block( > zero_len = mp->m_sb.sb_blocksize - zero_offset; > if (isize + zero_len > offset) > zero_len = offset - isize; > + *did_zeroing = true; > return xfs_iozero(ip, isize, zero_len); > } > > @@ -443,7 +445,8 @@ int /* error (positive) */ > xfs_zero_eof( > struct xfs_inode *ip, > xfs_off_t offset, /* starting I/O offset */ > - xfs_fsize_t isize) /* current inode size */ > + xfs_fsize_t isize, /* current inode size */ > + bool *did_zeroing) > { > struct xfs_mount *mp = ip->i_mount; > xfs_fileoff_t start_zero_fsb; > @@ -465,7 +468,7 @@ xfs_zero_eof( > * We only zero a part of that block so it is handled specially. > */ > if (XFS_B_FSB_OFFSET(mp, isize) != 0) { > - error = xfs_zero_last_block(ip, offset, isize); > + error = xfs_zero_last_block(ip, offset, isize, did_zeroing); > if (error) > return error; > } > @@ -525,6 +528,7 @@ xfs_zero_eof( > if (error) > return error; > > + *did_zeroing = true; > start_zero_fsb = imap.br_startoff + imap.br_blockcount; > ASSERT(start_zero_fsb <= (end_zero_fsb + 1)); > } > @@ -567,13 +571,15 @@ restart: > * having to redo all checks before. > */ > if (*pos > i_size_read(inode)) { > + bool zero = false; > + > if (*iolock == XFS_IOLOCK_SHARED) { > xfs_rw_iunlock(ip, *iolock); > *iolock = XFS_IOLOCK_EXCL; > xfs_rw_ilock(ip, *iolock); > goto restart; > } > - error = xfs_zero_eof(ip, *pos, i_size_read(inode)); > + error = xfs_zero_eof(ip, *pos, i_size_read(inode), &zero); > if (error) > return error; > } > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 8e82b41..c73b63d 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -384,10 +384,11 @@ enum xfs_prealloc_flags { > XFS_PREALLOC_INVISIBLE = (1 << 4), > }; > > -int xfs_update_prealloc_flags(struct xfs_inode *, > - enum xfs_prealloc_flags); > -int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); > -int xfs_iozero(struct xfs_inode *, loff_t, size_t); > +int xfs_update_prealloc_flags(struct xfs_inode *ip, > + enum xfs_prealloc_flags flags); > +int xfs_zero_eof(struct xfs_inode *ip, xfs_off_t offset, > + xfs_fsize_t isize, bool *did_zeroing); > +int xfs_iozero(struct xfs_inode *ip, loff_t pos, size_t count); > > > /* from xfs_iops.c */ > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index d7782ae..3ccc28e 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -756,6 +756,7 @@ xfs_setattr_size( > int error; > uint lock_flags = 0; > uint commit_flags = 0; > + bool did_zeroing = false; > > trace_xfs_setattr(ip); > > @@ -799,20 +800,16 @@ xfs_setattr_size( > return error; > > /* > - * Now we can make the changes. Before we join the inode to the > - * transaction, take care of the part of the truncation that must be > - * done without the inode lock. 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. > + * 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. > */ > if (newsize > oldsize) { > - /* > - * Do the first part of growing a file: zero any data in the > - * last block that is beyond the old EOF. We need to do this > - * before the inode is joined to the transaction to modify > - * i_size. > - */ > - error = xfs_zero_eof(ip, newsize, oldsize); > + error = xfs_zero_eof(ip, newsize, oldsize, &did_zeroing); > if (error) > return error; > } > @@ -822,23 +819,18 @@ xfs_setattr_size( > * any previous writes that are beyond the on disk EOF and the new > * EOF that have not been written out need to be written here. If we > * do not write the data out, we expose ourselves to the null files > - * problem. > - * > - * Only flush from the on disk size to the smaller of the in memory > - * file size or the new size as that's the range we really care about > - * here and prevents waiting for other data not within the range we > - * care about here. > + * problem. Note that this includes any block zeroing we did above; > + * otherwise those blocks may not be zeroed after a crash. > */ > - if (oldsize != ip->i_d.di_size && newsize > ip->i_d.di_size) { > + if (newsize > ip->i_d.di_size && > + (oldsize != ip->i_d.di_size || did_zeroing)) { > error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > ip->i_d.di_size, newsize); > if (error) > return error; > } > > - /* > - * Wait for all direct I/O to complete. > - */ > + /* Now wait for all direct I/O to complete. */ > inode_dio_wait(inode); > > /* > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From penguin-kernel@i-love.sakura.ne.jp Thu Feb 19 09:29:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A2B5F7F54 for ; Thu, 19 Feb 2015 09:29:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91515304032 for ; Thu, 19 Feb 2015 07:29:46 -0800 (PST) X-ASG-Debug-ID: 1424359783-04cb6c6b0c5267a0001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id hnUVyIa7jCctoqKh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 07:29:44 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav205.sakura.ne.jp (fsav205.sakura.ne.jp [210.224.168.167]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JFTV9R026900; Fri, 20 Feb 2015 00:29:31 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav205.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav205.sakura.ne.jp); Fri, 20 Feb 2015 00:29:31 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav205.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JFTV5a026896; Fri, 20 Feb 2015 00:29:31 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: mhocko@suse.cz, hannes@cmpxchg.org Cc: david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219125844.GI28427@dhcp22.suse.cz> In-Reply-To: <20150219125844.GI28427@dhcp22.suse.cz> Message-Id: <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Fri, 20 Feb 2015 00:29:29 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424359783 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Michal Hocko wrote: > On Thu 19-02-15 13:29:14, Michal Hocko wrote: > [...] > > Something like the following. > __GFP_HIGH doesn't seem to be sufficient so we would need something > slightly else but the idea is still the same: > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > index 8d52ab18fe0d..2d224bbdf8e8 100644 > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -2599,6 +2599,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, > enum migrate_mode migration_mode = MIGRATE_ASYNC; > bool deferred_compaction = false; > int contended_compaction = COMPACT_CONTENDED_NONE; > + int oom = 0; > > /* > * In the slowpath, we sanity check order to avoid ever trying to > @@ -2635,6 +2636,15 @@ retry: > alloc_flags = gfp_to_alloc_flags(gfp_mask); > > /* > + * __GFP_NOFAIL allocations cannot fail but yet the current context > + * might be blocking resources needed by the OOM victim to terminate. > + * Allow the caller to dive into memory reserves to succeed the > + * allocation and break out from a potential deadlock. > + */ We don't know how many callers will pass __GFP_NOFAIL. But if 1000 threads are doing the same operation which requires __GFP_NOFAIL allocation with a lock held, wouldn't memory reserves deplete? This heuristic can't continue if memory reserves depleted or continuous pages of requested order cannot be found. > + if (oom > 10 && (gfp_mask & __GFP_NOFAIL)) > + alloc_flags |= ALLOC_NO_WATERMARKS; > + > + /* > * Find the true preferred zone if the allocation is unconstrained by > * cpusets. > */ > @@ -2759,6 +2769,8 @@ retry: > goto got_pg; > if (!did_some_progress) > goto nopage; > + > + oom++; > } > /* Wait for some write requests to complete then retry */ > wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50); > -- > Michal Hocko > SUSE Labs > From jack@suse.cz Thu Feb 19 09:42:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1CC147F3F for ; Thu, 19 Feb 2015 09:42:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8F717AC003 for ; Thu, 19 Feb 2015 07:42:50 -0800 (PST) X-ASG-Debug-ID: 1424360567-04cbb011644c33b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id EZ3scJPYZyV2YKIU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 07:42:48 -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 1DB57ACA9; Thu, 19 Feb 2015 15:42:46 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id B45BC81FC3; Thu, 19 Feb 2015 16:42:41 +0100 (CET) Date: Thu, 19 Feb 2015 16:42:41 +0100 From: Jan Kara To: Dave Chinner Cc: Jan Kara , Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150219154241.GC22712@quack.suse.cz> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150218215523.GO12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218215523.GO12722@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424360568 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 19-02-15 08:55:23, Dave Chinner wrote: > On Wed, Feb 18, 2015 at 11:40:09AM +0100, Jan Kara wrote: > > On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > > > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > > > to a written extent after we've initialised the contents. We use the > > > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > > > softirq context. > > > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > > > point me please? > > > > > > For faults, we call it in dax_insert_mapping(), the very last thing > > > before returning in the fault path. The normal I/O path gets to use > > > the dio_iodone_t for the same purpose. > > I see. I didn't think of races with reads (hum, I actually wonder whether > > we don't have this data exposure problem for ext4 for mmapped write into > > a hole vs direct read as well). So I guess we do need those unwritten > > extent dances after all (or we would need to have a page covering hole when > > writing to it via mmap but I guess unwritten extent dances are somewhat > > more standard). > > Right, that was the reason for doing it that way - it leveraged all > the existing methods we have for avoiding data exposure races in > XFS. but it's also not just for races - it's for ensuring that if we > crash between the allocation and the write to the persistent store > we don't expose the underlying contents when the system next comes > up. Well, ext3/4 handles the crash situation differently - we make sure we flush data to allocated blocks before committing a transaction that allocates them. That works perfectly for crashes but doesn't avoid the race with DIO. > > > > > Also abusing b_end_io of a phony buffer for that looks ugly to me (we are > > > > > trying to get away from passing phony bh around and this would entangle us > > > > > even more into that mess). Normally I would think that end_io() callback > > > > > passed into dax_do_io() should perform necessary conversions and for > > > > > dax_fault() we could do necessary conversions inside foofs_page_mkwrite()... > > > > > > Dave sees to be the one trying the hardest to get rid of the phony BHs > > > ... and it was his idea to (ab)use b_end_io for this. The problem with > > > doing the conversion in ext4_page_mkwrite() is that we don't know at > > > that point whether the BH is unwritten or not. > > I see, thanks for explanation. So it would be enough to pass a bit of > > information (unwritten / written) to a caller of do_dax_fault() and that > > can then call conversion function. IMO doing that (either in a return value > > or in a separate argument of do_dax_fault()) would be cleaner and more > > readable than playing with b_private and b_end_io... Thoughts? > > I'm happy for a better mechanism to be thought up. The current one > was expedient, but not pretty. The need for the end_io function was > because unwritten conversion needed to happen after the page was > zeroed. If we change dax_fault() to also take a "end_io" function > callback (already takes a get_blocks callback), then we can avoid > the need to use the phony bh for this purpose. i.e filesystems that > allocate unwritten extents can pass a completion function Yeah, that's probably even better. > And speaking of phony BHs, the pnfs block layout changes introduce > an struct iomap and a "map_blocks" method to the export_ops in > exportfs.h. This is the model what we should be using instead of > phony BHs for block mapping/allocation operations... Yup, that'd be nice. Honza -- Jan Kara SUSE Labs, CR From mailreturn@smtp6.ymlpsv.com Thu Feb 19 09:52:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 F26507F3F for ; Thu, 19 Feb 2015 09:52:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1911304059 for ; Thu, 19 Feb 2015 07:52:57 -0800 (PST) X-ASG-Debug-ID: 1424361166-04bdf06a5b50ef90001-NocioJ Received: from smtp6.ymlpsv.com (smtp6.ymlpsv.com [87.237.13.75]) by cuda.sgi.com with SMTP id R1MEsAS38ucH3PLE for ; Thu, 19 Feb 2015 07:52:47 -0800 (PST) X-Barracuda-Envelope-From: mailreturn@smtp6.ymlpsv.com X-Barracuda-Apparent-Source-IP: 87.237.13.75 Received: (qmail 20777 invoked by uid 0); 19 Feb 2015 15:52:46 -0000 Date: Thu, 19 Feb 2015 16:52:46 +0100 To: xfs@oss.sgi.com From: "andycheung@multipixhdtv.com" Subject: Streaming HD Video & Audio at broadcasting quality makes easy Message-ID: <2b50543ca21b92bf921827dc41c35f78@smtp6.ymlpsv.com> X-ASG-Orig-Subj: Streaming HD Video & Audio at broadcasting quality makes easy X-YMLPcode: 9yyk+8+35 List-Unsubscribe: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_2b50543ca21b92bf921827dc41c35f78" X-Barracuda-Connect: smtp6.ymlpsv.com[87.237.13.75] X-Barracuda-Start-Time: 1424361166 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_WWW_MISMATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15539 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch 0.00 HTML_MESSAGE BODY: HTML included in message --b1_2b50543ca21b92bf921827dc41c35f78 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: quoted-printable --------------------------------------------------------------------------= ------ This email newsletter was sent to you in graphical HTML format. If you're seeing this version, your email program prefers plain text = emails. You can read the original version online: http://ymlp342.net/z3aXKa --------------------------------------------------------------------------= ------ Dear AV partner, How are you today? Knowing you are in PRO AV business, Our cutting edge broadcasting level video & audio streaming solution - MPWEB which might help you to please your customer and make more profits. MPWEB is high definition video & audio streaming turnkey solution, it includes 1080 60P pan tilt zoom camera, high-quality microphone and 3G HDSDI encoder. Simply power on these devices with network cable or it=E2=80=99s WiFi option, MPWEB will be ready to streaming your exciting high definition video and audio contents to audiences in the world in 7*24 hours up and running, thanks to various protocol HTTP, UDP, RTSP, RTMP provided, audiences is freely to watch the stream contents on his smartphone, pad or PC instantly. Various applications applied: 1. Small Video Conference 2. Live Broadcasting 3. Webinar / Webcast 4. Campus Broadcast 5. AV Recording System If you are interested in this, please don=E2=80=99t hesitate to contact us, We will offer you the very best price and service. http://youtu.be/6ufH0CqIZhQ video clip (downsized to 720p by youtu): Best Regards Andy Cheung Multipix Intelligent Systems www.multipixhdtv.com Email: andycheung@multipixhdtv.com Skype: andycheung.multipix _____________________________ Unsubscribe / Change Profile: http://ymlp342.net/ughhehqwgsgmbgqggbheyee Powered by YourMailingListProvider --b1_2b50543ca21b92bf921827dc41c35f78 Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: quoted-printable
Dear AV partner,
 
How are you today?
 
  Knowing you are in PRO AV b= usiness, Our cutting edge broadcasting level = ;video & audio streaming solution - MPWE= B which might help you to please your&n= bsp;customer and make more profits.
 
  MPWEB is high definition video &= amp; audio streaming turnkey solution, it in= cludes 1080 60P pan tilt zoom camera, h= igh-quality microphone and 3G HDSDI encoder. = ;Simply power on these devices with network&= nbsp;cable or it’s WiFi option, MPWEB = will be ready to streaming your exciting&nbs= p;high definition video and audio contents t= o audiences in the world in 7*24 hours&= nbsp;up and running, thanks to various proto= col HTTP, UDP, RTSP, RTMP provided, audience= s is freely to watch the stream content= s on his smartphone, pad or PC instantl= y.
 
Various applications applied:
1.   Small Video Conference 
2.   Live Broadcasting 
3.   Webinar / Webcast 
4.   Campus Broadcast
5.   AV Recording System 
 
  If you are interested in this,&n= bsp;please don’t hesitate to contact us,&nb= sp;We will offer you the very best pric= e and service.
 
http://youtu.be/6ufH0CqIZhQ
video clip (downsized to 720p by youtu)= : 
 
Best Regards
Andy Cheung
Multipix Intelligent Systems
Skype: andycheung.multipix
3D" --b1_2b50543ca21b92bf921827dc41c35f78-- From sandeen@sandeen.net Thu Feb 19 10:39:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B6997F50 for ; Thu, 19 Feb 2015 10:39:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A85B304043 for ; Thu, 19 Feb 2015 08:39:25 -0800 (PST) X-ASG-Debug-ID: 1424363963-04cbb011654c4f50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id U1PEFOFGEswcpoED for ; Thu, 19 Feb 2015 08:39:23 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 72846602D76B; Thu, 19 Feb 2015 10:39:23 -0600 (CST) Message-ID: <54E611BA.7010806@sandeen.net> Date: Thu, 19 Feb 2015 10:39:22 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Pratyush Anand , david@fromorbit.com, xfs@oss.sgi.com CC: jbastian@redhat.com, ddutile@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing In-Reply-To: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@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: 1424363963 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15540 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/19/15 7:24 AM, Pratyush Anand wrote: > My root file system is xfs. As soon as I enable event for > xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> > /sys/kernel/debug/tracing/set_event`, I see a kernel panic. > > A little bit of debugging shows that bp->b_fspriv is NULL many a time > when trace_xfs_trans_read_buf(bp->b_fspriv) is called. > > I do not have any idea about xfs filesystem. So, I am not sure, if it > is expected to have bp->b_fspriv = NULL at this location. > > This patch fixes the issue, until we have a better fix. What kernel did you hit this on? What did the backtrace look like? I've been unable to reproduce the problem so far. Thanks, -Eric > Signed-off-by: Pratyush Anand > --- > fs/xfs/xfs_trans_buf.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 0a4d4ab6d9a9..0b67a20643bf 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -329,7 +329,8 @@ xfs_trans_read_buf_map( > > if (tp) > _xfs_trans_bjoin(tp, bp, 1); > - trace_xfs_trans_read_buf(bp->b_fspriv); > + if (bp->b_fspriv) > + trace_xfs_trans_read_buf(bp->b_fspriv); > *bpp = bp; > return 0; > > From bfoster@redhat.com Thu Feb 19 11:20:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5CB777F37 for ; Thu, 19 Feb 2015 11:20:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D78F4AC001 for ; Thu, 19 Feb 2015 09:20:35 -0800 (PST) X-ASG-Debug-ID: 1424366433-04cbb011634c61e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0AXaSEFgPkITgcKQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 09:20:34 -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 (8.14.4/8.14.4) with ESMTP id t1JHKW9h030202 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 12:20:32 -0500 Received: from laptop.bfoster (vpn-62-220.rdu2.redhat.com [10.10.62.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JHKTtp022311 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 19 Feb 2015 12:20:31 -0500 Date: Thu, 19 Feb 2015 12:20:28 -0500 From: Brian Foster To: Pratyush Anand Cc: david@fromorbit.com, xfs@oss.sgi.com, jbastian@redhat.com, ddutile@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing Message-ID: <20150219172028.GC2291@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424366434 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Feb 19, 2015 at 06:54:33PM +0530, Pratyush Anand wrote: > My root file system is xfs. As soon as I enable event for > xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> > /sys/kernel/debug/tracing/set_event`, I see a kernel panic. > > A little bit of debugging shows that bp->b_fspriv is NULL many a time > when trace_xfs_trans_read_buf(bp->b_fspriv) is called. > > I do not have any idea about xfs filesystem. So, I am not sure, if it > is expected to have bp->b_fspriv = NULL at this location. > > This patch fixes the issue, until we have a better fix. > > Signed-off-by: Pratyush Anand > --- A fix for this has been posted here: http://oss.sgi.com/archives/xfs/2015-02/msg00101.html Brian > fs/xfs/xfs_trans_buf.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 0a4d4ab6d9a9..0b67a20643bf 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -329,7 +329,8 @@ xfs_trans_read_buf_map( > > if (tp) > _xfs_trans_bjoin(tp, bp, 1); > - trace_xfs_trans_read_buf(bp->b_fspriv); > + if (bp->b_fspriv) > + trace_xfs_trans_read_buf(bp->b_fspriv); > *bpp = bp; > return 0; > > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From panand@redhat.com Thu Feb 19 11:25:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCCC87F47 for ; Thu, 19 Feb 2015 11:25:55 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AC4A9304032 for ; Thu, 19 Feb 2015 09:25:52 -0800 (PST) X-ASG-Debug-ID: 1424366751-04cb6c6b0a5292a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cAxej6BymB9QehLv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 09:25:51 -0800 (PST) X-Barracuda-Envelope-From: panand@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JHPnpD029753 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 12:25:49 -0500 Received: from localhost.localdomain (vpn-58-190.rdu2.redhat.com [10.10.58.190]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JHPiL7011006; Thu, 19 Feb 2015 12:25:45 -0500 Message-ID: <54E61C97.1080402@redhat.com> Date: Thu, 19 Feb 2015 22:55:43 +0530 From: Pratyush Anand User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Brian Foster CC: david@fromorbit.com, xfs@oss.sgi.com, jbastian@redhat.com, ddutile@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> <20150219172028.GC2291@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing In-Reply-To: <20150219172028.GC2291@laptop.bfoster> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424366751 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thursday 19 February 2015 10:50 PM, Brian Foster wrote: > On Thu, Feb 19, 2015 at 06:54:33PM +0530, Pratyush Anand wrote: >> My root file system is xfs. As soon as I enable event for >> xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> >> /sys/kernel/debug/tracing/set_event`, I see a kernel panic. >> >> A little bit of debugging shows that bp->b_fspriv is NULL many a time >> when trace_xfs_trans_read_buf(bp->b_fspriv) is called. >> >> I do not have any idea about xfs filesystem. So, I am not sure, if it >> is expected to have bp->b_fspriv = NULL at this location. >> >> This patch fixes the issue, until we have a better fix. >> >> Signed-off-by: Pratyush Anand >> --- > > A fix for this has been posted here: > > http://oss.sgi.com/archives/xfs/2015-02/msg00101.html > Thanks Brian ~Pratyush From bfoster@redhat.com Thu Feb 19 12:13:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B6DA17F50 for ; Thu, 19 Feb 2015 12:13:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A649F304067 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369625-04cb6c6b0c52a530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bxvSL2KBGzG7OseV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDjxg017828 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjDJ030516 for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 118A41200A7; Thu, 19 Feb 2015 13:13:43 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 01/18] xfs: create individual inode alloc. helper Date: Thu, 19 Feb 2015 13:13:26 -0500 X-ASG-Orig-Subj: [PATCH v5 01/18] xfs: create individual inode alloc. helper Message-Id: <1424369623-5656-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from sparse inode records must filter the ir_free mask against ir_holemask. In preparation for this requirement, create a helper to allocate an individual inode from an inode record. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 116ef1d..12b62a34 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -731,6 +731,16 @@ xfs_ialloc_get_rec( } /* + * Return the offset of the first free inode in the record. + */ +STATIC int +xfs_inobt_first_free_inode( + struct xfs_inobt_rec_incore *rec) +{ + return xfs_lowbit64(rec->ir_free); +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int @@ -960,7 +970,7 @@ newino: } alloc_inode: - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1209,7 +1219,7 @@ xfs_dialloc_ag( if (error) goto error_cur; - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E29667F54 for ; Thu, 19 Feb 2015 12:13:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8AC68F8040 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011644c79b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 49X9v3nwy2AtlgH4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkfm021571 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjTI029971 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 81F48124FE9; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 09/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Date: Thu, 19 Feb 2015 13:13:34 -0500 X-ASG-Orig-Subj: [PATCH v5 09/18] xfs: use actual inode count for sparse records in bulkstat/inumbers Message-Id: <1424369623-5656-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The bulkstat and inumbers mechanisms make the assumption that inode records consist of a full 64 inode chunk in several places. For example, this is used to track how many inodes have been processed overall as well as to determine whether a record has allocated inodes that must be handled. This assumption is invalid for sparse inode records. While sparse inodes will be marked as free in the ir_free mask, they are not accounted as free in ir_freecount because they cannot be allocated. Therefore, ir_freecount may be less than 64 inodes in an inode record for which all physically allocated inodes are free (and in turn ir_freecount < 64 does not signify that the record has allocated inodes). The new in-core inobt record format includes the ir_count field. This holds the number of true, physical inodes tracked by the record. The in-core ir_count field is always valid as it is hardcoded to XFS_INODES_PER_CHUNK when sparse inodes is not enabled. Use ir_count to handle inode records correctly in bulkstat in a generic manner. Signed-off-by: Brian Foster --- fs/xfs/xfs_itable.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 82e3142..7c68058 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -252,7 +252,7 @@ xfs_bulkstat_grab_ichunk( } irec->ir_free |= xfs_inobt_maskn(0, idx); - *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + *icount = irec->ir_count - irec->ir_freecount; } return 0; @@ -415,6 +415,8 @@ xfs_bulkstat( goto del_cursor; if (icount) { irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; @@ -447,13 +449,15 @@ xfs_bulkstat( * If this chunk has any allocated inodes, save it. * Also start read-ahead now for this chunk. */ - if (r.ir_freecount < XFS_INODES_PER_CHUNK) { + if (r.ir_freecount < r.ir_count) { xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - icount += XFS_INODES_PER_CHUNK - r.ir_freecount; + icount += r.ir_count - r.ir_freecount; } error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { @@ -599,8 +603,7 @@ xfs_inumbers( agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); - buffer[bufidx].xi_alloccount = - XFS_INODES_PER_CHUNK - r.ir_freecount; + buffer[bufidx].xi_alloccount = r.ir_count - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; if (++bufidx == bcount) { long written; -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1930D7F50 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 07AD48F8074 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011654c79c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KTNBUtBghsBaZw5C (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkKS021582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDj8w029970 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D792C1200A7; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 16/18] xfs: only free allocated regions of inode chunks Date: Thu, 19 Feb 2015 13:13:41 -0500 X-ASG-Orig-Subj: [PATCH v5 16/18] xfs: only free allocated regions of inode chunks Message-Id: <1424369623-5656-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode chunk is currently added to the transaction free list based on a simple fsb conversion and hardcoded chunk length. The nature of sparse chunks is such that the physical chunk of inodes on disk may consist of one or more discontiguous parts. Blocks that reside in the holes of the inode chunk are not inodes and could be allocated to any other use or not allocated at all. Refactor the existing xfs_bmap_add_free() call into the xfs_difree_inode_chunk() helper. The new helper uses the existing calculation if a chunk is not sparse. Otherwise, use the inobt record holemask to free the contiguous regions of the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 81 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index a673da3..a29dd4e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1798,6 +1798,83 @@ out_error: return error; } +/* + * Free the blocks of an inode chunk. We must consider that the inode chunk + * might be sparse and only free the regions that are allocated as part of the + * chunk. + */ +STATIC void +xfs_difree_inode_chunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *rec, + struct xfs_bmap_free *flist) +{ + xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); + int startidx, endidx; + int nextbit; + xfs_agblock_t agbno; + int contigblk; + DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS); + + 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); + return; + } + + /* holemask is only 16-bits (fits in an unsigned long) */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * Find contiguous ranges of zeroes (i.e., allocated regions) in the + * holemask and convert the start/end index of each range to an extent. + * We start with the start and end index both pointing at the first 0 in + * the mask. + */ + startidx = endidx = find_first_zero_bit(holemask, + XFS_INOBT_HOLEMASK_BITS); + nextbit = startidx + 1; + while (startidx < XFS_INOBT_HOLEMASK_BITS) { + nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS, + nextbit); + /* + * If the next zero bit is contiguous, update the end index of + * the current range and continue. + */ + if (nextbit != XFS_INOBT_HOLEMASK_BITS && + nextbit == endidx + 1) { + endidx = nextbit; + goto next; + } + + /* + * nextbit is not contiguous with the current end index. Convert + * the current start/end to an extent and add it to the free + * list. + */ + agbno = sagbno + (startidx * XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + contigblk = ((endidx - startidx + 1) * + XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + + 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); + + /* reset range to current bit and carry on... */ + startidx = endidx = nextbit; + +next: + nextbit++; + } +} + STATIC int xfs_difree_inobt( struct xfs_mount *mp, @@ -1889,9 +1966,7 @@ xfs_difree_inobt( goto error0; } - 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_difree_inode_chunk(mp, agno, &rec, flist); } else { *deleted = 0; -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 720557F54 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 61AC68F8040 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cb6c6b0952a530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1pU6evgTMCoj1gU9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkW9015024 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDkJs030539 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B3DDF124FE1; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 13/18] xfs: allocate sparse inode chunks on full chunk allocation failure Date: Thu, 19 Feb 2015 13:13:38 -0500 X-ASG-Orig-Subj: [PATCH v5 13/18] xfs: allocate sparse inode chunks on full chunk allocation failure Message-Id: <1424369623-5656-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode chunk. If all else fails, reduce the allocation to the sparse length and alignment and attempt to allocate a sparse inode chunk. If sparse chunk allocation succeeds, check whether an inobt record already exists that can track the chunk. If so, inherit and update the existing record. Otherwise, insert a new record for the sparse chunk. Create helpers to align sparse chunk inode records and insert or update existing records in the inode btrees. The xfs_inobt_insert_sprec() helper implements the merge or update semantics required for sparse inode records with respect to both the inobt and finobt. To update the inobt, either insert a new record or merge with an existing record. To update the finobt, use the updated inobt record to either insert or replace an existing record. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 329 +++++++++++++++++++++++++++++++++++++-- fs/xfs/libxfs/xfs_ialloc_btree.c | 31 ++++ fs/xfs/libxfs/xfs_ialloc_btree.h | 7 + fs/xfs/xfs_trace.h | 47 ++++++ 4 files changed, 400 insertions(+), 14 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 7c002f2..0aad400 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -378,6 +378,213 @@ xfs_ialloc_inode_init( } /* + * Align startino and allocmask for a recently allocated sparse chunk such that + * they are fit for insertion (or merge) into the on-disk inode btrees. + * + * Background: + * + * When enabled, sparse inode support increases the inode alignment from cluster + * size to inode chunk size. This means that the minimum range between two + * non-adjacent inode records in the inobt is large enough for a full inode + * record. This allows for cluster sized, cluster aligned block allocation + * without need to worry about whether the resulting inode record overlaps with + * another record in the tree. Without this basic rule, we would have to deal + * with the consequences of overlap by potentially undoing recent allocations in + * the inode allocation codepath. + * + * Because of this alignment rule (which is enforced on mount), there are two + * inobt possibilities for newly allocated sparse chunks. One is that the + * aligned inode record for the chunk covers a range of inodes not already + * covered in the inobt (i.e., it is safe to insert a new sparse record). The + * other is that a record already exists at the aligned startino that considers + * the newly allocated range as sparse. In the latter case, record content is + * merged in hope that sparse inode chunks fill to full chunks over time. + */ +STATIC void +xfs_align_sparse_ino( + struct xfs_mount *mp, + xfs_agino_t *startino, + uint16_t *allocmask) +{ + xfs_agblock_t agbno; + xfs_agblock_t mod; + int offset; + + agbno = XFS_AGINO_TO_AGBNO(mp, *startino); + mod = agbno % mp->m_sb.sb_inoalignmt; + if (!mod) + return; + + /* calculate the inode offset and align startino */ + offset = mod << mp->m_sb.sb_inopblog; + *startino -= offset; + + /* + * Since startino has been aligned down, left shift allocmask such that + * it continues to represent the same physical inodes relative to the + * new startino. + */ + *allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; +} + +/* + * Determine whether the source inode record can merge into the target. Both + * records must be sparse, the inode ranges must match and there must be no + * allocation overlap between the records. + */ +STATIC bool +__xfs_inobt_can_merge( + struct xfs_inobt_rec_incore *trec, /* tgt record */ + struct xfs_inobt_rec_incore *srec) /* src record */ +{ + uint64_t talloc; + uint64_t salloc; + + /* records must cover the same inode range */ + if (trec->ir_startino != srec->ir_startino) + return false; + + /* both records must be sparse */ + if (!xfs_inobt_issparse(trec->ir_holemask) || + !xfs_inobt_issparse(srec->ir_holemask)) + return false; + + /* both records must track some inodes */ + if (!trec->ir_count || !srec->ir_count) + return false; + + /* can't exceed capacity of a full record */ + if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK) + return false; + + /* verify there is no allocation overlap */ + talloc = xfs_inobt_irec_to_allocmask(trec); + salloc = xfs_inobt_irec_to_allocmask(srec); + if (talloc & salloc) + return false; + + return true; +} + +/* + * Merge the source inode record into the target. The caller must call + * __xfs_inobt_can_merge() to ensure the merge is valid. + */ +STATIC void +__xfs_inobt_rec_merge( + struct xfs_inobt_rec_incore *trec, /* target */ + struct xfs_inobt_rec_incore *srec) /* src */ +{ + ASSERT(trec->ir_startino == srec->ir_startino); + + /* combine the counts */ + trec->ir_count += srec->ir_count; + trec->ir_freecount += srec->ir_freecount; + + /* + * Merge the holemask and free mask. For both fields, 0 bits refer to + * allocated inodes. We combine the allocated ranges with bitwise AND. + */ + trec->ir_holemask &= srec->ir_holemask; + trec->ir_free &= srec->ir_free; +} + +/* + * Insert a new sparse inode chunk into the associated inode btree. The inode + * record for the sparse chunk is pre-aligned to a startino that should match + * any pre-existing sparse inode record in the tree. This allows sparse chunks + * to fill over time. + * + * This function supports two modes of handling preexisting records depending on + * the merge flag. If merge is true, the provided record is merged with the + * existing record and updated in place. The merged record is returned in nrec. + * If merge is false, an existing record is replaced with the provided record. + * If no preexisting record exists, the provided record is always inserted. + * + * It is considered corruption if a merge is requested and not possible. Given + * the sparse inode alignment constraints, this should never happen. + */ +STATIC int +xfs_inobt_insert_sprec( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + int btnum, + struct xfs_inobt_rec_incore *nrec, /* in/out: new/merged rec. */ + bool merge) /* merge or replace */ +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int error; + int i; + struct xfs_inobt_rec_incore rec; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + /* the new record is pre-aligned so we know where to look */ + error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + /* if nothing there, insert a new record and return */ + if (i == 0) { + error = xfs_inobt_insert_rec(cur, nrec->ir_holemask, + nrec->ir_count, nrec->ir_freecount, + nrec->ir_free, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + goto out; + } + + /* + * A record exists at this startino. Merge or replace the record + * depending on what we've been asked to do. + */ + if (merge) { + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + XFS_WANT_CORRUPTED_GOTO(rec.ir_startino == nrec->ir_startino, + error); + + /* + * This should never fail. If we have coexisting records that + * cannot merge, something is seriously wrong. + */ + XFS_WANT_CORRUPTED_GOTO(__xfs_inobt_can_merge(nrec, &rec), + error); + + trace_xfs_irec_merge_pre(mp, agno, rec.ir_startino, + rec.ir_holemask, nrec->ir_startino, + nrec->ir_holemask); + + /* merge to nrec to output the updated record */ + __xfs_inobt_rec_merge(nrec, &rec); + + trace_xfs_irec_merge_post(mp, agno, nrec->ir_startino, + nrec->ir_holemask); + + error = xfs_inobt_rec_check_count(mp, nrec); + if (error) + goto error; + } + + error = xfs_inobt_update(cur, nrec); + if (error) + goto error; + +out: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ @@ -395,6 +602,8 @@ xfs_ialloc_ag_alloc( xfs_agino_t newlen; /* new number of inodes */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ + uint16_t allocmask = (uint16_t) -1; /* init. to full chunk */ + struct xfs_inobt_rec_incore rec; struct xfs_perag *pag; memset(&args, 0, sizeof(args)); @@ -510,6 +719,45 @@ xfs_ialloc_ag_alloc( return error; } + /* + * Finally, try a sparse allocation if the filesystem supports it and + * the sparse allocation length is smaller than a full chunk. + */ + if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && + args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && + args.fsbno == NULLFSBLOCK) { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.agbno = be32_to_cpu(agi->agi_root); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); + args.alignment = args.mp->m_sb.sb_spino_align; + args.prod = 1; + + args.minlen = args.mp->m_ialloc_min_blks; + args.maxlen = args.minlen; + + /* + * The inode record will be aligned to full chunk size. We must + * prevent sparse allocation from AG boundaries that result in + * invalid inode records, such as records that start at agbno 0 + * or extend beyond the AG. + * + * Set min agbno to the first aligned, non-zero agbno and max to + * the last aligned agbno that is at least one full chunk from + * the end of the AG. + */ + args.min_agbno = args.mp->m_sb.sb_inoalignmt; + args.max_agbno = round_down(args.mp->m_sb.sb_agblocks, + args.mp->m_sb.sb_inoalignmt) - + args.mp->m_ialloc_blks; + + error = xfs_alloc_vextent(&args); + if (error) + return error; + + newlen = args.len << args.mp->m_sb.sb_inopblog; + allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1; + } + if (args.fsbno == NULLFSBLOCK) { *alloc = 0; return 0; @@ -534,6 +782,73 @@ xfs_ialloc_ag_alloc( * Convert the results. */ newino = XFS_OFFBNO_TO_AGINO(args.mp, args.agbno, 0); + + if (xfs_inobt_issparse(~allocmask)) { + /* + * We've allocated a sparse chunk. Align the startino and mask. + */ + xfs_align_sparse_ino(args.mp, &newino, &allocmask); + + rec.ir_startino = newino; + rec.ir_holemask = ~allocmask; + rec.ir_count = newlen; + rec.ir_freecount = newlen; + rec.ir_free = XFS_INOBT_ALL_FREE; + + /* + * Insert the sparse record into the inobt and allow for a merge + * if necessary. If a merge does occur, rec is updated to the + * merged record. + */ + error = xfs_inobt_insert_sprec(args.mp, tp, agbp, XFS_BTNUM_INO, + &rec, true); + if (error == -EFSCORRUPTED) { + xfs_alert(args.mp, + "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u", + XFS_AGINO_TO_INO(args.mp, agno, + rec.ir_startino), + rec.ir_holemask, rec.ir_count); + xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE); + } + if (error) + return error; + + /* + * We can't merge the part we've just allocated as for the inobt + * due to finobt semantics. The original record may or may not + * exist independent of whether physical inodes exist in this + * sparse chunk. + * + * We must update the finobt record based on the inobt record. + * rec contains the fully merged and up to date inobt record + * from the previous call. Set merge false to replace any + * existing record with this one. + */ + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert_sprec(args.mp, tp, agbp, + XFS_BTNUM_FINO, &rec, + false); + if (error) + return error; + } + } else { + /* full chunk - insert new records to both btrees */ + error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, + newlen, XFS_BTNUM_FINO); + if (error) + return error; + } + } + + /* + * Update AGI counts and newino. + */ be32_add_cpu(&agi->agi_count, newlen); be32_add_cpu(&agi->agi_freecount, newlen); pag = xfs_perag_get(args.mp, agno); @@ -542,20 +857,6 @@ xfs_ialloc_ag_alloc( agi->agi_newino = cpu_to_be32(newino); /* - * Insert records describing the new inode chunk into the btrees. - */ - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_INO); - if (error) - return error; - - if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_FINO); - if (error) - return error; - } - /* * Log allocation group header fields */ xfs_ialloc_log_agi(tp, agbp, diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index aa13b46..674ad8f 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -478,3 +478,34 @@ xfs_inobt_irec_to_allocmask( return bitmap; } + +#if defined(DEBUG) || defined(XFS_WARN) +/* + * Verify that an in-core inode record has a valid inode count. + */ +int +xfs_inobt_rec_check_count( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + int inocount = 0; + int nextbit = 0; + uint64_t allocbmap; + int wordsz; + + wordsz = sizeof(allocbmap) / sizeof(unsigned int); + allocbmap = xfs_inobt_irec_to_allocmask(rec); + + nextbit = xfs_next_bit((uint *) &allocbmap, wordsz, nextbit); + while (nextbit != -1) { + inocount++; + nextbit = xfs_next_bit((uint *) &allocbmap, wordsz, + nextbit + 1); + } + + if (inocount != rec->ir_count) + return -EFSCORRUPTED; + + return 0; +} +#endif /* DEBUG */ diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.h b/fs/xfs/libxfs/xfs_ialloc_btree.h index 2c581ba..bd88453 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.h +++ b/fs/xfs/libxfs/xfs_ialloc_btree.h @@ -65,4 +65,11 @@ extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); /* ir_holemask to inode allocation bitmap conversion */ uint64_t xfs_inobt_irec_to_allocmask(struct xfs_inobt_rec_incore *); +#if defined(DEBUG) || defined(XFS_WARN) +int xfs_inobt_rec_check_count(struct xfs_mount *, + struct xfs_inobt_rec_incore *); +#else +#define xfs_inobt_rec_check_count(mp, rec) 0 +#endif /* DEBUG */ + #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..12a4bf4 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -734,6 +734,53 @@ TRACE_EVENT(xfs_iomap_prealloc_size, __entry->blocks, __entry->shift, __entry->writeio_blocks) ) +TRACE_EVENT(xfs_irec_merge_pre, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask, xfs_agino_t nagino, uint16_t nholemask), + TP_ARGS(mp, agno, agino, holemask, nagino, nholemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + __field(xfs_agino_t, nagino) + __field(uint16_t, nholemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + __entry->nagino = nagino; + __entry->nholemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x) new (%u:0x%x)", + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, + __entry->agino, __entry->holemask, __entry->nagino, + __entry->nholemask) +) + +TRACE_EVENT(xfs_irec_merge_post, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t agino, + uint16_t holemask), + TP_ARGS(mp, agno, agino, holemask), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agino_t, agino) + __field(uint16_t, holemask) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agino = agino; + __entry->holemask = holemask; + ), + TP_printk("dev %d:%d agno %d inobt (%u:0x%x)", MAJOR(__entry->dev), + MINOR(__entry->dev), __entry->agno, __entry->agino, + __entry->holemask) +) + #define DEFINE_IREF_EVENT(name) \ DEFINE_EVENT(xfs_iref_class, name, \ TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), \ -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8E94D7F55 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7DCB78F8073 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011634c79c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sJOQkeotirzNFhXa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDk6I000301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDkXq018236 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C0459124FE2; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 14/18] xfs: randomly do sparse inode allocations in DEBUG mode Date: Thu, 19 Feb 2015 13:13:39 -0500 X-ASG-Orig-Subj: [PATCH v5 14/18] xfs: randomly do sparse inode allocations in DEBUG mode Message-Id: <1424369623-5656-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sparse inode allocations generally only occur when full inode chunk allocation fails. This requires some level of filesystem space usage and fragmentation. For filesystems formatted with sparse inode chunks enabled, do random sparse inode chunk allocs when compiled in DEBUG mode to increase test coverage. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 0aad400..f719706 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -606,9 +606,18 @@ xfs_ialloc_ag_alloc( struct xfs_inobt_rec_incore rec; struct xfs_perag *pag; + int do_sparse = 0; + +#ifdef DEBUG + /* randomly do sparse inode allocations */ + if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb)) + do_sparse = prandom_u32() & 1; +#endif + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; + args.fsbno = NULLFSBLOCK; /* * Locking will ensure that we don't have two callers in here @@ -629,6 +638,8 @@ xfs_ialloc_ag_alloc( agno = be32_to_cpu(agi->agi_seqno); args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) + args.mp->m_ialloc_blks; + if (do_sparse) + goto sparse_alloc; if (likely(newino != NULLAGINO && (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); @@ -667,8 +678,7 @@ xfs_ialloc_ag_alloc( * subsequent requests. */ args.minalignslop = 0; - } else - args.fsbno = NULLFSBLOCK; + } if (unlikely(args.fsbno == NULLFSBLOCK)) { /* @@ -726,6 +736,7 @@ xfs_ialloc_ag_alloc( if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks && args.fsbno == NULLFSBLOCK) { +sparse_alloc: args.type = XFS_ALLOCTYPE_NEAR_BNO; args.agbno = be32_to_cpu(agi->agi_root); args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:47 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B85EF7F51 for ; Thu, 19 Feb 2015 12:13:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A65EB30406A for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369625-04cbb011624c79a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0dhefqSSPlzzxjwR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDjGm014607 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjiu015181 for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E0EC5124FE2; Thu, 19 Feb 2015 13:13:43 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 00/18] xfs: sparse inode chunks Date: Thu, 19 Feb 2015 13:13:25 -0500 X-ASG-Orig-Subj: [PATCH v5 00/18] xfs: sparse inode chunks Message-Id: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's v5 of sparse inode chunks. The only real change here is to convert the allocmask helpers back to using the XFS bitmap helpers rather than the generic bitmap code. This eliminates the need for the endian-conversion hack and extra helper to export a generic bitmap to a native type. The former users of the generic bitmap itself have been converted to use the native 64-bit value appropriately. The XFS bitmap code is actually not in userspace either so neither of these implementations backport cleanly to userspace. As it is, I've not included the sparse alloc/free code in my xfsprogs branch as this code currently isn't needed. Nothing in userspace that I've seen requires the ability to do a sparse inode allocation or free. I suspect if it is needed in the future, we can more easily sync the XFS bitmap helpers to userspace than the generic Linux bitmap code. Thoughts, reviews, flames appreciated... Brian v5: - Use XFS helpers for allocmask code instead of generic bitmap helpers. v4: http://oss.sgi.com/archives/xfs/2015-02/msg00240.html - Rename sb_spinoalignmt to sb_spino_align. - Clean up error/warning messages. - Use a union to differentiate old/new xfs_inobt_rec on-disk format. Refactor such that in-core record fields are always valid. - Rename/move allocmap (bitmap) helper functions and provide extra helper for endian conv. - Refactor sparse chunk allocation record management code. - Clean up #ifdef and label usage for DEBUG mode sparse allocs. - Split up and moved some generic, preparatory hunks earlier in series. v3: http://oss.sgi.com/archives/xfs/2015-02/msg00110.html - Rebase to latest for-next (bulkstat rework, data structure shuffling, etc.). - Fix issparse helper logic. - Update inode alignment model w/ spinodes enabled. All inode records are chunk size aligned, sparse allocations cluster size aligned (both enforced on mount). - Reworked sparse inode record merge logic to coincide w/ new alignment model. - Mark feature as experimental (warn on mount). - Include and use block allocation agbno range limit to prevent allocation of invalid inode records. - Add some DEBUG bits to improve sparse alloc. test coverage. v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html - Use a manually set feature bit instead of dynamic based on the existence of sparse inode chunks. - Add sb/mp fields for sparse alloc. granularity (use instead of cluster size). - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page size arches. - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. - Use byte of pad space in inobt record for inode count field. - Convert bitmap mgmt to use generic bitmap code. - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. - Add fs geometry bit for sparse inodes. - Rebase to latest for-next (bulkstat refactor). v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html Brian Foster (18): xfs: create individual inode alloc. helper xfs: update free inode record logic to support sparse inode records xfs: support min/max agbno args in block allocator xfs: add sparse inode chunk alignment superblock field xfs: use sparse chunk alignment for min. inode allocation requirement xfs: sparse inode chunks feature helpers and mount requirements xfs: add fs geometry bit for sparse inode chunks xfs: introduce inode record hole mask for sparse inode chunks xfs: use actual inode count for sparse records in bulkstat/inumbers xfs: pass inode count through ordered icreate log item xfs: handle sparse inode chunks in icreate log recovery xfs: helper to convert holemask to inode alloc. bitmap xfs: allocate sparse inode chunks on full chunk allocation failure xfs: randomly do sparse inode allocations in DEBUG mode xfs: filter out sparse regions from individual inode allocation xfs: only free allocated regions of inode chunks xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() xfs: enable sparse inode chunks for v5 superblocks fs/xfs/libxfs/xfs_alloc.c | 42 +++- fs/xfs/libxfs/xfs_alloc.h | 2 + fs/xfs/libxfs/xfs_format.h | 50 +++- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 530 +++++++++++++++++++++++++++++++++++---- fs/xfs/libxfs/xfs_ialloc.h | 12 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 93 ++++++- fs/xfs/libxfs/xfs_ialloc_btree.h | 10 + fs/xfs/libxfs/xfs_sb.c | 30 ++- fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_inode.c | 28 ++- fs/xfs/xfs_itable.c | 13 +- fs/xfs/xfs_log_recover.c | 26 +- fs/xfs/xfs_mount.c | 16 ++ fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_trace.h | 47 ++++ 16 files changed, 820 insertions(+), 86 deletions(-) -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F18EC7F59 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E08EA304053 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369627-04cbb011624c79c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UveqrxgXPSkIQ0Ov (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:48 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkMs017837 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjQH015203 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7810F124FE8; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 08/18] xfs: introduce inode record hole mask for sparse inode chunks Date: Thu, 19 Feb 2015 13:13:33 -0500 X-ASG-Orig-Subj: [PATCH v5 08/18] xfs: introduce inode record hole mask for sparse inode chunks Message-Id: <1424369623-5656-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inode btrees track 64 inodes per record regardless of inode size. Thus, inode chunks on disk vary in size depending on the size of the inodes. This creates a contiguous allocation requirement for new inode chunks that can be difficult to satisfy on an aged and fragmented (free space) filesystems. The inode record freecount currently uses 4 bytes on disk to track the free inode count. With a maximum freecount value of 64, only one byte is required. Convert the freecount field to a single byte and use two of the remaining 3 higher order bytes left for the hole mask field. Use the final leftover byte for the total count field. The hole mask field tracks holes in the chunks of physical space that the inode record refers to. This facilitates the sparse allocation of inode chunks when contiguous chunks are not available and allows the inode btrees to identify what portions of the chunk contain valid inodes. The total count field contains the total number of valid inodes referred to by the record. This can also be deduced from the hole mask. The count field provides clarity and redundancy for internal record verification. Note that neither of the new fields can be written to disk on fs' without sparse inode support. Doing so writes to the high-order bytes of freecount and causes corruption from the perspective of older kernels. The on-disk inobt record data structure is updated with a union to distinguish between the original, "full" format and the new, "sparse" format. The conversion routines to get, insert and update records are updated to translate to and from the on-disk record accordingly such that freecount remains a 4-byte value on non-supported fs, yet the new fields of the in-core record are always valid with respect to the record. This means that higher level code can refer to the current in-core record format unconditionally and lower level code ensures that records are translated to/from disk according to the capabilities of the fs. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 34 +++++++++++++++++++++++++--- fs/xfs/libxfs/xfs_ialloc.c | 48 +++++++++++++++++++++++++++++++++------- fs/xfs/libxfs/xfs_ialloc_btree.c | 11 ++++++++- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 47005b1..4f2160d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1285,26 +1285,54 @@ typedef __uint64_t xfs_inofree_t; #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) +#define XFS_INOBT_HOLEMASK_FULL 0 /* holemask for full chunk */ +#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(__uint16_t)) +#define XFS_INODES_PER_HOLEMASK_BIT \ + (XFS_INODES_PER_CHUNK / (NBBY * sizeof(__uint16_t))) + static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; } /* - * Data record structure + * The on-disk inode record structure has two formats. The original "full" + * format uses a 4-byte freecount. The "sparse" format uses a 1-byte freecount + * and replaces the 3 high-order freecount bytes wth the holemask and inode + * count. + * + * The holemask of the sparse record format allows an inode chunk to have holes + * that refer to blocks not owned by the inode record. This facilitates inode + * allocation in the event of severe free space fragmentation. */ typedef struct xfs_inobt_rec { __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ + union { + struct { + __be32 ir_freecount; /* count of free inodes */ + } f; + struct { + __be16 ir_holemask;/* hole mask for sparse chunks */ + __u8 ir_count; /* total inode count */ + __u8 ir_freecount; /* count of free inodes */ + } sp; + } ir_u; __be64 ir_free; /* free inode mask */ } xfs_inobt_rec_t; typedef struct xfs_inobt_rec_incore { xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ + __uint16_t ir_holemask; /* hole mask for sparse chunks */ + __uint8_t ir_count; /* total inode count */ + __uint8_t ir_freecount; /* count of free inodes (set bits) */ xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; +static inline bool xfs_inobt_issparse(uint16_t holemask) +{ + /* non-zero holemask represents a sparse rec. */ + return holemask; +} /* * Key structure diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 07cce35..008cb24 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -65,6 +65,8 @@ xfs_inobt_lookup( int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; cur->bc_rec.i.ir_freecount = 0; cur->bc_rec.i.ir_free = 0; return xfs_btree_lookup(cur, dir, stat); @@ -82,7 +84,14 @@ xfs_inobt_update( union xfs_btree_rec rec; rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + rec.inobt.ir_u.sp.ir_holemask = cpu_to_be16(irec->ir_holemask); + rec.inobt.ir_u.sp.ir_count = irec->ir_count; + rec.inobt.ir_u.sp.ir_freecount = irec->ir_freecount; + } else { + /* ir_holemask/ir_count not supported on-disk */ + rec.inobt.ir_u.f.ir_freecount = cpu_to_be32(irec->ir_freecount); + } rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -100,12 +109,27 @@ xfs_inobt_get_rec( int error; error = xfs_btree_get_rec(cur, &rec, stat); - if (!error && *stat == 1) { - irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); - irec->ir_free = be64_to_cpu(rec->inobt.ir_free); + if (error || *stat == 0) + return error; + + irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask); + irec->ir_count = rec->inobt.ir_u.sp.ir_count; + irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount; + } else { + /* + * ir_holemask/ir_count not supported on-disk. Fill in hardcoded + * values for full inode chunks. + */ + irec->ir_holemask = XFS_INOBT_HOLEMASK_FULL; + irec->ir_count = XFS_INODES_PER_CHUNK; + irec->ir_freecount = + be32_to_cpu(rec->inobt.ir_u.f.ir_freecount); } - return error; + irec->ir_free = be64_to_cpu(rec->inobt.ir_free); + + return 0; } /* @@ -114,10 +138,14 @@ xfs_inobt_get_rec( STATIC int xfs_inobt_insert_rec( struct xfs_btree_cur *cur, + __uint16_t holemask, + __uint8_t count, __int32_t freecount, xfs_inofree_t free, int *stat) { + cur->bc_rec.i.ir_holemask = holemask; + cur->bc_rec.i.ir_count = count; cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); @@ -154,7 +182,9 @@ xfs_inobt_insert( } ASSERT(i == 0); - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + error = xfs_inobt_insert_rec(cur, XFS_INOBT_HOLEMASK_FULL, + XFS_INODES_PER_CHUNK, + XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); @@ -1604,7 +1634,9 @@ xfs_difree_finobt( */ XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); - error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + error = xfs_inobt_insert_rec(cur, ibtrec->ir_holemask, + ibtrec->ir_count, + ibtrec->ir_freecount, ibtrec->ir_free, &i); if (error) goto error; diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 964c465..b95aac5 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -167,7 +167,16 @@ xfs_inobt_init_rec_from_cur( union xfs_btree_rec *rec) { rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino); - rec->inobt.ir_freecount = cpu_to_be32(cur->bc_rec.i.ir_freecount); + if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + rec->inobt.ir_u.sp.ir_holemask = + cpu_to_be16(cur->bc_rec.i.ir_holemask); + rec->inobt.ir_u.sp.ir_count = cur->bc_rec.i.ir_count; + rec->inobt.ir_u.sp.ir_freecount = cur->bc_rec.i.ir_freecount; + } else { + /* ir_holemask/ir_count not supported on-disk */ + rec->inobt.ir_u.f.ir_freecount = + cpu_to_be32(cur->bc_rec.i.ir_freecount); + } rec->inobt.ir_free = cpu_to_be64(cur->bc_rec.i.ir_free); } -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D975D7F56 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A4D4AC008 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011624c79b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id p4ZB9MjFcmCgj5WB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkRd032766 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjrY018230 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E5EC124FEA; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 10/18] xfs: pass inode count through ordered icreate log item Date: Thu, 19 Feb 2015 13:13:35 -0500 X-ASG-Orig-Subj: [PATCH v5 10/18] xfs: pass inode count through ordered icreate log item Message-Id: <1424369623-5656-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 v5 superblocks use an ordered log item for logging the initialization of inode chunks. The icreate log item is currently hardcoded to an inode count of 64 inodes. The agbno and extent length are used to initialize the inode chunk from log recovery. While an incorrect inode count does not lead to bad inode chunk initialization, we should pass the correct inode count such that log recovery has enough data to perform meaningful validity checks on the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 7 ++++--- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/xfs_log_recover.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 008cb24..7c002f2 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -250,6 +250,7 @@ xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, struct list_head *buffer_list, + int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, @@ -305,7 +306,7 @@ xfs_ialloc_inode_init( * they track in the AIL as if they were physically logged. */ if (tp) - xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, + xfs_icreate_log(tp, agno, agbno, icount, mp->m_sb.sb_inodesize, length, gen); } else version = 2; @@ -524,8 +525,8 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - error = xfs_ialloc_inode_init(args.mp, tp, NULL, agno, args.agbno, - args.len, prandom_u32()); + error = xfs_ialloc_inode_init(args.mp, tp, NULL, newlen, agno, + args.agbno, args.len, prandom_u32()); if (error) return error; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 100007d..4d4b702 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -156,7 +156,7 @@ int xfs_inobt_get_rec(struct xfs_btree_cur *cur, * Inode chunk initialisation routine */ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, - struct list_head *buffer_list, + struct list_head *buffer_list, int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index a5a945f..ecc73d5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3091,8 +3091,8 @@ xlog_recover_do_icreate_pass2( XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) return 0; - xfs_ialloc_inode_init(mp, NULL, buffer_list, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); + xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, + be32_to_cpu(icl->icl_gen)); return 0; } -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC8D67F58 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69CDBAC00A for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cb6c6b0c52a540001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pEDV5mRtQHIRnG4V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkWw015026 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjvW030535 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id F03DD124FED; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 17/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Date: Thu, 19 Feb 2015 13:13:42 -0500 X-ASG-Orig-Subj: [PATCH v5 17/18] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Message-Id: <1424369623-5656-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ifree_cluster() is called to mark all in-memory inodes and inode buffers as stale. This occurs after we've removed the inobt records and dropped any references of inobt data. xfs_ifree_cluster() uses the starting inode number to walk the namespace of inodes expected for a single chunk a cluster buffer at a time. The cluster buffer disk addresses are calculated by decoding the sequential inode numbers expected from the chunk. The problem with this approach is that if the inode chunk being removed is a sparse chunk, not all of the buffer addresses that are calculated as part of this sequence may be inode clusters. Attempting to acquire the buffer based on expected inode characterstics (i.e., cluster length) can lead to errors and is generally incorrect. We already use a couple variables to carry requisite state from xfs_difree() to xfs_ifree_cluster(). Rather than add a third, define a new internal structure to carry the existing parameters through these functions. Add an alloc field that represents the physical allocation bitmap of inodes in the chunk being removed. Modify xfs_ifree_cluster() to check each inode against the bitmap and skip the clusters that were never allocated as real inodes on disk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 17 +++++++---------- fs/xfs/libxfs/xfs_ialloc.h | 10 ++++++++-- fs/xfs/xfs_inode.c | 28 ++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index a29dd4e..b81e5e3 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1882,8 +1882,7 @@ xfs_difree_inobt( struct xfs_buf *agbp, xfs_agino_t agino, struct xfs_bmap_free *flist, - int *deleted, - xfs_ino_t *first_ino, + struct xfs_icluster *xic, struct xfs_inobt_rec_incore *orec) { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); @@ -1941,9 +1940,9 @@ xfs_difree_inobt( */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_free == XFS_INOBT_ALL_FREE)) { - - *deleted = 1; - *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->deleted = 1; + xic->first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->alloc = xfs_inobt_irec_to_allocmask(&rec); /* * Remove the inode cluster from the AGI B+Tree, adjust the @@ -1968,7 +1967,7 @@ xfs_difree_inobt( xfs_difree_inode_chunk(mp, agno, &rec, flist); } else { - *deleted = 0; + xic->deleted = 0; error = xfs_inobt_update(cur, &rec); if (error) { @@ -2107,8 +2106,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted,/* set if inode cluster was deleted */ - xfs_ino_t *first_ino)/* first inode in deleted cluster */ + struct xfs_icluster *xic) /* cluster info if deleted */ { /* REFERENCED */ xfs_agblock_t agbno; /* block number containing inode */ @@ -2159,8 +2157,7 @@ xfs_difree( /* * Fix up the inode allocation btree. */ - error = xfs_difree_inobt(mp, tp, agbp, agino, flist, deleted, first_ino, - &rec); + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, xic, &rec); if (error) goto error0; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 4d4b702..12401fe 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -28,6 +28,13 @@ struct xfs_btree_cur; /* Move inodes in clusters of this size */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 +struct xfs_icluster { + bool deleted; /* record is deleted */ + xfs_ino_t first_ino; /* first inode number */ + uint64_t alloc; /* inode phys. allocation bitmap for + * sparse chunks */ +}; + /* Calculate and return the number of filesystem blocks per inode cluster */ static inline int xfs_icluster_size_fsb( @@ -90,8 +97,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino); /* first inode in deleted cluster */ + struct xfs_icluster *ifree); /* cluster info if deleted */ /* * Return the location of the inode in imap, for mapping it into a buffer. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index daafa1f..a054110 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2182,9 +2182,9 @@ xfs_iunlink_remove( */ STATIC int xfs_ifree_cluster( - xfs_inode_t *free_ip, - xfs_trans_t *tp, - xfs_ino_t inum) + xfs_inode_t *free_ip, + xfs_trans_t *tp, + struct xfs_icluster *xic) { xfs_mount_t *mp = free_ip->i_mount; int blks_per_cluster; @@ -2197,13 +2197,26 @@ xfs_ifree_cluster( xfs_inode_log_item_t *iip; xfs_log_item_t *lip; struct xfs_perag *pag; + xfs_ino_t inum; + inum = xic->first_ino; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum)); blks_per_cluster = xfs_icluster_size_fsb(mp); inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; nbufs = mp->m_ialloc_blks / blks_per_cluster; for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) { + /* + * The allocation bitmap tells us which inodes of the chunk were + * physically allocated. Skip the cluster if an inode falls into + * a sparse region. + */ + if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) { + ASSERT(((inum - xic->first_ino) % + inodes_per_cluster) == 0); + continue; + } + blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); @@ -2361,8 +2374,7 @@ xfs_ifree( xfs_bmap_free_t *flist) { int error; - int delete; - xfs_ino_t first_ino; + struct xfs_icluster xic = { 0 }; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(ip->i_d.di_nlink == 0); @@ -2378,7 +2390,7 @@ xfs_ifree( if (error) return error; - error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino); + error = xfs_difree(tp, ip->i_ino, flist, &xic); if (error) return error; @@ -2395,8 +2407,8 @@ xfs_ifree( ip->i_d.di_gen++; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (delete) - error = xfs_ifree_cluster(ip, tp, first_ino); + if (xic.deleted) + error = xfs_ifree_cluster(ip, tp, &xic); return error; } -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 23B407F60 for ; Thu, 19 Feb 2015 12:13:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12C4B304053 for ; Thu, 19 Feb 2015 10:13:49 -0800 (PST) X-ASG-Debug-ID: 1424369627-04cbb011634c79d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qqY6VU0A3EWzXXFq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:48 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkcE007672 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjTK029971 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E1C94124FEF; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 15/18] xfs: filter out sparse regions from individual inode allocation Date: Thu, 19 Feb 2015 13:13:40 -0500 X-ASG-Orig-Subj: [PATCH v5 15/18] xfs: filter out sparse regions from individual inode allocation Message-Id: <1424369623-5656-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369628 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from an existing record with free inodes traditionally selects the first inode available according to the ir_free mask. With sparse inode chunks, the ir_free mask could refer to an unallocated region. We must mask the unallocated regions out of ir_free before using it to select a free inode in the chunk. Update the xfs_inobt_first_free_inode() helper to find the first free inode available of the allocated regions of the inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index f719706..a673da3 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1074,13 +1074,24 @@ xfs_ialloc_get_rec( } /* - * Return the offset of the first free inode in the record. + * Return the offset of the first free inode in the record. If the inode chunk + * is sparsely allocated, we convert the record holemask to inode granularity + * and mask off the unallocated regions from the inode free mask. */ STATIC int xfs_inobt_first_free_inode( struct xfs_inobt_rec_incore *rec) { - return xfs_lowbit64(rec->ir_free); + xfs_inofree_t realfree; + + /* if there are no holes, return the first available offset */ + if (!xfs_inobt_issparse(rec->ir_holemask)) + return xfs_lowbit64(rec->ir_free); + + realfree = xfs_inobt_irec_to_allocmask(rec); + realfree &= rec->ir_free; + + return xfs_lowbit64(realfree); } /* -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBDD97F50 for ; Thu, 19 Feb 2015 12:13:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 74EA58F8040 for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369627-04bdf06a5b512c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8QieEaJg4rwfaCdh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkPr017836 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDj8u029970 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F845124FE4; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 05/18] xfs: use sparse chunk alignment for min. inode allocation requirement Date: Thu, 19 Feb 2015 13:13:30 -0500 X-ASG-Orig-Subj: [PATCH v5 05/18] xfs: use sparse chunk alignment for min. inode allocation requirement Message-Id: <1424369623-5656-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_select() iterates through the allocation groups looking for free inodes or free space to determine whether to allow an inode allocation to proceed. If no free inodes are available, it assumes that an AG must have an extent longer than mp->m_ialloc_blks. Sparse inode chunk support currently allows for allocations smaller than the traditional inode chunk size specified in m_ialloc_blks. The current minimum sparse allocation is set in the superblock sb_spino_align field at mkfs time. Create a new m_ialloc_min_blks field in xfs_mount and use this to represent the minimum supported allocation size for inode chunks. Initialize m_ialloc_min_blks at mount time based on whether sparse inodes are supported. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 5 +++++ fs/xfs/xfs_mount.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ffac044..07cce35 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -644,7 +644,7 @@ xfs_ialloc_ag_select( * if we fail allocation due to alignment issues then it is most * likely a real ENOSPC condition. */ - ineed = mp->m_ialloc_blks; + ineed = mp->m_ialloc_min_blks; if (flags && ineed > 1) ineed += xfs_ialloc_cluster_alignment(mp); longest = pag->pagf_longest; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index a461c2e..2b5b4fe 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -697,6 +697,11 @@ xfs_sb_mount_common( mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; + + if (sbp->sb_spino_align) + mp->m_ialloc_min_blks = sbp->sb_spino_align; + else + mp->m_ialloc_min_blks = mp->m_ialloc_blks; } /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 0d8abd6..cba7afb 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -136,6 +136,8 @@ typedef struct xfs_mount { __uint64_t m_flags; /* global mount flags */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ + int m_ialloc_min_blks;/* min blocks in sparse inode + * allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ struct xfs_trans_resv m_resv; /* precomputed res values */ -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 314167F62 for ; Thu, 19 Feb 2015 12:13:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 110B38F8040 for ; Thu, 19 Feb 2015 10:13:49 -0800 (PST) X-ASG-Debug-ID: 1424369627-04cbb011654c79d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GYLbI1cHCAqcZFq8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:48 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkic017838 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDkEv029976 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A766E124FEC; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 12/18] xfs: helper to convert holemask to inode alloc. bitmap Date: Thu, 19 Feb 2015 13:13:37 -0500 X-ASG-Orig-Subj: [PATCH v5 12/18] xfs: helper to convert holemask to inode alloc. bitmap Message-Id: <1424369623-5656-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inobt record holemask field is a condensed data type designed to fit into the existing on-disk record and is zero based (allocated regions are set to 0, sparse regions are set to 1) to provide backwards compatibility. This makes the type somewhat complex for use in higher level inode manipulations such as individual inode allocation, etc. Rather than foist the complexity of dealing with this field to every bit of logic that requires inode granular information, create a helper to convert the holemask to an inode allocation bitmap. The inode allocation bitmap is inode granularity similar to the inobt record free mask and indicates which inodes of the chunk are physically allocated on disk, irrespective of whether the inode is considered allocated or free by the filesystem. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc_btree.c | 51 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc_btree.h | 3 +++ 2 files changed, 54 insertions(+) diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index b95aac5..aa13b46 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -427,3 +427,54 @@ xfs_inobt_maxrecs( return blocklen / sizeof(xfs_inobt_rec_t); return blocklen / (sizeof(xfs_inobt_key_t) + sizeof(xfs_inobt_ptr_t)); } + +/* + * Convert the inode record holemask to an inode allocation bitmap. The inode + * allocation bitmap is inode granularity and specifies whether an inode is + * physically allocated on disk (not whether the inode is considered allocated + * or free by the fs). + * + * A bit value of 1 means the inode is allocated, a value of 0 means it is free. + */ +uint64_t +xfs_inobt_irec_to_allocmask( + struct xfs_inobt_rec_incore *rec) +{ + uint64_t bitmap = 0; + uint64_t inodespbit; + int nextbit; + uint allocbitmap; + + /* + * The holemask has 16-bits for a 64 inode record. Therefore each + * holemask bit represents multiple inodes. Create a mask of bits to set + * in the allocmask for each holemask bit. + */ + inodespbit = (1 << XFS_INODES_PER_HOLEMASK_BIT) - 1; + + /* + * Allocated inodes are represented by 0 bits in holemask. Invert the 0 + * bits to 1 and convert to a uint so we can use xfs_next_bit(). Mask + * anything beyond the 16 holemask bits since this casts to a larger + * type. + */ + allocbitmap = ~rec->ir_holemask & ((1 << XFS_INOBT_HOLEMASK_BITS) - 1); + + /* + * allocbitmap is the inverted holemask so every set bit represents + * allocated inodes. To expand from 16-bit holemask granularity to + * 64-bit (e.g., bit-per-inode), set inodespbit bits in the target + * bitmap for every holemask bit. + */ + nextbit = xfs_next_bit(&allocbitmap, 1, 0); + while (nextbit != -1) { + ASSERT(nextbit < (sizeof(rec->ir_holemask) * NBBY)); + + bitmap |= (inodespbit << + (nextbit * XFS_INODES_PER_HOLEMASK_BIT)); + + nextbit = xfs_next_bit(&allocbitmap, 1, nextbit + 1); + } + + return bitmap; +} diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.h b/fs/xfs/libxfs/xfs_ialloc_btree.h index d7ebea7..2c581ba 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.h +++ b/fs/xfs/libxfs/xfs_ialloc_btree.h @@ -62,4 +62,7 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, xfs_btnum_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); +/* ir_holemask to inode allocation bitmap conversion */ +uint64_t xfs_inobt_irec_to_allocmask(struct xfs_inobt_rec_incore *); + #endif /* __XFS_IALLOC_BTREE_H__ */ -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6F6297F51 for ; Thu, 19 Feb 2015 12:13:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 504FC8F8073 for ; Thu, 19 Feb 2015 10:13:50 -0800 (PST) X-ASG-Debug-ID: 1424369625-04bdf06a59512c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HkyzvsNvTv2VycP2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDje0014606 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjdh029965 for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2863D124FE1; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 02/18] xfs: update free inode record logic to support sparse inode records Date: Thu, 19 Feb 2015 13:13:27 -0500 X-ASG-Orig-Subj: [PATCH v5 02/18] xfs: update free inode record logic to support sparse inode records Message-Id: <1424369623-5656-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_difree_inobt() uses logic in a couple places that assume inobt records refer to fully allocated chunks. Specifically, the use of mp->m_ialloc_inos can cause problems for inode chunks that are sparsely allocated. Sparse inode chunks can, by definition, define a smaller number of inodes than a full inode chunk. Fix the logic that determines whether an inode record should be removed from the inobt to use the ir_free mask rather than ir_freecount. Fix the agi counters modification to use ir_freecount to add the actual number of inodes freed rather than assuming a full inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 12b62a34..ffac044 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1509,7 +1509,7 @@ xfs_difree_inobt( * When an inode cluster is free, it becomes eligible for removal */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && - (rec.ir_freecount == mp->m_ialloc_inos)) { + (rec.ir_free == XFS_INOBT_ALL_FREE)) { *deleted = 1; *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); @@ -1519,7 +1519,7 @@ xfs_difree_inobt( * AGI and Superblock inode counts, and mark the disk space * to be freed when the transaction is committed. */ - ilen = mp->m_ialloc_inos; + ilen = rec.ir_freecount; be32_add_cpu(&agi->agi_count, -ilen); be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); @@ -1640,7 +1640,7 @@ xfs_difree_finobt( * keeping inode chunks permanently on disk, remove the record. * Otherwise, update the record with the new information. */ - if (rec.ir_freecount == mp->m_ialloc_inos && + if (rec.ir_free == XFS_INOBT_ALL_FREE && !(mp->m_flags & XFS_MOUNT_IKEEP)) { error = xfs_btree_delete(cur, &i); if (error) -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8FFA77F55 for ; Thu, 19 Feb 2015 12:13:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F9A0304053 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cb6c6b0b52a530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mrAYUUAtXMCdPKht (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDj8b014615 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjwg030520 for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4118C124FE5; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 03/18] xfs: support min/max agbno args in block allocator Date: Thu, 19 Feb 2015 13:13:28 -0500 X-ASG-Orig-Subj: [PATCH v5 03/18] xfs: support min/max agbno args in block allocator Message-Id: <1424369623-5656-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The block allocator supports various arguments to tweak block allocation behavior and set allocation requirements. The sparse inode chunk feature introduces a new requirement not supported by the current arguments. Sparse inode allocations must convert or merge into an inode record that describes a fixed length chunk (64 inodes x inodesize). Full inode chunk allocations by definition always result in valid inode records. Sparse chunk allocations are smaller and the associated records can refer to blocks not owned by the inode chunk. This model can result in invalid inode records in certain cases. For example, if a sparse allocation occurs near the start of an AG, the aligned inode record for that chunk might refer to agbno 0. If an allocation occurs towards the end of the AG and the AG size is not aligned, the inode record could refer to blocks beyond the end of the AG. While neither of these scenarios directly result in corruption, they both insert invalid inode records and at minimum cause repair to complain, are unlikely to merge into full chunks over time and set land mines for other areas of code. To guarantee sparse inode chunk allocation creates valid inode records, support the ability to specify an agbno range limit for XFS_ALLOCTYPE_NEAR_BNO block allocations. The min/max agbno's are specified in the allocation arguments and limit the block allocation algorithms to that range. The starting 'agbno' hint is clamped to the range if the specified agbno is out of range. If no sufficient extent is available within the range, the allocation fails. For backwards compatibility, the min/max fields can be initialized to 0 to disable range limiting (e.g., equivalent to min=0,max=agsize). Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_alloc.c | 42 +++++++++++++++++++++++++++++++++++++----- fs/xfs/libxfs/xfs_alloc.h | 2 ++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index a6fbf44..0ddf6c9 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -149,13 +149,27 @@ xfs_alloc_compute_aligned( { xfs_agblock_t bno; xfs_extlen_t len; + xfs_extlen_t diff; /* Trim busy sections out of found extent */ xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len); + /* + * If we have a largish extent that happens to start before min_agbno, + * see if we can shift it into range... + */ + if (bno < args->min_agbno && bno + len > args->min_agbno) { + diff = args->min_agbno - bno; + if (len > diff) { + bno += diff; + len -= diff; + } + } + if (args->alignment > 1 && len >= args->minlen) { xfs_agblock_t aligned_bno = roundup(bno, args->alignment); - xfs_extlen_t diff = aligned_bno - bno; + + diff = aligned_bno - bno; *resbno = aligned_bno; *reslen = diff >= len ? 0 : len - diff; @@ -790,9 +804,13 @@ xfs_alloc_find_best_extent( * The good extent is closer than this one. */ if (!dir) { + if (*sbnoa > args->max_agbno) + goto out_use_good; if (*sbnoa >= args->agbno + gdiff) goto out_use_good; } else { + if (*sbnoa < args->min_agbno) + goto out_use_good; if (*sbnoa <= args->agbno - gdiff) goto out_use_good; } @@ -879,6 +897,17 @@ xfs_alloc_ag_vextent_near( dofirst = prandom_u32() & 1; #endif + /* handle unitialized agbno range so caller doesn't have to */ + if (!args->min_agbno && !args->max_agbno) + args->max_agbno = args->mp->m_sb.sb_agblocks - 1; + ASSERT(args->min_agbno <= args->max_agbno); + + /* clamp agbno to the range if it's outside */ + if (args->agbno < args->min_agbno) + args->agbno = args->min_agbno; + if (args->agbno > args->max_agbno) + args->agbno = args->max_agbno; + restart: bno_cur_lt = NULL; bno_cur_gt = NULL; @@ -971,6 +1000,8 @@ restart: <bnoa, <lena); if (ltlena < args->minlen) continue; + if (ltbnoa < args->min_agbno || ltbnoa > args->max_agbno) + continue; args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ASSERT(args->len >= args->minlen); @@ -1091,11 +1122,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, ltbno, ltlen, <bnoa, <lena); - if (ltlena >= args->minlen) + if (ltlena >= args->minlen && ltbnoa >= args->min_agbno) break; if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i))) goto error0; - if (!i) { + if (!i || ltbnoa < args->min_agbno) { xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR); bno_cur_lt = NULL; @@ -1107,11 +1138,11 @@ restart: XFS_WANT_CORRUPTED_GOTO(i == 1, error0); xfs_alloc_compute_aligned(args, gtbno, gtlen, >bnoa, >lena); - if (gtlena >= args->minlen) + if (gtlena >= args->minlen && gtbnoa <= args->max_agbno) break; if ((error = xfs_btree_increment(bno_cur_gt, 0, &i))) goto error0; - if (!i) { + if (!i || gtbnoa > args->max_agbno) { xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR); bno_cur_gt = NULL; @@ -1211,6 +1242,7 @@ restart: ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); + ASSERT(ltnew >= args->min_agbno && ltnew <= args->max_agbno); args->agbno = ltnew; if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen, diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index d1b4b6a..29f27b2 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -112,6 +112,8 @@ typedef struct xfs_alloc_arg { xfs_extlen_t total; /* total blocks needed in xaction */ xfs_extlen_t alignment; /* align answer to multiple of this */ xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */ + xfs_agblock_t min_agbno; /* set an agbno range for NEAR allocs */ + xfs_agblock_t max_agbno; /* ... */ xfs_extlen_t len; /* output: actual size of extent */ xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ xfs_alloctype_t otype; /* original allocation type */ -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A5A9F7F59 for ; Thu, 19 Feb 2015 12:13:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86ED4304067 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cb6c6b0a52a530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2hVlqWvaWhOBFJX3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDjJn017830 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjrH019456 for ; Thu, 19 Feb 2015 13:13:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 30845124FE3; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 04/18] xfs: add sparse inode chunk alignment superblock field Date: Thu, 19 Feb 2015 13:13:29 -0500 X-ASG-Orig-Subj: [PATCH v5 04/18] xfs: add sparse inode chunk alignment superblock field Message-Id: <1424369623-5656-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add sb_spino_align to the superblock to specify sparse inode chunk alignment. This also currently represents the minimum allowable sparse chunk allocation size. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 6 +++--- fs/xfs/libxfs/xfs_sb.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 8eb7189..dbca93d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -170,7 +170,7 @@ typedef struct xfs_sb { __uint32_t sb_features_log_incompat; __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; + xfs_extlen_t sb_spino_align; /* sparse inode chunk alignment */ xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -256,7 +256,7 @@ typedef struct xfs_dsb { __be32 sb_features_log_incompat; __le32 sb_crc; /* superblock crc */ - __be32 sb_pad; + __be32 sb_spino_align; /* sparse inode chunk alignment */ __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -282,7 +282,7 @@ typedef enum { XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINO_ALIGN, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index b0a5fe9..a461c2e 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -382,7 +382,7 @@ __xfs_sb_from_disk( be32_to_cpu(from->sb_features_log_incompat); /* crc is only used on disk, not in memory; just init to 0 here. */ to->sb_crc = 0; - to->sb_pad = 0; + to->sb_spino_align = be32_to_cpu(from->sb_spino_align); to->sb_pquotino = be64_to_cpu(from->sb_pquotino); to->sb_lsn = be64_to_cpu(from->sb_lsn); /* Convert on-disk flags to in-memory flags? */ @@ -524,7 +524,7 @@ xfs_sb_to_disk( cpu_to_be32(from->sb_features_incompat); to->sb_features_log_incompat = cpu_to_be32(from->sb_features_log_incompat); - to->sb_pad = 0; + to->sb_spino_align = cpu_to_be32(from->sb_spino_align); to->sb_lsn = cpu_to_be64(from->sb_lsn); } } -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32A377F56 for ; Thu, 19 Feb 2015 12:13:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D15C8AC003 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369626-04bdf06a5c512c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dqGL71sVF3mRs8YV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkGR000300 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDkAN018234 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9ADF5124FEB; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 11/18] xfs: handle sparse inode chunks in icreate log recovery Date: Thu, 19 Feb 2015 13:13:36 -0500 X-ASG-Orig-Subj: [PATCH v5 11/18] xfs: handle sparse inode chunks in icreate log recovery Message-Id: <1424369623-5656-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Recovery of icreate transactions assumes hardcoded values for the inode count and chunk length. Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update the icreate validity checks to allow for appropriately sized inode chunks and verify the inode count matches what is expected based on the extent length rather than assuming a hardcoded count. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ecc73d5..74d504b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3068,12 +3068,22 @@ xlog_recover_do_icreate_pass2( return -EINVAL; } - /* existing allocation is fixed value */ - ASSERT(count == mp->m_ialloc_inos); - ASSERT(length == mp->m_ialloc_blks); - if (count != mp->m_ialloc_inos || - length != mp->m_ialloc_blks) { - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); + /* + * The inode chunk is either full or sparse and we only support + * m_ialloc_min_blks sized sparse allocations at this time. + */ + if (length != mp->m_ialloc_blks && + length != mp->m_ialloc_min_blks) { + xfs_warn(log->l_mp, + "%s: unsupported chunk length", __FUNCTION__); + return -EINVAL; + } + + /* verify inode count is consistent with extent length */ + if ((count >> mp->m_sb.sb_inopblog) != length) { + xfs_warn(log->l_mp, + "%s: inconsistent inode count and chunk length", + __FUNCTION__); return -EINVAL; } -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6BF867F6D for ; Thu, 19 Feb 2015 12:13:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0816BAC008 for ; Thu, 19 Feb 2015 10:13:47 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011654c79b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vogz6JMI4B4zYQu8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:46 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkj3021572 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDj6V018231 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 66ABB124FE7; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 07/18] xfs: add fs geometry bit for sparse inode chunks Date: Thu, 19 Feb 2015 13:13:32 -0500 X-ASG-Orig-Subj: [PATCH v5 07/18] xfs: add fs geometry bit for sparse inode chunks Message-Id: <1424369623-5656-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define an fs geometry bit for sparse inode chunks such that the characteristic of the fs can be identified by userspace. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 18dc721..89689c6 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ +#define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 74efe5b..8c18da9 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -101,7 +101,9 @@ xfs_fs_geometry( (xfs_sb_version_hasftype(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | (xfs_sb_version_hasfinobt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FINOBT : 0); + XFS_FSOP_GEOM_FLAGS_FINOBT : 0) | + (xfs_sb_version_hassparseinodes(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_SPINODES : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B09CD7F76 for ; Thu, 19 Feb 2015 12:13:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31F3AAC00A for ; Thu, 19 Feb 2015 10:13:48 -0800 (PST) X-ASG-Debug-ID: 1424369626-04cbb011634c79b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ARizB2Xz30yuVtVj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:47 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkMb015018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDjvU030535 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5C42C124FE6; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 06/18] xfs: sparse inode chunks feature helpers and mount requirements Date: Thu, 19 Feb 2015 13:13:31 -0500 X-ASG-Orig-Subj: [PATCH v5 06/18] xfs: sparse inode chunks feature helpers and mount requirements Message-Id: <1424369623-5656-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369626 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inode chunks feature uses the helper function to enable the allocation of sparse inode chunks. The incompatible feature bit is set on disk at mkfs time to prevent mount from unsupported kernels. Also, enforce the inode alignment requirements required for sparse inode chunks at mount time. When enabled, full inode chunks (and all inode record) alignment is increased from cluster size to inode chunk size. Sparse inode alignment must match the cluster size of the fs. Both superblock alignment fields are set as such by mkfs when sparse inode support is enabled. Finally, warn that sparse inode chunks is an experimental feature until further notice. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 7 +++++++ fs/xfs/libxfs/xfs_sb.c | 21 +++++++++++++++++++++ fs/xfs/xfs_mount.c | 16 ++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index dbca93d..47005b1 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -519,6 +519,7 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ (XFS_SB_FEAT_INCOMPAT_FTYPE) @@ -568,6 +569,12 @@ static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); } +static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES); +} + /* * end of superblock version macros */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 2b5b4fe..5b20a6c 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -182,6 +182,27 @@ xfs_mount_validate_sb( return -EFSCORRUPTED; } + /* + * Full inode chunks must be aligned to inode chunk size when + * sparse inodes are enabled to support the sparse chunk + * allocation algorithm and prevent overlapping inode records. + */ + if (xfs_sb_version_hassparseinodes(sbp)) { + uint32_t align; + + xfs_alert(mp, + "EXPERIMENTAL sparse inode feature enabled. Use at your own risk!"); + + align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize + >> sbp->sb_blocklog; + if (sbp->sb_inoalignmt != align) { + xfs_warn(mp, +"Inode block alignment (%u) must match chunk size (%u) for sparse inodes.", + sbp->sb_inoalignmt, align); + return -EINVAL; + } + } + if (unlikely( sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { xfs_warn(mp, diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 4fa80e6..61fd023 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -738,6 +738,22 @@ xfs_mountfs( } /* + * If enabled, sparse inode chunk alignment is expected to match the + * cluster size. Full inode chunk alignment must match the chunk size, + * but that is checked on sb read verification... + */ + if (xfs_sb_version_hassparseinodes(&mp->m_sb) && + mp->m_sb.sb_spino_align != + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) { + xfs_warn(mp, + "Sparse inode block alignment (%u) must match cluster size (%llu).", + mp->m_sb.sb_spino_align, + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)); + error = -EINVAL; + goto out_remove_uuid; + } + + /* * Set inode alignment fields */ xfs_set_inoalignment(mp); -- 1.9.3 From bfoster@redhat.com Thu Feb 19 12:13:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D28E57F54 for ; Thu, 19 Feb 2015 12:13:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60FE3AC008 for ; Thu, 19 Feb 2015 10:13:49 -0800 (PST) X-ASG-Debug-ID: 1424369627-04cbb011644c79d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sd2e217wzoLqtbuy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 10:13:48 -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 (8.14.4/8.14.4) with ESMTP id t1JIDkVY017842 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 13:13:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JIDj6X018231 for ; Thu, 19 Feb 2015 13:13:46 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 088BF124FE3; Thu, 19 Feb 2015 13:13:44 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v5 18/18] xfs: enable sparse inode chunks for v5 superblocks Date: Thu, 19 Feb 2015 13:13:43 -0500 X-ASG-Orig-Subj: [PATCH v5 18/18] xfs: enable sparse inode chunks for v5 superblocks Message-Id: <1424369623-5656-19-git-send-email-bfoster@redhat.com> In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> References: <1424369623-5656-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: 1424369628 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Enable mounting of filesystems with sparse inode support enabled. Add the incompat. feature bit to the *_ALL mask. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 4f2160d..7122ff6 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -521,7 +521,8 @@ xfs_sb_has_ro_compat_feature( #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) + (XFS_SB_FEAT_INCOMPAT_FTYPE| \ + XFS_SB_FEAT_INCOMPAT_SPINODES) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool -- 1.9.3 From cmaiolino@redhat.com Thu Feb 19 13:04:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4677C7F66 for ; Thu, 19 Feb 2015 13:04:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25175304053 for ; Thu, 19 Feb 2015 11:04:31 -0800 (PST) X-ASG-Debug-ID: 1424372670-04bdf06a59514010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kWV41IkbmHVMim60 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 11:04:31 -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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JJ4S4b008458 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 14:04:28 -0500 Received: from hades.maiolino.org (ovpn-112-100.phx2.redhat.com [10.3.112.100]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JJ4Kv2019707 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Thu, 19 Feb 2015 14:04:25 -0500 Date: Thu, 19 Feb 2015 17:04:19 -0200 From: Carlos Maiolino To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150219190419.GA8862@hades.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Mail-Followup-To: Dave Chinner , Eric Sandeen , xfs@oss.sgi.com References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <54E51CC7.8040709@sandeen.net> <20150218235220.GQ4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218235220.GQ4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424372671 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > > Well, the switch is simple characterisation. What we do with that > error type can be much more complex, and that's why I haven't tried > to address those issues here. When we've sorted out what we need > and how we are going to configure the error handling, then we can > add it. > > e.g. if we need configurable error handling, it needs to be > configurable for different error types, and it needs to be > configurable on a per-mount basis. And it needs to be configurable > at runtime, not just at mount time. That kind of leads to using > sysfs for this. e.g. for each error type we ned to handle different > behaviour for: > > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/type > [transient] permanent > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_timeout_seconds > 300 > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_max_retry_attempts > 50 > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/transient_fail_at_umount > 1 > > And then have generic infrastructure to set it up and handle the > buffer errors according to the config? > > > (I think that's accurately summing up irc-and-side-channel discussions) ;) > > Pretty much. > talking about possible configurable error handlers, what about leave this choice of failure to the sysadmin? Instead a time or type based configuration what about something that the administrator could just say "next IO to device X should fail permanently"? Anyway, I know it would not be automatic, but it adds some flexibility to the current behavior. Anyway, just my 2 cents. -- Carlos From bfoster@redhat.com Thu Feb 19 13:10:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18A787F5F for ; Thu, 19 Feb 2015 13:10:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04F8B304043 for ; Thu, 19 Feb 2015 11:10:38 -0800 (PST) X-ASG-Debug-ID: 1424373036-04cbb011654c93e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zmQ4jKxU9n6epF86 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 11:10:37 -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 (8.14.4/8.14.4) with ESMTP id t1JJAawK030114 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 19 Feb 2015 14:10:36 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JJAZdT023265 for ; Thu, 19 Feb 2015 14:10:36 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 89BC5124FE1; Thu, 19 Feb 2015 14:10:34 -0500 (EST) Date: Thu, 19 Feb 2015 14:10:34 -0500 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/18] xfs: sparse inode chunks Message-ID: <20150219191034.GA5750@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 00/18] xfs: sparse inode chunks References: <1424369623-5656-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="lrZ03NoBR/3+SXJZ" Content-Disposition: inline In-Reply-To: <1424369623-5656-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424373037 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --lrZ03NoBR/3+SXJZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Feb 19, 2015 at 01:13:25PM -0500, Brian Foster wrote: > Hi all, > > Here's v5 of sparse inode chunks. The only real change here is to > convert the allocmask helpers back to using the XFS bitmap helpers > rather than the generic bitmap code. This eliminates the need for the > endian-conversion hack and extra helper to export a generic bitmap to a > native type. The former users of the generic bitmap itself have been > converted to use the native 64-bit value appropriately. > > The XFS bitmap code is actually not in userspace either so neither of > these implementations backport cleanly to userspace. As it is, I've not > included the sparse alloc/free code in my xfsprogs branch as this code > currently isn't needed. Nothing in userspace that I've seen requires the > ability to do a sparse inode allocation or free. I suspect if it is > needed in the future, we can more easily sync the XFS bitmap helpers to > userspace than the generic Linux bitmap code. > > Thoughts, reviews, flames appreciated... > Attached is a tarball of a set of xfsprogs patches to aid in testing this patchset. I'm posting as a tarball because the core patches (e.g., the kernel patches) are obviously still in flux. The tarball includes the following: - general dependency backports - core infrastructure backports (i.e., applicable patches from this v5 sparse inode set) - xfsprogs work for sparse inode support The latter bits include support for mkfs, xfs_info, xfs_db and xfs_repair, the fundamentals of all of which should work. Use the '-i spalign' mkfs option to format a sparse inode enabled fs. E.g.: mkfs.xfs -m crc=1,finobt=1 -i spalign Note that metadump is not yet supported. Failures from the associated xfstests, etc. are expected. I'm not aware of anything else that is missing support or otherwise broken, so any feedback along those lines is appreciated. Brian > Brian > > v5: > - Use XFS helpers for allocmask code instead of generic bitmap helpers. > v4: http://oss.sgi.com/archives/xfs/2015-02/msg00240.html > - Rename sb_spinoalignmt to sb_spino_align. > - Clean up error/warning messages. > - Use a union to differentiate old/new xfs_inobt_rec on-disk format. > Refactor such that in-core record fields are always valid. > - Rename/move allocmap (bitmap) helper functions and provide extra > helper for endian conv. > - Refactor sparse chunk allocation record management code. > - Clean up #ifdef and label usage for DEBUG mode sparse allocs. > - Split up and moved some generic, preparatory hunks earlier in series. > v3: http://oss.sgi.com/archives/xfs/2015-02/msg00110.html > - Rebase to latest for-next (bulkstat rework, data structure shuffling, > etc.). > - Fix issparse helper logic. > - Update inode alignment model w/ spinodes enabled. All inode records > are chunk size aligned, sparse allocations cluster size aligned (both > enforced on mount). > - Reworked sparse inode record merge logic to coincide w/ new alignment > model. > - Mark feature as experimental (warn on mount). > - Include and use block allocation agbno range limit to prevent > allocation of invalid inode records. > - Add some DEBUG bits to improve sparse alloc. test coverage. > v2: http://oss.sgi.com/archives/xfs/2014-11/msg00007.html > - Use a manually set feature bit instead of dynamic based on the > existence of sparse inode chunks. > - Add sb/mp fields for sparse alloc. granularity (use instead of cluster > size). > - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page > size arches. > - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. > - Use byte of pad space in inobt record for inode count field. > - Convert bitmap mgmt to use generic bitmap code. > - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. > - Add fs geometry bit for sparse inodes. > - Rebase to latest for-next (bulkstat refactor). > v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html > > Brian Foster (18): > xfs: create individual inode alloc. helper > xfs: update free inode record logic to support sparse inode records > xfs: support min/max agbno args in block allocator > xfs: add sparse inode chunk alignment superblock field > xfs: use sparse chunk alignment for min. inode allocation requirement > xfs: sparse inode chunks feature helpers and mount requirements > xfs: add fs geometry bit for sparse inode chunks > xfs: introduce inode record hole mask for sparse inode chunks > xfs: use actual inode count for sparse records in bulkstat/inumbers > xfs: pass inode count through ordered icreate log item > xfs: handle sparse inode chunks in icreate log recovery > xfs: helper to convert holemask to inode alloc. bitmap > xfs: allocate sparse inode chunks on full chunk allocation failure > xfs: randomly do sparse inode allocations in DEBUG mode > xfs: filter out sparse regions from individual inode allocation > xfs: only free allocated regions of inode chunks > xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() > xfs: enable sparse inode chunks for v5 superblocks > > fs/xfs/libxfs/xfs_alloc.c | 42 +++- > fs/xfs/libxfs/xfs_alloc.h | 2 + > fs/xfs/libxfs/xfs_format.h | 50 +++- > fs/xfs/libxfs/xfs_fs.h | 1 + > fs/xfs/libxfs/xfs_ialloc.c | 530 +++++++++++++++++++++++++++++++++++---- > fs/xfs/libxfs/xfs_ialloc.h | 12 +- > fs/xfs/libxfs/xfs_ialloc_btree.c | 93 ++++++- > fs/xfs/libxfs/xfs_ialloc_btree.h | 10 + > fs/xfs/libxfs/xfs_sb.c | 30 ++- > fs/xfs/xfs_fsops.c | 4 +- > fs/xfs/xfs_inode.c | 28 ++- > fs/xfs/xfs_itable.c | 13 +- > fs/xfs/xfs_log_recover.c | 26 +- > fs/xfs/xfs_mount.c | 16 ++ > fs/xfs/xfs_mount.h | 2 + > fs/xfs/xfs_trace.h | 47 ++++ > 16 files changed, 820 insertions(+), 86 deletions(-) > > -- > 1.9.3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --lrZ03NoBR/3+SXJZ Content-Type: application/x-bzip2 Content-Disposition: attachment; filename="xfsprogs-sparse-inodes-v5.tar.bz2" Content-Transfer-Encoding: base64 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 UP/4u5IpwoSGtEPSCA== --lrZ03NoBR/3+SXJZ-- From david@fromorbit.com Thu Feb 19 15:12:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B2AF7F4E for ; Thu, 19 Feb 2015 15:12:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6804E8F8050 for ; Thu, 19 Feb 2015 13:12:56 -0800 (PST) X-ASG-Debug-ID: 1424380372-04bdf06a5c517850001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id aHiJcrNmbEV6HBM1 for ; Thu, 19 Feb 2015 13:12:53 -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: A2C6CgCGUeZU/zkjLHlbgwaBLII6rVcBAQEBAQEGmDwEAgKBIkQBAQEBAQF8hBABBScTHCMQCAMOCgklDwUlAyETiC7ULwEBAQcCIBiFbIULhG4HhCoFmQuBGoMTgk2MKSKCAhyBZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 07:42:25 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOYOI-0002Wq-RD; Fri, 20 Feb 2015 08:12:10 +1100 Date: Fri, 20 Feb 2015 08:12:10 +1100 From: Dave Chinner To: Jan Kara Cc: Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150219211210.GS12722@dastard> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150218215523.GO12722@dastard> <20150219154241.GC22712@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219154241.GC22712@quack.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424380372 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 04:42:41PM +0100, Jan Kara wrote: > On Thu 19-02-15 08:55:23, Dave Chinner wrote: > > On Wed, Feb 18, 2015 at 11:40:09AM +0100, Jan Kara wrote: > > > On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > > > > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > > > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > > > > to a written extent after we've initialised the contents. We use the > > > > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > > > > softirq context. > > > > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > > > > point me please? > > > > > > > > For faults, we call it in dax_insert_mapping(), the very last thing > > > > before returning in the fault path. The normal I/O path gets to use > > > > the dio_iodone_t for the same purpose. > > > I see. I didn't think of races with reads (hum, I actually wonder whether > > > we don't have this data exposure problem for ext4 for mmapped write into > > > a hole vs direct read as well). So I guess we do need those unwritten > > > extent dances after all (or we would need to have a page covering hole when > > > writing to it via mmap but I guess unwritten extent dances are somewhat > > > more standard). > > > > Right, that was the reason for doing it that way - it leveraged all > > the existing methods we have for avoiding data exposure races in > > XFS. but it's also not just for races - it's for ensuring that if we > > crash between the allocation and the write to the persistent store > > we don't expose the underlying contents when the system next comes > > up. > Well, ext3/4 handles the crash situation differently - we make sure we > flush data to allocated blocks before committing a transaction that > allocates them. That works perfectly for crashes but doesn't avoid the > race with DIO. I was talking about direct IO, not buffered IO. DAX is modeled on the direct IO stack, not buffered IO. I did go and look at the ext4 IO completion path, and I can see where ext4_end_io_dio() triggers a commit outside of doing unwritten extent conversion. Can you clue me in - IO completion in ext4 is a maze of twisty passages... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 15:19:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 497A27F56 for ; Thu, 19 Feb 2015 15:19:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD0F9AC003 for ; Thu, 19 Feb 2015 13:19:11 -0800 (PST) X-ASG-Debug-ID: 1424380745-04cbb011654ccb70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id iWqg0ggGGbEGJosX for ; Thu, 19 Feb 2015 13:19:05 -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: A2C5CgChUuZU/zkjLHlbgwaBLII6rVcBAQEBAQEGmDwEAgKBIkQBAQEBAQF8hBABBToNDzMIAxgJJQ8FJQMhARKILsEskwsMIBiFbIULhHWEKgWZC5MjIoF9ggUqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 07:49:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOYUm-0002XN-AR; Fri, 20 Feb 2015 08:18:52 +1100 Date: Fri, 20 Feb 2015 08:18:52 +1100 From: Dave Chinner To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150219211852.GT12722@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <54E51CC7.8040709@sandeen.net> <20150218235220.GQ4251@dastard> <20150219190419.GA8862@hades.maiolino.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219190419.GA8862@hades.maiolino.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: 1424380745 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 05:04:19PM -0200, Carlos Maiolino wrote: > > > > Well, the switch is simple characterisation. What we do with that > > error type can be much more complex, and that's why I haven't tried > > to address those issues here. When we've sorted out what we need > > and how we are going to configure the error handling, then we can > > add it. > > > > e.g. if we need configurable error handling, it needs to be > > configurable for different error types, and it needs to be > > configurable on a per-mount basis. And it needs to be configurable > > at runtime, not just at mount time. That kind of leads to using > > sysfs for this. e.g. for each error type we ned to handle different > > behaviour for: > > > > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/type > > [transient] permanent > > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_timeout_seconds > > 300 > > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/perm_max_retry_attempts > > 50 > > $ cat /sys/fs/xfs/vda/meta_write_errors/enospc/transient_fail_at_umount > > 1 > > > > And then have generic infrastructure to set it up and handle the > > buffer errors according to the config? > > > > > (I think that's accurately summing up irc-and-side-channel discussions) ;) > > > > Pretty much. > > > > talking about possible configurable error handlers, what about leave this choice > of failure to the sysadmin? Instead a time or type based configuration what > about something that the administrator could just say "next IO to device X > should fail permanently"? How is this different to just shutting down the filesystem immediately via 'xfs_io -x -c shutdown /path/to/mnt/pt' ? Regardless of this, leave failures as transient, then when an error condition occurs (say thinp device ENOSPC), this will error out on the next IO that is retried: # echo permanent > /sys/fs/xfs/vda/meta_write_errors/enospc/type # echo 0 > /sys/fs/xfs/vda/meta_write_errors/enospc/perm_max_retry_attempts Will make the next device ENOSPC IO error shut the filesystem down. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 15:35:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CCA1C7F54 for ; Thu, 19 Feb 2015 15:35:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A9DB4304053 for ; Thu, 19 Feb 2015 13:35:07 -0800 (PST) X-ASG-Debug-ID: 1424381704-04cb6c6b0b52f780001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9niDf4ZLW5QcBiJj for ; Thu, 19 Feb 2015 13:35:04 -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: A2CcEwArVuZU/zkjLHlbgwaBLII6rVgBAQEBAQEGmDwCAgEBAoEiRAEBAQEBAXyEDwEBAQQnExwjEAgDDgcDCSUPBSUDIROILtQ1AQEBBwIBHxiFbIULhG4HhCoFjVuLMJMjIoICHIFkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 08:05:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOYkE-0002Yi-TM; Fri, 20 Feb 2015 08:34:50 +1100 Date: Fri, 20 Feb 2015 08:34:50 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150219213450.GU12722@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <20150219142842.GA2291@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219142842.GA2291@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424381704 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 09:28:42AM -0500, Brian Foster wrote: > On Thu, Feb 19, 2015 at 09:32:20AM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Currently we consider all async metadata buffer write failures as > > transient failures and retry the IO immediately and then again at a > > a later time. The issue with this is that we can hang forever is the > > error is not recoverable. > > > > An example of this is a device that has been pulled and so is > > returning ENODEV to all IO. Attempting to unmount the filesystem > > with the device in this state will result in a hang waiting for the > > async metadata IO to be flushed and written successfully. In this > > case, we need metadata writeback to error out and trigger a shutdown > > state so the unmount can complete. > > > > Put simply, we need to consider some errors as permanent and > > unrecoverable rather than transient. > > > > Hence add infrastructure that allows us to classify the async write > > errors and hence apply different policies to the different failures. > > In this patch, classify ENODEV as a permanent error but leave > > all the other types of error handling unchanged. > > > > Signed-off-by: Dave Chinner .... > > + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > > + ASSERT(bp->b_iodone != NULL); > > + xfs_buf_ioerror(bp, 0); > > + > > Otherwise it's async... we clear the error here. Ah, well spotted, that shouldn't be there. > > > /* > > * If the write was asynchronous then no one will be looking for the > > - * error. Clear the error state and write the buffer out again. > > - * > > - * XXX: This helps against transient write errors, but we need to find > > - * a way to shut the filesystem down if the writes keep failing. > > - * > > - * In practice we'll shut the filesystem down soon as non-transient > > - * errors tend to affect the whole device and a failing log write > > - * will make us give up. But we really ought to do better here. > > + * error. If this is the first failure, clear the error state and write > > + * the buffer out again. > > */ > > - if (XFS_BUF_ISASYNC(bp)) { > > - ASSERT(bp->b_iodone != NULL); > > - > > - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); > > - > > - 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); > > - } else { > > - xfs_buf_relse(bp); > > - } > > - > > - return; > > + 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); > > + return true; > > ... and retry once via the XBF_WRITE_FAIL flag. It should be in this branch. > > > } > > > > /* > > - * If the write of the buffer was synchronous, we want to make > > - * sure to return the error to the caller of xfs_bwrite(). > > + * Repeated failure on an async write. > > + * > > + * Now we need to classify the error and determine the correct action to > > + * take. Different types of errors will require different processing, > > + * but make the default classification "transient" so that we keep > > + * retrying in these cases. If this is the wrog thing to do, then we'll > > + * get reports that the filesystem hung in the presence of that type of > > + * error and we can take appropriate action to remedy the issue for that > > + * type of error. > > */ > > + switch (bp->b_error) { > > When is this ever true if we clear the error above? > > > + case ENODEV: > > + /* permanent error, no recovery possible */ > > + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); > > + goto out_stale; > > If we can't retry, do the error-specific processing. Is doing this after > a retry really the intended behavior? E.g., if ENODEV is permanent, the > retry seems pointless. I'm leaving the "retry once" logic there on purpose - as a just in case we had some other transient problem. It doesn't hurt to retry the IO if there was an error, and if we get another error we can be pretty certain it wasn't a transient problem. > > + default: > > + /* do nothing, higher layers will retry */ > > + break; > > + } > > + bp->b_error should be cleared here.... > > + xfs_buf_relse(bp); > > + return true; > > + > > +out_stale: > > xfs_buf_stale(bp); > > XFS_BUF_DONE(bp); > > - > > trace_xfs_buf_error_relse(bp, _RET_IP_); > > + return false; > > +} > > + > > +/* > > + * This is the iodone() function for buffers which have had callbacks attached > > + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the > > + * callback list, mark the buffer as having no more callbacks and then push the > > + * buffer through IO completion processing. > > + */ > > +void > > +xfs_buf_iodone_callbacks( > > + struct xfs_buf *bp) > > +{ > > + /* > > + * If there is an error, process it. Some errors require us > > + * to run callbacks after failure processing is done so we > > + * detect that and take appropriate action. > > + */ > > 80 columns? *nod* That's what I get for hand editing patches. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 15:38:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCEF37F59 for ; Thu, 19 Feb 2015 15:38:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48B38AC003 for ; Thu, 19 Feb 2015 13:38:16 -0800 (PST) X-ASG-Debug-ID: 1424381892-04cb6c6b0b52f860001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Mfa1SBAEzWFzxX4N for ; Thu, 19 Feb 2015 13:38:13 -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: A2AyFACPV+ZU/zkjLHlbgwZSWoI6rU0MAQEBAQEBBpJRhWsCAgEBAoEiRAEBAQEBAXyEEAEFJxMcIxAIAw4KCSUPBSUDIROILg7UFwEBCAIBHxiFbIULgmGCDQeEKgWTJ4VkimGIQiKEAioxAYJCAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 08:07:59 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOYn4-0002ZE-LD; Fri, 20 Feb 2015 08:37:46 +1100 Date: Fri, 20 Feb 2015 08:37:46 +1100 From: Dave Chinner To: Brian Foster Cc: Pratyush Anand , xfs@oss.sgi.com, jbastian@redhat.com, ddutile@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing Message-ID: <20150219213746.GV12722@dastard> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> <20150219172028.GC2291@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219172028.GC2291@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424381892 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 12:20:28PM -0500, Brian Foster wrote: > On Thu, Feb 19, 2015 at 06:54:33PM +0530, Pratyush Anand wrote: > > My root file system is xfs. As soon as I enable event for > > xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> > > /sys/kernel/debug/tracing/set_event`, I see a kernel panic. > > > > A little bit of debugging shows that bp->b_fspriv is NULL many a time > > when trace_xfs_trans_read_buf(bp->b_fspriv) is called. > > > > I do not have any idea about xfs filesystem. So, I am not sure, if it > > is expected to have bp->b_fspriv = NULL at this location. > > > > This patch fixes the issue, until we have a better fix. > > > > Signed-off-by: Pratyush Anand > > --- > > A fix for this has been posted here: > > http://oss.sgi.com/archives/xfs/2015-02/msg00101.html It's already in the 3.20-rc0 kernel, and it was marked as a stable patch so should be fixed in the next 3.19 stable kernel. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Feb 19 15:41:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F17787F5E for ; Thu, 19 Feb 2015 15:41:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DEE308F8039 for ; Thu, 19 Feb 2015 13:41:15 -0800 (PST) X-ASG-Debug-ID: 1424382074-04cbb011634cd230001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zCm259RDFjcZ5zuE for ; Thu, 19 Feb 2015 13:41:14 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B816F60F96AC; Thu, 19 Feb 2015 15:41:13 -0600 (CST) Message-ID: <54E65878.2000302@sandeen.net> Date: Thu, 19 Feb 2015 15:41:12 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <20150219142842.GA2291@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures In-Reply-To: <20150219142842.GA2291@laptop.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1424382074 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/19/15 8:28 AM, Brian Foster wrote: > On Thu, Feb 19, 2015 at 09:32:20AM +1100, Dave Chinner wrote: ... >> + 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); >> + return true; so, shouldn't xfs_buf_ioerror(bp, 0); go under this conditional to address Brian's point... ok, you just responded to that. :) FWIW, this is re-setting XBF_ASYNC which must already be set, right? -Eric From david@fromorbit.com Thu Feb 19 15:44:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A8B67F61 for ; Thu, 19 Feb 2015 15:44:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29A108F8052 for ; Thu, 19 Feb 2015 13:44:13 -0800 (PST) X-ASG-Debug-ID: 1424382250-04bdf06a5a518200001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 5ZBFmOAccNn1c1h3 for ; Thu, 19 Feb 2015 13:44:10 -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: A2C5CgCTWOZU/zkjLHlbgwaBLII6rVoBAQEBAQEGmDwEAgKBIkQBAQEBAQF8hBABBTocIxAIAw4KCSUPBSUDIROILtQgAQEBBwIgGIVshQuEDBEBUAeEKgWZC4phiEIiggIcgWQqMYELgTgBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 08:14:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOYt2-0002Zy-MC; Fri, 20 Feb 2015 08:43:56 +1100 Date: Fri, 20 Feb 2015 08:43:56 +1100 From: Dave Chinner To: Michal Hocko Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219214356.GW12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219122914.GH28427@dhcp22.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424382250 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15551 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 01:29:14PM +0100, Michal Hocko wrote: > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > [...] > > Preferrably, we'd get rid of all nofail allocations and replace them > > with preallocated reserves. But this is not going to happen anytime > > soon, so what other option do we have than resolving this on the OOM > > killer side? > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > access to memory reserves (by giving it __GFP_HIGH). Won't work when you have thousands of concurrent transactions running in XFS and they are all doing GFP_NOFAIL allocations. That's why I suggested the per-transaction reserve pool - we can use that to throttle the number of concurent contexts demanding memory for forwards progress, just the same was we throttle the number of concurrent processes based on maximum log space requirements of the transactions and the amount of unreserved log space available. No log space, transaction reservations waits on an ordered queue for space to become available. No memory available, transaction reservation waits on an ordered queue for memory to become available. Cheers, Dave. -- Dave Chinner david@fromorbit.com From penguin-kernel@i-love.sakura.ne.jp Thu Feb 19 15:53:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1389E7F60 for ; Thu, 19 Feb 2015 15:53:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3AD3304032 for ; Thu, 19 Feb 2015 13:53:56 -0800 (PST) X-ASG-Debug-ID: 1424382833-04cbb011654cd640001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id ku1M1QC5mEKMkWWY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 13:53:54 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav203.sakura.ne.jp (fsav203.sakura.ne.jp [210.224.168.165]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JLrgXI079807; Fri, 20 Feb 2015 06:53:42 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav203.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp); Fri, 20 Feb 2015 06:53:42 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1JLrg86079804; Fri, 20 Feb 2015 06:53:42 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: mhocko@suse.cz, hannes@cmpxchg.org Cc: david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219125844.GI28427@dhcp22.suse.cz> <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> In-Reply-To: <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> Message-Id: <201502200653.FID73452.MtHVJLOFOFOFSQ@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Fri, 20 Feb 2015 06:53:41 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424382834 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Tetsuo Handa wrote: > Michal Hocko wrote: > > On Thu 19-02-15 13:29:14, Michal Hocko wrote: > > [...] > > > Something like the following. > > __GFP_HIGH doesn't seem to be sufficient so we would need something > > slightly else but the idea is still the same: > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index 8d52ab18fe0d..2d224bbdf8e8 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2599,6 +2599,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, > > enum migrate_mode migration_mode = MIGRATE_ASYNC; > > bool deferred_compaction = false; > > int contended_compaction = COMPACT_CONTENDED_NONE; > > + int oom = 0; > > > > /* > > * In the slowpath, we sanity check order to avoid ever trying to > > @@ -2635,6 +2636,15 @@ retry: > > alloc_flags = gfp_to_alloc_flags(gfp_mask); > > > > /* > > + * __GFP_NOFAIL allocations cannot fail but yet the current context > > + * might be blocking resources needed by the OOM victim to terminate. > > + * Allow the caller to dive into memory reserves to succeed the > > + * allocation and break out from a potential deadlock. > > + */ > > We don't know how many callers will pass __GFP_NOFAIL. But if 1000 > threads are doing the same operation which requires __GFP_NOFAIL > allocation with a lock held, wouldn't memory reserves deplete? > > This heuristic can't continue if memory reserves depleted or > continuous pages of requested order cannot be found. > Even if the system seems to be stalled, deadlocks may not have occurred. If the cause is (e.g.) virtio disk being stuck for unknown reason than a deadlock, nobody should start consuming the memory reserves after waiting for a while. The memory reserves are something like a balloon. To guarantee forward progress, the balloon must not become empty. Therefore, I think that throttling heuristics for memory requester side (deflator of the balloon, or SIGKILL receiver called processes) should be avoided and throttling heuristics for memory releaser side (inflator of the balloon, or SIGKILL sender called the OOM killer) should be used. If heuristic is used on the deflator side, the memory allocator may deliver a final blow via ALLOC_NO_WATERMARKS. If heuristic is used on the inflator side, the OOM killer can act as a watchdog when nobody volunteered memory within reasonable period. > > + if (oom > 10 && (gfp_mask & __GFP_NOFAIL)) > > + alloc_flags |= ALLOC_NO_WATERMARKS; > > + > > + /* > > * Find the true preferred zone if the allocation is unconstrained by > > * cpusets. > > */ > > @@ -2759,6 +2769,8 @@ retry: > > goto got_pg; > > if (!did_some_progress) > > goto nopage; > > + > > + oom++; > > } > > /* Wait for some write requests to complete then retry */ > > wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50); > > -- > > Michal Hocko > > SUSE Labs > > > From david@fromorbit.com Thu Feb 19 16:04:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 89D137F66 for ; Thu, 19 Feb 2015 16:04:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59B348F8064 for ; Thu, 19 Feb 2015 14:04:12 -0800 (PST) X-ASG-Debug-ID: 1424383449-04bdf06a59518870001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9Dr3O47EyclSdjM8 for ; Thu, 19 Feb 2015 14:04:10 -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: A2AgCwA+XeZU/zkjLHlTCIMGUlqCOol/o08MAQEBAQEBBpJRhWsEAgKBIkQBAQEBAQF8hA8BAQEDATocIwULCAMOCgklDwUlAyETGQKIDAcO1BABAQgCIBiFbIULgmGBN1YHhCoFkyeCFoNOimGIQiKEAioxAYJCAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 08:34:08 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOZCN-0002cA-Jf; Fri, 20 Feb 2015 09:03:55 +1100 Date: Fri, 20 Feb 2015 09:03:55 +1100 From: Dave Chinner To: Michal Hocko Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219220355.GX12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150218213118.GN12722@dastard> <20150219094020.GE28427@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219094020.GE28427@dhcp22.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424383449 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15552 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 10:40:20AM +0100, Michal Hocko wrote: > On Thu 19-02-15 08:31:18, Dave Chinner wrote: > > On Wed, Feb 18, 2015 at 01:16:02PM +0100, Michal Hocko wrote: > > > On Wed 18-02-15 21:48:59, Dave Chinner wrote: > > > > On Wed, Feb 18, 2015 at 09:25:02AM +0100, Michal Hocko wrote: > > This is why GFP_NOFAIL is not a solution to the "never fail" > > alloation problem. The caller doing the "no fail" allocation _must > > be able to set failure policy_. i.e. the choice of aborting and > > shutting down because progress cannot be made, or continuing and > > hoping for forwards progress is owned by the allocating context, no > > the allocator. > > I completely agree that the failure policy is the caller responsibility > and I would have no objections to something like: > > do { > ptr = kmalloc(size, GFP_NOFS); > if (ptr) > return ptr; > if (fatal_signal_pending(current)) > break; > if (looping_too_long()) > break; > } while (1); > > fallback_solution(); > > But this is not the case in kmem_alloc which is essentially GFP_NOFAIL > allocation with a warning and congestion_wait. There is no failure > policy defined there. The warning should be part of the allocator and > the NOFAIL policy should be explicit. So why exactly do you oppose to > changing kmem_alloc (and others which are doing essentially the same)? I'm opposing changing kmem_alloc() to GFP_NOFAIL precisely because doing so is *broken*, *and* it removes the policy decision from the calling context where it belongs. We are in the process of discussing - at an XFS level - how to handle errors in a configurable manner. See, for example, this discussion: http://oss.sgi.com/archives/xfs/2015-02/msg00343.html Where we are trying to decide how to expose failure policy to admins to make decisions about error handling behaviour: http://oss.sgi.com/archives/xfs/2015-02/msg00346.html There is little doubt in my mind that this stretches to ENOMEM handling; it is another case where we consider ENOMEM to be a transient error and hence retry forever until it succeeds. But some people are going to want to configure that behaviour, and the API above allows peopel to configure exactly how many repeated memory allocations we'd fail before considering the situation hopeless, failing, and risking a filesystem shutdown.... Converting the code to use GFP_NOFAIL takes us in exactly the opposite direction to our current line of development w.r.t. to filesystem error handling. > The reason I care about GFP_NOFAIL is that there are apparently code > paths which do not tell allocator they are basically GFP_NOFAIL without > any fallback. This leads to two main problems 1) we do not have a good > overview how many code paths have such a strong requirements and so > cannot estimate e.g. how big memory reserves should be and Right, when GFP_NOFAIL got deprecated we lost the ability to document such behaviour and find it easily. People just put retry loops in instead of using GFP_NOFAIL. Good luck finding them all :/ > 2) allocator > cannot help those paths (e.g. by giving them access to reserves to break > out of the livelock). Allocator should not help. Global reserves are unreliable - make the allocation context reserve the amount it needs before it enters the context where it can't back out.... > > IOWs, we have need for forward allocation progress guarantees on > > (potentially) several megabytes of allocations from slab caches, the > > heap and the page allocator, with all allocations all in > > unpredictable order, with objects of different life times and life > > cycles, and at which may, at any time, get stuck behind > > objects locked in other transactions and hence can randomly block > > until some other thread makes forward progress and completes a > > transaction and unlocks the object. > > Thanks for the clarification, I have to think about it some more, > though. My thinking was that mempools could be used for an emergency > pool with a pre-allocated memory which would be used in the non failing > contexts. The other problem with mempools is that they aren't exclusive to the context that needs the reservation. i.e. we can preallocate to the mempool, but then when the preallocating context goes to allocate, that preallocation may have already been drained by other contexts. The memory reservation needs to be follow to the transaction - we can pass them between tasks, and they need to persist across sleeping locks, IO, etc, and mempools simply too constrainted to be usable in this environment. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ddutile@redhat.com Thu Feb 19 16:32:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 48D327F69 for ; Thu, 19 Feb 2015 16:32:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3542D8F804C for ; Thu, 19 Feb 2015 14:32:28 -0800 (PST) X-ASG-Debug-ID: 1424385146-04cbb011634ce490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id szXwpFehOY2b4LiV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 14:32:27 -0800 (PST) X-Barracuda-Envelope-From: ddutile@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JMWObi025183 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 17:32:24 -0500 Received: from dddsys0.bos.redhat.com (dddsys0.bos.redhat.com [10.18.16.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JMWN6v026496; Thu, 19 Feb 2015 17:32:23 -0500 Message-ID: <54E66477.5060600@redhat.com> Date: Thu, 19 Feb 2015 17:32:23 -0500 From: Don Dutile User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.8.0 MIME-Version: 1.0 To: Eric Sandeen , Pratyush Anand , david@fromorbit.com, xfs@oss.sgi.com CC: jbastian@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> <54E611BA.7010806@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing In-Reply-To: <54E611BA.7010806@sandeen.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424385147 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 02/19/2015 11:39 AM, Eric Sandeen wrote: > On 2/19/15 7:24 AM, Pratyush Anand wrote: >> My root file system is xfs. As soon as I enable event for >> xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> >> /sys/kernel/debug/tracing/set_event`, I see a kernel panic. >> >> A little bit of debugging shows that bp->b_fspriv is NULL many a time >> when trace_xfs_trans_read_buf(bp->b_fspriv) is called. >> >> I do not have any idea about xfs filesystem. So, I am not sure, if it >> is expected to have bp->b_fspriv = NULL at this location. >> >> This patch fixes the issue, until we have a better fix. > > What kernel did you hit this on? What did the backtrace look like? > > I've been unable to reproduce the problem so far. > > Thanks, > -Eric > RHELSA snap7 kernel (that's RHEL Server for ARM; 3.19-based). Thanks for everyone's attention. Pratyush has provided a link to the upstream patch, that we have to pull into our kernel. >> Signed-off-by: Pratyush Anand >> --- >> fs/xfs/xfs_trans_buf.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c >> index 0a4d4ab6d9a9..0b67a20643bf 100644 >> --- a/fs/xfs/xfs_trans_buf.c >> +++ b/fs/xfs/xfs_trans_buf.c >> @@ -329,7 +329,8 @@ xfs_trans_read_buf_map( >> >> if (tp) >> _xfs_trans_bjoin(tp, bp, 1); >> - trace_xfs_trans_read_buf(bp->b_fspriv); >> + if (bp->b_fspriv) >> + trace_xfs_trans_read_buf(bp->b_fspriv); >> *bpp = bp; >> return 0; >> >> > From ddutile@redhat.com Thu Feb 19 16:35:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5AEDC7F6C for ; Thu, 19 Feb 2015 16:35:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE257AC003 for ; Thu, 19 Feb 2015 14:35:18 -0800 (PST) X-ASG-Debug-ID: 1424385316-04cb6c6b09530aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id daEkneBv7CnBFRxc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 14:35:17 -0800 (PST) X-Barracuda-Envelope-From: ddutile@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1JMZDZs018154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 17:35:14 -0500 Received: from dddsys0.bos.redhat.com (dddsys0.bos.redhat.com [10.18.16.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JMZCNG027103; Thu, 19 Feb 2015 17:35:12 -0500 Message-ID: <54E66520.7000102@redhat.com> Date: Thu, 19 Feb 2015 17:35:12 -0500 From: Don Dutile User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.8.0 MIME-Version: 1.0 To: Dave Chinner , Brian Foster CC: Pratyush Anand , xfs@oss.sgi.com, jbastian@redhat.com Subject: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing References: <7fb3278485ca5d8b48cd1ba980be6cc11dafc11b.1424352124.git.panand@redhat.com> <20150219172028.GC2291@laptop.bfoster> <20150219213746.GV12722@dastard> X-ASG-Orig-Subj: Re: [PATCH RFC] fs: xfs: Fix xfs_trans_read_buf event tracing In-Reply-To: <20150219213746.GV12722@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed 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: 1424385317 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 02/19/2015 04:37 PM, Dave Chinner wrote: > On Thu, Feb 19, 2015 at 12:20:28PM -0500, Brian Foster wrote: >> On Thu, Feb 19, 2015 at 06:54:33PM +0530, Pratyush Anand wrote: >>> My root file system is xfs. As soon as I enable event for >>> xfs_trans_read_buf `echo xfs:xfs_trans_read_buf >> >>> /sys/kernel/debug/tracing/set_event`, I see a kernel panic. >>> >>> A little bit of debugging shows that bp->b_fspriv is NULL many a time >>> when trace_xfs_trans_read_buf(bp->b_fspriv) is called. >>> >>> I do not have any idea about xfs filesystem. So, I am not sure, if it >>> is expected to have bp->b_fspriv = NULL at this location. >>> >>> This patch fixes the issue, until we have a better fix. >>> >>> Signed-off-by: Pratyush Anand >>> --- >> >> A fix for this has been posted here: >> >> http://oss.sgi.com/archives/xfs/2015-02/msg00101.html > > It's already in the 3.20-rc0 kernel, and it was marked as a stable > patch so should be fixed in the next 3.19 stable kernel. > We (RHELSA) are not tracking 3.19 stable; just rebased to 3.19-final (from -rc5). But, you make me think we *should* track 3.19 stable now (our Beta kernel base). > Cheers, > > Dave. > From sandeen@sandeen.net Thu Feb 19 16:39:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7530F7F6F for ; Thu, 19 Feb 2015 16:39:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5570D304032 for ; Thu, 19 Feb 2015 14:39:10 -0800 (PST) X-ASG-Debug-ID: 1424385548-04cb6c6b0a530b70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wiaCHO69gyQNlqde for ; Thu, 19 Feb 2015 14:39:08 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 56F63602D76B; Thu, 19 Feb 2015 16:39:08 -0600 (CST) Message-ID: <54E6660B.6040406@sandeen.net> Date: Thu, 19 Feb 2015 16:39:07 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures In-Reply-To: <1424298740-25821-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1424385548 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- What about something along these lines (rough, but works) - shut down the fs after enough time goes by with sequential errors and no success, on the same buffer (based on your patch...) One thing that still happens is a lot of error spew during the retries, maybe we can make more use of XBF_WRITE_FAIL to only print errors once? Based-on-patch-by: Dave Chinner Signed-off-by: Eric Sandeen diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 75ff5d5..13c47a1 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -181,6 +181,7 @@ typedef struct xfs_buf { unsigned int b_page_count; /* size of page array */ unsigned int b_offset; /* page offset in first page */ int b_error; /* error code on I/O */ + unsigned long b_first_error_time; const struct xfs_buf_ops *b_ops; #ifdef XFS_BUF_LOCK_TRACKING diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 507d96a..4751c5f 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1041,14 +1041,13 @@ xfs_buf_do_callbacks( } /* - * This is the iodone() function for buffers which have had callbacks - * attached to them by xfs_buf_attach_iodone(). It should remove each - * log item from the buffer's list and call the callback of each in turn. - * When done, the buffer's fsprivate field is set to NULL and the buffer - * is unlocked with a call to iodone(). + * Process a write IO error on a buffer with active log items. + * + * Returns true if the buffer has been completed and released, false if callback + * processing still needs to be performed and the IO completed. */ -void -xfs_buf_iodone_callbacks( +static bool +xfs_buf_iodone_callback_error( struct xfs_buf *bp) { struct xfs_log_item *lip = bp->b_fspriv; @@ -1056,19 +1055,12 @@ xfs_buf_iodone_callbacks( static ulong lasttime; static xfs_buftarg_t *lasttarg; - if (likely(!bp->b_error)) - goto do_callbacks; - /* * If we've already decided to shutdown the filesystem because of * I/O errors, there's no point in giving this a retry. */ - if (XFS_FORCED_SHUTDOWN(mp)) { - xfs_buf_stale(bp); - XFS_BUF_DONE(bp); - trace_xfs_buf_item_iodone(bp, _RET_IP_); - goto do_callbacks; - } + if (XFS_FORCED_SHUTDOWN(mp)) + goto out_stale; if (bp->b_target != lasttarg || time_after(jiffies, (lasttime + 5*HZ))) { @@ -1077,45 +1069,70 @@ xfs_buf_iodone_callbacks( } lasttarg = bp->b_target; + /* synchronous writes will have callers process the error */ + if (!(bp->b_flags & XBF_ASYNC)) + goto out_stale; + + trace_xfs_buf_item_iodone_async(bp, _RET_IP_); + ASSERT(bp->b_iodone != NULL); + /* * If the write was asynchronous then no one will be looking for the - * error. Clear the error state and write the buffer out again. - * - * XXX: This helps against transient write errors, but we need to find - * a way to shut the filesystem down if the writes keep failing. - * - * In practice we'll shut the filesystem down soon as non-transient - * errors tend to affect the whole device and a failing log write - * will make us give up. But we really ought to do better here. + * error. If this is the first failure, clear the error state and write + * the buffer out again. */ - if (XFS_BUF_ISASYNC(bp)) { - ASSERT(bp->b_iodone != NULL); - - trace_xfs_buf_item_iodone_async(bp, _RET_IP_); - - 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); - } else { - xfs_buf_relse(bp); - } - - return; + if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { + if (!bp->b_first_error_time) + bp->b_first_error_time = get_seconds(); + xfs_buf_ioerror(bp, 0); + bp->b_flags |= XBF_WRITE | XBF_ASYNC | + XBF_DONE | XBF_WRITE_FAIL; + xfs_buf_submit(bp); + return true; } /* - * If the write of the buffer was synchronous, we want to make - * sure to return the error to the caller of xfs_bwrite(). + * Repeated failure on an async write. + * + * Let things retry for 60s, then give up. + * XXX handle seconds wrap? */ + if (get_seconds() - bp->b_first_error_time > 60) { + xfs_err(mp, "too many errors, giving up"); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + goto out_stale; + } + + xfs_buf_relse(bp); + return true; + +out_stale: xfs_buf_stale(bp); XFS_BUF_DONE(bp); - trace_xfs_buf_error_relse(bp, _RET_IP_); + return false; +} + +/* + * This is the iodone() function for buffers which have had callbacks attached + * to them by xfs_buf_attach_iodone(). We need to iterate the items on the + * callback list, mark the buffer as having no more callbacks and then push the + * buffer through IO completion processing. + */ +void +xfs_buf_iodone_callbacks( + struct xfs_buf *bp) +{ + /* + * If there is an error, process it. Some errors require us + * to run callbacks after failure processing is done so we + * detect that and take appropriate action. + */ + if (bp->b_error && xfs_buf_iodone_callback_error(bp)) + return; -do_callbacks: + /* zero out error timer if we're good */ + bp->b_first_error_time = 0; xfs_buf_do_callbacks(bp); bp->b_fspriv = NULL; bp->b_iodone = NULL; From david@fromorbit.com Thu Feb 19 16:52:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C413E7F73 for ; Thu, 19 Feb 2015 16:52:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8503A8F8040 for ; Thu, 19 Feb 2015 14:52:34 -0800 (PST) X-ASG-Debug-ID: 1424386351-04bdf06a5a519b90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qVv8ozaiCcidbLYG for ; Thu, 19 Feb 2015 14:52:31 -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: A2ARCwD7Z+ZU/zkjLHlTCIMGUlqCOq1ODAEBAQEBAQaSUYVrBAICgRxEAQEBAQEBfIQPAQEBAwE6HCMFCwgDDgQGCSUPBSUDDRQTG4gMBw7UHwELIBiFbIULgmGBKwwFAVAHhCoFkyeFZIEagxOGNIUEgz4iggIcgWQqMQGBCoE4AQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 09:22:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOZxB-0002fr-81; Fri, 20 Feb 2015 09:52:17 +1100 Date: Fri, 20 Feb 2015 09:52:17 +1100 From: Dave Chinner To: Johannes Weiner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150219225217.GY12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219102431.GA15569@phnom.home.cmpxchg.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: 1424386351 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 05:24:31AM -0500, Johannes Weiner wrote: > On Wed, Feb 18, 2015 at 09:54:30AM +1100, Dave Chinner wrote: > > [ cc xfs list - experienced kernel devs should not have to be > > reminded to do this ] > > > > On Tue, Feb 17, 2015 at 07:53:15AM -0500, Johannes Weiner wrote: > > > - do { > > > - ptr = kmalloc(size, lflags); > > > - if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) > > > - return ptr; > > > - if (!(++retries % 100)) > > > - xfs_err(NULL, > > > - "possible memory allocation deadlock in %s (mode:0x%x)", > > > - __func__, lflags); > > > - congestion_wait(BLK_RW_ASYNC, HZ/50); > > > - } while (1); > > > + if (!(flags & (KM_MAYFAIL | KM_NOSLEEP))) > > > + lflags |= __GFP_NOFAIL; > > > + > > > + return kmalloc(size, lflags); > > > } > > > > Hmmm - the only reason there is a focus on this loop is that it > > emits warnings about allocations failing. It's obvious that the > > problem being dealt with here is a fundamental design issue w.r.t. > > to locking and the OOM killer, but the proposed special casing > > hack^H^H^H^Hband aid^W^Wsolution is not "working" because some code > > in XFS started emitting warnings about allocations failing more > > often. > > > > So the answer is to remove the warning? That's like killing the > > canary to stop the methane leak in the coal mine. No canary? No > > problems! > > That's not what happened. The patch that affected behavior here > transformed code that an incoherent collection of conditions to > something that has an actual model. Which is entirely undocumented. If you have a model, the first thing to do is document it and communicate that model to everyone who needs to know about that new model. I have no idea what that model is. Keeping it in your head and changing code that other people maintain without giving them any means of understanding WTF you are doing is a really bad engineering practice. And yes, I have had a bit to say about this in public recently. Go watch my recent LCA talk, for example.... And, FWIW, email discussions on a list is no substitute for a properly documented design that people can take their time to understand and digest. > That model is that we don't loop > in the allocator if there are no means to making forward progress. In > this case, it was GFP_NOFS triggering an early exit from the allocator > because it's not allowed to invoke the OOM killer per default, and > there is little point in looping for times to better on their own. So you keep saying.... > So these deadlock warnings happen, ironically, by the page allocator > now bailing out of a locked-up state in which it's not making forward > progress. They don't strike me as a very useful canary in this case. ... yet we *rarely* see the canary warnings we emit when we do too many allocation retries, the code has been that way for 13-odd years. Hence, despite your protestations that your way is *better*, we have code that is tried, tested and proven in rugged production environments. That's far more convincing evidence that the *code should not change* than your assertions that it is broken and needs to be fixed. > > Right now, the oom killer is a liability. Over the past 6 months > > I've slowly had to exclude filesystem regression tests from running > > on small memory machines because the OOM killer is now so unreliable > > that it kills the test harness regularly rather than the process > > generating memory pressure. That's a big red flag to me that all > > this hacking around the edges is not solving the underlying problem, > > but instead is breaking things that did once work. > > > > And, well, then there's this (gfp.h): > > > > * __GFP_NOFAIL: The VM implementation _must_ retry infinitely: the caller > > * cannot handle allocation failures. This modifier is deprecated and no new > > * users should be added. > > > > So, is this another policy relevation from the mm developers about > > the kmalloc API? i.e. that __GFP_NOFAIL is no longer deprecated? > > Or just another symptom of frantic thrashing because nobody actually > > understands the problem or those that do are unwilling to throw out > > the broken crap and redesign it? > > Well, understand our dilemma here. __GFP_NOFAIL is a liability > because it can trap tasks with unknown state and locks in a > potentially never ending loop, and we don't want people to start using > it as a convenient solution to get out of having a fallback strategy. > > However, if your entire architecture around a particular allocation is > that failure is not an option at this point, and you can't reasonably > preallocate - although that would always be preferrable - then please > do not open code an endless loop around the call to the allocator but > use __GFP_NOFAIL instead so that these callsites are annotated and can > be reviewed. I will actively work around aanything that causes filesystem memory pressure to increase the chance of oom killer invocations. The OOM killer is not a solution - it is, by definition, a loose cannon and so we should be reducing dependencies on it. I really don't care about the OOM Killer corner cases - it's completely the wrong way line of development to be spending time on and you aren't going to convince me otherwise. The OOM killer a crutch used to justify having a memory allocation subsystem that can't provide forward progress guarantee mechanisms to callers that need it. I've proposed a method of providing this forward progress guarantee for subsystems of arbitrary complexity, and this removes the dependency on the OOM killer for fowards allocation progress in such contexts (e.g. filesystems). We should be discussing how to implement that, not what bandaids we need to apply to the OOM killer. I want to fix the underlying problems, not push them under the OOM-killer bus... > And please understand that this callsite blowing up is a chance to > better the code and behavior here. Where previously it would just > endlessly loop in the allocator without any means to make progress, Again, this statement ignores the fact we have *no credible evidence* that this is actually a problem in production environments. And, besides, even if you do force through changing the XFS code to GFP_NOFAIL, it'll get changed back to a retry loop in the near future when we add admin configurable error handling behaviour to XFS, as I pointed Michal to.... (http://oss.sgi.com/archives/xfs/2015-02/msg00346.html) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 17:02:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 35E477F73 for ; Thu, 19 Feb 2015 17:02:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 15E058F806F for ; Thu, 19 Feb 2015 15:02:14 -0800 (PST) X-ASG-Debug-ID: 1424386930-04cb6c6b09531420001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id awkMkeVlkYNFGCpm for ; Thu, 19 Feb 2015 15:02:11 -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: A2C5CgBQauZU/zkjLHlbgwaBLII6rVoBAQEBAQEGmDwEAgKBHEQBAQEBAQF8hBABBTocIxAIAw4KCSUPBSUDIROILtQpAQEBBwIgGIVshQuEbgeEKgWZC4Eaiz6GSyKCAhyBZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 09:32:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOa6Q-0002hH-On; Fri, 20 Feb 2015 10:01:50 +1100 Date: Fri, 20 Feb 2015 10:01:50 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/18] xfs: sparse inode chunks Message-ID: <20150219230150.GZ12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 00/18] xfs: sparse inode chunks References: <1424369623-5656-1-git-send-email-bfoster@redhat.com> <20150219191034.GA5750@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219191034.GA5750@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424386930 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 02:10:34PM -0500, Brian Foster wrote: > On Thu, Feb 19, 2015 at 01:13:25PM -0500, Brian Foster wrote: > > Hi all, > > > > Here's v5 of sparse inode chunks. The only real change here is to > > convert the allocmask helpers back to using the XFS bitmap helpers > > rather than the generic bitmap code. This eliminates the need for the > > endian-conversion hack and extra helper to export a generic bitmap to a > > native type. The former users of the generic bitmap itself have been > > converted to use the native 64-bit value appropriately. > > > > The XFS bitmap code is actually not in userspace either so neither of > > these implementations backport cleanly to userspace. As it is, I've not > > included the sparse alloc/free code in my xfsprogs branch as this code > > currently isn't needed. Nothing in userspace that I've seen requires the > > ability to do a sparse inode allocation or free. I suspect if it is > > needed in the future, we can more easily sync the XFS bitmap helpers to > > userspace than the generic Linux bitmap code. > > > > Thoughts, reviews, flames appreciated... > > > > Attached is a tarball of a set of xfsprogs patches to aid in testing > this patchset. I'm posting as a tarball because the core patches (e.g., > the kernel patches) are obviously still in flux. The tarball includes > the following: > > - general dependency backports > - core infrastructure backports (i.e., applicable patches from this v5 > sparse inode set) > - xfsprogs work for sparse inode support You should probably base it on the libxfs-3.19-update branch rather than backport random patches into the current branch. This is what I'm basing the current rmap-btree work I'm doing on, and having the same libxfs structure on both sides makes it way easier to keep both sides up to date.... Give me a couple of hours and I'll push out the latest updates to that the branch... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 17:03:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2029C7F76 for ; Thu, 19 Feb 2015 17:03:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0D2AAC00E for ; Thu, 19 Feb 2015 15:03:30 -0800 (PST) X-ASG-Debug-ID: 1424387007-04cbb011634ceef0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PN3ERbROlsHpLdPv for ; Thu, 19 Feb 2015 15:03:28 -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: A2C5CgCAa+ZU/zkjLHlbgwaBLII6rVoBAQEBAQEGmDwEAgKBHEQBAQEBAQF8hBABBScTHCMQCAMYCSUPBSUDIROILtQiAQEBBwIBHxiFbIULhG4HgxaBFAEEmQuTIyKEAioxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 09:32:42 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOa73-0002hj-RH; Fri, 20 Feb 2015 10:02:29 +1100 Date: Fri, 20 Feb 2015 10:02:29 +1100 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures Message-ID: <20150219230229.GA12722@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Introduce permanent async buffer write IO failures References: <1424298740-25821-1-git-send-email-david@fromorbit.com> <20150219142842.GA2291@laptop.bfoster> <54E65878.2000302@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E65878.2000302@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424387007 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 03:41:12PM -0600, Eric Sandeen wrote: > On 2/19/15 8:28 AM, Brian Foster wrote: > > On Thu, Feb 19, 2015 at 09:32:20AM +1100, Dave Chinner wrote: > > ... > > >> + 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); > >> + return true; > > so, shouldn't > > xfs_buf_ioerror(bp, 0); > > go under this conditional to address Brian's point... ok, you just responded to that. :) > > FWIW, this is re-setting XBF_ASYNC which must already be set, right? To be sure, to be sure.... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Feb 19 17:11:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 836AB7F76 for ; Thu, 19 Feb 2015 17:11:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 60C4D8F8066 for ; Thu, 19 Feb 2015 15:11:33 -0800 (PST) X-ASG-Debug-ID: 1424387490-04cb6c6b0c5316e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id f9JAQuJPLDJ4SjTV for ; Thu, 19 Feb 2015 15:11:31 -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: A2ATCwCobOZU/zkjLHlbgwZSWoI6rU4MAQEBAQEBBpJHCoVrBAICgRxEAQEBAQEBfIQPAQEBAwEnExQIIwULCAMOCgklDwUdCAMhCAsdBIgGBw7UFgEBAQEBBQEBAQEeGIVshQuEbgeDFoEUBZMnhWSBGjiCW4JNjCkiggIcgWQqMQGCQgEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 09:38:35 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOaCk-0002iS-3T; Fri, 20 Feb 2015 10:08:22 +1100 Date: Fri, 20 Feb 2015 10:08:22 +1100 From: Dave Chinner To: Jan Kara Cc: Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150219230822.GB12722@dastard> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150218215523.GO12722@dastard> <20150219154241.GC22712@quack.suse.cz> <20150219211210.GS12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219211210.GS12722@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424387490 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15553 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 20, 2015 at 08:12:10AM +1100, Dave Chinner wrote: > On Thu, Feb 19, 2015 at 04:42:41PM +0100, Jan Kara wrote: > > On Thu 19-02-15 08:55:23, Dave Chinner wrote: > > > On Wed, Feb 18, 2015 at 11:40:09AM +0100, Jan Kara wrote: > > > > On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > > > > > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > > > > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > > > > > to a written extent after we've initialised the contents. We use the > > > > > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > > > > > softirq context. > > > > > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > > > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > > > > > point me please? > > > > > > > > > > For faults, we call it in dax_insert_mapping(), the very last thing > > > > > before returning in the fault path. The normal I/O path gets to use > > > > > the dio_iodone_t for the same purpose. > > > > I see. I didn't think of races with reads (hum, I actually wonder whether > > > > we don't have this data exposure problem for ext4 for mmapped write into > > > > a hole vs direct read as well). So I guess we do need those unwritten > > > > extent dances after all (or we would need to have a page covering hole when > > > > writing to it via mmap but I guess unwritten extent dances are somewhat > > > > more standard). > > > > > > Right, that was the reason for doing it that way - it leveraged all > > > the existing methods we have for avoiding data exposure races in > > > XFS. but it's also not just for races - it's for ensuring that if we > > > crash between the allocation and the write to the persistent store > > > we don't expose the underlying contents when the system next comes > > > up. > > Well, ext3/4 handles the crash situation differently - we make sure we > > flush data to allocated blocks before committing a transaction that > > allocates them. That works perfectly for crashes but doesn't avoid the > > race with DIO. > > I was talking about direct IO, not buffered IO. DAX is modeled on > the direct IO stack, not buffered IO. I did go and look at the ext4 > IO completion path, and I can see where ext4_end_io_dio() triggers a ^^^^^^^ can't see. Stupid fingers can type what I'm thinking. :/ > commit outside of doing unwritten extent conversion. Can you clue me > in - IO completion in ext4 is a maze of twisty passages... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > 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 > -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Thu Feb 19 17:20:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5393D7F76 for ; Thu, 19 Feb 2015 17:20:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 312DF8F8040 for ; Thu, 19 Feb 2015 15:20:32 -0800 (PST) X-ASG-Debug-ID: 1424388030-04cb6c6b0c531870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RVbbvTwSY2V8AySd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Feb 2015 15:20:31 -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 (8.14.4/8.14.4) with ESMTP id t1JNKSKn030099 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 19 Feb 2015 18:20:28 -0500 Received: from laptop.bfoster (vpn-62-220.rdu2.redhat.com [10.10.62.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1JNKOeM017119 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Thu, 19 Feb 2015 18:20:28 -0500 Date: Thu, 19 Feb 2015 18:20:24 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/18] xfs: sparse inode chunks Message-ID: <20150219232024.GA8498@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 00/18] xfs: sparse inode chunks References: <1424369623-5656-1-git-send-email-bfoster@redhat.com> <20150219191034.GA5750@bfoster.bfoster> <20150219230150.GZ12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219230150.GZ12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424388031 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Feb 20, 2015 at 10:01:50AM +1100, Dave Chinner wrote: > On Thu, Feb 19, 2015 at 02:10:34PM -0500, Brian Foster wrote: > > On Thu, Feb 19, 2015 at 01:13:25PM -0500, Brian Foster wrote: > > > Hi all, > > > > > > Here's v5 of sparse inode chunks. The only real change here is to > > > convert the allocmask helpers back to using the XFS bitmap helpers > > > rather than the generic bitmap code. This eliminates the need for the > > > endian-conversion hack and extra helper to export a generic bitmap to a > > > native type. The former users of the generic bitmap itself have been > > > converted to use the native 64-bit value appropriately. > > > > > > The XFS bitmap code is actually not in userspace either so neither of > > > these implementations backport cleanly to userspace. As it is, I've not > > > included the sparse alloc/free code in my xfsprogs branch as this code > > > currently isn't needed. Nothing in userspace that I've seen requires the > > > ability to do a sparse inode allocation or free. I suspect if it is > > > needed in the future, we can more easily sync the XFS bitmap helpers to > > > userspace than the generic Linux bitmap code. > > > > > > Thoughts, reviews, flames appreciated... > > > > > > > Attached is a tarball of a set of xfsprogs patches to aid in testing > > this patchset. I'm posting as a tarball because the core patches (e.g., > > the kernel patches) are obviously still in flux. The tarball includes > > the following: > > > > - general dependency backports > > - core infrastructure backports (i.e., applicable patches from this v5 > > sparse inode set) > > - xfsprogs work for sparse inode support > > You should probably base it on the libxfs-3.19-update branch rather > than backport random patches into the current branch. This is what > I'm basing the current rmap-btree work I'm doing on, and having the > same libxfs structure on both sides makes it way easier to keep both > sides up to date.... > I wasn't aware we had such a branch... I don't see it in my xfsprogs repo. Perhaps that's because my repo is still based on the oss.sgi.com repo? > Give me a couple of hours and I'll push out the latest updates to > that the branch... > If you can make it available somewhere or another, I'll try to move everything over. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Thu Feb 19 17:49:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 594037F83 for ; Thu, 19 Feb 2015 17:49:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1A3E18F8059 for ; Thu, 19 Feb 2015 15:49:54 -0800 (PST) X-ASG-Debug-ID: 1424389788-04bdf06a5b51ad60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 3huHdSI0C42lZ3nD for ; Thu, 19 Feb 2015 15:49:49 -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: A2APCwAGduZU/zkjLHlbgwZSWoI6rU8MAQEBAQEBBpJThWkEAgKBHEQBAQEBAQF8hBABBTocIxAIAw4KCSUPBSUDIROILg7UFQEBAQEBBQEBAQEeGIVshQuCYYINB4MWgRQFkyeFZIEaiz6GSyKCAhyBZCoxAQGCQQEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 20 Feb 2015 10:19:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOaqd-0002lO-C9; Fri, 20 Feb 2015 10:49:35 +1100 Date: Fri, 20 Feb 2015 10:49:35 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v5 00/18] xfs: sparse inode chunks Message-ID: <20150219234935.GC12722@dastard> X-ASG-Orig-Subj: Re: [PATCH v5 00/18] xfs: sparse inode chunks References: <1424369623-5656-1-git-send-email-bfoster@redhat.com> <20150219191034.GA5750@bfoster.bfoster> <20150219230150.GZ12722@dastard> <20150219232024.GA8498@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219232024.GA8498@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424389788 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15556 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Feb 19, 2015 at 06:20:24PM -0500, Brian Foster wrote: > On Fri, Feb 20, 2015 at 10:01:50AM +1100, Dave Chinner wrote: > > On Thu, Feb 19, 2015 at 02:10:34PM -0500, Brian Foster wrote: > > > On Thu, Feb 19, 2015 at 01:13:25PM -0500, Brian Foster wrote: > > > > Hi all, > > > > > > > > Here's v5 of sparse inode chunks. The only real change here is to > > > > convert the allocmask helpers back to using the XFS bitmap helpers > > > > rather than the generic bitmap code. This eliminates the need for the > > > > endian-conversion hack and extra helper to export a generic bitmap to a > > > > native type. The former users of the generic bitmap itself have been > > > > converted to use the native 64-bit value appropriately. > > > > > > > > The XFS bitmap code is actually not in userspace either so neither of > > > > these implementations backport cleanly to userspace. As it is, I've not > > > > included the sparse alloc/free code in my xfsprogs branch as this code > > > > currently isn't needed. Nothing in userspace that I've seen requires the > > > > ability to do a sparse inode allocation or free. I suspect if it is > > > > needed in the future, we can more easily sync the XFS bitmap helpers to > > > > userspace than the generic Linux bitmap code. > > > > > > > > Thoughts, reviews, flames appreciated... > > > > > > > > > > Attached is a tarball of a set of xfsprogs patches to aid in testing > > > this patchset. I'm posting as a tarball because the core patches (e.g., > > > the kernel patches) are obviously still in flux. The tarball includes > > > the following: > > > > > > - general dependency backports > > > - core infrastructure backports (i.e., applicable patches from this v5 > > > sparse inode set) > > > - xfsprogs work for sparse inode support > > > > You should probably base it on the libxfs-3.19-update branch rather > > than backport random patches into the current branch. This is what > > I'm basing the current rmap-btree work I'm doing on, and having the > > same libxfs structure on both sides makes it way easier to keep both > > sides up to date.... > > > > I wasn't aware we had such a branch... I don't see it in my xfsprogs > repo. Perhaps that's because my repo is still based on the oss.sgi.com > repo? Possibly, though I thought I pushed it there. I don't tend to look at the oss repositories these days, and only push to them at release time. https://git.kernel.org/cgit/fs/xfs/xfsprogs-dev.git/log/?h=libxfs-3.19-update Cheers, Dave. -- Dave Chinner david@fromorbit.com From im-xfs=oss.sgi.com@bestinforex.com Thu Feb 19 21:33:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6571F7F3F for ; Thu, 19 Feb 2015 21:33:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3A4FAC001 for ; Thu, 19 Feb 2015 19:33:24 -0800 (PST) X-ASG-Debug-ID: 1424403200-04cb6c6b0b535610001-NocioJ Received: from however.bestinforex.com (however.bestinforex.com [80.83.115.193]) by cuda.sgi.com with ESMTP id wFlEwvUEyscVo2j8 for ; Thu, 19 Feb 2015 19:33:21 -0800 (PST) X-Barracuda-Envelope-From: im-xfs=oss.sgi.com@bestinforex.com X-Barracuda-Apparent-Source-IP: 80.83.115.193 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=bestinforex.com; h=MIME-Version:Content-Type:Date:Message-Id:Subject:From:To; i=im@bestinforex.com; bh=dhOKOYp463WZEosC1KpwUWPmPeE=; b=kNMbK3hvVViJg/Oj2X+CepZun+Wmg5QHtPwGTGJwtB9pueK21FTZNq/Au05hp81eCoUw18Tu7dt8 1zXvS2WDElQ8c9Dx2Tkvea2dHhWhnYSJgzzqWLpYe6UomTDuqMTkKHpg9GgBxnFr48AlnGkf8bl0 WlI1JWJq7iWDysEtXdw= Received: by however.bestinforex.com id hsqlge0001gd for ; Thu, 19 Feb 2015 22:33:21 -0500 (envelope-from ) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="d63d7e844f4c3b73551701c94ece42" Date: Thu, 19 Feb 2015 22:33:21 -0500 Message-Id: Subject: =?UTF-8?B?QWxsIDIwMTQncyBtdXN0IGdvLiBTZWxlY3QgeW91cnMgLg==?= From: Autos - iMotors xfs X-ASG-Orig-Subj: =?UTF-8?B?QWxsIDIwMTQncyBtdXN0IGdvLiBTZWxlY3QgeW91cnMgLg==?= To: xfs@oss.sgi.com X-Barracuda-Connect: however.bestinforex.com[80.83.115.193] X-Barracuda-Start-Time: 1424403200 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15563 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 --d63d7e844f4c3b73551701c94ece42 Content-Type: text/plain; [February Overstock Lot-Blowout] Below Kelly Blue Book Dealers are making room for 2015 models. That means you can get 2014 for less than what you would expect. Remaining vehicles can be seen below: View vehicles Unsubscribe2237 Hood Avenue,San Diego,CA,92123 --d63d7e844f4c3b73551701c94ece42 Content-Type: text/html;
[February Overstock Lot-Blowout]
Below Kelly Blue Book
Dealers are making room for 2015 models.
That means you can get 2014 for less than what you would expect.

Remaining vehicles can be seen below:

View vehicles



Unsubscribe
3459 Maple Street,Burbank,CA,91505 --d63d7e844f4c3b73551701c94ece42-- From news@mistergagnant.fr Thu Feb 19 23:58:42 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A5937F4E for ; Thu, 19 Feb 2015 23:58:42 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68406304032 for ; Thu, 19 Feb 2015 21:58:39 -0800 (PST) X-ASG-Debug-ID: 1424411914-04cb6c6b0954b0e0001-NocioJ Received: from GREENQL-87H0I4R (i-46-149-28-189.compute.is-1.greenqloud.com [46.149.28.189]) by cuda.sgi.com with ESMTP id LKhMm7r3hgYa0Hn6 for ; Thu, 19 Feb 2015 21:58:35 -0800 (PST) X-Barracuda-Envelope-From: news@mistergagnant.fr X-Barracuda-Apparent-Source-IP: 46.149.28.189 Received: from [10.1.1.141] ([127.0.0.1]) by GREENQL-87H0I4R with Microsoft SMTPSVC(7.5.7601.17514); Fri, 20 Feb 2015 05:58:34 +0000 Message-Id: Mime-Version: 1.0 From: "=?UTF-8?B?Ru+9j++9ku+9lO+9le+9ju+9he+9jw==?=" To: Undisclosed-Recipients:; Subject: =?UTF-8?B?VsmRbGlkZcm+IHZvdMm+ZSBudW3Dqcm+bw==?= Date: Fri, 20 Feb 2015 05:58:34 GMT X-ASG-Orig-Subj: =?UTF-8?B?VsmRbGlkZcm+IHZvdMm+ZSBudW3Dqcm+bw==?= Content-type: text/html; charset=iso-8859-1 Content-transfer-encoding: quoted-printable X-OriginalArrivalTime: 20 Feb 2015 05:58:34.0364 (UTC) FILETIME=[42F06BC0:01D04CD2] X-Barracuda-Connect: i-46-149-28-189.compute.is-1.greenqloud.com[46.149.28.189] X-Barracuda-Start-Time: 1424411915 X-Barracuda-URL: http://192.48.176.15:80/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=BSF_SC7_MJ5792, DYN_RDNS_SHORT_HELO_HTML, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15566 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 0.25 BSF_SC7_MJ5792 Mismatched html tag text 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.29 DYN_RDNS_SHORT_HELO_HTML Sent by dynamic rDNS, short HELO, and HTML

3D""3D""


Bonjour ,

 

Nous tenons de vous informer que vous devez vali= der votre numéro de téléphone=2E 
La plupart des utilisateurs reçoivent moins de trois alertes par ans= =2E

Ce numéro de téléphone ne s= era utilisé que pour la sécurité de votre compte

Veuillez cliquer sur le lien ci-dessous:

 


Après la validation  de votre numéro de téléphone= , vous pouvez utiliser votre compte en toute sécurité=2E

A bientôt

Cordialement,

Le Service Commercial
Email : > Nous contacter

* Conditions sur site

 

From mtk.linux.lists@gmail.com Fri Feb 20 02:51:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 BB43F7F37 for ; Fri, 20 Feb 2015 02:51:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 664E7AC002 for ; Fri, 20 Feb 2015 00:51:15 -0800 (PST) X-ASG-Debug-ID: 1424422270-04bdf06a5a535ea0001-NocioJ Received: from mail-ob0-f179.google.com (mail-ob0-f179.google.com [209.85.214.179]) by cuda.sgi.com with ESMTP id u1dnxCokB6YsfZBa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 00:51:10 -0800 (PST) X-Barracuda-Envelope-From: mtk.linux.lists@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] Received: by mail-ob0-f179.google.com with SMTP id wp4so22875899obc.10 for ; Fri, 20 Feb 2015 00:51:10 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:from:date:message-id:subject:to:cc:content-type :content-transfer-encoding; bh=XrCYGr6t8qTTgAfRJMvIt26hTNY09kNFzrME9vLNPvU=; b=aNkVVESvBvii35QQvbyLhMcU9ae5yHjeffQ4iFc1N9IsjqKLhkUU8HLTTxGz2QIVkM xg6szmdgdbG/Ugd95fTgSz0B4d6UCtHJl+aQpORPU2a1AgjBwwx8UmQS+n1Q6TvGZXjE 7WH9jFDhpjheP2YqrSgpD1stppxAi4qRtw2K6gEnodwg2+RM7BbBiE9zKT+A7k5ALy7m 4pr+g12+ZrjP3cNoM2qX8wdXjXaTxWtNQ1IzPhfK8k5kEl7yIx7M2nwdLTg9qlvmoHjC CSFhV9kosXAB44uCUCKy6IeSbKXRfJ6sdbxdXYHk+k0SruP5F1X9xknTpURCptOCvjzF wTQg== X-Received: by 10.202.208.1 with SMTP id h1mr5467035oig.25.1424422270348; Fri, 20 Feb 2015 00:51:10 -0800 (PST) MIME-Version: 1.0 Sender: mtk.linux.lists@gmail.com Received: by 10.202.229.144 with HTTP; Fri, 20 Feb 2015 00:50:50 -0800 (PST) From: Michael Kerrisk Date: Fri, 20 Feb 2015 09:50:50 +0100 X-Google-Sender-Auth: c5FTimQWScXPqNiBiPxt-S31-ak Message-ID: Subject: Documenting MS_LAZYTIME To: "Theodore Ts'o" X-ASG-Orig-Subj: Documenting MS_LAZYTIME Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-ob0-f179.google.com[209.85.214.179] X-Barracuda-Start-Time: 1424422270 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15572 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 Ted, Based on your commit message 0ae45f63d4e, I I wrote the documentation below for MS_LAZYTIME, to go into the mount(2) man page. Could you please check it over and let me know if it's accurate. In particular, I added pieces marked with "*" below that were not part of the commit message and I'd like confirmation that they're accurate. Thanks, Michael [[ MS_LAZYTIME (since Linux 3.20) Only update filetimes (atime, mtime, ctime) on the in- memory version of the file inode. The on-disk time=E2=80= =90 stamps are updated only when: (a) the inode needs to be updated for some change unre=E2=80= =90 lated to file timestamps; (b) the application employs fsync(2), syncfs(2), or sync(2); (c) an undeleted inode is evicted from memory; or * (d) more than 24 hours have passed since the i-node was * written to disk. This mount option significantly reduces writes to the inode table for workloads that perform frequent random writes to preallocated files. * As at Linux 3.20, this option is supported only on ext4. ]] --=20 Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Author of "The Linux Programming Interface", http://blog.man7.org/ From mhocko@suse.cz Fri Feb 20 03:10:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2AA837F54 for ; Fri, 20 Feb 2015 03:10:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0AEB08F8089 for ; Fri, 20 Feb 2015 01:10:05 -0800 (PST) X-ASG-Debug-ID: 1424423403-04cb6c6b0b54e0e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4TVHfuzlKESOAXgf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 01:10:03 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 20920ABD0; Fri, 20 Feb 2015 09:10:02 +0000 (UTC) Date: Fri, 20 Feb 2015 10:10:01 +0100 From: Michal Hocko To: Tetsuo Handa Cc: hannes@cmpxchg.org, david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220091001.GC21248@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <201502192229.FCJ73987.MFQLOHSJFFtOOV@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502192229.FCJ73987.MFQLOHSJFFtOOV@I-love.SAKURA.ne.jp> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424423403 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu 19-02-15 22:29:37, Tetsuo Handa wrote: > Michal Hocko wrote: > > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > > [...] > > > Preferrably, we'd get rid of all nofail allocations and replace them > > > with preallocated reserves. But this is not going to happen anytime > > > soon, so what other option do we have than resolving this on the OOM > > > killer side? > > > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > > access to memory reserves (by giving it __GFP_HIGH). This is still not a > > 100% solution because reserves could get depleted but this risk is there > > even with multiple oom victims. I would still argue that this would be a > > better approach because selecting more victims might hit pathological > > case more easily (other victims might be blocked on the very same lock > > e.g.). > > > Does "multiple OOM victims" mean "select next if first does not die"? > Then, I think my timeout patch http://marc.info/?l=linux-mm&m=142002495532320&w=2 > does not deplete memory reserves. ;-) It doesn't because --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2603,9 +2603,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask) alloc_flags |= ALLOC_NO_WATERMARKS; else if (in_serving_softirq() && (current->flags & PF_MEMALLOC)) alloc_flags |= ALLOC_NO_WATERMARKS; - else if (!in_interrupt() && - ((current->flags & PF_MEMALLOC) || - unlikely(test_thread_flag(TIF_MEMDIE)))) + else if (!in_interrupt() && (current->flags & PF_MEMALLOC)) alloc_flags |= ALLOC_NO_WATERMARKS; you disabled the TIF_MEMDIE heuristic and use it only for OOM exclusion and break out from the allocator. Exiting task might need a memory to do so and you make all those allocations fail basically. How do you know this is not going to blow up? > If we change to permit invocation of the OOM killer for GFP_NOFS / GFP_NOIO, > those who do not want to fail (e.g. journal transaction) will start passing > __GFP_NOFAIL? > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Don't email: email@kvack.org -- Michal Hocko SUSE Labs From mhocko@suse.cz Fri Feb 20 03:13:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38BAC7F55 for ; Fri, 20 Feb 2015 03:13:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA6FC8F8040 for ; Fri, 20 Feb 2015 01:13:29 -0800 (PST) X-ASG-Debug-ID: 1424423607-04bdf06a5c5364f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 8ehhrHEDLWWN5LE7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 01:13:28 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 8052FABD0; Fri, 20 Feb 2015 09:13:26 +0000 (UTC) Date: Fri, 20 Feb 2015 10:13:26 +0100 From: Michal Hocko To: Tetsuo Handa Cc: hannes@cmpxchg.org, david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220091326.GD21248@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219125844.GI28427@dhcp22.suse.cz> <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424423607 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15572 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 00:29:29, Tetsuo Handa wrote: > Michal Hocko wrote: > > On Thu 19-02-15 13:29:14, Michal Hocko wrote: > > [...] > > > Something like the following. > > __GFP_HIGH doesn't seem to be sufficient so we would need something > > slightly else but the idea is still the same: > > > > diff --git a/mm/page_alloc.c b/mm/page_alloc.c > > index 8d52ab18fe0d..2d224bbdf8e8 100644 > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2599,6 +2599,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, > > enum migrate_mode migration_mode = MIGRATE_ASYNC; > > bool deferred_compaction = false; > > int contended_compaction = COMPACT_CONTENDED_NONE; > > + int oom = 0; > > > > /* > > * In the slowpath, we sanity check order to avoid ever trying to > > @@ -2635,6 +2636,15 @@ retry: > > alloc_flags = gfp_to_alloc_flags(gfp_mask); > > > > /* > > + * __GFP_NOFAIL allocations cannot fail but yet the current context > > + * might be blocking resources needed by the OOM victim to terminate. > > + * Allow the caller to dive into memory reserves to succeed the > > + * allocation and break out from a potential deadlock. > > + */ > > We don't know how many callers will pass __GFP_NOFAIL. But if 1000 > threads are doing the same operation which requires __GFP_NOFAIL > allocation with a lock held, wouldn't memory reserves deplete? We shouldn't have an unbounded number of GFP_NOFAIL allocations at the same time. This would be even more broken. If a load is known to use such allocations excessively then the administrator can enlarge the memory reserves. > This heuristic can't continue if memory reserves depleted or > continuous pages of requested order cannot be found. Once memory reserves are depleted we are screwed anyway and we might panic. -- Michal Hocko SUSE Labs From mhocko@suse.cz Fri Feb 20 03:27:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1DEE07F58 for ; Fri, 20 Feb 2015 03:27:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9235FAC003 for ; Fri, 20 Feb 2015 01:27:25 -0800 (PST) X-ASG-Debug-ID: 1424424443-04cbb011634ed0b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6HVZCZwn4A92CP2D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 01:27:23 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 3E1DFABD0; Fri, 20 Feb 2015 09:27:22 +0000 (UTC) Date: Fri, 20 Feb 2015 10:27:21 +0100 From: Michal Hocko To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220092721.GE21248@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150218213118.GN12722@dastard> <20150219094020.GE28427@dhcp22.suse.cz> <20150219220355.GX12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219220355.GX12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424424443 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 09:03:55, Dave Chinner wrote: [...] > Converting the code to use GFP_NOFAIL takes us in exactly the > opposite direction to our current line of development w.r.t. to > filesystem error handling. Fair enough. If there are plans to have a failure policy rather than GFP_NOFAIL like behavior then I have, of course, no objections. Quite opposite. This is exactly what I would like to see. GFP_NOFAIL should be rarely used, really. The whole point of this discussion, and I am sorry if I didn't make it clear, is that _if_ there is really a GFP_NOFAIL requirement hidden from the allocator then it should be changed to use GFP_NOFAIL so that allocator knows about this requirement. > > The reason I care about GFP_NOFAIL is that there are apparently code > > paths which do not tell allocator they are basically GFP_NOFAIL without > > any fallback. This leads to two main problems 1) we do not have a good > > overview how many code paths have such a strong requirements and so > > cannot estimate e.g. how big memory reserves should be and > > Right, when GFP_NOFAIL got deprecated we lost the ability to document > such behaviour and find it easily. People just put retry loops in > instead of using GFP_NOFAIL. Good luck finding them all :/ That will be PITA, all right, but I guess the deprecation was a mistake and we should stop this tendency. > > 2) allocator > > cannot help those paths (e.g. by giving them access to reserves to break > > out of the livelock). > > Allocator should not help. Global reserves are unreliable - make the > allocation context reserve the amount it needs before it enters the > context where it can't back out.... Sure pre-allocation is preferable. But once somebody asks for GFP_NOFAIL then it is too late and the allocator only has memory reclaim and potentially reserves. [...] -- Michal Hocko SUSE Labs From penguin-kernel@i-love.sakura.ne.jp Fri Feb 20 04:36:50 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E93CD7F5F for ; Fri, 20 Feb 2015 04:36:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 64733AC002 for ; Fri, 20 Feb 2015 02:36:49 -0800 (PST) X-ASG-Debug-ID: 1424428604-04cbb011634eec60001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id bq4C9MVD74dzeeYg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 02:36:46 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav203.sakura.ne.jp (fsav203.sakura.ne.jp [210.224.168.165]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1KAaXmo017218; Fri, 20 Feb 2015 19:36:33 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav203.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp); Fri, 20 Feb 2015 19:36:33 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1KAaXJB017215; Fri, 20 Feb 2015 19:36:33 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: david@fromorbit.com, hannes@cmpxchg.org Cc: mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> In-Reply-To: <20150219225217.GY12722@dastard> Message-Id: <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Fri, 20 Feb 2015 19:36:33 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424428605 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Chinner wrote: > I really don't care about the OOM Killer corner cases - it's > completely the wrong way line of development to be spending time on > and you aren't going to convince me otherwise. The OOM killer a > crutch used to justify having a memory allocation subsystem that > can't provide forward progress guarantee mechanisms to callers that > need it. I really care about the OOM Killer corner cases, for I'm (1) seeing trouble cases which occurred in enterprise systems under OOM conditions (2) trying to downgrade OOM "Deadlock or Genocide" attacks (which an unprivileged user with a login shell can trivially trigger since Linux 2.0) to OOM "Genocide" attacks in order to allow OOM-unkillable daemons to restart OOM-killed processes (3) waiting for a bandaid for (2) in order to propose changes for mitigating OOM "Genocide" attacks (as bad guys will find how to trigger OOM "Deadlock or Genocide" attacks from changes for mitigating OOM "Genocide" attacks) I started posting to linux-mm ML in order to make forward progress about (1) and (2). I don't want the memory allocation subsystem to lock up an entire system by indefinitely disabling memory releasing mechanism provided by the OOM killer. > I've proposed a method of providing this forward progress guarantee > for subsystems of arbitrary complexity, and this removes the > dependency on the OOM killer for fowards allocation progress in such > contexts (e.g. filesystems). We should be discussing how to > implement that, not what bandaids we need to apply to the OOM > killer. I want to fix the underlying problems, not push them under > the OOM-killer bus... I'm fine with that direction for new kernels provided that a simple bandaid which can be backported to distributor kernels for making OOM "Deadlock" attacks impossible is implemented. Therefore, I'm discussing what bandaids we need to apply to the OOM killer. From jack@suse.cz Fri Feb 20 06:06:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0761E7F61 for ; Fri, 20 Feb 2015 06:06:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA496304039 for ; Fri, 20 Feb 2015 04:05:56 -0800 (PST) X-ASG-Debug-ID: 1424433953-04cb6c6b09554270001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id qIxVvoahWfAVxdRT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 04:05:54 -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 00EE6ACAB; Fri, 20 Feb 2015 12:05:51 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id ECD918274B; Fri, 20 Feb 2015 13:05:47 +0100 (CET) Date: Fri, 20 Feb 2015 13:05:47 +0100 From: Jan Kara To: Dave Chinner Cc: Jan Kara , Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150220120547.GA6293@quack.suse.cz> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150218215523.GO12722@dastard> <20150219154241.GC22712@quack.suse.cz> <20150219211210.GS12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219211210.GS12722@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424433953 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15577 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 08:12:10, Dave Chinner wrote: > On Thu, Feb 19, 2015 at 04:42:41PM +0100, Jan Kara wrote: > > On Thu 19-02-15 08:55:23, Dave Chinner wrote: > > > On Wed, Feb 18, 2015 at 11:40:09AM +0100, Jan Kara wrote: > > > > On Tue 17-02-15 08:37:45, Matthew Wilcox wrote: > > > > > On Tue, Feb 17, 2015 at 09:52:00AM +0100, Jan Kara wrote: > > > > > > > > This got added to fix a problem that Dave Chinner pointed out. We need > > > > > > > > the allocated extent to either be zeroed (as ext2 does), or marked as > > > > > > > > unwritten (ext4, XFS) so that a racing read/page fault doesn't return > > > > > > > > uninitialized data. If it's marked as unwritten, we need to convert it > > > > > > > > to a written extent after we've initialised the contents. We use the > > > > > > > > b_end_io() callback to do this, and it's called from the DAX code, not in > > > > > > > > softirq context. > > > > > > > OK, I see. But I didn't find where ->b_end_io gets called from dax code > > > > > > > (specifically I don't see it anywhere in dax_do_IO() or dax_io()). Can you > > > > > > > point me please? > > > > > > > > > > For faults, we call it in dax_insert_mapping(), the very last thing > > > > > before returning in the fault path. The normal I/O path gets to use > > > > > the dio_iodone_t for the same purpose. > > > > I see. I didn't think of races with reads (hum, I actually wonder whether > > > > we don't have this data exposure problem for ext4 for mmapped write into > > > > a hole vs direct read as well). So I guess we do need those unwritten > > > > extent dances after all (or we would need to have a page covering hole when > > > > writing to it via mmap but I guess unwritten extent dances are somewhat > > > > more standard). > > > > > > Right, that was the reason for doing it that way - it leveraged all > > > the existing methods we have for avoiding data exposure races in > > > XFS. but it's also not just for races - it's for ensuring that if we > > > crash between the allocation and the write to the persistent store > > > we don't expose the underlying contents when the system next comes > > > up. > > Well, ext3/4 handles the crash situation differently - we make sure we > > flush data to allocated blocks before committing a transaction that > > allocates them. That works perfectly for crashes but doesn't avoid the > > race with DIO. > > I was talking about direct IO, not buffered IO. DAX is modeled on Ah, OK. For DIO writes ext4 uses unwritten extents as well. But the race I was talking about is between mmap allocating write (i.e. going through page cache) and DIO read of the same location. > the direct IO stack, not buffered IO. I did go and look at the ext4 > IO completion path, and I can see where ext4_end_io_dio() triggers a > commit outside of doing unwritten extent conversion. Can you clue me > in - IO completion in ext4 is a maze of twisty passages... I don't quite follow you. Why should ext4_end_io_dio() trigger a commit? Honza -- Jan Kara SUSE Labs, CR From penguin-kernel@i-love.sakura.ne.jp Fri Feb 20 06:21:22 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D10D7F5F for ; Fri, 20 Feb 2015 06:21:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B4AF304032 for ; Fri, 20 Feb 2015 04:21:21 -0800 (PST) X-ASG-Debug-ID: 1424434876-04cb6c6b0c554ac0001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id SZQVYlEzGaImr1nF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 04:21:17 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav203.sakura.ne.jp (fsav203.sakura.ne.jp [210.224.168.165]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1KCL3nt036050; Fri, 20 Feb 2015 21:21:03 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav203.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp); Fri, 20 Feb 2015 21:21:03 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav203.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1KCKwFg036024; Fri, 20 Feb 2015 21:21:03 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: mhocko@suse.cz Cc: hannes@cmpxchg.org, david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <201502192229.FCJ73987.MFQLOHSJFFtOOV@I-love.SAKURA.ne.jp> <20150220091001.GC21248@dhcp22.suse.cz> In-Reply-To: <20150220091001.GC21248@dhcp22.suse.cz> Message-Id: <201502202120.GHE87026.OFSHLFFOJMVtOQ@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Fri, 20 Feb 2015 21:20:58 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424434876 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Michal Hocko wrote: > On Thu 19-02-15 22:29:37, Tetsuo Handa wrote: > > Michal Hocko wrote: > > > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > > > [...] > > > > Preferrably, we'd get rid of all nofail allocations and replace them > > > > with preallocated reserves. But this is not going to happen anytime > > > > soon, so what other option do we have than resolving this on the OOM > > > > killer side? > > > > > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > > > access to memory reserves (by giving it __GFP_HIGH). This is still not a > > > 100% solution because reserves could get depleted but this risk is there > > > even with multiple oom victims. I would still argue that this would be a > > > better approach because selecting more victims might hit pathological > > > case more easily (other victims might be blocked on the very same lock > > > e.g.). > > > > > Does "multiple OOM victims" mean "select next if first does not die"? > > Then, I think my timeout patch http://marc.info/?l=linux-mm&m=142002495532320&w=2 > > does not deplete memory reserves. ;-) > > It doesn't because > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -2603,9 +2603,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask) > alloc_flags |= ALLOC_NO_WATERMARKS; > else if (in_serving_softirq() && (current->flags & PF_MEMALLOC)) > alloc_flags |= ALLOC_NO_WATERMARKS; > - else if (!in_interrupt() && > - ((current->flags & PF_MEMALLOC) || > - unlikely(test_thread_flag(TIF_MEMDIE)))) > + else if (!in_interrupt() && (current->flags & PF_MEMALLOC)) > alloc_flags |= ALLOC_NO_WATERMARKS; > > you disabled the TIF_MEMDIE heuristic and use it only for OOM exclusion > and break out from the allocator. Exiting task might need a memory to do > so and you make all those allocations fail basically. How do you know > this is not going to blow up? > Well, treat exiting tasks to imply __GFP_NOFAIL for clean up? We cannot determine correct task to kill + allow access to memory reserves based on lock dependency. Therefore, this patch evenly allow no tasks to access to memory reserves. Exiting task might need some memory to exit, and not allowing access to memory reserves can retard exit of that task. But that task will eventually get memory released by other tasks killed by timeout-based kill-more mechanism. If no more killable tasks or expired panic-timeout, it is the same result with depletion of memory reserves. I think that this situation (automatically making forward progress as if the administrator is periodically doing SysRq-f until the OOM condition is solved, or is doing SysRq-c if no more killable tasks or stalled too long) is better than current situation (not making forward progress since the exiting task cannot exit due to lock dependency, caused by failing to determine correct task to kill + allow access to memory reserves). > > If we change to permit invocation of the OOM killer for GFP_NOFS / GFP_NOIO, > > those who do not want to fail (e.g. journal transaction) will start passing > > __GFP_NOFAIL? > > From adilger@dilger.ca Fri Feb 20 06:33:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A17BC7F63 for ; Fri, 20 Feb 2015 06:33:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FE008F8050 for ; Fri, 20 Feb 2015 04:33:04 -0800 (PST) X-ASG-Debug-ID: 1424435582-04cb6c6b09555180001-NocioJ Received: from mail-pd0-f178.google.com (mail-pd0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id zZqzmWH6BQjw2sum (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 04:33:02 -0800 (PST) X-Barracuda-Envelope-From: adilger@dilger.ca Received: by pdjg10 with SMTP id g10so7404734pdj.1 for ; Fri, 20 Feb 2015 04:33:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:content-type:mime-version:subject:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to; bh=5nhUwVDLgLO3K8MINspNTAWy5rn+HmC0PhL0lV7CAJg=; b=d7SVeSaAiJTFUGgx5AWy9PFsr37tsaj66MobmakQxJ476JE156+O6RXrTnt6dpNxW6 GVedn6fjGShQPF3K48Dx4ShKc6Wf5glDMSY1uEGBjcFpI33rIM3DE3PBid6WSPzWGtk5 Z+byMKHGK1MrD0/m5p5oKMm8KLW0nXjykpeYTgr2TwxBJrojoj9Xp/0NehrehE2QrxKN ciVW5j7lFo/8h8IbLdXsWXpWfR1sRt/RKyEC2c6E6PN0k1AhnE9CP9gqdQdpMQH3+aNY 4qa2AsaDsiFCU0v4AMEojy79uV59xOWxsq//qiE9yiWSHBHb9XtOA67viroUq0SmYTfN C9fw== X-Gm-Message-State: ALoCoQngC1Z0s0Uoifl8gjZhQf5Fooz5BRSbJiBf6oqCuu2OloQ8Nol5mQDr6mFpcC6LhCzT3leG X-Received: by 10.67.3.196 with SMTP id by4mr3837291pad.74.1424435581908; Fri, 20 Feb 2015 04:33:01 -0800 (PST) Received: from cabot-wlan.adilger.int (S0106002191d9348b.cg.shawcable.net. [96.51.76.157]) by mx.google.com with ESMTPSA id gv2sm2317428pbc.8.2015.02.20.04.33.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 20 Feb 2015 04:33:01 -0800 (PST) Content-Type: text/plain; charset=utf-8 X-Barracuda-Apparent-Source-IP: 96.51.76.157 Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2070.6\)) Subject: Re: Documenting MS_LAZYTIME From: Andreas Dilger X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: Date: Fri, 20 Feb 2015 05:32:58 -0700 Cc: Theodore Ts'o , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Content-Transfer-Encoding: quoted-printable Message-Id: <44893EA7-B11A-469A-9911-6CE2E8B26EB4@dilger.ca> References: To: Michael Kerrisk X-Mailer: Apple Mail (2.2070.6) X-Barracuda-Connect: mail-pd0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1424435582 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Feb 20, 2015, at 1:50 AM, Michael Kerrisk = wrote: >=20 > Hello Ted, >=20 > Based on your commit message 0ae45f63d4e, I I wrote the documentation > below for MS_LAZYTIME, to go into the mount(2) man page. Could you > please check it over and let me know if it's accurate. In particular, > I added pieces marked with "*" below that were not part of the commit > message and I'd like confirmation that they're accurate. >=20 > Thanks, >=20 > Michael >=20 > [[ > MS_LAZYTIME (since Linux 3.20) > Only update filetimes (atime, mtime, ctime) on the in- > memory version of the file inode. The on-disk = time=E2=80=90 > stamps are updated only when: >=20 > (a) the inode needs to be updated for some change = unre=E2=80=90 > lated to file timestamps; >=20 > (b) the application employs fsync(2), syncfs(2), or > sync(2); >=20 > (c) an undeleted inode is evicted from memory; or >=20 > * (d) more than 24 hours have passed since the i-node was > * written to disk. >=20 > This mount option significantly reduces writes to the > inode table for workloads that perform frequent random > writes to preallocated files. >=20 > * As at Linux 3.20, this option is supported only on ext4. I _think_ that the lazytime mount option is generic for all filesystems. I believe ext4 has an extra optimization for it, but that's it. Cheers, Andreas From mhocko@suse.cz Fri Feb 20 06:39:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84F5C7F63 for ; Fri, 20 Feb 2015 06:39:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 463FF8F8059 for ; Fri, 20 Feb 2015 04:39:00 -0800 (PST) X-ASG-Debug-ID: 1424435937-04bdf06a5a53bf50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 782b8AK8bWFbhsTQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 04:38:58 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 0FF18ABED; Fri, 20 Feb 2015 12:38:56 +0000 (UTC) Date: Fri, 20 Feb 2015 13:38:55 +0100 From: Michal Hocko To: Tetsuo Handa Cc: hannes@cmpxchg.org, david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, fernando_b1@lab.ntt.co.jp Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220123855.GG21248@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <201502192229.FCJ73987.MFQLOHSJFFtOOV@I-love.SAKURA.ne.jp> <20150220091001.GC21248@dhcp22.suse.cz> <201502202120.GHE87026.OFSHLFFOJMVtOQ@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502202120.GHE87026.OFSHLFFOJMVtOQ@I-love.SAKURA.ne.jp> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424435938 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri 20-02-15 21:20:58, Tetsuo Handa wrote: > Michal Hocko wrote: > > On Thu 19-02-15 22:29:37, Tetsuo Handa wrote: > > > Michal Hocko wrote: > > > > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > > > > [...] > > > > > Preferrably, we'd get rid of all nofail allocations and replace them > > > > > with preallocated reserves. But this is not going to happen anytime > > > > > soon, so what other option do we have than resolving this on the OOM > > > > > killer side? > > > > > > > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > > > > access to memory reserves (by giving it __GFP_HIGH). This is still not a > > > > 100% solution because reserves could get depleted but this risk is there > > > > even with multiple oom victims. I would still argue that this would be a > > > > better approach because selecting more victims might hit pathological > > > > case more easily (other victims might be blocked on the very same lock > > > > e.g.). > > > > > > > Does "multiple OOM victims" mean "select next if first does not die"? > > > Then, I think my timeout patch http://marc.info/?l=linux-mm&m=142002495532320&w=2 > > > does not deplete memory reserves. ;-) > > > > It doesn't because > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2603,9 +2603,7 @@ gfp_to_alloc_flags(gfp_t gfp_mask) > > alloc_flags |= ALLOC_NO_WATERMARKS; > > else if (in_serving_softirq() && (current->flags & PF_MEMALLOC)) > > alloc_flags |= ALLOC_NO_WATERMARKS; > > - else if (!in_interrupt() && > > - ((current->flags & PF_MEMALLOC) || > > - unlikely(test_thread_flag(TIF_MEMDIE)))) > > + else if (!in_interrupt() && (current->flags & PF_MEMALLOC)) > > alloc_flags |= ALLOC_NO_WATERMARKS; > > > > you disabled the TIF_MEMDIE heuristic and use it only for OOM exclusion > > and break out from the allocator. Exiting task might need a memory to do > > so and you make all those allocations fail basically. How do you know > > this is not going to blow up? > > > > Well, treat exiting tasks to imply __GFP_NOFAIL for clean up? > > We cannot determine correct task to kill + allow access to memory reserves > based on lock dependency. Therefore, this patch evenly allow no tasks to > access to memory reserves. > > Exiting task might need some memory to exit, and not allowing access to > memory reserves can retard exit of that task. But that task will eventually > get memory released by other tasks killed by timeout-based kill-more > mechanism. If no more killable tasks or expired panic-timeout, it is > the same result with depletion of memory reserves. > > I think that this situation (automatically making forward progress as if > the administrator is periodically doing SysRq-f until the OOM condition > is solved, or is doing SysRq-c if no more killable tasks or stalled too > long) is better than current situation (not making forward progress since > the exiting task cannot exit due to lock dependency, caused by failing to > determine correct task to kill + allow access to memory reserves). If you really believe this is an improvement then send a proper patch with justification. But I am _really_ skeptical about such a change to be honest. -- Michal Hocko SUSE Labs From mhocko@suse.cz Fri Feb 20 06:48:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6EC957F6D for ; Fri, 20 Feb 2015 06:48:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D73E8F8039 for ; Fri, 20 Feb 2015 04:48:53 -0800 (PST) X-ASG-Debug-ID: 1424436530-04cb6c6b0b555ac0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id HqOFr4I5VDUCAqPg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 04:48:51 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 0DEA6ACAB; Fri, 20 Feb 2015 12:48:50 +0000 (UTC) Date: Fri, 20 Feb 2015 13:48:49 +0100 From: Michal Hocko To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220124849.GH21248@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219214356.GW12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219214356.GW12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424436531 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 08:43:56, Dave Chinner wrote: > On Thu, Feb 19, 2015 at 01:29:14PM +0100, Michal Hocko wrote: > > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > > [...] > > > Preferrably, we'd get rid of all nofail allocations and replace them > > > with preallocated reserves. But this is not going to happen anytime > > > soon, so what other option do we have than resolving this on the OOM > > > killer side? > > > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > > access to memory reserves (by giving it __GFP_HIGH). > > Won't work when you have thousands of concurrent transactions > running in XFS and they are all doing GFP_NOFAIL allocations. Is there any bound on how many transactions can run at the same time? > That's why I suggested the per-transaction reserve pool - we can use > that I am still not sure what you mean by reserve pool (API wise). How does it differ from pre-allocating memory before the "may not fail context"? Could you elaborate on it, please? > to throttle the number of concurent contexts demanding memory for > forwards progress, just the same was we throttle the number of > concurrent processes based on maximum log space requirements of the > transactions and the amount of unreserved log space available. > > No log space, transaction reservations waits on an ordered queue for > space to become available. No memory available, transaction > reservation waits on an ordered queue for memory to become > available. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Michal Hocko SUSE Labs From mtk.manpages@gmail.com Fri Feb 20 07:22:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 CB24D7F6F for ; Fri, 20 Feb 2015 07:22:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B935E304032 for ; Fri, 20 Feb 2015 05:22:34 -0800 (PST) X-ASG-Debug-ID: 1424438548-04cbb011644f4290001-NocioJ Received: from mail-lb0-f174.google.com (mail-lb0-f174.google.com [209.85.217.174]) by cuda.sgi.com with ESMTP id 2ADMCwTTGQbrhrEr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 05:22:29 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.174] Received: by lbvn10 with SMTP id n10so6225080lbv.4 for ; Fri, 20 Feb 2015 05:22:27 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:from:date:message-id :subject:to:cc:content-type:content-transfer-encoding; bh=7mIeM69a5GLCOvWj/iUeG/nYhgBBPK1qxUHOVBe/1DM=; b=FvH5qrtf77wTVBa4Ws4t9vIICWCtmIK+IlgcAjAx4JVOnj6EgZ397ISCfPsZwUmJB/ zBj8KatU7r1gSh7Me6iR80k1HQPRmWyQ//Fd7CJ42tXLoViJrz+afQLtOpa58Q3MWV9f 6htpVl/7CugT/1pBRZjY90yaz1CDDpzPJZ47p/7x4aTMWMsLs6wGwSBqn1rcLoyxtReb 4cMAR+ARA5cWrSVZldOTxMrqnX0oUkRVR7EoNUeKszZNlMuqV6HTtE20PoZyycRWz+XU b+7o5UYDvIPNlILPjzAOfcBODCyza22udRYBywNB0/7877PcMTbQTFJ4m2Z68oxiBp1c 4f5w== X-Received: by 10.112.26.165 with SMTP id m5mr8420644lbg.61.1424438547631; Fri, 20 Feb 2015 05:22:27 -0800 (PST) MIME-Version: 1.0 Received: by 10.152.22.5 with HTTP; Fri, 20 Feb 2015 05:22:07 -0800 (PST) Reply-To: mtk.manpages@gmail.com In-Reply-To: <44893EA7-B11A-469A-9911-6CE2E8B26EB4@dilger.ca> References: <44893EA7-B11A-469A-9911-6CE2E8B26EB4@dilger.ca> From: "Michael Kerrisk (man-pages)" Date: Fri, 20 Feb 2015 14:22:07 +0100 Message-ID: Subject: Re: Documenting MS_LAZYTIME To: Andreas Dilger X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME Cc: "Theodore Ts'o" , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man , Linux-Fsdevel , Linux API Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-lb0-f174.google.com[209.85.217.174] X-Barracuda-Start-Time: 1424438548 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15581 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 20 February 2015 at 13:32, Andreas Dilger wrote: > On Feb 20, 2015, at 1:50 AM, Michael Kerrisk wro= te: >> >> Hello Ted, >> >> Based on your commit message 0ae45f63d4e, I I wrote the documentation >> below for MS_LAZYTIME, to go into the mount(2) man page. Could you >> please check it over and let me know if it's accurate. In particular, >> I added pieces marked with "*" below that were not part of the commit >> message and I'd like confirmation that they're accurate. >> >> Thanks, >> >> Michael >> >> [[ >> MS_LAZYTIME (since Linux 3.20) >> Only update filetimes (atime, mtime, ctime) on the in- >> memory version of the file inode. The on-disk time=E2= =80=90 >> stamps are updated only when: >> >> (a) the inode needs to be updated for some change unre=E2= =80=90 >> lated to file timestamps; >> >> (b) the application employs fsync(2), syncfs(2), or >> sync(2); >> >> (c) an undeleted inode is evicted from memory; or >> >> * (d) more than 24 hours have passed since the i-node was >> * written to disk. >> >> This mount option significantly reduces writes to the >> inode table for workloads that perform frequent random >> writes to preallocated files. >> >> * As at Linux 3.20, this option is supported only on ext4. > > I _think_ that the lazytime mount option is generic for all filesystems. > I believe ext4 has an extra optimization for it, but that's it. Ah yes, looking at the code again, that makes sense. I think you're right, and I've struck that last sentence. Thanks, Andreas. Cheers, Michael --=20 Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From stefanrin@gmail.com Fri Feb 20 07:37:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D86577F76 for ; Fri, 20 Feb 2015 07:37:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5CD0304039 for ; Fri, 20 Feb 2015 05:37:03 -0800 (PST) X-ASG-Debug-ID: 1424439420-04cbb011654f49c0001-NocioJ Received: from mail-wi0-f180.google.com (mail-wi0-f180.google.com [209.85.212.180]) by cuda.sgi.com with ESMTP id o3pJzdaaXMZQ5K7o (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 05:37:01 -0800 (PST) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.180 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.180] Received: by mail-wi0-f180.google.com with SMTP id h11so2967989wiw.1 for ; Fri, 20 Feb 2015 05:37:00 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.180] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.180] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=g/0BBZiqiuKxWqQvX17aHAdNoQ273hfu7SHpQLWeRC8=; b=GtKf0p7GbZ04o/a9Esoe3gKkX39BxHLiHQ8fe9Ao/KgD5g/g3nUIJrX5IKvZK9tjJj jIjrHZyq8nEJN0uoKLCsAWRnxsF1c5mFKW6iXCdDUaO+DMZrywrdRXQ9+EHBEBTBWvIQ nYAylrv2L3oEq6bgykY3Wd0/DuxuKyV2BPqJ80VFyoLRF0m36hSSk4XC2DkI+99Z5514 YjdwjlvKp7sEA0/v3aPhjHCRSjNtwWBuV0Wr7b2YP9rPXHGXOwCBr7BORGtfgZvle6o9 YWbyJQX07JueDnEWMuAvvZoLUJHJnzGtV4mY7ZkT1waYbObBqWE0mqJn1lhhWrDRmYaR 3m8w== MIME-Version: 1.0 X-Received: by 10.180.74.229 with SMTP id x5mr19325012wiv.1.1424439420499; Fri, 20 Feb 2015 05:37:00 -0800 (PST) Received: by 10.194.135.42 with HTTP; Fri, 20 Feb 2015 05:37:00 -0800 (PST) In-Reply-To: <20150220091326.GD21248@dhcp22.suse.cz> References: <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219125844.GI28427@dhcp22.suse.cz> <201502200029.DEG78137.QFVLHFFOJMtOOS@I-love.SAKURA.ne.jp> <20150220091326.GD21248@dhcp22.suse.cz> Date: Fri, 20 Feb 2015 14:37:00 +0100 Message-ID: Subject: Re: How to handle TIF_MEMDIE stalls? From: Stefan Ring X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? To: Michal Hocko Cc: Tetsuo Handa , dchinner@redhat.com, oleg@redhat.com, Linux fs XFS , hannes@cmpxchg.org, linux-mm@kvack.org, mgorman@suse.de, rientjes@google.com, linux-fsdevel@vger.kernel.org, akpm@linux-foundation.org, fernando_b1@lab.ntt.co.jp, torvalds@linux-foundation.org Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f180.google.com[209.85.212.180] X-Barracuda-Start-Time: 1424439421 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15581 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 >> We don't know how many callers will pass __GFP_NOFAIL. But if 1000 >> threads are doing the same operation which requires __GFP_NOFAIL >> allocation with a lock held, wouldn't memory reserves deplete? > > We shouldn't have an unbounded number of GFP_NOFAIL allocations at the > same time. This would be even more broken. If a load is known to use > such allocations excessively then the administrator can enlarge the > memory reserves. > >> This heuristic can't continue if memory reserves depleted or >> continuous pages of requested order cannot be found. > > Once memory reserves are depleted we are screwed anyway and we might > panic. This discussion reminds me of a situation I've seen somewhat regularly, which I have described here: http://oss.sgi.com/pipermail/xfs/2014-April/035793.html I've actually seen it more often on another box with OpenVZ and VirtualBox installed, where it would almost always happen during startup of a VirtualBox guest machine. This other machine is also running XFS. I blamed it on OpenVZ or VirtualBox originally, but having seen the same thing happen on the other machine with neither of them, the next candidate for taking blame is XFS. Is this behavior something that can be attributed to these memory allocation retry loops? From anavarro15@ibericaformacion.com Fri Feb 20 08:53:18 2015 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3A0287F51 for ; Fri, 20 Feb 2015 08:53:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2360B8F8074 for ; Fri, 20 Feb 2015 06:53:15 -0800 (PST) X-ASG-Debug-ID: 1424443990-04cbb011654f6c80001-NocioJ Received: from mail.ibericaformacion.com (mail.ibericaformacion.com [185.37.226.55]) by cuda.sgi.com with ESMTP id 2BX7GgLs4hY7tw0f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 06:53:11 -0800 (PST) X-Barracuda-Envelope-From: anavarro15@ibericaformacion.com X-Barracuda-Apparent-Source-IP: 185.37.226.55 X-No-Relay: not in my network Received: from 39.Red-95-120-141.dynamicIP.rima-tde.net (70.Red-79-146-122.dynamicIP.rima-tde.net [79.146.122.70]) by mail.ibericaformacion.com (Postfix) with ESMTPSA id E12863CE0AC for ; Fri, 20 Feb 2015 15:53:01 +0100 (CET) MIME-Version: 1.0 From: "Andres Navarro" Reply-To: anavarro15@ibericaformacion.com To: xfs@oss.sgi.com Subject: =?windows-1252?Q?Att._Administraci=F3n?= Content-Type: multipart/mixed; boundary="----=_NextPart_001_3D9D_24D31021.33550292" X-ASG-Orig-Subj: =?windows-1252?Q?Att._Administraci=F3n?= X-Mailer: Smart_Send_3_1_6 Date: Fri, 20 Feb 2015 15:52:36 +0100 Message-ID: <26964559373522911514163@andres9-THINK> X-Barracuda-Connect: mail.ibericaformacion.com[185.37.226.55] X-Barracuda-Start-Time: 1424443991 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: a3af369a7717ed0c4ea1ff27faf5de1c-1512-txt 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 ------=_NextPart_001_3D9D_24D31021.33550292 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Informamos de la presente convocatoria de cursos de formaci=F3n bonificada = para empleados en activo (Febrero 2015). Recordamos que todos los cursos que se imparten son 100% bonificados, por l= o que no suponen ning=FAn coste adicional para la empresa. Si desconoce de cuanto cr=E9dito de formaci=F3n dispone su empresa cons=FAl= tenos. =20 Instrucciones para su solicitud: =20 1 - Imprimir (1) impreso de solicitud por curso. 2 - Cumplimentar, firmar y sellar las dos p=E1ginas del impreso. 3 - Enviar el impreso adjuntando cabecera de n=F3mina del empleado a la dir= ecci=F3n de correo electr=F3nico (anavarro@ibericasf.es) =20 Quedamos a su disposici=F3n para cualquier consulta. =20 =20 Un cordial saludo. =20 =20 Andr=E9s Navarro Consultor de Formaci=F3n Tel. 932 183 664 M=F3vil. 633 622 096 anavarro@ibericasf.es Departamento de formaci=F3n continua de Ib=E9rica Soluciones Formativas y C= onsultor=EDa S.L =20 IBERICA SOLUCIONES FORMATIVAS Y CONSULTORIA S.L ofrece formaci=F3n a empres= as y trabajadores en activo a trav=E9s de cursos bonificados por la Fundaci= =F3n Estatal para la Formaci=F3n en el Empleo (antiguo FORCEM) que gestiona= las acciones formativas de FORMACI=D3N CONTINUA para trabajadores y se rig= e por la orden del BOE del 1/03/2004. =20 Confidencialidad: Este documento se dirige exclusivamente a su destinatario= y podr=EDa contener informaci=F3n confidencial sometida a secreto profesio= nal o cuya divulgaci=F3n est=E9 prohibida en virtud de la legislaci=F3n vig= ente. Si ha recibido este documento por error, le rogamos que nos lo comuni= que inmediatamente. ------=_NextPart_001_3D9D_24D31021.33550292 Content-Type: application/pdf; name="IMPRESO SOLICITUD CURSO BONIFICADO.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="IMPRESO SOLICITUD CURSO BONIFICADO.pdf" JVBERi0xLjYNJeLjz9MNCjE3IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDQ3MTI1NC9PIDE5L0Ug NDUxMzkyL04gMi9UIDQ3MDkzNC9IIFsgNTE0IDIxNl0+Pg1lbmRvYmoNICAgICAgICAgICAgICAg DQozOCAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0 ZXIvRmxhdGVEZWNvZGUvSURbPDRGNUI3NDVEMThBM0VFRUM1NDM3RkM5MkIyRjQxM0FCPjw2NERC QUFBMDNGN0M4MTQ0QTY2MUNFMzI4MUM5Qzc2Mj5dL0luZGV4WzE3IDQyXS9JbmZvIDE2IDAgUi9M ZW5ndGggMTA5L1ByZXYgNDcwOTM1L1Jvb3QgMTggMCBSL1NpemUgNTkvVHlwZS9YUmVmL1dbMSAz IDFdPj5zdHJlYW0NCmjeYmJkYBBgYGJgYDoFJpeDSEYLEClRCCJ5/oFItp8gkt0YRLKqgEXCwCIF YPIGWNd2EMl1BMxOAZHceWAT3gBJFrF6sPlBIJL3E5Bk8loEJH/JH2BgArphAUgcqI9O5H8Gpnfv AAIMAGT/EloNCmVuZHN0cmVhbQ1lbmRvYmoNc3RhcnR4cmVmDQowDQolJUVPRg0KICAgICAgICAN CjU4IDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9JIDE0MC9MZW5ndGggMTM1L1MgNjU+PnN0 cmVhbQ0KaN5iYGBgBqKVDKwMDFaRDMIMCCAMlGFlYGHgaGC40nOAgeEOSNDY68Z1BvaOjrSKjgaw KBCwMPD+/wjWwMAgAha5CmTzJEQVsE5pCHLg2cMofECHg3U2w4EE5g6W8gaOD8JGTEcfrA1gqGVs XqluwhDdALOTnYFP4CKQZgQiOYAAAwDCnB8lDQplbmRzdHJlYW0NZW5kb2JqDTE4IDAgb2JqDTw8 L01ldGFkYXRhIDUgMCBSL09DUHJvcGVydGllczw8L0Q8PC9BU1s8PC9DYXRlZ29yeVsvVmlld10v RXZlbnQvVmlldy9PQ0dzWzM5IDAgUl0+Pjw8L0NhdGVnb3J5Wy9QcmludF0vRXZlbnQvUHJpbnQv T0NHc1szOSAwIFJdPj48PC9DYXRlZ29yeVsvRXhwb3J0XS9FdmVudC9FeHBvcnQvT0NHc1szOSAw IFJdPj48PC9DYXRlZ29yeVsvVmlld10vRXZlbnQvVmlldy9PQ0dzWzQwIDAgUl0+Pjw8L0NhdGVn b3J5Wy9QcmludF0vRXZlbnQvUHJpbnQvT0NHc1s0MCAwIFJdPj48PC9DYXRlZ29yeVsvRXhwb3J0 XS9FdmVudC9FeHBvcnQvT0NHc1s0MCAwIFJdPj5dL09OWzM5IDAgUiA0MCAwIFJdL09yZGVyW10v UkJHcm91cHNbXT4+L09DR3NbMzkgMCBSIDQwIDAgUl0+Pi9QYWdlcyAxNSAwIFIvVHlwZS9DYXRh bG9nPj4NZW5kb2JqDTE5IDAgb2JqDTw8L0NvbnRlbnRzWzIxIDAgUiAyMiAwIFIgMjMgMCBSIDI0 IDAgUiAyNSAwIFIgMjYgMCBSIDI3IDAgUiAyOSAwIFJdL0Nyb3BCb3hbMCAwIDU5NSA4NDJdL01l ZGlhQm94WzAgMCA1OTUgODQyXS9QYXJlbnQgMTUgMCBSL1Jlc291cmNlczw8L0V4dEdTdGF0ZTw8 L0dTMCA0MSAwIFI+Pi9Gb250PDwvQzJfMCA0NiAwIFIvVDFfMCA0OCAwIFIvVDFfMSA1MCAwIFIv VDFfMiA1MSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dF0vWE9iamVjdDw8L0ZtMCAzNyAwIFIvRm0x IDI4IDAgUj4+Pj4vUm90YXRlIDAvVHlwZS9QYWdlPj4NZW5kb2JqDTIwIDAgb2JqDTw8L0ZpbHRl ci9GbGF0ZURlY29kZS9GaXJzdCAxNTcvTGVuZ3RoIDU5MDMvTiAxOS9UeXBlL09ialN0bT4+c3Ry ZWFtDQpo3sybW4+cN3KG/0pf2hdO83wAFgYs+Yggu4HlXQf40BdjqS0PVppRZkaJ/e/zPkWyp2ck WXaQixjWRzaLhyJZVazTxL5zu+R2PvZd8rtQ6y6FXfRqjLtYwi6lXS55l/LOJ+fVqVAJ6lZV8T7u UlMl+rJLnUrtu6z5Uupxl70qufhdDqoUzZojFY3NiUpVH2augJi5xrLLzFzV4S9/2f/14vXxkycX z//58ub67dWLT/c//PbmuP/b02/2f7+9eHlUj69+fXN9c3eqPLu7uFOHv37++f7f1eGrV8fXxyvA z97+dMfYJ98Aurm0RivPhvzj8vjfaqa4b+W/hcqParx5fXHzz/8DTL7+32Ly9Iud/xc3EPjq17tv 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 Y+TSCD4nNd3RALtOp99p21/owfWf9BD7a37ba4D+ox5y/6Bzf47e84flowL5Tcfyl/LJboE98uOG h93yh3u2UkC3lezt9Krj/Rj1sC+bNXWzOY2WrsCBTm3VdNXRp9OH7uV0uiyQ6ICLtpS7Em0hI6zi UnweiWvU/kmBrY2jJ6NfaHyOBkhcVqroswpYNPvM+hSRLqtw9IcThFP/CjAAWtc7AA0KZW5kc3Ry ZWFtDWVuZG9iag0yOCAwIG9iag08PC9CQm94WzAuMCAwLjAgNDk4LjI0IDI5Ni42NF0vR3JvdXAg NTQgMCBSL0xhc3RNb2RpZmllZChEOjIwMTQxMTIxMTQxMjIyKzAxJzAwJykvTGVuZ3RoIDQ3L01h dHJpeFsxLjAgMC4wIDAuMCAxLjAgMC4wIDAuMF0vT0MgNTUgMCBSL1BpZWNlSW5mbzw8L0FEQkVf Q29tcG91bmRUeXBlPDwvRG9jU2V0dGluZ3MgMzAgMCBSL0xhc3RNb2RpZmllZChEOjIwMTQxMTIx MTQxMjIyKzAxJzAwJykvUHJpdmF0ZS9XYXRlcm1hcms+Pj4+L1Jlc291cmNlczw8L0NvbG9yU3Bh Y2U8PC9DUzAgNTYgMCBSPj4vUHJvY1NldFsvUERGL0ltYWdlQ10vWE9iamVjdDw8L0ltMCAzMyAw IFI+Pj4+L1N1YnR5cGUvRm9ybS9UeXBlL1hPYmplY3Q+PnN0cmVhbQ0KcQo0OTguMjQwMDA1NSAw IDAgMjk2LjYzOTk5OTQgMCAwIGNtCi9JbTAgRG8KUQoNCmVuZHN0cmVhbQ1lbmRvYmoNMjkgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyNDI5Pj5zdHJlYW0NCkiJrFdZcxzHDX7f X9GPMyrvsO8j5XJKd+SK7Mjc2JUSU67VcsVQ4SHzcGL9+gDoa4ZHuD2UVV42evABDaAbx95K/MqZ ZauPi2AH4dmSD0Ky1eGiY/3q0+LlavHbArZECMEIxvHfhNqcwmdnNDtaKOkMUza4wTpmVWCCO3ax XXxcvGsQouAQykmJQoxRzBQZz1YLDhx7cGQRj8wHkKFJhGAqqCGY4JnWfhC4WJ0u3nev+6XsLvrQ Dbhg+PO8l915vwzdVb903TFufVn3S91t8Oe4F747UFYhx1kvBIBgZwVsIUrb7x39z/p/rr5foG7O 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 nq62r26ovqTz0nXpJmvCajbVzOiT9TtrodoltUcMPPxn6oLR3bjSOFUXWTdS97w+t/5QA7tB23Ch 0bNxTeO9poSm3zWjzYrmky2OLe0tU8tilu1ohVpLWk+2Obd1tk0vT1y+q53aXtH+lw6/jv6O71fk rTjWade5vPPuysSVe7vMuvRdN1aFr9q+Gl2tWT2xJmDNljWvu5XdX/T49Qz2/NCr6P1irWjt0Nof 15Wum+gL7tu2nrheu/76hqgNu/rZ/U39dzembjw8gA10D3y/qWjTucHAwe2bqZuNmyeH/g2lAVr+ TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRW pMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqx YLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6E vv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr7 24DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDq W+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH +lf65/t3/Af8mP0p/br+S/7c/23//wIMAAOY8/wNCmVuZHN0cmVhbQ1lbmRvYmoNMzIgMCBvYmoN PDwvTGVuZ3RoIDI5NzQvU3VidHlwZS9YTUwvVHlwZS9NZXRhZGF0YT4+c3RyZWFtDQo8P3hwYWNr ZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRh IHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjIuMS1j MDQxIDUyLjM0Mjk5NiwgMjAwOC8wNS8wNy0yMDo0ODowMCAgICAgICAgIj4KICAgPHJkZjpSREYg eG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4K ICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9 Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5p bWFnZS9qcGVnPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRm OkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9u cy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAwOS0wOC0x MFQxMzoyNjo1MCswMjowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFE YXRlPjIwMDktMDgtMTBUMTM6MjY6NTArMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAg IDx4bXA6TW9kaWZ5RGF0ZT4yMDE0LTA2LTE4VDE2OjMxOjM2KzAyOjAwPC94bXA6TW9kaWZ5RGF0 ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5HSU1QIDIuNC4wLXJjMjwveG1wOkNyZWF0b3JU b29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6 YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFw LzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh cC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIj4KICAgICAgICAgPHhtcE1NOkluc3RhbmNlSUQ+dXVp ZDo0OEI1MkI1M0EwODVERTExOUQ3NkFFREIwMTkwMDE4RTwveG1wTU06SW5zdGFuY2VJRD4KICAg ICAgICAgPHhtcE1NOkRvY3VtZW50SUQgcmRmOnJlc291cmNlPSJ1dWlkOjQ3QjUyQjUzQTA4NURF MTE5RDc2QUVEQjAxOTAwMThFIi8+CiAgICAgICAgIDx4bXBNTTpEZXJpdmVkRnJvbSByZGY6cGFy c2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgIDxzdFJlZjppbnN0YW5jZUlEPnV1aWQ6NzA2 RkE5MDE5RDg1REUxMTlENzZBRURCMDE5MDAxOEU8L3N0UmVmOmluc3RhbmNlSUQ+CiAgICAgICAg ICAgIDxzdFJlZjpkb2N1bWVudElEPnV1aWQ6Q0E2MUE2RUU5Qjg1REUxMTlENzZBRURCMDE5MDAx OEU8L3N0UmVmOmRvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAg IDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgog ICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAg ICAgICAgIDx0aWZmOk5hdGl2ZURpZ2VzdD4yNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0 LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIs MzA1LDMxNSwzMzQzMjtCNEQ1NDU2OUM4NzdBMkQ0M0M5NEU4QjEzRDQ0RTc2RTwvdGlmZjpOYXRp dmVEaWdlc3Q+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+ CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjMwMC8xPC90aWZmOlhSZXNvbHV0aW9uPgogICAg ICAgICA8dGlmZjpZUmVzb2x1dGlvbj4zMDAvMTwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAg PHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgPC9yZGY6 RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAg ICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAg PGV4aWY6TmF0aXZlRGlnZXN0PjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQw OTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1 LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3 Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkz LDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQx OTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3 LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwz MDs0NjEzRjMwOTUxNUMzNjBCNDE3RTM4MzE5NTkzQTI3MTwvZXhpZjpOYXRpdmVEaWdlc3Q+CiAg ICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhp ZjpQaXhlbFhEaW1lbnNpb24+MjY3OTwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxl eGlmOlBpeGVsWURpbWVuc2lvbj4xMjM4PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9y ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg ICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4w LyI+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+ CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9z aG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDxwaG90b3Nob3A6SGlzdG9yeS8+CiAgICAgIDwvcmRm OkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgo8P3hwYWNrZXQgZW5kPSJy Ij8+DQplbmRzdHJlYW0NZW5kb2JqDTMzIDAgb2JqDTw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xv clNwYWNlIDU3IDAgUi9GaWx0ZXIvRENURGVjb2RlL0hlaWdodCAxMjM2L0xlbmd0aCAyNjc3MjIv TWV0YWRhdGEgMzIgMCBSL05hbWUvWC9TdWJ0eXBlL0ltYWdlL1R5cGUvWE9iamVjdC9XaWR0aCAy MDc2Pj5zdHJlYW0NCv/Y/+AAEEpGSUYAAQEBASwBLAAA/+AAEEpGSUYAAQEBASwBLAAA/+EWiUV4 aWYAAE1NACoAAAAIAAcBEgADAAAAAQABAAABGgAFAAAAAQAAAGIBGwAFAAAAAQAAAGoBKAADAAAA AQACAAABMQACAAAADwAAAHIBMgACAAAAFAAAAIKHaQAEAAAAAQAAAJYAAADAAAABLAAAAAEAAAEs AAAAAUdJTVAgMi40LjAtcmMyAAAyMDE0OjA2OjE4IDE2OjMxOjM2AAADoAEAAwAAAAEAAQAAoAIA BAAAAAEAAAp3oAMABAAAAAEAAATWAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEOARsABQAA AAEAAAEWASgAAwAAAAEAAgAAAgEABAAAAAEAAAEeAgIABAAAAAEAABVjAAAAAAAAAGAAAAABAAAA YAAAAAH/2P/gABBKRklGAAEBAAABAAEAAP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQd Gh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAHQA xAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQD BQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJma 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 N32CQcsAAW/vBccDjAJ5pt1pkNzc3cx1Oc/ad2Q9k52EhRlcAYxsA+hP1oDmj/P+Rv3N3NIkaPp9 zEpmiy7tGQPnX0cn9K065618uJRBGwcvLEwCWjx8iTcck8YA4HoB3roaZUNW7O4UUUUGgUUUUAFF FFABRRRQAUUUUAFQXryxWFxJbrumWJmjXGcsAcDH1qeigDmrK/106lbxyWxktZIOZJFZcS7m4J2A j5R1K44A7glqahrsjorQPHm5CMRA3EZUb8fLj5WJAJIDAZG7GD09FAHNRXWtiKBn83fJCSwkhA2t JJiIHA+8qnL4OBt/2s0JqesG9RUgme3NwwLPash2ZQc5xgYMrAjOdqjrwelooAw9M1DVbq8s1ns3 S1e0Z5ZWiKHzgyjG1jlRjOARz+HO5RRQAVk6vf3ljcW32eB5YWDeZ5ds0zZ3IABhgF4LHJ9Pz1qK AOetdZ1aXS7qe50i4t5lZmhHlb8oQCgKB9xbnB9wScdKhfWddjQt9hVyJ7RCqWsv3HkCysDnnahL dOMYNdPRQBzX9sa1I80ZsBbyxS7irR+b+5OwA4VvmPzOeP8AnmRimXGu6zDaeYmmvJMrRF41tZeF MRZgv95tw2jkAbhn1rqKKAMrQ77UL6KdtQsxbMkm1AFYblwP73fORxx6E1q0UUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAf/9n/4QolaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49 J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pgo8eDp4bXBtZXRhIHhtbG5zOng9 J2Fkb2JlOm5zOm1ldGEvJz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8x OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOmRjPSdo dHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyc+CiAgPGRjOmZvcm1hdD5pbWFnZS9qcGVn PC9kYzpmb3JtYXQ+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5z OnhtcD0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyc+CiAgPHhtcDpDcmVhdG9yVG9vbD5B ZG9iZSBQaG90b3Nob3AgQ1MyIFdpbmRvd3M8L3htcDpDcmVhdG9yVG9vbD4KICA8eG1wOkNyZWF0 ZURhdGU+MjAwOS0wOC0xMFQxMzoyNjo1MCswMjowMDwveG1wOkNyZWF0ZURhdGU+CiAgPHhtcDpN b2RpZnlEYXRlPjIwMDktMDgtMTBUMTM6MjY6NTArMDI6MDA8L3htcDpNb2RpZnlEYXRlPgogIDx4 bXA6TWV0YWRhdGFEYXRlPjIwMDktMDgtMTBUMTM6MjY6NTArMDI6MDA8L3htcDpNZXRhZGF0YURh dGU+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHhtbG5zOnhtcE1NPSdo dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vJz4KICA8eG1wTU06RG9jdW1lbnRJRCByZGY6 cmVzb3VyY2U9J3V1aWQ6NDdCNTJCNTNBMDg1REUxMTlENzZBRURCMDE5MDAxOEUnIC8+CiAgPHht cE1NOkluc3RhbmNlSUQ+dXVpZDo0OEI1MkI1M0EwODVERTExOUQ3NkFFREIwMTkwMDE4RTwveG1w TU06SW5zdGFuY2VJRD4KICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0nUmVzb3Vy Y2UnCiAgIHhtbG5zOnN0UmVmPSdodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz b3VyY2VSZWYjJz4KICAgPHN0UmVmOmluc3RhbmNlSUQ+dXVpZDo3MDZGQTkwMTlEODVERTExOUQ3 NkFFREIwMTkwMDE4RTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgPHN0UmVmOmRvY3VtZW50SUQ+dXVp ZDpDQTYxQTZFRTlCODVERTExOUQ3NkFFREIwMTkwMDE4RTwvc3RSZWY6ZG9jdW1lbnRJRD4KICA8 L3htcE1NOkRlcml2ZWRGcm9tPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlv biB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRpZmY6T3Jp ZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICA8dGlmZjpYUmVzb2x1dGlvbj4zMDAwMDAw LzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogIDx0aWZmOllSZXNvbHV0aW9uPjMwMDAwMDAvMTAw MDA8L3RpZmY6WVJlc29sdXRpb24+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNv bHV0aW9uVW5pdD4KICA8dGlmZjpOYXRpdmVEaWdlc3Q+MjU2LDI1NywyNTgsMjU5LDI2MiwyNzQs Mjc3LDI4NCw1MzAsNTMxLDI4MiwyODMsMjk2LDMwMSwzMTgsMzE5LDUyOSw1MzIsMzA2LDI3MCwy NzEsMjcyLDMwNSwzMTUsMzM0MzI7QjRENTQ1NjlDODc3QTJENDNDOTRFOEIxM0Q0NEU3NkU8L3Rp ZmY6TmF0aXZlRGlnZXN0PgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiB4 bWxuczpleGlmPSdodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyc+CiAgPGV4aWY6UGl4ZWxY RGltZW5zaW9uPjI2Nzk8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogIDxleGlmOlBpeGVsWURpbWVu c2lvbj4xMjM4PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4 aWY6Q29sb3JTcGFjZT4KICA8ZXhpZjpOYXRpdmVEaWdlc3Q+MzY4NjQsNDA5NjAsNDA5NjEsMzcx MjEsMzcxMjIsNDA5NjIsNDA5NjMsMzc1MTAsNDA5NjQsMzY4NjcsMzY4NjgsMzM0MzQsMzM0Mzcs MzQ4NTAsMzQ4NTIsMzQ4NTUsMzQ4NTYsMzczNzcsMzczNzgsMzczNzksMzczODAsMzczODEsMzcz ODIsMzczODMsMzczODQsMzczODUsMzczODYsMzczOTYsNDE0ODMsNDE0ODQsNDE0ODYsNDE0ODcs NDE0ODgsNDE0OTIsNDE0OTMsNDE0OTUsNDE3MjgsNDE3MjksNDE3MzAsNDE5ODUsNDE5ODYsNDE5 ODcsNDE5ODgsNDE5ODksNDE5OTAsNDE5OTEsNDE5OTIsNDE5OTMsNDE5OTQsNDE5OTUsNDE5OTYs NDIwMTYsMCwyLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDIwLDIyLDIz LDI0LDI1LDI2LDI3LDI4LDMwOzQ2MTNGMzA5NTE1QzM2MEI0MTdFMzgzMTk1OTNBMjcxPC9leGlm Ok5hdGl2ZURpZ2VzdD4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24geG1s bnM6cGhvdG9zaG9wPSdodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvJz4KICA8cGhv dG9zaG9wOkNvbG9yTW9kZT4zPC9waG90b3Nob3A6Q29sb3JNb2RlPgogIDxwaG90b3Nob3A6SUND UHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgPHBob3Rv c2hvcDpIaXN0b3J5PjwvcGhvdG9zaG9wOkhpc3Rvcnk+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCjwv cmRmOlJERj4KPC94OnhtcG1ldGE+Cjw/eHBhY2tldCBlbmQ9J3InPz4K/9sAQwACAQECAQECAgIC AgICAgMFAwMDAwMGBAQDBQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sA QwECAgIDAwMGAwMGDAgHCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwM/8AAEQgE1AgcAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYH CAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHw JDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk 5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIB AgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX2 9/j5+v/aAAwDAQACEQMRAD8A/fyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACijOKM5oAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACivHf2+/2htU/ZK/Yo+K XxO0WxsdS1bwJ4ZvdbtLW93m2uJYImdUk2srbSRg4IOO4r8A/wDiNo+Pv/RKPg//AN8aj/8AJNAH 9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI2j4+/wDRKPg//wB8aj/8k0Af0vUV/ND/AMRtHx9/ 6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo/wDyTQB/S9RX80P/ABG0fH3/AKJR8H/++NR/+SaP +I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG0fH3/olHwf8A++NR/wDkmj/iNo+Pv/RKPg//AN8a j/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI2j4+/wDRKPg//wB8aj/8k0Af0vUV/ND/ AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo/wDyTQB/S9RX80P/ABG0fH3/AKJR8H/+ +NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG0fH3/olHwf8A++NR/wDkmj/iNo+Pv/RK Pg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI2j4+/wDRKPg//wB8aj/8k0Af 0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo/wDyTQB/S9RX80P/ABG0fH3/ AKJR8H/++NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG0fH3/olHwf8A++NR/wDkmj/i No+Pv/RKPg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI2j4+/wDRKPg//wB8 aj/8k0Af0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo/wDyTQB/S9RX80P/ ABG0fH3/AKJR8H/++NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG0fH3/olHwf8A++NR /wDkmj/iNo+Pv/RKPg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI2j4+/wDR KPg//wB8aj/8k0Af0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo/wDyTQB/ S9RX80P/ABG0fH3/AKJR8H/++NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG0fH3/olH wf8A++NR/wDkmj/iNo+Pv/RKPg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/AJJo/wCI 2j4+/wDRKPg//wB8aj/8k0Af0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj4P8A/fGo /wDyTQB/S9RX80P/ABG0fH3/AKJR8H/++NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0vUV/ND/xG 0fH3/olHwf8A++NR/wDkmj/iNo+Pv/RKPg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H/wDvjUf/ AJJo/wCI2j4+/wDRKPg//wB8aj/8k0Af0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmj/iNo+Pv/AESj 4P8A/fGo/wDyTQB/S9RX80P/ABG0fH3/AKJR8H/++NR/+SaP+I2j4+/9Eo+D/wD3xqP/AMk0Af0v UV/ND/xG0fH3/olHwf8A++NR/wDkmj/iNo+Pv/RKPg//AN8aj/8AJNAH9L1FfzQ/8RtHx9/6JR8H /wDvjUf/AJJo/wCI2j4+/wDRKPg//wB8aj/8k0Af0vUV/ND/AMRtHx9/6JR8H/8AvjUf/kmv0b/4 N6v+C5XxC/4LA+Mfihp3jfwj4M8MxeBLPTrm0bQxchrg3L3CsJPOlfgeSuMY6nOeKAP1DooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBp+U5pW4980mMrXKfGbxpcfDn4TeJ/EFpHFN c6JpVzfxRy52SPFC7qGxzglQDgg4700jGtWjSpyqT2im36I6zA9qMD2r8kP+H/fxM/6FHwb+Vz/8 do/4f+fEz/oUfBv5XP8A8drl+t0+5+YPxk4ZTs6r/wDAWfrfge1GB7V+SH/D/wA+Jn/Qo+Dfyuf/ AI7R/wAP/PiZ/wBCj4N/K5/+O0fW6fcX/EZeGf8An6//AAFn634HtRge1fkh/wAP/PiZ/wBCj4N/ K5/+O0f8P/PiZ/0KPg38rn/47R9bp9w/4jLwz/z9f/gLP1vwPajA9q/JD/h/58TP+hR8G/lc/wDx 2j/h/wCfEz/oUfBv5XP/AMdo+t0+4f8AEZeGf+fr/wDAWfrfge1GB7V+SH/D/wA+Jn/Qo+Dfyuf/ AI7R/wAP/PiZ/wBCj4N/K5/+O0fW6fcP+Iy8M/8AP1/+As/W/A9qMD2r8kP+H/nxM/6FHwb+Vz/8 do/4f+fEz/oUfBv5XP8A8do+t0+4f8Rl4Z/5+v8A8BZ+t+B7UYHtX5If8P8Az4mf9Cj4N/K5/wDj tH/D/wA+Jn/Qo+Dfyuf/AI7R9bp9w/4jLwz/AM/X/wCAs/W/A9qMD2r8kP8Ah/58TP8AoUfBv5XP /wAdo/4f+fEz/oUfBv5XP/x2j63T7h/xGXhn/n6//AWfrfge1GB7V+SH/D/z4mf9Cj4N/K5/+O0f 8P8Az4mf9Cj4N/K5/wDjtH1un3D/AIjLwz/z9f8A4Cz9b8D2owPavyQ/4f8AnxM/6FHwb+Vz/wDH aP8Ah/58TP8AoUfBv5XP/wAdo+t0+4f8Rl4Z/wCfr/8AAWfrfge1GB7V+SH/AA/8+Jn/AEKPg38r n/47R/w/8+Jn/Qo+Dfyuf/jtH1un3D/iMvDP/P1/+As/W/A9qMD2r8kP+H/nxM/6FHwb+Vz/APHa P+H/AJ8TP+hR8G/lc/8Ax2j63T7h/wARl4Z/5+v/AMBZ+t+B7UYHtX5If8P/AD4mf9Cj4N/K5/8A jtH/AA/8+Jn/AEKPg38rn/47R9bp9w/4jLwz/wA/X/4Cz9b8D2owPavyQ/4f+fEz/oUfBv5XP/x2 j/h/58TP+hR8G/lc/wDx2j63T7h/xGXhn/n6/wDwFn634HtRge1fkh/w/wDPiZ/0KPg38rn/AOO0 f8P/AD4mf9Cj4N/K5/8AjtH1un3D/iMvDP8Az9f/AICz9b8D2owPavyQ/wCH/nxM/wChR8G/lc// AB2j/h/58TP+hR8G/lc//HaPrdPuH/EZeGf+fr/8BZ+t+B7UYHtX5If8P/PiZ/0KPg38rn/47R/w /wDPiZ/0KPg38rn/AOO0fW6fcP8AiMvDP/P1/wDgLP1vwPajA9q/JD/h/wCfEz/oUfBv5XP/AMdo /wCH/nxM/wChR8G/lc//AB2j63T7h/xGXhn/AJ+v/wABZ+t+B7UYHtX5If8AD/z4mf8AQo+Dfyuf /jtH/D/z4mf9Cj4N/K5/+O0fW6fcP+Iy8M/8/X/4Cz9b8D2owPavyQ/4f+fEz/oUfBv5XP8A8do/ 4f8AnxM/6FHwb+Vz/wDHaPrdPuH/ABGXhn/n6/8AwFn634HtRge1fkh/w/8APiZ/0KPg38rn/wCO 0f8AD/z4mf8AQo+Dfyuf/jtH1un3D/iMvDP/AD9f/gLP1vwPajA9q/JD/h/58TP+hR8G/lc//HaP +H/nxM/6FHwb+Vz/APHaPrdPuH/EZeGf+fr/APAWfrfge1GB7V+SH/D/AM+Jn/Qo+Dfyuf8A47R/ w/8APiZ/0KPg38rn/wCO0fW6fcP+Iy8M/wDP1/8AgLP1vwPajA9q/JD/AIf+fEz/AKFHwb+Vz/8A HaP+H/nxM/6FHwb+Vz/8do+t0+4f8Rl4Z/5+v/wFn634HtRge1fkh/w/8+Jn/Qo+Dfyuf/jtH/D/ AM+Jn/Qo+Dfyuf8A47R9bp9w/wCIy8M/8/X/AOAs/W/A9qMD2r8kP+H/AJ8TP+hR8G/lc/8Ax2j/ AIf+fEz/AKFHwb+Vz/8AHaPrdPuH/EZeGf8An6//AAFn634HtRge1fkh/wAP/PiZ/wBCj4N/K5/+ O0f8P/PiZ/0KPg38rn/47R9bp9w/4jLwz/z9f/gLP1vwPajA9q/JD/h/58TP+hR8G/lc/wDx2j/h /wCfEz/oUfBv5XP/AMdo+t0+4f8AEZeGf+fr/wDAWfrfge1GB7V+SH/D/wA+Jn/Qo+Dfyuf/AI7R /wAP/PiZ/wBCj4N/K5/+O0fW6fcP+Iy8M/8AP1/+As/W/A9qMD0Ffkh/w/8APiZ/0KPg38rn/wCO 0f8AD/z4mD/mUfBv5XP/AMdo+t0+4/8AiMvDP/P1/wDgLP1ub5hg8Ck4x1r89f2Cv+Ctfjf9q39p vRvBOteH/Ddhp+pwXMjzWYm81DHC7gDc7LyVAOR06V+hYH6VtTnGa5on23D3EmCzrDPF4CTcE3HV NapJ9fUcOlFFFWe+FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF 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 AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHy/8A8Frf +USH7R3/AGT/AFb/ANJnr+V//giV/wAnsR/9gK9/9p1/VB/wWt/5RIftHf8AZP8AVv8A0mev5X/+ CJX/ACexH/2Ar3/2nTW4H7AUUUVuAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAfKv/BZn/kxXWv+wlY/+jhXpn/Bjr/yVP8AaI/7BOh/+jr6vM/+ CzP/ACYrrX/YSsf/AEcK9M/4Mdf+Sp/tEf8AYJ0P/wBHX1Yy3A/oeoooqQCiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAD1Fef8A7VX/ACbV8QP+xd1D/wBJpK9APUV5/wDtVf8AJtXxA/7F 3UP/AEmkqZHn5n/uVX/C/wAj8dP+CQf/ACkU+HP+9qH/AKbrqv3LHU1+Gn/BIP8A5SKfDn/e1D/0 3XVfuWOprmwX8N+v6I/JvAz/AJEVb/r7L8ohRRRXWftIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAg+8a8q/bj/5M2+Kn/Yo6r/6Ry16qPvGvKv24/wDk zb4qf9ijqv8A6Ry1J5mcf7hW/wAMvyPyc/4Ix/8AKQLwp/16X3/pLJX7cD7xr8R/+CMf/KQLwp/1 6X3/AKSyV+3A+8a5cF/C+f8Akflngd/yIan/AF8l+URaKKK7D9mCiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPl/8A4LW/8okP2jv+yf6t/wCk z1/K/wD8ESv+T2I/+wFe/wDtOv6oP+C1v/KJD9o7/sn+rf8ApM9fyv8A/BEr/k9iP/sBXv8A7Tpr cD9gKKKK3AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKAPlX/gsz/yYrrX/YSsf/Rwr0z/AIMdf+Sp/tEf9gnQ/wD0dfV5n/wWZ/5MV1r/ALCVj/6O Femf8GOv/JU/2iP+wTof/o6+rGW4H9D1FFFSAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFAAeorz/wDaq/5Nq+IH/Yu6h/6TSV6Aeorz/wDaq/5Nq+IH/Yu6h/6TSVMjz8z/ANyq/wCF/kfj p/wSD/5SKfDn/e1D/wBN11X7ljqa/DT/AIJB/wDKRT4c/wC9qH/puuq/csdTXNgv4b9f0R+S+Bn/ ACIq3/X2X5RCiiius/agooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigBB9415V+3H/yZt8VP+xR1X/0jlr1UfeNeVftx/wDJm3xU/wCxR1X/ANI5ak8zOP8A cK3+GX5H5Of8EY/+UgXhT/r0vv8A0lkr9uB941+I/wDwRj/5SBeFP+vS+/8ASWSv24H3jXLgv4Xz /wAj8s8Dv+RDU/6+S/KItFFFdh+zBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF 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 wPY+OvCfjXxLJ48t7y4s20JLZltxbNCriTzpY8E+euNuehzjjP21XwN/wWf/AOCFWg/8FjfEXw/v 9Z+IereBm8BW99bxJZaXHei8F00DEsXkTbt8gAAZzuPpQB8vf8Rsv7Pv/RLPjH/3503/AOSqP+I2 X9n3/olnxj/786b/APJVfnx/wXK/4N1PDn/BIn9kvw78SdG+J+ueNLjW/F1t4aaxvNHis0iSWyvb gyh1kYkg2oXbjBDk545+Ff8AgnJ+yjZ/ty/tu/Dn4S6hq9z4fs/HOqf2fLqNvAs8toPLd9yoxAbl AMEjr1oA/fH/AIjZf2ff+iWfGP8A786b/wDJVSWP/B63+ztJdot18MvjTDbn77xWmmSuBjspvFB/ Ej+lcH/xA9+Bf+jgPFn/AITNv/8AH6zvFP8AwY++HJdHkXRv2h9cttQHMb3vhGKeE+xVLpGGfUE4 64PSgD6W+GX/AAd//sfePZYE1W6+JfgoSsQ76z4aEqwgHGW+xy3BII5+UE47A8V+hH7OX7Vfw3/a 68AJ4o+GXjbw7440Jn2Nc6TeLP5D8/JKud8T8H5XCnHOMV/Lf/wUd/4NgP2g/wDgn/4E1LxpYnRf in4F0mI3F/qPh8Ol5psK5LSz2kg3hAACWiaQKDliACa+R/2Cf2+/iR/wTk+P2m/EL4ba5c6be2zo mo6eZD9i1y1DAtbXMecOjDOCRlDhlIYA0Af3G0V5H+w3+194Z/b0/ZQ8EfFnwkzpo/jLTxc/ZpHD S2E6sY57aQqcb4pkkjJHBK5HBFeuUAFFFFABRRRQAg+8a8q/bj/5M2+Kn/Yo6r/6Ry16qPvGvKv2 4/8Akzb4qf8AYo6r/wCkctSeZnH+4Vv8MvyPyc/4Ix/8pAvCn/Xpff8ApLJX7cD7xr8R/wDgjH/y kC8Kf9el9/6SyV+3A+8a5cF/C+f+R+WeB3/Ihqf9fJflEWiiiuw/ZgooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA 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 vpqvwT/4Mivj7Ne+E/jr8LriRxBY3mneKrFNxK7pkktbk4xgHEFoM5yfwr97KAPyB/4PVv8AlFl4 B/7Krp3/AKaNYr8Sf+DfT/lM1+z7/wBjJ/7bzV+23/B6t/yiy8A/9lV07/00axX4k/8ABvp/yma/ Z9/7GT/23moA/s0ooooAgnto7u3eORFljkBV0YblYHggg9vav4qv+Cy37Nuh/sh/8FQ/jV8P/DUM dr4f0bxC8+m2sShY7K3uo47uOBAAAFiWcRqMcBByep/s7+JvxJ0L4NeAtY8V+KtXsdB8N6BayX2p ajeSCK3s4I1LO7seAAB9T0GSQK/ig/4Kd/tYW/7cn7fnxV+KtnA9tpni/XJZ9OjkBEi2cYWC2LjA w5hijLDsSR2oA/fD/gy1+J9/4n/4J5/EPwxdSvNb+F/HEklluAxBFc2ds7RjvjzEkfkdZDyeg/ZC vyz/AODRb9mDUfgH/wAEpo/Emq2slrefFTxHdeI7cSYDmyVIrSA46gN9nkkXPUSg9CK/UygAoooo AKKKKAEH3jXlX7cf/Jm3xU/7FHVf/SOWvVR9415V+3H/AMmbfFT/ALFHVf8A0jlqTzM4/wBwrf4Z fkfk5/wRj/5SBeFP+vS+/wDSWSv24H3jX4j/APBGP/lIF4U/69L7/wBJZK/bgfeNcuC/hfP/ACPy zwO/5ENT/r5L8oi0UUV2H7MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAfL/8AwWt/5RIftHf9k/1b/wBJnr+V/wD4Ilf8nsR/9gK9/wDadf1Q f8Frf+USH7R3/ZP9W/8ASZ6/lf8A+CJX/J7Ef/YCvf8A2nTW4H7AUUUVuAUUUUAFFFFABRRRQAV9 ff8ABJr4JDxH491bxvexK1r4fT7FYlhkG5lX52B9UjOP+2wx0r5Fggkup0jjR5JJGCoiglnYngAd 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 hT8MfGA1D/hGfGWsfYNQ+wziC48vyZG+RyG2nKjnBoA/Vj/iOM8S/wDRueh/+FlL/wDIdc745/4P cfinqFlcjwz8EfAGk3DD/R31PVrvUUjO3GWWMQFhu5wCvHGc8191f8Qd/wCyD/1VT/wpI/8A4xXG /Fj/AIMv/wBm7xZprt4S8b/FfwlqHlbIzNe2epWu4Ene0TW6SEnIBAlUYA4BySAfil+2R/wVj/an /wCCw2u2/hPxFq+t+I9PkkE9r4M8I6XJHZO6ElXNtCGknZS3DSlyvGCK+v8A/gkp/wAGnvxQ/aH8 c6b4s/aH02++Gfw7sZ0nk0CZwuveIVGG8rarE2cTHhnkxLgMFQZEg+J/+CnX/BMf4n/8Ea/2oLPw 1r2qGeO8iOo+F/FWkNJax6pCp2s6YbfDNGSA8e4lSykFlZWP66/8Gs//AAXU8Z/tG/EVv2dvjN4j uvE2tvp0l54M1/UZvMv737OpeaxnkY755BCHmSRstthlDMcLQB+4Xhbwvp/gjwxp2i6PY22m6RpF tFZWNnbRiOG0giQJHEigYVVVQoA4AAFalFFABRRRQAUUUUAIPvGvKv24/wDkzb4qf9ijqv8A6Ry1 6qPvGvKv24/+TNvip/2KOq/+kctSeZnH+4Vv8MvyPyc/4Ix/8pAvCn/Xpff+kslftwPvGvxH/wCC Mf8AykC8Kf8AXpff+kslftwPvGuXBfwvn/kflngd/wAiGp/18l+URaKKK7D9mCiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPl//gtb/wAokP2j v+yf6t/6TPX8r/8AwRK/5PYj/wCwFe/+06/qg/4LW/8AKJD9o7/sn+rf+kz1/K//AMESv+T2I/8A sBXv/tOmtwP2AooorcAooooAKKKKACiiigD3/wD4JxfBP/hbn7RNnfXUPmaT4UX+07jI+V5QcQIf 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 V+nv/Bxt/wAHG2jftX+DdT+AvwF1O6n8DXE3leKfFMe6FfECowItLUHDfZdy5eQ4EoAVQYyS/wCZ /wDwTO/4J3+NP+Cm37V2gfDTwhbTRQXMi3Ou6v5Za30HTlYedcyHpkD5UUkb5Ci5GSQAfvj/AMGa f7Jt18IP2B/F/wATtRtfs918WdfAsWMZDTafp6vDG+SBwbiW8AAyMKDnJIH7DVx3wM+Cnh79m/4N eFvAPhOyXT/DfhDTYNK063GMrDEgRSxAALNjcxwMsSeprsaAPyB/4PVv+UWXgH/squnf+mjWK/En /g30/wCUzX7Pv/Yyf+281ftt/wAHq3/KLLwD/wBlV07/ANNGsV+JP/Bvp/yma/Z9/wCxk/8Abeag D+zSiiigD8vv+Ds39jn/AIaU/wCCWOpeLrGyNz4g+D2pw+JIGjC+YbJz9nvUyf4BHIkzAEE/ZV64 wf5nf2G/2k739j39sH4afE+wmkik8E+IrPU5gi7jNbJKPtEWO4khMiHGDhjgg4Nf2/fFj4X6R8av hb4k8HeILZL3QvFml3Oj6jbuoZZ7e4iaKRSCMHKMRyDX8Mf7SnwI1b9l39oPxt8OdeV11jwPrl3o l0zRGMTNbzNH5iqc/K4UOpyQVYEEggkA/uw8NeIrHxh4d0/VtNuY73TdUto7y0uIzlJ4pFDo6n0Z WBHsa0a/P7/g2e/a6X9rb/gkd8PftV09zr3w58zwXqm+bzHU2m37MSTzzaSW3XvuHQV+gNABRRRQ AUUUUAIPvGvKv24/+TNvip/2KOq/+kcteqj7xryr9uP/AJM2+Kn/AGKOq/8ApHLUnmZx/uFb/DL8 j8nP+CMf/KQLwp/16X3/AKSyV+3A+8a/Ef8A4Ix/8pAvCn/Xpff+kslftwPvGuXBfwvn/kflngd/ yIan/XyX5RFooorsP2YKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo 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 JH3ThIz/AM9BX9Nn/BNf/gmP8Mf+CW3wFi8EfDrTpGnuitxreuXYVtR1+5C482ZwAAoyQka4RATg ZLMfo2igAr8Kf+DxP9rr4r/sxePvgLD8Nvid8Qfh7DrOn609/H4Z8R3mkretHJZBDKLeRBIVDsFL ZxubGMmv3WrM1nwtpfiNozqGn2N80IIQ3FukpQHrjcDjOO1AH8Nfxp/ba+M/7SfhSDQ/iN8Xfif4 +0S1ulv7fT/Eniq+1W1huFR0WZYp5XQSBJJFDgAgO4zgkHiPh78RPEHwk8Zaf4j8K67rPhnxFpMv nWOqaTeyWV7ZSYI3xTRsro2CRlSDgn1r+8L/AIVl4b/6F7Qv/AGL/wCJo/4Vl4b/AOhe0L/wBi/+ JoA/if8A+HsP7U3/AEct+0B/4cLV/wD5Ir+1/wCHl3JfeA9DnmkeaabT7d5JHbczsY1JJPUknnJ6 0v8AwrLw3/0L2hf+AMX/AMTWyiBECqAABgAdAKAH1/Ld/wAHhH7IC/An/gpDpfxIsLRYdH+Muhpe yuuQralYhLW5AHQZhNk5IPLSsSMnJ/qRrN1jw3p3iFYxf2NlfiMkoLiBZQh743A46dqAP4Yvgj+2 R8Xf2aNIvbD4cfFX4j/D+w1KYXN5beGvEt7pMN3KBtDyJBIiswXgEgnHHSv6L/8Ag0B/aX+I37TP 7L/xb1H4j+P/ABv8Qb/TfFVvb2dz4l1y61aa1iNorFI3uHdlUtyQCATzjNfrJ/wrLw3/ANC9oX/g DF/8TV3SPDmn+HYXTT7GzsUkO51t4VjDH1IUDNAF+iiigAooooAQfeNeVftx/wDJm3xU/wCxR1X/ ANI5a9VH3jXlX7cf/Jm3xU/7FHVf/SOWpPMzj/cK3+GX5H5Of8EY/wDlIF4U/wCvS+/9JZK/bgfe NfiP/wAEY/8AlIF4U/69L7/0lkr9uB941y4L+F8/8j8s8Dv+RDU/6+S/KItFFFdh+zBRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHy/wD8Frf+ USH7R3/ZP9W/9Jnr+V//AIIlf8nsR/8AYCvf/adf1Qf8Frf+USH7R3/ZP9W/9Jnr+V//AIIlf8ns R/8AYCvf/adNbgfsBRRRW4BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQB8q/8Fmf+TFda/wCwlY/+jhXpn/Bjr/yVP9oj/sE6H/6Ovq8z/wCCzP8A yYrrX/YSsf8A0cK9M/4Mdf8Akqf7RH/YJ0P/ANHX1Yy3A/oeoooqQCiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAD1Fef/tVf8m1fED/ALF3UP8A0mkr0A9RXn/7VX/JtXxA/wCxd1D/ANJp KmR5+Z/7lV/wv8j8dP8AgkH/AMpFPhz/AL2of+m66r9yx1Nfhp/wSD/5SKfDn/e1D/03XVfuWOpr mwX8N+v6I/JfAz/kRVv+vsvyiFFFFdZ+1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFACD7xryr9uP/AJM2+Kn/AGKOq/8ApHLXqo+8a8q/bj/5M2+Kn/Yo 6r/6Ry1J5mcf7hW/wy/I/Jz/AIIx/wDKQLwp/wBel9/6SyV+3A+8a/Ef/gjH/wApAvCn/Xpff+ks lftwPvGuXBfwvn/kflngd/yIan/XyX5RFooorsP2YKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+X/APgtb/yiQ/aO/wCyf6t/6TPX8r//AARK /wCT2I/+wFe/+06/qg/4LW/8okP2jv8Asn+rf+kz1/K//wAESv8Ak9iP/sBXv/tOmtwP2AooorcA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+Vf +CzP/Jiutf8AYSsf/Rwr0z/gx1/5Kn+0R/2CdD/9HX1eZ/8ABZn/AJMV1r/sJWP/AKOFemf8GOv/ ACVP9oj/ALBOh/8Ao6+rGW4H9D1FFFSAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAAe orz/APaq/wCTaviB/wBi7qH/AKTSV6Aeorz/APaq/wCTaviB/wBi7qH/AKTSVMjz8z/3Kr/hf5H4 6f8ABIP/AJSKfDn/AHtQ/wDTddV+5Y6mvw0/4JB/8pFPhz/vah/6brqv3LHU1zYL+G/X9EfkvgZ/ yIq3/X2X5RCiiius/agooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigBB9415V+3H/wAmbfFT/sUdV/8ASOWvVR9415V+3H/yZt8VP+xR1X/0jlqTzM4/3Ct/ hl+R+Tn/AARj/wCUgXhT/r0vv/SWSv24H3jX4j/8EY/+UgXhT/r0vv8A0lkr9uB941y4L+F8/wDI /LPA7/kQ1P8Ar5L8oi0UUV2H7MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAfL/wDwWt/5RIftHf8AZP8AVv8A0mev5X/+CJX/ACexH/2Ar3/2 nX9UH/Ba3/lEh+0d/wBk/wBW/wDSZ6/lf/4Ilf8AJ7Ef/YCvf/adNbgfsBRRRW4BRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB8q/8Fmf+TFda/7C Vj/6OFemf8GOv/JU/wBoj/sE6H/6Ovq8z/4LM/8AJiutf9hKx/8ARwr0z/gx1/5Kn+0R/wBgnQ// AEdfVjLcD+h6iiipAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAPUV5/wDtVf8AJtXx A/7F3UP/AEmkr0A9RXn/AO1V/wAm1fED/sXdQ/8ASaSpkefmf+5Vf8L/ACPx0/4JB/8AKRT4c/72 of8Apuuq/csdTX4af8Eg/wDlIp8Of97UP/TddV+5Y6mubBfw36/oj8l8DP8AkRVv+vsvyiFFFFdZ +1BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACD7xry r9uP/kzb4qf9ijqv/pHLXqo+8a8q/bj/AOTNvip/2KOq/wDpHLUnmZx/uFb/AAy/I/Jz/gjH/wAp AvCn/Xpff+kslftwPvGvxH/4Ix/8pAvCn/Xpff8ApLJX7cD7xrlwX8L5/wCR+WeB3/Ihqf8AXyX5 RFooorsP2YKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikZgvWgBaKaJlJ60GVRQA6i m+ctG8GgB1FNMyjuKQzqD1p2FcfRTBOp70olDHrRYdx1FNMqrQZlBxSAdRTfNXON3NJ5y5x6c0AP ooBzRQAUUUUAFFFGaACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo 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 BOSxA6sT1P09K8pz+WOK/SMky76phVSqW5rtvrqfnmc5h9axLq072tZen9XAtuP+eaKKK9mJ4wUK pZuMZ6AnsaKu+HPD174t8Q2OkadC1xqGqTpa28SjJkkcgKB9f5ZqJzSjqXCLckkfd3j7/ghV4iPw R0fxH4J8SQ69rs1lHc3Wnz7UjuCyhv3Mg9jgbs5x1r4c8e+ANa+Fvii40fxDpN9oup27bZLW8jMb j3Geo9xkGv6Gf2a/hlN8H/gL4T8L3FxJdz6PpkFrLK5JZ2VAD+Gc1i/tJ/st/D39pHwnNZ+NtG06 5jGRHeybYbi1bGNyS8Efnz34r89wXFlWlWdOv70bvVaPf8T77F8K0qlJToe7Ky0eq/4B/PRu/wA4 o756HscdPeu9/ae+HWhfCX49+KPDnhrVDrWiaTfPBbXZYP5gB/vDhsdMjriuCr9BpTVSCmtmrnwV Wm6c3CW6dvuNTwZ4z1b4e+JrXWND1G60vVLFxLBc2zmOSMjkYIIr9Q/2AP8AgtNY+NmsfCfxYmg0 3VnYQ2+uquyC5J6CYdEbP8Q4Oe3f8qKAT7flXnZllFDGw5ai16Pqjvy3Na+DnzU3p1T2Z/TRY6jD qFtHPBIs8MqhkkQ7lcHkEEcYqwkgl5xX4p/8E+f+Cr/iT9lu8s/Dfiqa68QeBdwTa7brnTFJ5aIn 7yjrs6V+wnwo+LPh740eDLXxF4Z1O21bSb+MPFNDJux/ssP4WHcHkV+X5rk1bAz5Zax6Po/8mfpm V5tRxtPmhpLquq/4B1lFRxTrKW2/w9akryj1QooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA+X/wDgtb/yiQ/a O/7J/q3/AKTPX8r/APwRK/5PYj/7AV7/AO06/qg/4LW/8okP2jv+yf6t/wCkz1/K/wD8ESv+T2I/ +wFe/wDtOmtwP2AooorcAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPJv2s/wBjLwb+174JfTvENmlv qkEbLp+rwRj7XYOcEYb+JMgbkPBHTBwR+MP7S37NviT9lf4o3nhbxNaqlxF+8tbmPmC/hJIWWM9w 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 AIRm+tLbz/tv2XzfO+0W0+7H2SPbt24y+c5GPU/+Cfv7CnhH/gm9+y5ofwk8Daj4k1Xw54fnuri2 udduIZ752uLiSdw7wxRIQHkYDCDAxnJyT7dRQAUUUUAFFFFABRRRQAg+8a8q/bj/AOTNvip/2KOq /wDpHLXqo+8a8q/bj/5M2+Kn/Yo6r/6Ry1J5mcf7hW/wy/I/Jz/gjH/ykC8Kf9el9/6SyV+3A+8a /Ef/AIIx/wDKQLwp/wBel9/6SyV+3A+8a5cF/C+f+R+WeB3/ACIan/XyX5RFooorsP2YKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAEZcimlDT6KAGom2lC4paKACiiig AooooAMZoxiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigD5f/4LW/8AKJD9o7/sn+rf+kz1/K//AMESv+T2I/8AsBXv/tOv6oP+C1v/ACiQ/aO/7J/q 3/pM9fyv/wDBEr/k9iP/ALAV7/7TprcD9gKKKK3AKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigBysY2DKWBByCOoPqK7fw9+0t8Q/C8Ah0/xt4ot4V+7ENTlaMfRSxA/AVw1FAHpGqfte/FD VwfO8e+KE3AD9xfvB0OePLK4Pv36HiuD1nXL3xDqD3eoXl3f3Uv35riVpZH+rMST+JqnRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQB8q/8ABZn/AJMV1r/sJWP/AKOFemf8GOv/ACVP9oj/ALBOh/8Ao6+rzP8A4LM/ 8mK61/2ErH/0cK9M/wCDHX/kqf7RH/YJ0P8A9HX1Yy3A/oeoooqQCiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAD1Fef/tVf8m1fED/sXdQ/9JpK9APUV5/+1V/ybV8QP+xd1D/0mkqZHn5n /uVX/C/yPx0/4JB/8pFPhz/vah/6brqv3LHU1+Gn/BIP/lIp8Of97UP/AE3XVfuWOprmwX8N+v6I /JfAz/kRVv8Ar7L8ohRRRXWftQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAg+8a8q/bj/AOTNvip/2KOq/wDpHLXqo+8a8q/bj/5M2+Kn/Yo6r/6Ry1J5 mcf7hW/wy/I/Jz/gjH/ykC8Kf9el9/6SyV+3A+8a/Ef/AIIx/wDKQLwp/wBel9/6SyV+3A+8a5cF /C+f+R+WeB3/ACIan/XyX5RFooorsP2YKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooA+X/+C1v/ACiQ/aO/7J/q3/pM9fyv/wDBEr/k9iP/ALAV 7/7Tr+qD/gtb/wAokP2jv+yf6t/6TPX8r/8AwRK/5PYj/wCwFe/+06a3A/YCiiitwCiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD5V/4LM/8AJiut f9hKx/8ARwr0z/gx1/5Kn+0R/wBgnQ//AEdfV5n/AMFmf+TFda/7CVj/AOjhXpn/AAY6/wDJU/2i P+wTof8A6OvqxluB/Q9RRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAHqK8//aq/ 5Nq+IH/Yu6h/6TSV6Aeorz/9qr/k2r4gf9i7qH/pNJUyPPzP/cqv+F/kfjp/wSD/AOUinw5/3tQ/ 9N11X7ljqa/DT/gkH/ykU+HP+9qH/puuq/csdTXNgv4b9f0R+S+Bn/Iirf8AX2X5RCiiius/agoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBB9415V+3H/ AMmbfFT/ALFHVf8A0jlr1UfeNeVftx/8mbfFT/sUdV/9I5ak83OP9wrf4Zfkfk5/wRj/AOUgXhT/ AK9L7/0lkr9uB941+I//AARj/wCUgXhT/r0vv/SWSv24H3jXLgv4Xz/yPyvwO/5ENT/r5L8oi0UU V2H7MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAfL/APwWt/5RIftHf9k/1b/0mev5Kv8Agmf+0L4Y/Zj/AGl18UeLLm5tdJXS7m03wW7Tv5j7 No2rzj5TzX9av/Ba3/lEh+0d/wBk/wBW/wDSZ6/lJ/4JBf8ABNn/AIesfth2/wAJv+E0/wCEDE+k Xerf2r/ZH9qY8gIfL8nz4fvbuu/jHQ5oA+7f+HzfwJ/6DWuf+Ceb/Cj/AIfN/An/AKDWuf8Agnm/ wr2v/iBj/wCrof8AzG//AN9KP+IGP/q6H/zG/wD99KrmYHin/D5v4E/9BrXP/BPN/hR/w+b+BP8A 0Gtc/wDBPN/hXtf/ABAx/wDV0P8A5jf/AO+lH/EDH/1dD/5jf/76UczA8U/4fN/An/oNa5/4J5v8 KP8Ah838Cf8AoNa5/wCCeb/Cva/+IGP/AKuh/wDMb/8A30o/4gY/+rof/Mb/AP30o5mB4p/w+b+B P/Qa1z/wTzf4Uf8AD5v4E/8AQa1z/wAE83+Fe1/8QMf/AFdD/wCY3/8AvpR/xAx/9XQ/+Y3/APvp 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 6X3/AKSyV+3A+8a/Ef8A4Ix/8pAvCn/Xpff+kslftwPvGqwf8L5/5Hu+BrvkE3/08l+URaKKK7D9 mCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK APl//gtb/wAokP2jv+yf6t/6TPX89f8AwaAf8piLD/sT9X/lDX9Cn/Ba3/lEh+0d/wBk/wBW/wDS Z6/nr/4NAP8AlMRYf9ifq/8AKGgD+rSiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooA/Mn/g7l/wCUMnib/sZdG/8ASivhf/gx1/5Kn+0R/wBg nQ//AEdfV90f8Hcv/KGTxN/2Mujf+lFfC/8AwY6/8lT/AGiP+wTof/o6+oA/oeooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAPUV5/+1V/ybV8QP+xd1D/0mkr0A9RXn/7VX/JtXxA/ 7F3UP/SaSpkefmf+5Vf8L/I/HP8A4JCDP/BRT4c/72of+m66r9yggyeB+Vfht/wSD/5SKfDn/e1D /wBN11X7ljqa5sF/Dfr+iPyXwMX/AAhVv+vsvyiJsHoPyo2D0H5UtFdZ+02Qmweg/KjYPQflS0UB ZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qNg9B+VLRQFkJsHo Pyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5UtFAWQmweg/KjYP QflS0UBZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qNg9B+VLR QFkJsHoPyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5UtFAWQmw eg/KjYPQflS0UBZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qN g9B+VLRQFkJsHoPyo2D0H5UtFAWQmweg/KjYPQflS0UBZCbB6D8qNg9B+VLRQFkJsHoPyo2D0H5U tFAWQ0ICx4H5V5V+3Go/4Y3+KnA/5FHVf/SOWvVh9415V+3H/wAmbfFT/sUdV/8ASOWkebnCX1Ct /hl+R+Tn/BGP/lIF4U/69L7/ANJZK/bgfeNfiP8A8EY/+UgXhT/r0vv/AElkr9uB941yYL+F8/8A I/LPA7/kQ1P+vkvyiLRRRXYfswUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQB8v/wDBa3/lEh+0d/2T/Vv/AEmev56/+DQD/lMRYf8AYn6v/KGv 6FP+C1v/ACiQ/aO/7J/q3/pM9fz1/wDBoB/ymIsP+xP1f+UNAH9WlFFFABXkP7Qn7ePwW/ZK8RWO kfE34p+BvAWqapbm8tLXXdYhspbmEMUMiLIwJXcpGRxkYr16v5rv+D23/k9r4P8A/Yjyf+l89AH9 KNFFFAHkvj79ub4N/Cz426X8NfEfxO8E6F4/1ye2t9P8PXurww6leSXLiO3SOFm3sZHIVQByTgc1 61X85X/BZ3/lbV/Z4/7GXwB/6do6/o1oA+e7H/gqv+zVqvxFg8IW/wAdvhZL4puNSXR49KXxHa/a 3vGlEItxHvz5hkOzb1zx1r6Er+Lvxf8Asa+KP2i/iF+1n4+8JySyXvwS1+48QX9pCCJXsH1O5jnu EYHIaAqkhx/AJGyCoz/S3/wb9f8ABT1f+Cnn7BGj6xrF0snxH8Dsnh/xdGWy886IDDe+u24iAcnA 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 9el9/wCkslftwPvGvxH/AOCMf/KQLwp/16X3/pLJX7cD7xrlwX8L5/5H5Z4Hf8iGp/18l+URaKKK 7D9mCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKAPl//AILW/wDKJD9o7/sn+rf+kz1/PX/waAf8piLD/sT9X/lDX9Cn/Ba3/lEh+0d/2T/Vv/SZ 6/nr/wCDQD/lMRYf9ifq/wDKGgD+rSiiigAr+a7/AIPbf+T2vg//ANiPJ/6Xz1/SjX813/B7b/ye 18H/APsR5P8A0vnoA/pRooooA/nK/wCCzv8Aytq/s8f9jL4A/wDTtHX9Gtfzlf8ABZ3/AJW1f2eP +xl8Af8Ap2jr+jWgD8B/+DW3Q7PxP/wUu/bV03Uba3vtP1GS5trq3mQPFcRPqt2royngqykgg8EG vG/B+o6r/wAGxH/Be2fSbl7lPgL8T3VHkkBMTaJdSnypd3CmawnyGPJMaOAB5wNe3/8ABqT/AMpT f2y/+vuX/wBO91X3V/wcaf8ABL8f8FJP2BtVbQLA3fxL+Gqy+IPDHlJumvdqf6TYjkZ8+NflH/PW OLtmgD74sr6HVLKG6tZo7m1uUWWKWJw8cqMMqysOCCCCCDgiv57/APgxy/5KX+0Z/wBgzQf/AEbf 19Yf8Gn3/BUhv2wP2Q7j4O+K78TePfg5BFBaPLKWm1TRGwkEp3cloG/ctgnC+QerV8n/APBjl/yU v9oz/sGaD/6Nv6APuX/g7l/5QyeJv+xl0b/0oroP+DYrx3omi/8ABDn4IW93rGl2txH/AG9vimu4 43TOv6kRlScjgg/Q5rn/APg7l/5QyeJv+xl0b/0or87f+CRv/Brd8Of+CjP/AAT18AfGXXfid428 O6r4x/tHz9PsLK1kt7f7LqV3ZrtZwW+ZbdWOT1Y9sUAf0V/8LK8OMwUeINFJJwAL6LJP/fVbtfi1 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 RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAHy/8A8Frf+USH7R3/AGT/AFb/ANJnr+ev/g0A/wCUxFh/2J+r/wAo a/oU/wCC1v8AyiQ/aO/7J/q3/pM9fz1/8GgH/KYiw/7E/V/5Q0Af1aUUUUAFfzo/8Hufwz1Gz+P/ AMDvGBhmbSdR8PX+jCYITGk8FysxUt0DMtyCAcZCtjODj+i6vnX/AIKb/wDBN7wN/wAFSP2WtS+G njYS2bGUX+i6xboGudCv0VljuEB4YYdldCQHRmGQcMAD1r4FfGXQf2ifg54X8d+Fr2HUfDvi3TIN UsLiJw4kimQOASDjcM4YdQQQcEEV2Ffzn/CX9kT/AIKhf8ENb688NfCSxg+LPwye5lltLGwRNa0s lnDeYtpI0d5au27LrFhCxckuQHrrPiV+1n/wWD/bX0q48G6T8H3+FcOrIttdahpWjLoTxxsArEXd /cyNH0JLQsHGTtxkCgDzj9vPxrZ/tjf8Hd3wqsfAk0es/wDCF+MfDFnezQsXjZtKmS+vtuFP+qRJ lJGRmJjkDJH9Jdfl5/wQV/4N64v+CYurX/xQ+Jet2HjL4za9bNAslqpksvDkUnMyxSyDfNcSEkPM Qo25VRgsz/qHQB+CX/BqT/ylN/bL/wCvuX/073VfvbX4/wD/AAb1f8E5fjV+xz/wUB/ab8YfErwL e+FfDfjq4kfQr2a8tZl1AHUriYELFK7L+7dW+cDr65FfsBQB/N5/wVy+EfiL/g3/AP8AgtN4Q/ab +G2mSr8OPiJqEt/dWMMeLcyuQNW0w8bU85HM0WSMMxKgiE11H/Bjl/yUv9oz/sGaD/6Nv6/Yn/gq 3/wT/wBH/wCCmP7D3jL4Wal9nttVvoPtvh3UJVyNM1SEFraYnGQpbMb45McsgHJBr88P+DUX/gmV 8dP+CfHjn42XHxh8AXvgmDxPY6RBpbz39pci8aGS8MoHkSyY2iRDk4B3cZ5wAe1/8Hcv/KGTxN/2 Mujf+lFdv/wa5f8AKCj4F/8Acf8A/Ug1Orn/AAcdfsnfEP8AbV/4Ji674D+F/hm58WeLLvXdMu4t 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 T/DF7b3TP/CjSXMcUAzxyJCAPU8V8G/8E1f2fPiZ/wAHCf8AwVpX9rf4peHptD+DfgLULeXQrWUn 7PcNYyb7PTbcso89I5t01w+NhdpF48zaAD96v2Z/hf8A8KS/Zy+H/gswQwf8Ij4b07RPLhC+XH9m tY4dqhQF2jZgYAGOgAru6K/Pr9on/g5k/ZW/Zb+Ofir4deLte8XW3ifwbqMulalFb+HZ54kmjOGC uvDD3HWgD4W/4M7f+Tvf2v8A/r70/wD9LdTr97q/lz/4N4/+Cu/wV/4Jx/tA/tC+IfifquuWWmfE S4tJNFex0uW8aZY7m9kYuq8p8s8Z565I7Gv6FP8Agn//AMFEvhn/AMFNvg1qfjv4U32q6h4d0nWp dBuJL+weylF1HBBOwCPyV8u5iOehJI7GgD3cfeNeVftx/wDJm3xU/wCxR1X/ANI5a9VH3jXlX7cf /Jm3xU/7FHVf/SOWpPMzj/cK3+GX5H5Of8EY/wDlIF4U/wCvS+/9JZK/bgfeNfiP/wAEY/8AlIF4 U/69L7/0lkr9uB941y4L+F8/8j8s8Dv+RDU/6+S/KItFFFdh+zBRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHy/wD8Frf+USH7R3/ZP9W/9Jnr +ev/AINAP+UxFh/2J+r/AMoa/oU/4LW/8okP2jv+yf6t/wCkz1/PX/waAf8AKYiw/wCxP1f+UNAH 9WlFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQB+ZP/B3L/wAoZPE3/Yy6N/6UV8L/APBjr/yVP9oj/sE6H/6Ovq+6P+DuX/lDJ4m/7GXRv/Si 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 wO/5ENT/AK+S/KItFFFdh+zBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAHy/8A8Frf+USH7R3/AGT/AFb/ANJnr+ev/g0A/wCUxFh/2J+r/wAo a/oX/wCCzdjPqf8AwSf/AGh7e3hlubibwDqyRxRoXeQm2fAAHJPsK/jt+EGtfF39nrxiviLwDdfE jwPr6wvbrqfh+W90y8ET43oJoSrhTgZGcHAyKAP7r6K/ij/4eFftof8ARcP2n/8Awstd/wDj1H/D wr9tD/ouH7T/AP4WWu//AB6gD+1yiv4o/wDh4V+2h/0XD9p//wALLXf/AI9R/wAPCv20P+i4ftP/ APhZa7/8eoA/tcor+KP/AIeFftof9Fw/af8A/Cy13/49R/w8K/bQ/wCi4ftP/wDhZa7/APHqAP7X KK/ij/4eFftof9Fw/af/APCy13/49R/w8K/bQ/6Lh+0//wCFlrv/AMeoA/tcor+KP/h4V+2h/wBF w/af/wDCy13/AOPUf8PCv20P+i4ftP8A/hZa7/8AHqAP7XKK/ij/AOHhX7aH/RcP2n//AAstd/8A j1H/AA8K/bQ/6Lh+0/8A+Flrv/x6gD+1yiv4o/8Ah4V+2h/0XD9p/wD8LLXf/j1H/Dwr9tD/AKLh +0//AOFlrv8A8eoA/tcor+KP/h4V+2h/0XD9p/8A8LLXf/j1H/Dwr9tD/ouH7T//AIWWu/8Ax6gD +1yiv4o/+HhX7aH/AEXD9p//AMLLXf8A49R/w8K/bQ/6Lh+0/wD+Flrv/wAeoA/tcor+KP8A4eFf tof9Fw/af/8ACy13/wCPUf8ADwr9tD/ouH7T/wD4WWu//HqAP7XKK/ij/wCHhX7aH/RcP2n/APws td/+PUf8PCv20P8AouH7T/8A4WWu/wDx6gD+1yiv4o/+HhX7aH/RcP2n/wDwstd/+PUf8PCv20P+ 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 /Tf/AAev/wDGaP8AiIY1v/ol+m/+D1//AIzR9apdw/4i/wALf9BD/wDAZf5H6h7T/kUbT/kV+Xn/ ABEMa3/0S/Tf/B6//wAZo/4iGNb/AOiX6b/4PX/+M0fWqXcP+Iv8Lf8AQQ//AAGX+R+oe0/5FG0/ 5Ffl5/xEMa3/ANEv03/wev8A/GaP+IhjW/8Aol+m/wDg9f8A+M0fWqXcP+Iv8Lf9BD/8Bl/kfqGf lB968r/bjYD9jf4rY7+EdV/9I5a+D/8AiIW1of8ANL9O5/6jjf8AxmuY+NP/AAXL1P4x/CLxP4Tl +HNlYx+JtJutKa4XWnka3E0LxFwvkjJXfnGRnGMij61S3ucWZeLHDVXCVKdOu25RaXuy3aaXQ8z/ AOCMf/KQLwp/16X3/pLJX7cD7xr8R/8AgjH/AMpAvCn/AF6X3/pLJX7cDhjUYP8Ah/P/ACOPwOd8 hqP/AKeS/KItFFFdh+zBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQA04Bx2rH8b+ELTx54Q1TRNQV2sNXtJbK4CNtYxyoUYA9jhjzWvn86XGQTTM5wjOLjJXT0Z8e f8OP/gZ/z5eI/wDwbSf4Uf8ADj/4Gf8APl4j/wDBrJ/hX2JtPrRtPrWHsodkfLPgXIG7/VKf/gKP jv8A4cf/AAM/58vEf/g1k/wo/wCHH/wM/wCfLxH/AODWT/CvsTafWjafWj2MOyD/AFEyD/oEp/8A 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 iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKMYoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAor+XL9t3/ AIOEP24/Bf8AwUk+L3wt+HPxS1Ca00n4laz4V8MaFYeCtFv7p0j1Sa1tLSIGxeaeQgRxqCWdzjlm PN//AIeWf8Fkv+hc/aA/8MTa/wDypoA/p+or+YH/AIeWf8Fkv+hc/aA/8MTa/wDypr9P/wDg29/a W/bJ/aI/4XL/AMNbab8QNP8A7H/sT/hFP+En8CReF/M83+0Ptnk7LS38/Hl2u7O/ZlPu7/mAP0/o r84P+DoH9vX4sf8ABO39gXwh41+Dniv/AIQ/xPqnxAs9Eur3+zLPUPNs5NO1KZ4vLuopYxmS3hbc FDDZgHBIP44/BT/gtj/wVU/aU8K3Gu/DnVfih4/0S0u2sJ9Q8N/CLTdVtYbhUR2haWDTHRZAkkbF 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 ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igD+QL/naa/7uq/926v6/a/iy/bd8TeMvBf/AAXK+L2s/DmPUJviFpPx11m98MR2FgL+6fVI/EEz 2gityjieQziPbGUYOcLtbOD9n/8ADyz/AILJf9C5+0B/4Ym1/wDlTQB/T9RX8wP/AA8s/wCCyX/Q uftAf+GJtf8A5U1+n/8Awbe/tLftk/tEf8Ll/wCGttN+IGn/ANj/ANif8Ip/wk/gSLwv5nm/2h9s 8nZaW/n48u13Z37Mp93f8wBwH/B6t/yiy8A/9lV07/00axR/wZU/8osvH3/ZVdR/9NGj0f8AB6t/ yiy8A/8AZVdO/wDTRrFfL/8Awa/f8Fmf2bP+Cdv7Avi/wV8Y/iR/wh/ifVPiBea3a2X/AAj+qah5 tnJp2mwpL5lrbSxjMlvMu0sGGzJGCCQD+hbVdJtde0u5sb62t72yvImguLeeMSRTxsCGRlOQykEg gjBBr+OL/grp8JdM/wCCeP8AwXA+IGj/AAqhGjWfgjxZpuv+H7e0+RdNmmgtNRSGID7qxSzFFA6B AO1fux+0r/wd5/smfCbwHfXfgPVPE/xV8QrE32HTrDRLrS4JZcHaJp7yOLy484yyJIwB4Q9K/Jj/ AIJD/sQ/E/8A4Lrf8FXLz46ePNNkTwJY+Kh4r8X6t5DR2FxLHIs0OkW2fvk7YoyoYmOAFmbcUDgH 9WlFFfAH/EUd+wn/ANFz/wDLM8Q//INAH3/RXwB/xFHfsJ/9Fz/8szxD/wDINfb/AMJ/iloXxx+F nhrxr4Wvv7U8MeMNKtdb0i98mSD7XZ3MKTQS+XIqyJujdW2uqsM4IByKAP5uf+D0r9pS88eft4+A fhjDcu2jfD/wquoyQhsKL+/mcyEjv+4t7XBPTc3rz+63/BIn9k/SP2LP+CcHwj8CaVYw2dxb+HbT UdYdEAa71K5iWe7lc9STK7AZyQiovRRX8z//AAdQ6xLqf/Bcr4wwSMSmnW+hW8QPZToljJgf8Ckb 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 igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD+QL/naa/7uq/926v6/a/ji+LPxS0L4Hf8 HI/ibxr4pvv7L8M+D/2lbrW9XvfJkn+yWdt4oeaeXy41aR9saM21FZjjABOBX9D3/EUd+wn/ANFz /wDLM8Q//INAH3/RXwB/xFHfsJ/9Fz/8szxD/wDINfQH7DH/AAVH+BP/AAUo/wCEp/4Up45/4TT/ AIQv7J/bP/El1DTvsf2rz/I/4+4It+77PN9zdjZzjIyAfAH/AAerf8osvAP/AGVXTv8A00axXwf/ AMG9P/BvT8F/+Cs37F/if4jfEbxP8UNF1vRfGt14bgg8N6jY21q9vFY2Fwrss9nM5kL3UgJDgYC/ KCCT94f8Hq3/ACiy8A/9lV07/wBNGsUf8GVP/KLLx9/2VXUf/TRo9AH5jf8ABfv/AIN3Lr/glTa6 R8QPhnfeJvGPwdv/AC7K/u9XaGfUfD18ThRcNDFFG0Exx5cgjUB/3bclC/7A/wDBtT/wV+8Fft6f st6f8M5dM8N+Cfif8NNPSC90HSbOHT7HVLNSFXULS3jCoiliBLGgASRs4CyIK/Rb4q/Cvw78cPht rng/xbo9lr/hnxJZyafqenXab4buCRSrIw+h4IwQcEEEA1/J9/wU+/4J8/FT/g3b/wCCg/h7x38N dY1a38KSag+qeA/E4G4qo/1um3fG1pFRijqw2zxPux8zogB/XDX5A/8AEFT+yx/0P37QH/g80j/5 WV9k/wDBHb/grN4N/wCCtf7L1t4u0b7NpHjPRBHZ+LfDgl3SaRdlTh0z8zW0u1mifuAyk70cD61o A/IH/iCp/ZY/6H79oD/weaR/8rK/U79nr4KaV+zX8AvA/wAOdCuNQu9E8AeH7Dw3p89+6SXU1vZ2 0dvE8rIqI0hSNSxVFBJOFA4rsKKAP5Kf+DsvwLP4R/4LW+PNQljZI/FGi6LqcJI++i2EVoSP+BWr D8K/q6+GXi6D4gfDbw9r1rIstrremW1/C4OQ6SxLIpH1DCvw0/4PTv2DtU8U+H/h1+0ToVhLd2vh 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 LBOgPZZ39a/oq/4Kd/t4+Ev+CdX7GnjP4i+J9Ws7K7s9Ong0CyklCz6zqbRsLe2hT7zEybSxAOxA 7nCqTX88X/Bnv+y1q/xd/wCCpP8AwsaO1mHh/wCEmg3l3c3m0+ULu+gksoIM/wB945blx7QN7ZAP 2b/4ONv+CrOrf8Et/wBh+K78GSQxfEv4i3r6H4duJEWQaWqxl7m+2N8rtEhRVByPMmjJDKrKfhb/ AINYv+CT3h/9pjwprX7Wvxytv+FkeJfEWs3Nt4aj8RZ1GMtE2251Obzd3nTtNvjQvnZ5LtyzKU6j /g90+But+K/2dPgh8QbK3mn0TwXrep6TqTRqWFu2oRWzwyPjoubF03HjdIo6sM+w/wDBoJ+2P4V+ L3/BMyy+EkF/aw+M/hNqN+t3pruBcT2V5eS3kV2q9Wj8y4kiJH3WjGcblyAerftvf8Gw/wCyl+2P Y313p3gtfhR4ruQzR6v4N22MIk6gyWWDasueW2xo55+cdR+EPxo8A/tI/wDBrh+39ZweH/F4ns9S iTUrG6t/MGieNtOWQqYru1LYDqQyuhJeIsGjk+ZJD/XXX83H/B69+0h4W+Iv7Tvwg+HOj3tpfeIf h1pOo3mu+Q4c2bag9oYLeQj7sgS0Mm08hZ0P8QoA/fT9iL9qzRf24v2SvAHxZ0CB7TTfHWkRaiLV 33vZTHKT27MAAximWSMkDBKZ716nXyD/AMEEPgBrn7MX/BIH4GeEPElvPZ61DokuqXNtOpWW1+33 lxfrE6nlXRLlVKnkFSD0r6+oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/LD9oX/AINFP2bf2lPj 744+I2u+Nvjhaa34/wDEF/4k1CCw1jS47WG4vLmS4lSJX053WMPIwUM7EADLE81yH/EFT+yx/wBD 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 /wCIVtPA9vKbzRNbsgovtCu9pUTREjDKQdrxt8rr6MFZfwM8af8ABr5+3V+xD8S76/8AgN4tXXoJ iY4NY8IeMD4X1GaEfdE6TTQ7G6/Ks0ij+8a/p7ooA/mV+GX/AAa0ftrftu/E6y1P9ofx2PDdlAQl zqnibxS3ivWEiOCVgSOWVGPs88Y789D+/H/BPb/gnl8Nv+CZv7O1h8OPhppkttp0UhutR1C6YSX+ t3bKFe5uJAAGchQAAAqqoVQAMV7lRQBx/wAffgJ4R/ah+DfiH4f+PNEtPEfhLxTaNZalp9yDsmjJ BBBBDI6sFZXUhkZVZSCAa/BD9oX/AINM/wBoD9kL46f8LA/ZE+KwmSxlebTIbvVn0PxFpyn/AJYi 4QCC4UjIYsYQwOChGTX9D9FAH8+t38Cf+C3HxG0k+F9T8VXmi6VKvkNqMeueF7OZFIxu+02n+lgj +8Du79a9q/4JX/8ABpxYfBH4vWnxZ/aa8WWXxS8bW14NUg0G1eW50sXm7f8AaLy4nAlvX34bYURN wO7zQcV+0FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFAH//ZDQplbmRzdHJlYW0NZW5kb2JqDTM0IDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9M ZW5ndGggMjY4Pj5zdHJlYW0NCkiJZJDBSsQwEIZfJeS+3bQH6aHbRRcWBEHZ1QcY0yEG25mSpkV9 NQ8+kq/gZNuK4CnJP98/+We+P7+q/VvXqgnD4JnUTuk8M1ohWW48uSQ8PR43pVb7uroB++oCj9Sc MUYpD3+NpRjr6sxjsHj0LSqCDnf6MIaAFG87cKi3AliQ2gTtKMWNyfIiqSeOEFOjpWCSeN+D9fF9 1VIyUe/YzihT5H5BD9xyUGGG1PNyul/TdesddZJDjeSjyFq9cPAfa468NMkg48RVKvLsyphiASE1 uPgSs7zm1n2PEIAsSqLBBsSZY+qDp8tfQj3I+Ccgh7LbJjnVECHEyw2n1dI0C779v+v6R4ABALj+ h8wNCmVuZHN0cmVhbQ1lbmRvYmoNMzUgMCBvYmoNPDwvTGVuZ3RoIDMyMzYvU3VidHlwZS9YTUwv VHlwZS9NZXRhZGF0YT4+c3RyZWFtDQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl aGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4 OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA0LjIuMS1jMDQxIDUyLjM0Mjk5NiwgMjAwOC8wNS8wNy0y MDo0ODowMCAgICAgICAgIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9y Zy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6 YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x LjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRv d3M8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDktMTlU MDk6NTA6MDYrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+ MjAxNC0xMS0yMVQxMjowOTozMiswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6 TWV0YWRhdGFEYXRlPjIwMTQtMTEtMjFUMTI6MDk6MzIrMDE6MDA8L3htcDpNZXRhZGF0YURhdGU+ CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91 dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEu MS8iPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL2pwZWc8L2RjOmZvcm1hdD4KICAgICAgPC9y ZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAg ICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4w LyI+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+ CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91 dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4w L21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu MC9zVHlwZS9SZXNvdXJjZUV2ZW50IyI+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5p aWQ6QTE5MDM5ODhBQTcwRTQxMUE4NEE5MEYyNkU0NzdDM0M8L3htcE1NOkluc3RhbmNlSUQ+CiAg ICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnhtcC5kaWQ6QTA5MDM5ODhBQTcwRTQxMUE4NEE5MEYy NkU0NzdDM0M8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpPcmlnaW5hbERvY3Vt ZW50SUQ+eG1wLmRpZDpBMDkwMzk4OEFBNzBFNDExQTg0QTkwRjI2RTQ3N0MzQzwveG1wTU06T3Jp Z2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJk ZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgog ICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAg ICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpBMDkwMzk4OEFBNzBFNDEx QTg0QTkwRjI2RTQ3N0MzQzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0 RXZ0OndoZW4+MjAxNC0wOS0xOVQwOTo1MDowNiswMjowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAg ICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dz PC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAg ICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAg IDxzdEV2dDphY3Rpb24+Y29udmVydGVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAg IDxzdEV2dDpwYXJhbWV0ZXJzPmZyb20gaW1hZ2UvZ2lmIHRvIGltYWdlL2pwZWc8L3N0RXZ0OnBh cmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxp IHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlv bj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJ RD54bXAuaWlkOkExOTAzOTg4QUE3MEU0MTFBODRBOTBGMjZFNDc3QzNDPC9zdEV2dDppbnN0YW5j ZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTExLTIxVDEyOjA5OjMyKzAx OjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5B ZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3M8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAg ICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAg IDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06SGlzdG9y eT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFi b3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8x LjAvIj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAg ICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgog ICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+ CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAg ICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i IgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+ CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAg ICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjkwMjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAg ICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj40NzY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAg ICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0 IGVuZD0iciI/Pg0KZW5kc3RyZWFtDWVuZG9iag0zNiAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50 IDgvQ29sb3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWlnaHQgNDc2L0xlbmd0 aCAxNDk5OTYvTWV0YWRhdGEgMzUgMCBSL05hbWUvWC9TdWJ0eXBlL0ltYWdlL1R5cGUvWE9iamVj dC9XaWR0aCA5MDI+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/4Ra0RXhpZgAATU0AKgAA AAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIA AAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAABAAAApAAAANAACvyAAAAnEAAK/IAAACcQQWRvYmUg UGhvdG9zaG9wIENTNSBXaW5kb3dzADIwMTQ6MTE6MjEgMTI6MDk6MzIAAAAAA6ABAAMAAAAB//8A AKACAAQAAAABAAADhqADAAQAAAABAAAB3AAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEe ARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABV+AAAAAAAAAEgA AAABAAAASAAAAAH/2P/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJ DBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEN CwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwM/8AAEQgAVACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIE BQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIR AwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX 0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAIC AQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUG FqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYn N0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9VSSSSUpJJJJSkkkklKSSSSUpJJJJSlC22umt1trgytg lzjoAAsS/wCtmM17m0UPuaNG2EhrXH+T9J+z+VtVeijqX1hd6uVZ6GCx3tYwaOI52bvp7P8ATWfn /wA1UozlB0j6pMRzROkPXLw2+1r3fWjqH2l19W0YzSdtDm/SYP33/Tba9v8AmLrQZAPErPxugdKx 3Me2nfYwyH2EvMj87a47N39hXMnIqxaH5Fx211iXH+A/lO/NSxiUbM5X+xWOM4iRnK71/uoMnrHT cW70L8hrLNJbqYn/AEhaC2v+2rbXNc0OaQ5rhII1BB7hefF1l1znbXPutcXljQXOJcdx9rZc76S7 TouPdjdLopvG2xoJLedoc5z2s/sNdtTcWUzkRWi3FmlORFaN5JJJTM6kkkklP//Q9Dz/AKx9B6bk fZs/Poxr9od6drw120/RdDv6qfp/1h6H1O84/Ts6jKua02OrqeHODAWsL4b+buexeX/40f8AxWu/ 8K0/9Vcjf4p//FRf/wCEbP8Az9io1pbF7vr4K+rrf+PDT/5U2ckfzzexj/RrsPqz11vX+kV9TbQc YWPsZ6RcHkem91X0wG/S2LwYd/ifylex/wCLH/xIY/8AxuR/5+sSKMWSUiQXq0kkkGZSp9S6x0vp NbLepZVeIy12yt1rg3cY3Q1XF5j9d+hfXL6wdaffR0556fiA04YNtLS4TN2R6T7927Isb/I/QVUJ LZEgWBZe3xPrZ9W87JrxMPqNGRkXGK6q3bnEgF5hrf3WtWpbWLa31nQPaWkjnUQuG/xa/VLJ6d6/ V+qUOpzH7qMamwe6usH9NbyffkWN9v8AwFX/AA67xJUSSNRV9HiX9C6tVb6Ax3WRo2xhbscB+duc 5uz+2rvT+s5PSQMHqGO8Vtk16APA8Buhl1f8tj11KDl4mPmUmjIYHsOvmD+8x35rlCMPDrCRB8dm IYOHWEiD47ODk/Wx/qxiUA1D860kF3wY36Cpvv6h9YM1mPIqqb7wwatraNDa/wCj6tv5lf8A6tQs vofUca91bKX31z+jtYN0j83fH0H/AL66D6v9MtwMZ7sgBt97gXNBB2taIYwuH9tyYBknLhlfD+kx xGXJLhnYj+l0bmD0/FwKvTx2RMb3nVziPzrHqykkrAAAoaNoAAUNFJJJIpUkkkkp/9Gn/jR/8Vrv /CtP/VXI3+Kf/wAVF/8A4Rs/8/YqD/jR/wDFa7/wrT/1VyN/in/8VF//AIRs/wDP2Kj0a3+X+v7H jB3+J/KVqV/WbrdHSaekYmS7DxKHPefs5NdljrHutJtvafU2t37GV0+kz/S+ossd/ifylemf4ufq p0LM6I3qufi15uTfZawDIaLGMbW91IbXS/dX7tm/1NvqIlbjjIkgGngsTr/XsKwW4vUsqt4MwbXP aT/LpvNtNn9uteq/UX65f84sezHzGsq6nigGxrNG2VnRuRUx3ub7vZdX/g3/APGsXFf4xvqvg9Dz cbJ6cz0cXO3h2OPo12M2u/RT9Gu5j/5r/B+n7FzXTuo5PTb7L8Vxa+2i7GcQSPbcz093t/OqfsuZ /wAJWhuuE5Y5VI2Hsfrd/jIzsjJtwOg2/Z8SpxY/NZDrLSJa/wCzuduZVR+5az9Nb/OV2Vfn8cet dV9be7qWV63Zxybd/wD583KpEN2t0gQ3y8F3GH9e/q5h9KHSK/q+bMIt22NsfW51hj3W3nZ77n/S 9RJHEZEky4eyL6rf4x+p9Oya8frV7szpryGuus911Mn+e9VvvyKW/wCGZb6l2z+af7PRtP8A4xut dYxPrN6OF1DIxqDi1PFdNrmMkuul+1h2+7auHeKy9wrDhUXHY153ODJ9jbHD6b9n03LU6/echvSL nfSPSsdjj4mp+Tj7v7XpJdVcZMJC9q1SYv1w+s+KL9nUsix19fpB91jrfTG5r3WUMt3Vtuc1vpep t9jFf+o/U+qXfXDpzbs3Jubc+wWtsuseHgU3PAsa97mv97dyr/Uj6vYv1h62cTMe5mNRScixrDDn w5lbafU/wbP0n6R7f0n/AJ8Xp2D9RPqx07Ox8/AxXY+TjOLmPFtrgdzX1Oa9l9lrPo2JFdjjM1K9 AXy3q31i+sNfV8+uvqmYytmXe1jG3vAa1ttjWMaN30WtXd/4veuWN+quf1LrWbZbXi5VpfkZD3WF tba6HbGzuf8ASd7K2fnrzTrP/LXUv/DmT/5+sWh9tsq+ojcFhIbl9WsdbHDmU0UWbHf9fdTZ/wBb S6IjMicielt76wf4xOvdVve3Btf0zAmK66iG3OA4fkZLfex7v9FjuYyv+b33/wA4sAdX6w2z1G9Q yxYfzxkW7v8AO9RLpHTrOq9VxOm1u2Oy7RWbIna36dtm387ZUx7l7Ph/Uj6qYmMMZvTMe4AQ62+t ttjj+8+64PsS0CoieSzxU879TvrH1m/6ndZzcrIOTk9Nbccay0An2Y7chjbS3Z636T9/9J/wi4LM +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 T5N+n7H6MxP+bW/I9Ld/Nv8AtPq+ts2y31PU+0fo9+7bt/wv+jSx/wDm1r6e7d9lOzd6u/7P7932 fd+k/wBJ/Nfp185pJo6fza0dP5r+XZ+iR/zX+wOj1fsnqt3f0iPU2u2/2Nm7/gvU/wCERW/83vtb I9X7R6I2f0ifS9H/AN5/7fq/92F84pJDp/NdP5BA6fzXT+UX6Ip/5rbavs/q7/UHo7PX9Td7Z2f4 T0v9J/gUn/8ANf7G76fp+ufo+t6nrR7vS/P+h/o/0X/XF87pIdP8lsjp/kdn6P6d/wA3vt7PsPqf advtn1427e/q/o9u399FxP2D9gyfQ2/Y/d6+/dG2X7tvq+/0d/q+l6f6Pf6npL5rSTo/9T/S+X+X +Ovj/wBT/S+X+X+O/Qtn/NT0q/tHq+lsf6fq/aI9Pcd30vd6e7+b3/8AW1pdO/ZX26/7Pv8Atke/ 1vU3enPt9H1/+0+7/Q+xfNCSEPmH830+X5kQ+YfzXT5fm2/lwv8A/9n/7R3yUGhvdG9zaG9wIDMu MAA4QklNBCUAAAAAABAAAAAAAAAAAAAAAAAAAAAAOEJJTQQ6AAAAAACTAAAAEAAAAAEAAAAAAAtw cmludE91dHB1dAAAAAUAAAAAQ2xyU2VudW0AAAAAQ2xyUwAAAABSR0JDAAAAAEludGVlbnVtAAAA AEludGUAAAAAQ2xybQAAAABNcEJsYm9vbAEAAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAAAAALcHJp bnRlck5hbWVURVhUAAAAAQAAADhCSU0EOwAAAAABsgAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRP cHRpb25zAAAAEgAAAABDcHRuYm9vbAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5D Ym9vbAAAAAAAQ250Q2Jvb2wAAAAAAExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wA AAAAAEludHJib29sAAAAAABCY2tnT2JqYwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv 4AAAAAAAAAAAAEdybiBkb3ViQG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50 RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAUgAA AAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExl ZnRVbnRGI1JsdAAAAAAAAAAAAAAAAFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1By Y0BZAAAAAAAAOEJJTQPtAAAAAAAQAEgAAAABAAIASAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAA AAA/gAAAOEJJTQQNAAAAAAAEAAAAHjhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAA AAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAv ZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D +AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////// //8D6AAAAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAA4QklNBAAAAAAAAAIAADhCSU0EAgAAAAAAAgAAOEJJTQQwAAAAAAABAQA4QklNBC0AAAAA AAYAAQAAAAI4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0E GgAAAAADTwAAAAYAAAAAAAAAAAAAAdwAAAOGAAAADQBJAGIAZQByAGkAYwBhAE4AdQBlAHYAbwAz AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAOGAAAB3AAAAAAAAAAAAAAAAAAAAAAB AAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEA AAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25n AAAB3AAAAABSZ2h0bG9uZwAAA4YAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNl AAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0A AAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNlVHlw ZQAAAABJbWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAA AAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAdwAAAAAUmdodGxvbmcAAAOGAAAAA3VybFRF WFQAAAABAAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFnVEVY VAAAAAEAAAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAAAAlo b3J6QWxpZ25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGlnbmVu dW0AAAAPRVNsaWNlVmVydEFsaWduAAAAB2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAAEUVT bGljZUJHQ29sb3JUeXBlAAAAAE5vbmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91dHNl dGxvbmcAAAAAAAAADGJvdHRvbU91dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAA OEJJTQQoAAAAAAAMAAAAAj/wAAAAAAAAOEJJTQQRAAAAAAABAQA4QklNBBQAAAAAAAQAAAACOEJJ TQQMAAAAABWaAAAAAQAAAKAAAABUAAAB4AAAnYAAABV+ABgAAf/Y/+0ADEFkb2JlX0NNAAL/7gAO QWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwM DAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCABUAKADASIAAhEBAxEB/90ABAAK /8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUG BwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLR QwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZm doaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKB kRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aU pIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwD1VJJJJSkk kklKSSSSUpJJJJSkkkklKULba6a3W2uDK2CXOOgACxL/AK2YzXubRQ+5o0bYSGtcf5P0n7P5W1V6 KOpfWF3q5VnoYLHe1jBo4jnZu+ns/wBNZ+f/ADVSjOUHSPqkxHNE6Q9cvDb7Wvd9aOofaXX1bRjN J20Ob9Jg/ff9Ntr2/wCYutBkA8Ss/G6B0rHcx7ad9jDIfYS8yPztrjs3f2FcycirFofkXHbXWJcf 4D+U781LGJRszlf7FY4ziJGcrvX+6gyesdNxbvQvyGss0lupif8ASFoLa/7attc1zQ5pDmuEgjUE HuF58XWXXOdtc+61xeWNBc4lx3H2tlzvpLtOi492N0uim8bbGgkt52hznPaz+w121NxZTORFaLcW aU5EVo3kkklMzqSSSSU//9D0PP8ArH0HpuR9mz8+jGv2h3p2vDXbT9F0O/qp+n/WHofU7zj9OzqM q5rTY6up4c4MBawvhv5u57F5f/jR/wDFa7/wrT/1VyN/in/8VF//AIRs/wDP2KjWlsXu+vgr6ut/ 48NP/lTZyR/PN7GP9Guw+rPXW9f6RX1NtBxhY+xnpFweR6b3VfTAb9LYvBh3+J/KV7H/AIsf/Ehj /wDG5H/n6xIoxZJSJBerSSSQZlKn1LrHS+k1st6llV4jLXbK3WuDdxjdDVcXmP136F9cvrB1p99H Tnnp+IDThg20tLhM3ZHpPv3bsixv8j9BVQktkSBYFl7fE+tn1bzsmvEw+o0ZGRcYrqrducSAXmGt /da1altYtrfWdA9paSOdRC4b/Fr9Usnp3r9X6pQ6nMfuoxqbB7q6wf01vJ9+RY32/wDAVf8ADrvE lRJI1FX0eJf0Lq1VvoDHdZGjbGFuxwH525zm7P7au9P6zk9JAweoY7xW2TXoA8DwG6GXV/y2PXUo OXiY+ZSaMhgew6+YP7zHfmuUIw8OsJEHx2Yhg4dYSIPjs4OT9bH+rGJQDUPzrSQXfBjfoKm+/qH1 gzWY8iqpvvDBq2to0Nr/AKPq2/mV/wDq1Cy+h9Rxr3VspffXP6O1g3SPzd8fQf8AvroPq/0y3Axn uyAG33uBc0EHa1ohjC4f23JgGScuGV8P6THEZckuGdiP6XRuYPT8XAq9PHZExvedXOI/OserKSSs AACho2gABQ0UkkkilSSSSSn/0af+NH/xWu/8K0/9Vcjf4p//ABUX/wDhGz/z9ioP+NH/AMVrv/Ct P/VXI3+Kf/xUX/8AhGz/AM/YqPRrf5f6/seMHf4n8pWpX9Zut0dJp6RiZLsPEoc95+zk12WOse60 m29p9Ta3fsZXT6TP9L6iyx3+J/KV6Z/i5+qnQszojeq5+LXm5N9lrAMhosYxtb3UhtdL91fu2b/U 2+oiVuOMiSAaeCxOv9ewrBbi9Syq3gzBtc9pP8um8202f2616r9Rfrl/zix7MfMayrqeKAbGs0bZ WdG5FTHe5vu9l1f+Df8A8axcV/jG+q+D0PNxsnpzPRxc7eHY4+jXYza79FP0a7mP/mv8H6fsXNdO 6jk9NvsvxXFr7aLsZxBI9tzPT3e386p+y5n/AAlaG64TljlUjYex+t3+MjOyMm3A6Db9nxKnFj81 kOstIlr/ALO525lVH7lrP01v85XZV+fxx611X1t7upZXrdnHJt3/APnzcqkQ3a3SBDfLwXcYf17+ rmH0odIr+r5swi3bY2x9bnWGPdbednvuf9L1EkcRkSTLh7Ivqt/jH6n07Jrx+tXuzOmvIa66z3XU yf571W+/Ipb/AIZlvqXbP5p/s9G0/wDjG611jE+s3o4XUMjGoOLU8V02uYyS66X7WHb7tq4d4rL3 CsOFRcdjXnc4Mn2NscPpv2fTctTr95yG9Iud9I9Kx2OPian5OPu/tekl1VxkwkL2rVJi/XD6z4ov 2dSyLHX1+kH3WOt9MbmvdZQy3dW25zW+l6m32MV/6j9T6pd9cOnNuzcm5tz7Ba2y6x4eBTc8Cxr3 ua/3t3Kv9SPq9i/WHrZxMx7mY1FJyLGsMOfDmVtp9T/Bs/SfpHt/Sf8AnxenYP1E+rHTs7Hz8DFd j5OM4uY8W2uB3NfU5r2X2Ws+jYkV2OMzUr0BfLerfWL6w19Xz66+qZjK2Zd7WMbe8BrW22NYxo3f Ra1d3/i965Y36q5/UutZtlteLlWl+RkPdYW1trodsbO5/wBJ3srZ+evNOs/8tdS/8OZP/n6xaH22 yr6iNwWEhuX1ax1scOZTRRZsd/191Nn/AFtLoiMyJyJ6W3vrB/jE691W97cG1/TMCYrrqIbc4Dh+ Rkt97Hu/0WO5jK/5vff/ADiwB1frDbPUb1DLFh/PGRbu/wA71EukdOs6r1XE6bW7Y7LtFZsidrfp 22bfztlTHuXs+H9SPqpiYwxm9Mx7gBDrb6222OP7z7rg+xLQKiJ5LPFTzv1O+sfWb/qd1nNysg5O T01txxrLQCfZjtyGNtLdnrfpP3/0n/CLgsz60/WTNcX5XVMk7hq2uw0s/wC2sX0a160/oH1b6D0T qtRecHpea15ypfpWLKxiv+zueLLN1n+Dr/S/pv5n/Rrhz9avqJ0/9B0v6tMy6mn+eygzc7+UH5Lc zJ2/8b6aQXzBoAz4aH2vL0da61juD8fqOXWefbfZB+LXPcx39peifUL6+5fVModG6wWvy3tc7Fym tDfU2j1LKbq6/wBG25te6xllba6311/6T+e436xdU+q/VMavI6X013SeoseBdUwMFFlRDtzm+h7P Wqs9P3elT/13/B0fq29zPrJ0lzDB+20NnydY2t/+cx6THGRjIDi4gX//0qf+NH/xWu/8K0/9Vcjf 4p//ABUX/wDhGz/z9iq//jA+q31h6p9YzmdOwXZGOcepnqNfW0bmm0ubFttbvz0T/F19WOv9J6/d ldSwnY1DsR9TXufW6XmzHe1kU2WO+jW9HowcMvdutLfOR3+J/KV6J9Qfrv0LpXRv2X1Sx2JZRZY+ u0tc9ljbHOu+lU1/p2Vuds2Wf9b/AOD5kfUP646/5Ls5P+Eo8f8Aj0a//F79a6cGvLGGbXO3etjM cw3V7XFrTtDyy9lrNtn6F/qf8ElosgMkSSIpvr/9a8X6w5uPXgBxwsIP22vaWGyyzbue2t/vbVWy v2eo1j/fYsLpPSsvq2Rdj4jS+ynHuyS1okkVNltYH711rq6Wf8YreH9TvrVmWiqrpeRWe772+gwe bn37P/A22L1P6mfVCj6tYbzY8X9RydpyrxIaA36GPQHf4Grc73/zl7/0j/8AB00rZMYSnLikKD4n O5ksP0hLT8eF6J0TG/xUdSxK35FVeBl7R6+Nk5V9W1353pW25DK76/3H1u+h/OenZ+jU/rZ/ixvs ybeofV7ZttJfb0952APJl7sO0/o2tsd7vs9uytn+Ct2foVxt31V+s9LzXZ0nLLhzsqNjf+3KPUr/ AOklugRljJ9PEHsOp4/+KHp7fbWM24kBlOHkX3EkkN/nGZH2evn/AAtzFgf4wcDE6b16rp+Ez0sX Gw6m017nOgGzIsPvtc+x3ve76T03Sv8AF/8AWrPur34n2Gjc0uuySGwGkOO2hhfkOd+77K/+MW9/ jA+q31h6r9Yjl9OwXZOP9nqr9Rr62jc02lzYttrd+el1XESlA+mtqppf4pv/ABSZX/hJ3/n2lesr zn/Fz9Wev9I65kZPUsJ2NS/FNbXufW4F/qVP2RTZY76LXL0ZAsmIERo6Pz71n/lrqX/hzJ/8/WLS bgPu+oJzmAkYXVn+qfCu6minf/2/6CtdU+pH1tu6rnX1dNe+q7JvsreLKRLX2Pex3uuDvc1y7b6g fV/Mwvq5m9N63iekMrItL6LC14fU+qmrX0X2N9217fpI2xRxkzlY0NvlXTM+7pnUsXqNADrMS1to YTAcBo+ou9231a3Pr3L17G/xk/VC6gW2ZhxnRLqLq3ixp/ditljH/wDWX2rjOv8A+LDrOFc6zow/ aGGZLay5rb2D9x3qllWRt/0jH+r/AMCueH1Y+sxf6Y6TmbuNaXAf9uO/R/8ASS0KonJj0q3a+v8A 9cMb6xWY2L08WDBxHOsc+wbBbafZXYyk/pGspr9TZ6ux/wCm/mv0ay/qj0jp3WeuVYHUcg41D2Oc 0NIa62wFoZissf8AQc/c+z9/9F+jWz0z/Fb9YMvHttzX19OeGn7PS8i1zn/m+v6BdXTS7+Q+67/g v9JjZv1K+tWK81XdLutH71Abcwj94ekXO/7cZWkgifEJSjfg7f1++qPQvq/j49/Tr3svus2OwrLP UJZD3HIr3/p2+m5myz/BfpFzf1e/8UXSf/D2N/59YrOP9SPrXc0vp6Tc0aTv9Oon+zfZW9aXRfqT 9a8frfTsm/pr66aMui215spIaxljH2Phtzne1o/NSUYkyBEaD//T9OtzcSm1tNtzGWPEtYSJj96P 3NPpowIcAQZB1BHELOyKL68nJvxmV5bL2tbk4zjtf7W7f0dnuZ76z/MXen/x36RNh2Oz3WuoudRi 1sYyhlYaD+kqrvFz/UZZ9BtzGVV/zf6P9J6v5jOI3RHXRZxm6I66Nx2U1uWzFLHbrGOsY/Tadha1 7fpb936Rn5iOsWm67IyccWvi2uvMpdcwAEmuymr1WNdvY1ztn+eijJyXYXSsj1XB95pFwAbD/UZu fu9v73+j2JCe/wDL93/vkDJvv/Lh/wC+dVDpvpvaXUvD2tc5jiOzmEssb/Ze1UcI5eZSM37QWG1/ tpDWljK22DdXEb3XvqrdXZY6z9HZZ7EGjIzLXVYfruaX25IffDfUNdFnpsqZ7PT3v3s9/p/zbLPz /wBIlx7aHVPHtoaOzsJLGzsrNxXZdVd5Pp1tyanlrS5oL3Mfju02+l7f0T9vq/ziLk3X9PyQ71bM ip9V9jqn7dDWG2s9J7GNc3/R+7elxjsdN1e4NdDpv/0XUSWTTZ1Uux3gW2SSb3u9EUOa8fTq2P8A tDWVO2+j/hPS/nv0n6RT6ZdkGxtOVZYMgVl1tNrG+50t33Y91X6J9LJ2emz6G/8ASoie2hF91Cdk CiL7pW9Wx355wa67bHsO2y1rJqY7aX7LLPzeFeXKC7KwKuqZFVznWY+TtJcGw82BtQsv9v8Agt/q N9LYr9zupYeVh44zTf8Aba31Fz2NJbY1peMutrdv73uq+gmRyb2Dv+Z4YrI5TrYO/wBnFLgi7iS5 h2V1U9BHV25r2v2kPqLGEH9K6ve32ex/uVt7M89Vs6cM21td9JyWvAZurIft9Nns/mkfd29J1o9P 0vlSM116TqARt+n8ruJi5oIBIBdwCefgubpz8vKwMJj8q5mTc61sY9bXPsDHemLXucNlVdX+E/0i DXbk5lvSrci4utNt9LXgN0LA9gyGe3+c+j/wfsQ94aUDrX48P/fI98aUDrX/ADuH/v3o2Z+NZm2Y LXE5FLWve2DAa76PvjarC5zId1dmVmYlGZa9+PjsvrJbXLiNHs9tf+Ej/PUR1DIufRZXn2VY9WE3 IyrXNY4B0uY2Whnutsfu9Rn/AAX6NL3e4O/8v0le9WhB3Pbv/e/RelSXNY+Z1Ntr66b7bTdiWXUj Kaxjg9pDWWe2Gsrf+Z6it9Gyr35Rx8i68WtpDn4+TW1ri7ed+RVdX7XVe/0WMRGUEgUdV0coJAoi 3//U9Bzf2b6l2/1uf1v0PUj6Ddvr+h7tvo7fop7f2X6p9Hf6n2cT9k3x6MO9H+jez9/7J/hv+4y+ aElF1Py7sR3Pybv0tT+yPXw/s3qT6Z+zel6np7J/S79v6L6ez7R636Tf6fqoNf7H9Nuz7R9m31/Z 49b098n0vsm337P+K/Qel/wK+b0kP8T+QW/4n8gH6WH7O+2u9H7RPq/pfR9X0PVn3b/S/Q7t/wDS Nvs9T+lIbf2P9n09ePXPpz63q+v7/V+zz+m3/wA76/p/o/571v0fqL5tSR/xOqf8Tq/Sl37H9HL9 X1f5z9c/nfU7+nu2/pfsv+h2fq3+jRbPsP2vE9T1/X2foP52I/P9X8zd/pvXXzMkl/i9P+kn/E6f 9L+X+G/SWN+ydw9H7R9mh/p/z32bbtdv9P8AwPo+nu9L/tP/ANx/zFYwPsH2j9D6nqen+h9Tft9H 2f0bf7PS/mvU2fpP5r1v8EvmVJKPT5d+iI9Pk36fsfozE/5tb8j0t382/wC0+r62zbLfU9T7R+j3 7tu3/C/6NLH/AObWvp7t32U7N3q7/s/v3fZ936T/AEn81+nXzmkmjp/NrR0/mv5dn6JH/Nf7A6PV +yeq3d/SI9Ta7b/Y2bv+C9T/AIRFb/ze+1sj1ftHojZ/SJ9L0f8A3n/t+r/3YXzikkOn810/kEDp /NdP5Rfoin/mttq+z+rv9Qejs9f1N3tnZ/hPS/0n+BSf/wA1/sbvp+n65+j63qetHu9L8/6H+j/R f9cXzukh0/yWyOn+R2fo/p3/ADe+3s+w+p9p2+2fXjbt7+r+j27f30XE/YP2DJ9Db9j93r790bZf u2+r7/R3+r6Xp/o9/qekvmtJOj/1P9L5f5f46+P/AFP9L5f5f479C2f81PSr+0er6Wx/p+r9oj09 x3fS93p7v5vf/wBbWl079lfbr/s+/wC2R7/W9Td6c+30fX/7T7v9D7F80JIQ+YfzfT5fmRD5h/Nd Pl+bb+XC/wD/2ThCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBo AG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMANQAAAAEAOEJJTQQG AAAAAAAHAAgAAAABAQD/4Q36aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQg YmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHht bG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2 MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJk Zj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVz Y3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpw aG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1N PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25z LmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9 IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wOkNyZWF0ZURhdGU9IjIwMTQtMDktMTlU MDk6NTA6MDYrMDI6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE0LTExLTIxVDEyOjA5OjMyKzAxOjAw IiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE0LTExLTIxVDEyOjA5OjMyKzAxOjAwIiBkYzpmb3JtYXQ9 ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9Inht cC5paWQ6QTE5MDM5ODhBQTcwRTQxMUE4NEE5MEYyNkU0NzdDM0MiIHhtcE1NOkRvY3VtZW50SUQ9 InhtcC5kaWQ6QTA5MDM5ODhBQTcwRTQxMUE4NEE5MEYyNkU0NzdDM0MiIHhtcE1NOk9yaWdpbmFs RG9jdW1lbnRJRD0ieG1wLmRpZDpBMDkwMzk4OEFBNzBFNDExQTg0QTkwRjI2RTQ3N0MzQyI+IDx4 bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0 RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QTA5MDM5ODhBQTcwRTQxMUE4NEE5MEYyNkU0NzdDM0Mi IHN0RXZ0OndoZW49IjIwMTQtMDktMTlUMDk6NTA6MDYrMDI6MDAiIHN0RXZ0OnNvZnR3YXJlQWdl bnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0i Y29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGltYWdlL2dpZiB0byBpbWFnZS9qcGVn Ii8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlp ZDpBMTkwMzk4OEFBNzBFNDExQTg0QTkwRjI2RTQ3N0MzQyIgc3RFdnQ6d2hlbj0iMjAxNC0xMS0y MVQxMjowOTozMiswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENT NSBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5 PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3 Ij8+/+4ADkFkb2JlAGRAAAAAAf/bAEMAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDA//bAEMBAQEBAQEBAQEBAQICAQICAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAdwDhgMBEQAC EQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAA AX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQAD AQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEG EkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpT VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4 ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP7+KACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgD5U+OH7ZXwO+BFxPo3iPX5/EHi6FWMng7whF Bq+s2kmxGRNXle5tdL0N3Eit5d1cRztG29I3FfJZ9xrkPD8pUcTiHUxi/wCXdO0pL/Fqox9JNO2q TPiuI+P+HOGZyw+LxTq49f8ALqklKa/xO6jDppKSlbVJnwlq3/BWeb7Uy6F8EIvsSswSbVvHjfap 1wu1mtrPwr5VowOQVEs2eDkdK+AreL8udrD5EuTvKrq/kqen3s/NK/jjLnaw3Di9n3lW1fyVOy+9 npHgD/gql8NNbvILP4h/D/xH4ESZkjOraRqMHjPS7ck4ae9jTT9B1aKADnEFtdSDoAep9PLvFnK6 84wzLLquHT+1GSqRXm9ISt6Rkz18r8asnxFSNPNcrrYZP7UZKrFeb92EkvSMmfpN4M8ceEPiJ4fs /FXgfxFpXijw/fgi21TSLuO6t/MQKZbacKRLaXtvvAlgmVJom+V1U8V+nYHH4PMsNDF4DEwq4aW0 ou69H2a6p2a6o/XMvzHAZrhaeNy3FwrYWW0ou680+qa6xdmtmkdVXWdoUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF AH5w/t9ftaah8FtFs/hp8Pb77L8SPFunm+vtagZGn8HeGnme3S6tgdwj1zWpYZI7ZiCbeGOSX5XM DV+Z+IXGFTI6EMry2pbM60buS3pwva6/vSs1Hsk3vys/JfE7jirw9h6eUZVU5c3rx5nNb0qd7XX9 +bTUf5UnLR8rP5/bi4nu55rq6mmubm5mkuLi4uJHmnuJ5naSaaaaRmklmlkYszMSWJJJzX87ylKc pTnJubd23q23u2z+XpSlOUpzk3Nu7b1bb3bfVshpEhQB9D/s4ftG+NP2c/G9r4h0C4nvvDV9PBF4 x8HyTldN8R6Yu9CdrbktNYsUlaSzulAeOQbX3wvLE/0fDPEuO4ax8MTh5OWFk17Snf3Zx/SS3jLo 9HeLaf1fCXFmY8J5jDFYWblhJNKrSv7tSP6TW8Zbp6O8W0/6efBni7QfH3hTw9408MXi3+geJ9Js tZ0q5GFdrW9hWVY54wz+Rd27ExzRE7opUZG5U1/VGCxmHzDCYbHYWfNh6sFKL8muvZrZro7o/sbL 8fhszwOFzDB1ObC1oKcX5NX17NbNdGmjpq6jsCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOb8YeLvD/gLwvrvjLxVqMO k+HvDmnXGqarfznCw21uudkaffnubiQrHDEmZJpnVEBZgDy43GYbL8JiMbi6qhhqUXKTfRL829kt 22ktWcmPx2FyzBYnMMbVUMJRg5Sk+iX5t7JLVtpLVn8qPxt+KGo/Gb4qeNPiVqUUts/ifWJLmxsJ ZvPbS9Gto47HRNLMoCpI2n6TawxMyqqu6lsDNfyVnua1c7zbHZpVTTqzule/LFaRj8opLzep/FHE Wc1eIM6zDN60WnWqXUW78sF7sI3/ALsUl5vU8rryTxAoAKACgD95v+CWfj27134ReM/Ad5cm4HgD xXDd6ZG0m5rLRvGNvc3qWiR5/dwHW9Lv5wcDc87+lf0B4T5hPEZNjsvnK/1esnHyjUTdvTmjN+rZ /TPgvmc8TkWYZZUnf6rXTj5Qqpu3pzxm/Vs/UCv1U/ZAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAIp54baGa5uZore3t4p J5555EihghiQySzTSyFUjijRSzMxAAGTSlKMYuUmlFK7b2SJlKMIynOSUErtvRJLdt9j+fr9vD9r 1PjPrTfDL4e35f4XeGr8S32q20kix+OdeteFvRlU3eH9JlLLaLytxKDcEkeRs/nbj/jJZ3X/ALLy 2p/wlUpayX/L2a6/4I/Z7v3v5bfy74l8driDEPJ8qq/8I1GV3Jf8vprr/gj9n+Z+/wDy2/OOvzQ/ JgoAKACgAoA/an/gkxo93BoXxv8AEDqwsdT1bwHo9u+whWu9Ds/FV7eKHzhmWHxFASMfLketfuHh BRnHD57iGv3c50or1gqjf4TR/Q3gdh5xw3EeKa/dznRgvWCqN/hOJ+vtfsp+7hQAUAFABQAUAeff Ev4qeAPhB4ZuPFvxE8S2HhvRYW8mGS6Z5bzUbsqzpYaRptukt/qt/IilhFBG7BFZ2wisw87NM2y7 JsLLGZlio0qC0V95PtGK1k/JJ6a7Js8rOM6yvIcHLHZri40cOtFfVyf8sYq8pS8knpq9E2fkz8VP +CqmtS3lzYfBrwBp1pp0Zkii8RePmuL2/u1OFW4g8O6NfWVtpzJglPNvbvcCCyLgqfyDNvFqu5yp 5Jl0VT/nq3bfmoRaUfnKXmlsfh+deNeIdSdLh/K4RpLapXu5PzVODSj5XnLzS2Pl+6/4KJ/tX3Fz HPD490qxiSSR2srXwR4Oe2lV9u2KR77RLy8EcWPlKzKxydxPGPlZ+JPF0pqSzCEVfZUqdvTWLenq fGz8VuN5zUo5nCMb7KjSs/LWDenk792eo+Bv+Covxv0K4gTxv4d8G+O9MDxm6MVpc+FtdkRcB1t9 R02S50iBnGTltOkw3TA4r1cB4rZ7h5RWOw1DEUuujpz+TjeK/wDAGe1lvjNxHhpxWY4TD4mjfXR0 5/KUW4r/AMFs/VL4A/te/B/9oRF0/wANapNoXjKO38+78EeJBDZ60VRSZ5tJljlksdetIijEtbSN NHGA00UW4Cv1rh7jLJeI0qeFqunjUrulOyl5uPSa/wALulq0j9q4Y47yHilKlg6zpZgld0allPzc Xe00v7rulrJRufUlfVn2YUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFAFHU9T03RdOvdX1i/stK0rTbaa91HUtRuYbKwsbO3QyT3V3d3DxwW9vDGpZndgqgZJrOrV pUKc61apGFGKbcm0kkt229EkZ1q1HD0qlfEVYwoQi3KUmlGKW7beiS6tn4Oftpft0T/Fhb/4XfCS 7vNP+Gwke38QeIwJ7LUPHexgPskEMixXWn+FdwyY5As17x5qpGDG/wCAccceyzf2mVZPOUcsvac9 U6vkluqfk9ZdUlo/5n8QvEmWeKrk2RVJRyi9p1NVKt5JaONPyes+qS0f5lV+Wn48FABQAUAFAF7T dN1DWdRsNI0qzudR1TVLy20/TrCziee7vb68mS3tbW2gjDPLPcTyKqKASWIFXSpVK9SnRowcqs5J JLVtt2SS7tmtGjVxFWlQoU3OtOSjGKV223ZJLq29Ef1Ffso/BT/hQnwU8MeB7wQt4juDP4k8YzQM Hik8T60sLXkEcikrNHpNnBb2KSDAlS1D4G7Ff1Zwjkf+r2R4XATt9Zd51Gv55WuvPlSUb9eW5/Zf BPDv+rHDuDy6pb6271KrW3tJ2uvPlSjBPqo36n0dX0x9aFABQAUAFAHnXxY+J/hj4OfD/wAR/ETx bO0WkeHrIzC3iKfbNUv5nWDTdH09HIWS+1O9kSJM4VNxdyqKzDzc3zXC5Ll2JzLGStRpxvbrJvSM V5yei+96Jnk55nODyDK8XmuOlahSjey3lJ6RjH+9J2S7buyTZ/MF8cfjl45+Pvje+8ZeNNQlZDLc R+H/AA/FPI+j+FtJkkUw6VpNu2yNAI408+faJbqVfMkJbGP5Wz7PsfxDj6mNx1R2u+SF/dpx6Riv uu95PVn8ccR8SZlxPmNTMMwqu13yQT9ynHpGK+673k9WeN14p8+FABQBf0vVdT0PUrHWNF1C90nV tMuoL7TdT026nsdQsL22kWW3u7O8tnjuLa5glUMjowZSMg1pSq1aFWnWoVJQrQacZRbTTWzTWqa7 o1o1q2GrU8Rh6soV4STjKLalFrVNNapro0f0V/sPftWf8NBeD7nw14unhT4qeCrSA62yCKFfFOiM 6W1t4qtbaNIkhuFuHWDUIo18qOdo5F2rcJFH/SXAfF3+sWClhcZJf2tQS5untI7Kol0d9JpaJ2as pJL+rvDjjb/WnATweOklnWHiufp7SGyqJdHfSaWik01ZSSX3ZX35+lBQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAHjPxo+Pvww+Avh99e+IXiGGymlhmk0fw5ZGK78T+ IpYcAwaNpHmxyTL5jKjzyNFawlh5sqAg14md8Q5Vw/hniMyxKjJp8sFrOdukY9fNu0V1aPn+IOJ8 m4ZwrxOa4pRk0+WmrOpUa6QjfXs27RX2pI/n+/aa/bI+I37Rd5JpUjN4R+HFrc+bpvgrTbpnW8aJ yYL/AMT6gqQvrd+vBRCqWsBAMce/dI/878U8a5nxLN0X+5yxP3aUXv2c3pzPy0iuivdv+XuMOP8A NuLKjoP9xlKd40YvftKpLTnl2WkY9Fe7fyBXxp8GFABQAUAaemaLrGtzG30bSdT1e4XG6DTLC6v5 hlZHGYrWKVxlInPTopPY1rSoV68uWhRnOXaKbf4G1HD4jES5MPQnUl2jFyf4J9me8eAP2TP2iPiT dwW/h/4V+KrS1mZc6z4m02fwpokURUM0/wDaXiBNPhuURDnbB50jdFUkgV7+XcIcSZnOMcNlNZQf 2pxdOPrzTtf5XfZH02V8D8V5vOMcLkteMH9upF04W780+VP/ALdu+yP2e/ZR/YT8KfASe18b+Mby z8a/FJYv9EvoYZV8PeEDNE8VzH4dguVjmvb+VJCjahcRxyeX8sUUOZDJ+3cI8A4Th6UMfjZxr5tb R/Yp335E9W+nO0nbRKOt/wCguCPDXBcMShmOPqRxGdW0aT5KV1Z+zT1cns5ySdtIqOt/v2v0M/Tw oAKACgAoAKAPxE/4KofFW6vvFvgf4O2M8iaZoGlf8Jpr8cbsIrvWtZkutP0eC4j3YaTSdLs5ZUOM Y1A8kjj8K8Wc2nUxmAyWnJ+ypw9rPzlK6in/AIYpv/t8/nTxpzqdXHZbkFOT9jSh7WfZzneME/8A DFNr/GfkpX4+fhoUAFABQAUAe4/s3/FW6+DHxp8BePYrhoNO0/WoLDxIgZhHc+FtYP8AZviCKWMf JKYtOuHniDAhLiKN+qgj3eGc2nkmeZfmClanGaU/OnL3Z/g7rzSfQ+k4SzufD/EOWZmp2pRqKNTz py92afe0W2u0kn0P6ta/rg/tkKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KAOc8V+L/C/gXQ73xL4x8QaT4Z0HT0L3eq6zewWFnGdrMkSyTuvnXU2wiKFA0srfKisxArmxeMwm AoTxWNxEKWHjvKTSX47t9EtX0RyY7H4LLcNUxmYYqFHCx3lNqK9Nd2+iWreiTZ+TXx//AOCnttCt 54b/AGfNK+1TESQP8RfE9iyW0JIdPO8N+F7pFluHGVeO41IIispVrORSGr8g4i8VIRU8Nw5SvLb2 01p6wg9/Jzt5we5+H8UeMcIqphOFqHNLb29RaLzp03v3Uqll0dN7n5CeK/F3ijx1rt74m8Y69qvi XX9RffearrF5Ne3kuM7IxJMzeVbwqdscSBY41wqqAAK/G8XjMXj8RUxWNxE6uIlvKTu/+GXRLRdD 8Ix2PxmZYmpjMfip1sVPeUm239+yXRLRLRI5yuY5AoA+ifhB+yp8cvjeYbnwT4KvU0CV0VvF3iA/ 2F4XRGJVpYNRvUEmrCE/fSwiu5UyMpyK+kybhLPs95Z4HAy+rv8A5eT9yHyk/i8+RSfkfV5DwTxJ xHyzy7LpLCv/AJez9yn6qT+K3VQUmux+lvwz/wCCVXheySC9+LfxD1TXrrajy6F4ItotG0uKUD95 DJrmrQ32o6lbFujJa2EmPSv1DK/CXCU1GecZlOpP+SkuWPpzSTlJekYM/X8n8FMFTUame5rOrPrC iuSKfbnknKS9IwZ9x+Cf2R/2b/h+sf8Awj/wh8IzXMQUrqHiSyfxhqKyjBM8N74ql1ia0mdsnMBi ABIUBeK+8wPB3DOXJfV8mouS6zXtJet6nM18rfcfo+XcC8JZWl9VyKg5r7VRe1lfunUc2n6W8tD6 Es7Kz063is9PtLaxtIV2w2tnBFbW8S/3YoIUSKNfYAV9FCnCnFQpwUYLZJWX3I+pp06dKCp0qcY0 1skkkvkizVlhQAUAFABQAUAFABQB/Mj+3Zraa7+1b8W7mKZZobLUdB0SMJIZEifQ/Ceg6VeQqSF2 MuoWkxdRwshYc9T/AC1x/XWI4uziSleMZQj/AOAU4Ra+9O/nc/jzxKxKxPG2ezjK8YzhD05KUItf +BJ387nyPXx58KFABQAUAFABQB/Xb8ML651T4a/DzUr1HjvNR8DeEr67jlz5iXN3oGn3E6SblRt6 yyEHIBz2Ff2NlVSVXK8tqzVpyoU2/VwTZ/deTVJ1soyqtUTVSeGpN37uEW/xO5rvPSCgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoA8z8dfGf4T/DL5PH3xE8I+Fbkqrpp+ra3Yw6tLGwDCSDR 1lfVLiPawO5IWABGeteXj87yjK9MxzKjRl2lJKXyj8T+SPHzLiDI8n0zTNaFCf8ALKaUn6RvzP5I 8Ik/b7/ZIinNu3xchMiuIy0fgv4izQbjgAi6i8IvbMnPLByo9a+ffiFwepcrzhX/AOvVZr7/AGdv xPmn4n8DKXI89V/+vVdr71St+J093+2Z+zBZ+H5vEj/GXwjPYw7R9jtJ7u68QSu6syJD4YhtH8Qv u24LfZtiEjcy5rrnxtwrDDyxLzui6a6Jtz+UEuf/AMlt3Oyp4gcG08LLFviCg6a6Jtz+VNLn/wDJ bLrY+AvjD/wVOlkS80j4H+C2t9yNFH4x8ciN5o2JKNNp3hWwnkgBVRuilurtwSR5ltgFT+eZ14sN qdHIcDb/AKeVd/VU07ejlJ+cT8wz7xpk1UocOZdbp7Wtv6xpxdvNOUn5w6H5Z/ET4q/ET4s60/iD 4i+L9Z8VakzOYTqNyfsVgjks0GlaXAsOmaTa5OfKtoYo8knGSTX5PmWb5lnFd4jMsZOtV6cz0XlG KtGK8opI/F81zvNc8xDxWa46pXrdOZ6R8oxVoxXlFJHn1eceUFAHqnwk+C3xH+OHiaPwt8OvDtzr N4DE+o6g/wDouiaFaSMVN/rmqyL9msLYBWKqS00xUpDHJJhD62T5HmefYpYTLcM5z+09owXeUtkv xeyTeh7eRcPZtxHjI4LKcK6lT7UtoQX805bRX4vaKb0P3H/Z9/4J4fCn4WRWeu/EOK1+KXjhBHMT qtoD4N0ecBW2aX4fuA6anJFJkfaL/wA3dhWSGBs5/eOHfDfKMpUMRmSWLx+/vL93F/3YP4vWd+6j E/o7hbwqyTJVTxOaxjjcy0fvL91B/wB2D+K38079GoxZ+hEcccMccMMaRRRIscUUaqkccaKFSONF AVERQAAAAAK/RklFKMVZI/U0lFKMVaK2Q+mMKACgAoAKACgAoAKACgAoA474heNtI+G/gbxZ4815 1TSfCWg6lrl2hlWF7kWFs80NjA7hh9r1G4CQQrglpZFUAkgVxZjjqOWYDGZhiH+5o05SfnZaJebe i82jgzXMaGU5bjszxL/cUKUpvpflV0l5ydoru2kfyTeJvEOp+LfEev8AirWpjcav4l1rVNf1Sclj 52o6vez6heSfMWbD3FwxGSeK/j7FYmrjMTiMXXletVnKcn3cm2/xZ/DWMxVbHYvFY3ESvXrVJTk+ 8pNyf4sw6wOYKACgAoAKAOg8J+GtS8ZeKfDfhHRozNq3ijXdJ8P6bGBndfaxfwafagjI+UTXAJOQ AOSRXRg8LVxuLw2Doq9arUjCPrJpL8WdeBwlbMMbhMBh1evWqxhH1nJRX4s/r30rTbXRtL03SLJW Wy0qws9NtFdt7ra2NvHa26u2BuYRRDJwMmv7JpUo0aVKjD4IRUV6JWR/dtCjDD0aNCn/AA4RUV6J WX4Iv1oahQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAGdq2raXoOl6hret6hZ6To+k2dxqGp6n qFxFaWNhY2kTTXN1dXMzJFBBBEhZmYgACs61alh6VSvXqRhRhFuUm7JJattvZIyr16OGo1cRiKsY UIRcpSk7KKWrbb0SSPwu/af/AOCi3i/xre6j4O+Bt5e+DPBkM0trN4zh8yz8X+JkQmMz6dKds3hf Spj80Xl7dQdQrO8OXgH4HxV4lYzHTq4LIZyoYFNp1FpUn5x6wi+lvfel3HWJ/NvGXivj8xqVcBw3 Ulh8vTadVaVannF704vpb32rNuOsT8w7u7ur+5nvb65uLy8upXmubu7mkuLm4mkO55Z55meWWV2O SzEkmvyyc51JSnUm5Tbu23dt+bZ+OTnOrOVSpNyqSd227tvu29WyvUkBQAUAFABQB9Y/sr/soeL/ ANpTxJJ5Tz+Hvh5odzEvinxi9v5gDkJL/YWgxyYiv9fuYGDHOYrSJhLNndFFN9dwnwjjOJ8U7N08 tpv95Ut/5JDvNr5RWr6KX3HBXBGP4uxb5W6WVU3+8q2+fJDpKbXyitZbxUv6M/hj8LPAvwe8J2Pg z4f6DbaHotkoaTyx5t9qd4VVZtT1i/cG41HUbkr88khOBhECoqqv9K5VlOAyXB08Dl2HVOhH75Pr KT3k33forKyP6wybJctyHA08vyvDKnh4/NyfWUpbyk+rforJJHoVekeqFABQAUAFABQAUAFABQAU AFABQB+Ov/BTz9oCNLXS/wBnvw3eK8tw1j4m+I0kLg+TDC8d34X8Ny7XI8yadV1K4RlDII7RlJDs B+L+KnESUKXDmFnq7TrW6Jawh8377XlDuz8D8Y+KIqFHhbCVLydqle3RLWnTfq/3kl0tTa3Z+Mdf iR/PwUAFABQAUAFAH6zf8E0/2b7vWvEZ/aB8V2MkOg+HTe6f8PoLiIquseIJY5rDU9fRZF2y6foV vJLBEwBD30hKsrWxB/XvDDhmdfE/6xYunbD0rqin9qe0p+kFdL+8+8T9x8IeEqmIxf8ArRjabWFp XjQTXxz1jKfnGCvFd5vRpw1/cCv3c/owKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAPxJ/4 KYftG3mp69H+z34Vv5IdG0QWGq/EWW2kKjVdamjg1HRfD0rxviWw0e2kiu54zlXvJI8gPbCvwvxQ 4lnVxC4cwlRqhTtKtb7UnaUYekVaTX8zXWJ/O3i/xZUrYlcLYKq1h6fLKu19qbSlCHnGCak1s5Nd YH5H1+PH4WFABQAUAFABQB75+zh8A/Ef7RHxK03wRozSWGkwr/ani7xH5PmweHvD0EiJcXO0lUn1 G7kdYLSDP72dwW2xJI6fQcM8PYniTNKWAoNxor3qk7aQgt35t7RXVvsm19Pwlwxi+K83o5dh240F 71Wpa6hBbvzk9orq3rZJtf09eAfAfhb4ZeEdD8DeC9Li0fw54fs1s7CziJd25Mk93dzt+8u7+9uH aWeZyXlldmJya/qjL8vwmV4OhgMDSUMNTjZL8231berb1b1P7HyzLMFk+Aw2W5fRVPCUo2ivzbfW Terb1bbZ2Fdp3hQAUAFABQAUAFABQAUAFABQAUAfOP7T37RHh39nL4b3vii/a2vvFOpibTfA/hqS T99reuGPInnijZZk0TSFcT3s2VUJtiVhNNErfM8VcSYbhrLKmLqNSxc7xpQ6yl3fXljvJ9rK95K/ yXGXFeE4TyipjarjLGzvGjT6zn3a35I7zemlop80op/zCeJvEuueMvEOs+KvE2pXGr+IPEGo3Wra vqV0VM13fXkrTTylUVY4k3NhI0VY40AVFVQAP5XxWKxGNxNfF4qq54ipJylJ7tvV/wDAS0S0Wh/H GMxmJzDFYjG4ys6mKqzcpSe7bd3/AMBLRLRaGFWBzBQAUAFAGzoPh3X/ABTqcGi+GdD1fxDq90cW 2l6Hpt5quoz/ADKv7qzsYZ7iQBnAJCnGRW2Hw2IxdWNDC0J1Kz2jGLk38kmzow2FxWNrRw+Dw1Sr XltGEXKT9Ek2fqD+zX/wTZ8VeIb3T/Fnx9ifwt4YiZLmHwHbXanxRrYG14o9aubN3h8O6dKGG+NZ Gv2AZCts2Hr9V4Y8McXialPGcQr2WFWvsk/3kv8AE1pCPdX5+lo7n7Lwj4R43FVKWO4nXscGtVRT /eT7KbWlOL6q/PurQep+3ek6Tpeg6Xp+iaJp9npOj6TZ2+n6Zpmn28VpY2FjaRLDbWtrbQqkUEEE SBVVQAAK/dqNGlh6VOhQpxhRhFKMUrJJaJJLZI/ouhQo4ajSw+HpRhQhFRjGKsopaJJLRJI0a0NQ oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgClqV/baVp1/ql6/l2em2V1f3cnH7u2s4HuJ3+Yqv yxRk8kCoq1I0adSrN2hGLb9Erszq1YUKVWtUdqcIuT9Erv8AA/kP8ceLNS8eeMvFXjXV3Z9T8WeI dY8Q3uXLhJ9Xv5754Yyfuw2/neXGowqooAAAAr+N8fjKuYY3F46s/wB7WqSm/WTbt6K9l5H8J5jj quZ5hjcxrv8AfV6spv1lJu3or2XkctXKcQUAFABQAUAFAH9KP7A/wr8NfDv9nnwnrekNDfa38SrK 18ZeJtXWMLLNcXSSJp2jAks62vh20JgCbipuWnlAXzSB/Tvh7lOFy3hzB16LUq+Kiqk5d2/hj6QW n+LmfU/rrwxyXB5TwrgcRQaliMZFVakurb+GHpTXu2/m5npzH2rX3B+hhQAUAFABQAUAFABQAUAF ABQAUAeQfG342+B/gJ4HvvG/je+8uGPdbaNo1s0bav4k1do2e30nSbd2XzJpNu6SRsRW8QMkhCiv Gz3PcBw/gKmPx9S0VpGK+KcukYrv3eyWr0PB4i4iy3hnLamY5jUtFaQgviqS6Riu/d7RWr0P5nfj r8cPGXx/8faj468YT+X5n+iaFoNvPNJpXhnRY2/0bStNSU/9tJ5dqtcXDNIQMhV/l3P8+xvEWYVM fjZWvpCCb5YR6Rj+bfV3fkfyBxLxHmHFGZ1cyx8rX0hBN8tOHSMb/fJ/ald+S8arxT58KACgD6K+ BX7Lfxe/aCvlXwVoJtPDcU7Q6j4317z9P8K2DRbfOhS9EE02q38e9QbazjnmXepcImXH0mQcKZzx HU/2HD2wydpVZ3VNd1e15P8AuxTfey1Pq+GuDM94pqpZdhuXCJ2lWneNOPdXs3KX92Ck9Vey1P2f +CX/AATu+CXwwistU8ZWp+K3i6EJLLeeJLZE8LW1yrhwNN8JLJNZzQqFAJv5L4sQWAjB2D9uyLw3 yLKlTq42H1vGLrNfu0/7tPVf+BuXy2P6D4d8KeHcmjTrZhD69jlq3UX7tP8Au0tU1/jc++mx9xaH 4a8OeGLZrLw1oGieHrN2VntND0qx0m2dkXajNBYQW8TMqnAJHAr7yhhcNhYuGFw9OnDtGKivuSR+ j4bB4TBwdPB4WnSp9oRjFfdFJG3W50BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcD8V 7e7u/hb8SbWwZkvrnwD4xt7N0Z0dLubw7qMduyPEDIjLMwIKjcD05rz83jOeVZnCm/3jw9RL1cJW /E8zO4znk2bwpO1R4Wql6unK34n8i9fx0fwqFABQAUAFABQAUAfu1/wTg/aW0fxR4MsvgH4kuLfT /F3g21u5PB8ksnlr4p8Mtc3F9NZwF22vrPh1rhg0K4aWx2SIreTcMv774Z8UUcXgocPYqSjjKCfs /wDp5C7bS/vQvt1hZpe7Jn9K+EvF9DGZfT4YxclHHYdP2V/+XlO7bS/v077dYWaT5ZM/Uyv1g/aA oAKACgAoAKACgAoAKACgAoA+cf2iv2nfh1+zj4c/tDxPdDVPFGoQSN4a8EabPF/bWtTLlFnnyJF0 nRYpR+9vJl2gArGssuI2+Z4k4qy3hrDe0xU+fFyXuUov3peb/lj3k/km9D5LivjHKeE8J7XGT58b JP2dGL9+b7v+WF95P0SlLQ/nJ+Nvxz8f/H3xjceMPHmpec6+bBomh2Zli0Lw1pruHGnaNZPJJ5SH apllcvPcOoaR2IGP5pz3Psx4hxssbmFW72jFfBCP8sV+ber3bZ/J3EXEmacT4+WPzOtd6qEFpCnH +WC6ebd3J6ts8drxjwAoAs2dnd6hd21hYWtzfX15PFa2dlZwS3N3d3M7rFBb21vCrzTzzSMFRFBZ mIAGaqEJ1Jxp04OVSTskldtvZJLVtl06dSrOFKlByqSaSSV229kktW30SP2I/Za/4JvLJHpvjz9o eCRd4ivdL+F8MzRsEIWSCXxpfW0gkRmB3HTYGVl4FxJnzLcftHCfhmmqWYcSRfeNBP7vatf+kL/t 57xP3vgvwkTVHM+Kovo44dP7vatf+m4/9vPeB+w2l6XpmiadZaRo2n2Wk6VpttFZ6fpmm2sFlYWN pAoSG2tLS2SOC3giQYVEUKB0Ffs9KlSoUoUaFOMKMVZRikkktkktEj96o0KOGpU6GHpRhQgkoxik opLZJLRJdkX60NQoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAZJHHNHJDNGksUqN HLFIqvHJG6lXjkRgVdHUkEEEEGk0pJxkrpiaUk4yV4vdH8lPxm+HV98Jvip47+Hd/HKjeF/EeoWF lJKCGvNGeT7VoOogEsdmpaLcQXC5JOJOea/j/O8tqZPm2YZbUTvSqtLzjvB/9vRafzP4c4gyqpke dZnlVVNOjVlFX6wveEv+3oOMvmeZV5Z4wUAFABQAUAFAGjpOrapoOqafreiaheaTrGk3lvqGmanp 9xLaX1hfWkqzW11a3MLJLBPBKgZWUggitKNarh6tOvQqShWhJOMk7NNapprZo2oV62GrUsRh6soV 4SUoyi7OLWqaa1TTP3n/AGTf2/8Awz8TrbTfAnxhvtO8J/EWNIbOx8QztFYeGvGsgCxxsZWKWuhe Ibgj57dyltcSH/RyrOtuv9A8IeIeFzWNLAZ1UjRzJWSm9IVf0jN9U7Rb+HflX9McD+KGDziFHLc/ qwoZskkpu0adX57Qm+sXaMn8Nm1BfpdX6gfr4UAFABQAUAeA/Ej9qT4A/Ceeex8bfE3w9Y6tbbln 0LTHuvEeuwyqSBBdaT4ettUvbCV24H2hIlHUkKCR89mfFfD2USlTx2aU41lvCN5zXk4wUmvnY+Xz bjPhjI5Sp5jnFKNdbwjepNPs4wUnF/4kj5vuf+CnH7NUE8kUUXxFvY0IC3Vt4VskglyoYmNbzXbS 5AUnB3RqcjjjBPzMvFPheMmksTJd1TVvxmn+B8lPxi4QjJxisXJd1TVn980/wOu8K/8ABRD9lzxN cQ2tx4x1bwncXDbIl8VeGdVtLfeWACzahpcWr6ZaKRzvmmjjAHLA4B7MJ4kcKYqUYSxs6Mn/AM/I SS+bjzRXq2l5nfgvFXgzGSjCePqUJP8A5+U5JfOUVKK9W0vM+vdD8YeE/E2hDxP4c8TaBrvhsxTT f2/pGsafqOjLFbR+bcu+pWlxLZottHzJuceWPvYr7KhjcHisP9aw2Kp1MLZvnjJOOm/vJ2069j7v DY/A4zDfXMJjKVXCWb54zjKFlv7ybWnXXTqfmx+0z/wUe8K+C49R8H/At7Hxn4sCy2tz42cLc+D9 BlO5Gk0n+DxVqEOMo6H+z1JVt9wA0VfmHFPiZhMCqmCyBxr4zZ1d6cP8P/Pxrp9jzlqj8i4w8WsF l6q4DhtxxGO2dbelB/3f+fkl0fwbO8tYn4i+K/Fvibxzr+peKfF+t6j4i8Q6vObjUNV1S4a4uriQ 8Ku5sJDBCgCxxRhYokAVFVQAPwvF4zFY/EVcXja8qmJm7uUndv8AyXZLRLRaH8647HYzMsVWxuPx M6uKqO8pSd2/8ktklolokkc7XMcgUAbnhnwzr/jLX9J8LeFtJvdc8Q65exafpOk6fEZrq8upidqI uQqIigvJI5WOKNWd2VVJG+FwuIxuIo4TCUZVMTUlaMVq23/Wr2S1eh04PB4rMMVQwWCoSqYqpJRj GKu23/V23oldtpI/oa/ZG/Yn8LfAKxs/F/i6Ow8UfFy6tt0mqGIT6Z4OS5gRbjS/DKzbg14oLxza ltSaZGaOMRxM6yf0dwdwNhOHqcMZjFGrnDXxbxp3WsYX67pz0bWism7/ANU8C+HeC4Yp08fjlGtn sl8VrxpXWsad+u6dTRtXStFu/wB4V+gH6WFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8s/8AwW9/4Le/tW/8 E1f2rfh98C/gX8Pv2evFfhLxX+z14U+LOo6j8WfCnxI13xHD4j134kfFjwfd2Vld+D/ix4E0yPRI 9M8CWbxxvZyTieSZmmZGRI+vD4eFWDlJu97aH5lxpxpmnDmaYfA4HD4edKeHjNucZt3c5xsuWcVa 0V0ve+p+OP8AxFj/APBRX/ojH7Ff/huvjn/9EbW/1Ol/NL8P8j5H/iKfEH/QHg//AACp/wDLQ/4i x/8Agor/ANEY/Yr/APDdfHP/AOiNo+p0v5pfh/kH/EU+IP8AoDwf/gFT/wCWh/xFj/8ABRX/AKIx +xX/AOG6+Of/ANEbR9TpfzS/D/IP+Ip8Qf8AQHg//AKn/wAtD/iLH/4KK/8ARGP2K/8Aw3Xxz/8A ojaPqdL+aX4f5B/xFPiD/oDwf/gFT/5aH/EWP/wUV/6Ix+xX/wCG6+Of/wBEbR9TpfzS/D/IP+Ip 8Qf9AeD/APAKn/y0P+Isf/gor/0Rj9iv/wAN18c//ojaPqdL+aX4f5B/xFPiD/oDwf8A4BU/+Wn7 o/8ABDD/AILIftOf8FNviv8AHXwL8efAvwI8JaR8Mfh74c8W6DcfCLwx8QdB1G71HV/Ekmj3MOrz eMvif4+triyS2Xciww28gk5LsPlrnxFCFKMXFvV9T7Xgni/MuJMVjaGOoUIQpU1JezjNO7dteact PuP6Va5T9GCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKAPy2/4KMfsvX3xB0SH42+BdPe88V+ENLNn4x0m1j3XGueErMzXMWrWsSDdc an4c8yQyLy81k3Bzboj/AJR4lcKVMxoRz3AU+bF0YWqRW8qau+Zd5Q1v1cf8KT/GPFjgypmmHjxF ltJyx1CFqsVvOkrvmXeVPW/Vw/wpP8Iq/AT+aQoAKACgAoAKACgAoA+3PgP+3p8afgrDZaFf3afE jwPZqkMXhvxVdz/2hp1pGAq2+g+J1S51HTYo40VI4p0vLSFBiOBetfdcP+IOeZGoYepP61gI6clR u6XaE9XHyTUopbRR+jcM+JvEPD0aeGqz+t5dHRU6jfNFdoVNZRXRJqUUtoo/WP4W/wDBQz9nX4iR QW+ta/c/DPXZFjWXTfG8AttNMpwshtfE1mbnRDbI7DD3UlnIw58sAHH69lPiPw1mSjGviHhcQ/s1 VaPymrxt/icX5H7dkvipwpmqjDEYqWDxL+zWVo38qivC3nJwfkfaGieINB8S2EWq+HNb0jxBpc4B h1LRNSs9VsJgQGBivLCae3kBUg8MeDX29DEYfFU1Ww1eFSk9pRkpJ/NNo/QsPisNjKUa+ExFOrRe 0oSUov0cW0Z3jTxp4X+HfhfWfGnjTWbXQPDOgWv2zVNUvPMMUERkSGKOOKFJbi6urq4lSKGGJHmn mdY41Z2AOWOx2Ey3CV8djq6p4Wmryk+nTpq23ZJJNttJK5jmGYYLKsFiMwzDERpYOlG8pPp0Wi1b bskkm22kk2z8CP2l/wBv74j/ABdvNQ8NfDu71H4dfDcSywRpp1y9p4t8S2w3xefr2rWkglsbS6iJ P2C1dYwrlZpLjClf564o8Q8zzmdTC5bOWGyy9tHapNd5yWyf8kdOknI/mLi/xQzbPalXCZVOeEym 7Xuu1WotrzkvhT/ki7a2k5aW/PkkkkkkkkkknJJPJJJ5JJr86Py3cSgQUAaVprOsWFlqOnWOq6lZ afq8cMOrWFpfXVtZapFbyCaCLUbWGVIL2OCYb0WVWCtyMGtIV61OFWlTrSjTmlzJNpStquZLR2e1 zaGIr0qdWjSrzjSqJKUU2lJLVcyTs7PVXM2szEKACgDT0XRtV8RavpmgaFYXOq6zrN9a6Zpem2UR mu76/vZkt7W1t4l5eWaZwo7c88VrQoVsTWpYfD03OvOSjGK1bbdkl6m2Hw9fF16OFw1JzxFSSjGK 1bk3ZJerP6N/2O/2QtC/Z48OQ+IfEENrq3xb1/T4xrurERTw+Gra4VJZfC/h+RTIiwwvhbu6Q7ry VcgiJUUf0twXwbh+G8NHE4mKnnFSPvy3UE/sQ8l9qX2n5WR/WXAXAmG4VwkcVioxqZ7Vj78t1TT1 9nDyX2pL4mv5UkfblfdH6KFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/ns/wDB2P8A8pFfgx/2ZX8Ov/V5 /tG16WD/AIUv8X6I/BPFP/koMH/2Bw/9OVT+YKus/NAoAKACgAoAKAP65/8Ag0b/AOTi/wBrv/si vgf/ANTqauLG/DD1P1fwp/5GGbf9eY/+lH93leeft4UAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAMlljhjkmmkSKGJHlllldY44o41LvJI7kKiIoJJJAAFAN21exxv/AAsr4c/9 D/4K/wDCq0L/AOT6dn2MfrOH/wCf8P8AwJf5h/wsr4c/9D/4K/8ACq0L/wCT6LPsH1nD/wDP+H/g S/zD/hZXw5/6H/wV/wCFVoX/AMn0WfYPrOH/AOf8P/Al/mH/AAsr4c/9D/4K/wDCq0L/AOT6LPsH 1nD/APP+H/gS/wAw/wCFlfDn/of/AAV/4VWhf/J9Fn2D6zh/+f8AD/wJf5h/wsr4c/8AQ/8Agr/w qtC/+T6LPsH1nD/8/wCH/gS/zLdh468E6rdw6fpfjHwrqV/csy29lYeIdJvLu4ZUaRlhtre7kmlZ Y0LEKpwAT0FFn2HGvRk1GNaLk+iaOqpGoUAFABQAUAFABQB+X37T3/BObw98Rr2/8cfBe50vwT4t u2e51Twpdxta+DdduTlnudPayglk8NancHO8JFJZzvglIGMkr/lXFXhrhsyqVMfkkoUMY9ZU3pTm +6svck+tk4t9I6t/jXGPhPhc2qVcy4enDD46WsqT0pTfeNk/ZyfWycG+kdZP8d/iL8BPjH8J7m4g 8ffDrxPoEFszBtWfTpb7w9KFJBa28R6b9s0K5XjJ2XDEAjIGRX4vmXD2dZRKUcwy2rTivtct4fKc bwfyZ+C5twzn+STnHNMprUox+1ytw+VSN4P5SPIq8c8E7fwd8NPiH8Q7tLLwN4I8U+LLh3CEaDoe o6lDEc4LXNzbW721pEuPmeV0RR1IruwWV5lmU1TwGBq1pf3IuX3tKy9Wz0svyjNc1mqeW5dWrz/u QlJL1aVkvNtI+lLz/gn9+1laWkN2Phct2skKTSQ2fjDwNLd2xcR4hmtm8SRzSTKXwREJQNpycc19 PPw74vhCM/7Kumr2VSldeTXPe/pc+uqeF/HFOEZ/2NzJq9lVotrya9pe/pc+fvGvwb+LHw5DP46+ HPjLwtbqQv2/WPD+pWuluSwQCHVWtzps+XIHyStyRXzuOyTN8su8fltelHvKElH5Styv5M+XzHIM 7ym7zLKcRRh/NOElH5Styv5M81rzDxwoAKACgDV0fXdc8PXiahoGs6rod/GVKX2j6jeaZeIVO5Sl zZTQTKVbkYbg1rRxFfDTVTD1506neLcX96aZvQxOJwtRVcLiJ06q6xk4v700zsfFPxg+K3jjRbXw 54z+JHjjxZoVldJfW2l+JPFGs63aRXkccsUVyI9SvLndNBFM6Rk5MasQuAcV24vOc3x9CGGx2Z16 2Hi7qM5ykr9/eb2vp26Hfjc+zvMsPDCZhm+Jr4aMrqNSpOaT2T95vVJtLt0POa808kKACgAoAKAC gAoAKAP3b/4J4/sox+BdDs/jn490wf8ACaeJdP3+CNOvIsy+F/DOowEHV2jkH7jW/EdpLhTgSQWD 7MgzzIP33w44RWAw8M+zCl/t1WP7qL/5dwa+LylNfNQ0+00f0r4VcErLcNT4kzOj/wAKFaP7mLX8 OnJfF5TqL5qDt9qSP1Lr9YP2gKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgD8/v8Agq1eXen/APBNb9uS9sLq4sr21/Zl+LU9rd2k8ttd W08fhPUGjmguIWSWGVGGQykEHpWlH+LT9UeDxQ3Hh3OpRbUlhp/+ks/ykv8AhZXxG/6H/wAa/wDh Va7/APJ9exZdj+XvrOI/5/z/APAn/mH/AAsr4jf9D/41/wDCq13/AOT6LLsH1nEf8/5/+BP/ADD/ AIWV8Rv+h/8AGv8A4VWu/wDyfRZdg+s4j/n/AD/8Cf8AmH/CyviN/wBD/wCNf/Cq13/5PosuwfWc R/z/AJ/+BP8AzD/hZXxG/wCh/wDGv/hVa7/8n0WXYPrOI/5/z/8AAn/mH/CyviN/0P8A41/8KrXf /k+iy7B9ZxH/AD/n/wCBP/MP+FlfEb/of/Gv/hVa7/8AJ9Fl2D6ziP8An/P/AMCf+Z/qDf8ABCzU L/Vf+CT/AOxxqGqX15qV/c+C/GjXF7f3M15d3DL8WviDGrTXNw8k0rLGgUFmOAAOgrycR/Gn/XQ/ pXgmUpcLZRKUm5OEtX/jkfrRWJ9Uf57P/B2P/wApFfgx/wBmV/Dr/wBXn+0bXpYP+FL/ABfoj8E8 U/8AkoMH/wBgcP8A05VP5gq6z80CgAoAKACgAoA/rn/4NG/+Ti/2u/8Asivgf/1Opq4sb8MPU/V/ Cn/kYZt/15j/AOlH93leeft4UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAf zjf8HI3/AAUJP7Kf7I3/AAzr8PdcWy+Nv7WFpq3hSSSwvVi1bwd8FbURW/xF8RlIvMmtZfF8dwvh 2yMix+bDeX80EgmseOrC0uefM/hj+Z+e+Imf/wBl5V/Z+HnbG4pOOj1jT+2/+3vgXrJp3if5ytem fz2FABQAUAFABQB/ax/wa2f8E5vKj8R/8FF/ip4fxLL/AG58Of2ZbbUYPmSErPo3xN+KlkrZx5+6 bw1psuQdo1YMm1oJK4MXV2pJ+p+yeGXD1vacQYqnrrCjf7pzX/pC/wC3/I/tLrhP2IKACgAoAKAC gAoAKACgDn5fCXhWe7S/m8M+H5r6IOI72XRtOku4xJv8wJcvbGZBJ5jbsNzuOeprmeDwkpqpLC03 UXXljf77XOWWBwUqiqywdJ1V1cI3++1zdjjjhjjhhjSKKJFjiijVUjjjRQqRxooCoiKAAAAABXQk opRirJHSkopRirRWyH0xkcsUVxFLBPFHNBNG8U0MqLJFLFIpSSKWNwySRyIxDKQQQcGk0pJxkk4t aoUoxlFxkk4tWaezR8b/ABg/YQ/Z9+LMdzdxeGF+H/iWYtIviHwIlvo4eZjuLahoIifQL9ZX5kb7 PHcvk4mUnNfFZzwBw5nClNYX6vin9ulaOvnC3I/PRPzPgM+8NOFs8U6iwf1XGP7dG0Nf70LckvP3 VJ/zI/Hv4/8A7Cnxk+ByXuu2tovxD8B2qyzSeKfDNrObrS7WPLGbxH4eL3F/pKJGpd5omurONR88 6kha/GOIuAc6yFTxEIfWcvWvtIJ3iv78NXHza5orrJH4LxR4a5/w2qmJhD61lkdfaU07xXepDWUf NrmguslsfFNfDn54FABQAUAFABQAUAFABQAUAFAH3L+wj+zevx1+KI1vxLYmf4cfD2Sz1fxDHPFm 11/VndpNE8LkurRzQXUsDT3q4YfZIjG20zxtX3nAHDKz/Nfb4qnfLMM1Kd9py+zT807Xl/dVtOZM /SPDThJcS5ysTjKd8pwrUp3Wk5fYp+abV5r+VWduZM/pAAAAAAAAAAAwABwAAOAAK/pk/rXYWgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKAPz1/4Ky/8ozf26/+zYPi7/6iWo1pR/i0/VHgcVf8k3nf/YNU/wDSWf5M1eyfywFABQAUAFAB QAUAf6l//BB3/lEn+xj/ANiV42/9W78Q68nEfxp/10P6b4H/AOSVyf8AwS/9OTP10rA+rP8APZ/4 Ox/+UivwY/7Mr+HX/q8/2ja9LB/wpf4v0R+CeKf/ACUGD/7A4f8ApyqfzBV1n5oFABQAUAFABQB/ XP8A8Gjf/Jxf7Xf/AGRXwP8A+p1NXFjfhh6n6v4U/wDIwzb/AK8x/wDSj+7yvPP28KACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA5nxr4z8LfDnwd4r+IHjjXLDwz4L8D+HNa8XeLf EeqSmHTdB8NeHNNudX1zWL+UK7R2em6bZyzSEAnYhwCeKaTbSW7M61alh6NWvXmo0YRcpN7JJXbf oj/Jx/4KUftseJ/+CgH7YPxV/aL1o6jaeG9W1EeGPhR4Z1GRWk8G/CXw1NdW3gvQDFG8kFve3EE0 upaisTGJ9W1C7kU4evYpU1ThGPXr6n8s8RZzVz7NsVmE7qm3ywT+zBfCvXq/7zZ8IVoeGFABQAUA FAH2d/wT+/Y08c/t7/tXfCv9mzwUt7Z2/izV11Hx94qtLZbmPwF8MNDkivPHHjO687baK+maSTFY xzvHHearcWtoG8y4QHOpNU4OTPYyHJ6+e5phcuo3Sm7yl/LBfFL5La+8ml1P9Zb4VfDDwR8FPhp4 D+EXw20O18NeAfht4U0PwX4R0OzRVi0/QvD+nwadYROyqhuLp4YA88zZknnZ5HJd2J8dtybk92f1 PhcNRweGoYTDwUaFOCjFdklZf8Hud/SNwoAKACgAoAKACgAoAKACgAoAKACgAoAKAPzo/aZ/4J7+ AviyuoeLPhiun/Dv4hOr3E1rBb+R4N8TXGCzDUdOtUP9iahO2M3dohRmy0sEjsZF/NeKPDnL84VT GZXy4bMd2krU5v8AvJfC3/NFesW3c/KOMPCzLM8VXHZOo4TNXq0lalUf96K+CT/mirfzRbdz8Jfi B8O/Gnwt8T3/AIO8e+H7/wAOeINOb97Z3seEngZmEV9YXUZe11HTrnaTFPC7xOAcNkHH4FmOW47K cVUwWYYeVLER6Pqu6ezT6NXTP5qzTKswyXGVcBmeFlSxUN0+q6OL2lF9JJtM4quE84KACgAoAKAC gAoAKALVlZXepXlpp1hbTXl9f3MFlZWltG0txdXd1KkFtbQRIC8s080iqqgEsxAFVCE6s4U6cXKp JpJLdt6JLzbLp051akKVKDlUk0klq227JJdW3sf1P/sy/Bax+Avwd8K+A44oP7bFsNZ8Y3sO1v7R 8W6pFFLq0vnLxPBY7Esrd+N1rax5Gc1/WXC2R0+H8lwmXpL29uao11qS+L1S0iv7sUf2nwfw9T4Z yDBZYkvrNueq19qrKzlr1UdIRf8ALFHvtfQn04UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB+ev/BWX/lGb+3X/wBmwfF3/wBRLUa0 o/xafqjwOKv+Sbzv/sGqf+ks/wAmavZP5YCgAoAKACgAoAKAP9S//gg7/wAok/2Mf+xK8bf+rd+I deTiP40/66H9N8D/APJK5P8A4Jf+nJn66VgfVn+ez/wdj/8AKRX4Mf8AZlfw6/8AV5/tG16WD/hS /wAX6I/BPFP/AJKDB/8AYHD/ANOVT+YKus/NAoAKACgAoAKAP65/+DRv/k4v9rv/ALIr4H/9Tqau LG/DD1P1fwp/5GGbf9eY/wDpR/d5Xnn7eFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAfyTf8AB0b/AMFCT8MvhF4V/YM+GmuLF43+NlvbeNfjfcadeqLvQfhFpV+3/CO+ELpIP31v cfEfxPZGeYF0YaZpDxSRvDqCsOzCU7ydR7Lb1PyrxMz/AOrYSlkeGn++re9Us9qaekf+35K/pG20 j+DWvRPw4KACgAoAKACgD/Rm/wCDcD/gnOv7Jv7Kv/DSfxH0NbT47ftV6VpHiKGO/tBHqngb4Ip/ xMfAXhdDMGnsrzxj5o8QakqGPzUm06CeMTWGa8zFVeefIvhX5n9B+HnD39lZX/aOIhbHYpJ67xp7 xj5c3xv1imrxP6Pa5T9DCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDxP45fAH4dftA+FJPDP jvSw1xAsr6D4ksRFD4g8N3si4+1aZesj5hcgedbSh7ecAb0LKrL4WfcPZbxFhHhcwpe8vgmtJwfe L/OLun1W1vneJOF8p4owTweZUfeV+SpHSdN94vt3i7xfVXSa/nL/AGiP2a/iB+zl4rOieKrb+0fD +oSzN4W8Z2EEy6L4gtEO7ZucN/Z+s20TL9qspGLxMco0sLRyv/NXEnDGY8NYv2GLjzYaTfs6iT5Z r9JL7UXqujas3/J3FfCOacJ436vjYc+Fm37OrFPkmv8A22a+1B6ro3G0n88184fKhQAUAFABQAUA FAH2D+wd4Pbxh+1J8NI3gWey8N3Oq+ML9niWVbdfD+kXlzpk+xuAw8QNZqrdUZgw5AB+z8P8E8bx XlacbwpOVR9bckW4v/wPl9Nz73wzwDx/GeUJxvTouVWXW3JFuL/8D5PRu5/TLX9RH9gBQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QB+ev/BWX/lGb+3X/wBmwfF3/wBRLUa0o/xafqjwOKv+Sbzv/sGqf+ks/wAmavZP5YCgAoAKACgA oAKAP9S//gg7/wAok/2Mf+xK8bf+rd+IdeTiP40/66H9N8D/APJK5P8A4Jf+nJn66VgfVn+ez/wd j/8AKRX4Mf8AZlfw6/8AV5/tG16WD/hS/wAX6I/BPFP/AJKDB/8AYHD/ANOVT+YKus/NAoAKACgA oAKAP65/+DRv/k4v9rv/ALIr4H/9TqauLG/DD1P1fwp/5GGbf9eY/wDpR/d5Xnn7eFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB47+0H8c/h/8AszfBL4n/AB9+KeqLo/gH4UeD9X8Y eIroGP7TcQabATZ6PpcUjxrd654g1KSGw0+3B3XN7cxRL8ziqjFzkordnJj8bQy3BYnH4qVqFKDk /l0Xm3ol1bSP8kn9rb9pfx9+2H+0f8Xf2kviXcvL4p+Kvi6+182H2h7m18N6DEseneE/B2mSyKjt pHg7wvZWemWpYB2gtVZ8uWJ9mEFCMYrZH8q5rmVfN8xxeY4l/vas27dltGK8oxSS8kfOlUecFABQ AUAFAH7Rf8EMP+Cdkn/BQD9svQovGmiz3v7PXwI/sv4l/Gu5kgZtM1xYL2Q+CPhjNMUaIz/EHXLB xcxEqz6JYaiyMsiJnDEVfZw0fvPY+x4J4f8A7eziCrQvgKFp1Oz192H/AG+1r/dUup/p/RRRwxxw wxpFDEiRRRRIsccUcahEjjRAFREUAAAAACvJP6VStoth9ABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAcN8Rvhx4N+K/hHVPBHjvRbbXNA1WIrJBOoFxZ3IR0t9T0y6wZtP1SyMhaGeMh0JI5U sDwZnlmCzfB1cBmFBVMPNbPdPpKL6SXRrVHm5tlOX55ga2XZlh1Uws1s90+koveMl0a1Xofyq/Ff 4ba/8IviH4r+HXiSJk1Pwxqs9kJzG0UWpWDYn0rWLVWJP2PV9NliuIsnISQA4YED+Ss3yzEZNmWL y3FL97Sm1f8AmW8ZLylGzXqfxTneUYrIs1xuU4uP76jNq+3NHeMl5Si1JeTPPK848oKACgAoAKAC gD9y/wDgl/8ABK68N+EvEnxr1y0a3vfHMY8O+EllVkmHhXTb0T6rqAVo1Ig1rWrWJY+fmWxDgbXU n958KsinhcHic8xELVMQuSn/ANe4u8n6Sklb/Bfqf0h4N8OzwmBxfEOJhapiV7Olff2cXeUvSc0r eUL7NH6t1+uH7aFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFAH56/8FZf+UZv7df/AGbB8Xf/AFEtRrSj/Fp+qPA4q/5JvO/+wap/ 6Sz/ACZq9k/lgKACgAoAKACgAoA/1L/+CDv/ACiT/Yx/7Erxt/6t34h15OI/jT/rof03wP8A8krk /wDgl/6cmfrpWB9Wf57P/B2P/wApFfgx/wBmV/Dr/wBXn+0bXpYP+FL/ABfoj8E8U/8AkoMH/wBg cP8A05VP5gq6z80CgAoAKACgAoA/rn/4NG/+Ti/2u/8Asivgf/1Opq4sb8MPU/V/Cn/kYZt/15j/ AOlH93leeft4UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH8Q/8AwdOf8FCTrGv+ D/8Agnh8NNcVtM8NNovxR/aMm029VluvEV1AL74ZfDXUo4dskY0TS518RXtvIXjmlvtKkAWS2Nd+ EpaOq/kfjHidn/PUo8P4afuxtOrZ9d4Qfovfa849j+NSu4/IAoAKACgAoA0tG0bVvEWsaV4f0DTL /Wtd13UrHRtF0bSrSe/1PVtW1S6istN0zTbG2SW5vb+/vJ0ihijVnkkcKoJIFG2r2LhCdScadOLl OTSSWrbeiSXVs/1Uv+CRX7AGk/8ABOz9jTwL8I72206b4v8Ai3Z8Rvj14hsts39pfErX7K1FxoNr fFna50HwFpUFvo1kUMcM/wBklvBFHLeTA+PWqe1m5fZ6H9PcKZDDh/J6GEkl9bn79V95tbX7RVor o7N2u2fp/WR9KFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAHwh+2x+yJB+0L4eg8Ve EEtLH4r+FbGWHTHmMdvb+LtHRpLn/hGdRu2KJbXMU8jyWFxIfLjlkeOTbHKZIvgOOeDY8R4aOLwS Uc3oxtG+iqR35G+jTu4N6Jtp6O6/NPETgSPFOFjjcAoxzuhFqN9FVhv7OT6NO7hJ6Jtp2Urx/na1 jRtW8ParqGh67pt7o+s6VdTWOpaXqVtLZ39jeQOUmtrq1nVJYZo2GCGANfzbWoVsNVqUMRSlCvBt SjJWaa3TT2P5TxGHr4WtVw2Joyp4iEmpRkmpJrdNPVMzazMQoAKACgD7Z/ZB/ZB8R/tDeI7TXtet L3R/hDo97/xPte5tpvEE1sdz+HPDjth57mdwEublAY7OMkkmYxxt9zwbwbieI8TDEYiEoZNCXvz2 c2vsQ7t7SktIrzsn+icB8B4virFwxWKhKnkVOXvz2c2v+XdPu3tKS0gv71k/6PdJ0rTdC0vTtE0a xttM0jSLG00zS9NsoUt7Ow0+xgjtrOztYIwEht7a3iVEUDCqAK/pijRpYelSoUKahRhFRjFaJJKy SXZLRH9aUKFHDUaWHw9NQoU4qMYpWUYpWSS6JLRGhWhqFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH56/8ABWX/AJRm/t1/9mwf F3/1EtRrSj/Fp+qPA4q/5JvO/wDsGqf+ks/yZq9k/lgKACgAoAKACgAoA/1L/wDgg7/yiT/Yx/7E rxt/6t34h15OI/jT/rof03wP/wAkrk/+CX/pyZ+ulYH1Z/ns/wDB2P8A8pFfgx/2ZX8Ov/V5/tG1 6WD/AIUv8X6I/BPFP/koMH/2Bw/9OVT+YKus/NAoAKACgAoAKAP65/8Ag0b/AOTi/wBrv/sivgf/ ANTqauLG/DD1P1fwp/5GGbf9eY/+lH93leeft4UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAQXK3L21wtnLBBdtBKtrPc28l3bQ3JjYQS3FrFc2UtzBHKQXjWaJnUEB1J3AE72dnr/AF6H 8x15/wAGvv7O3xT+I/jX4x/tTftW/tIfGf4nfEXxbrXjjxprXhO3+Hnwv0nW/EOv6nJqmpE6Vqnh v4najY6SZJnihtbfUIhbQCOOJ0SNRXX9bkkowglFH5u/DTL8ViK2MzPNMRWxNSblJx5IJtu70am0 uyT0WiPfNA/4Nnf+CUmj2xg1H4Z/FPxVKUt0F5r/AMafG1vcq0MZSSUL4Xu/Ddpvu2O6TMRUMPkC LxUvFVn1X3HdT8OOF4K0sNVk/OpL/wBtsd/d/wDBuf8A8EgbnTVsYf2W9U0+6VIEOs2nx6/aIfUn aHZ5krRX/wAVb3SA91tPmYtAo3HYE4xP1mv/AD/gv8jd+H3CbjyrLGn39rVv+M2vwPM/E3/Bsn/w Sr16Jo9L8C/GDwW5gWIT+GfjL4lupUkWbzDcqPGMXiyEzun7sgoY9nIQN81UsXWXVP5HNU8N+F5r 3aFaHpUf/t3MfIvxJ/4NJ/2SNYiuW+Ev7Tf7QvgK7l3PB/wnenfDv4n6bayNMXKJaaL4f+Fl/Lax xHYiveGUYBaRznNrGT+1BP8Ar5nlYjwqyqaf1XMsRTf95QmvwUH+J+Xvxx/4NQP20PBUd5f/AAM+ NnwR+OdhbbzDpetjxD8IfGeoAKDGLTS9Sh8X+D0diCGE/iCBV4wWydu0cZTfxRa/E+ZxvhbnFG8s FjaNeK6O9OT+T5o/fNH0t/wQk/4Ie/H/AOEf7YGvftA/tv8AwgvfhzB+zh9im+EfhfW9R0DXrPxn 8VdZju0svGukar4W1bXvD2s6D8ONMhe4jljuWH9sXdnJExa0mCxiMRGUOWnK99/Q9LgjgvH4TNp4 /OsI6aw/8OLafNN/aTi2moLXf4mrbM/tvrgP2YKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoA+Zvj7+yd8Iv2hrY3HizSH0nxdDbrb2Hjnw/5Nn4hgjiDCC2vmeOS11rT4ieIbpHMa kiJ4ixavl+IeEMm4jjzYyjyYxKyqwsprsn0kvKSdujR8fxPwPkXFUOfHUPZ45K0a0LKatspdJx8p J2+y4n5K/Ef/AIJi/HXwzc3EvgHUPDXxK0kM5tUgv4PC3iExq52/atN16eLR42MZH+r1GXJyMDjP 49mfhZn+FlJ5fUpYqj0s1Tn84zfL902fhubeDvEuDnKWWVaOModLSVOfzjNqP3VGfNWo/sh/tNaZ N5Fz8FPHkr7nXdp2kHV4cxkBv9I0mS9g2kn5Tuww6Zr5ipwbxTSfLLI8Q35R5vxjdHyNXgTjCjLl nw7iW/7seZffG6/zO48LfsEftTeKbhY/+FbSeHbXcEl1HxTrehaRbwZJAZrQ6hPrEy/KeYbWQDv1 Ge/CeHvFmLlb+zPZQ71JQil8ruT+UWejgvDLjTGzS/sh0odZVJwil8uZyfyiz9A/gl/wS+8J+G7y z1341+JY/HF5bMky+EfDi3mm+FvOQqwGpatcfZta1q2yM+WkVgpxh96kqf0XIvCrB4WcMRnmKVea 19nC8ad/70naUl5JQ87rQ/UuHfBrA4SpTxPEOMWJqLX2VO8ad/70nac15JQ87rQ/U3StJ0vQtNsd G0TTrHSNI0y2hstN0vTLSCx0+ws7dBHBa2dnbRxW9tbwoAFRFCqOgr9Yo0aWHpU6FClGFGCtGMUk klsklol5I/aKFCjhqNPD4elGnQgkoxikoxS2SS0SXZGhWhqFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB+ev/AAVl/wCUZv7d f/ZsHxd/9RLUa0o/xafqjwOKv+Sbzv8A7Bqn/pLP8mavZP5YCgAoAKACgAoAKAP9S/8A4IO/8ok/ 2Mf+xK8bf+rd+IdeTiP40/66H9N8D/8AJK5P/gl/6cmfrpWB9Wf57P8Awdj/APKRX4Mf9mV/Dr/1 ef7Rtelg/wCFL/F+iPwTxT/5KDB/9gcP/TlU/mCrrPzQKACgAoAKACgD+uf/AING/wDk4v8Aa7/7 Ir4H/wDU6mrixvww9T9X8Kf+Rhm3/XmP/pR/d5Xnn7eFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH56/8ABWX/AJRm/t1/9mwfF3/1EtRrSj/Fp+qPA4q/ 5JvO/wDsGqf+ks/yZq9k/lgKACgAoAKACgAoA/1L/wDgg7/yiT/Yx/7Erxt/6t34h15OI/jT/rof 03wP/wAkrk/+CX/pyZ+ulYH1Z/ns/wDB2P8A8pFfgx/2ZX8Ov/V5/tG16WD/AIUv8X6I/BPFP/ko MH/2Bw/9OVT+YKus/NAoAKACgAoAKAP65/8Ag0b/AOTi/wBrv/sivgf/ANTqauLG/DD1P1fwp/5G Gbf9eY/+lH93leeft5+Pf7cv/Bcj9gb9ha61Lwj4q+Ik/wAYPjBpzz2tz8IPgkNM8YeIdFv4Qyta +Ndek1Kx8HeCJoJ9gmtL2/GrIjiRLKVQa3p4epU1StHuz5LO+NciyRypVcR7bFr/AJd07Saf953U Y+ab5v7rP5b/ANpX/g6t/bT+I099pv7N3wz+F37N3h2VZEs9Z1O2Pxl+JELByI7ldW8T2GlfD+JX jAJgfw1cbGOPNcDnrhg6a+Jtv7j8zzHxQznEOUcuw1LD0+7/AHk/vklD5cj9T8ePid/wVh/4KUfF +4uJ/G37bf7RXlXbFrnTPB/xG1r4aaDPmZpwkvhz4azeEtAeJJWyqG22JtUKAEXGyo0o7U0fI4ni niLFtutnOI16Rm4L7ocq/A+Zp/2mv2kbqea5uf2g/jfcXNxLJPcXE/xX8eSzzzyuZJZppZNfaSWW WRizMxJYnJq+SP8AKjzXmWYttvH1m3/fl/mdr4U/bj/bU8CyW0ngv9rz9p3wobNpGtl8PfHr4p6R FF50nmzoILHxVBCYrmTmVCpSTJ3A5NJ06b3gvuN6WdZzQt7HNsTC3arNflI+5/hL/wAF8/8Agq58 IpoBZftVa94+0qJ4Xn0X4teFfBPxGhvlhSONYp9c1/w9N4ygR0jw/wBm1OBnJLElzurN4ejL7B7W E464owjXLmkqke1SMZ3+bXN90kftZ+zN/wAHbPiC3utM0b9sH9l/S9S05vLj1Px/+zxrdxpup2yo I0M8fww+IWpX1jqk83zO5XxRYIpGFjwcLhPB/wAk/v8A8/8AgH2WW+KtROMM2yxOPWVJ2f8A4BNt P/wNH9Pf7Hn/AAUx/Yo/bssID+zp8cvDPiPxZ9g+36l8LdfaXwh8V9GjihE1/wDavAfiFbLWdSs9 LJ2XF/pq3+lh/uXLqVY8k6VSn8UdPwP0rKOI8mzuK/s/GxlVtdwfuzXf3XZu3Vq8fM+8azPcCgAo AKACgAoAKACgAoAKAPzK/bH/AOCv/wCwF+w3Lqeh/GX446Rq/wASNL8+Kb4O/C2NPiJ8T4r6CIzf 2ZrOi6NcDS/BV7OmPK/4SG+0iKTcMPg5rWFCpU1jHTufN5vxbkWSOUMZjU8Qv+XcPfnfs0tIv/G4 n80/7Rv/AAdtfEnUp9Q0v9k79l3wj4T08PJDYeM/j1r2qeMdZurZy6reHwH4EvvCel6FqEcZDIj6 7q8CyDLCRcoeqODX25/cfnOYeKuIk5RyrLIQj0lVbk//AAGPKk/+3pI/Gv4rf8F6/wDgq58Wpbka j+1l4m8E6ZNK0kGj/Cnwx4H+G0VgjCQCC21rwv4bsfFs0SiQ4NzqVw/AJYlQRusPRj9g+QxXHPFO Lb5s1lCPaEYwt84pS+9s+H/FH7cP7afjcznxn+17+0/4s+0+V9oXxJ8fPirraTC3cSW6vHqXiu5Q pbuAY1xtQj5QK0VOmtoL7keLVzrOK9/bZtiZ371Zv85HD/8ADSf7Rf8A0X341f8Ah0/HP/y9p8sf 5UY/2jmH/QdW/wDA5f5npPhj9vf9ubwXJbS+Ev2y/wBqnw2bSC2tYI9G/aC+LGn2y2dm0TW1g9pb +LEtZtOi8hALd0aEqoBUjik6dN7019yOilnud0beyzjFRt2qzXy+LbyPtH4V/wDBe3/gq78J5rX+ z/2sfEvjbTYHjafR/ip4W8C/EeG/jjSJPJutZ8TeGrzxZCjrCNzW2owSElm3bmYnN4ei/sHs4Xjn inCtcuaynHtOMZ3+clzfc0frj+z5/wAHa3xw0Oez079qD9mP4c/ETTC8cNz4m+Dev678NvENrbgn zL2bw74rl8f6Jr97jA8mK70aI9dy4wcZYOP2Jtep9VgPFTGwajmeW06ke9NuD9bS5k384n9Ff7IP /BdT/gnH+2LNpmgeGvjPF8IPiPqctva23wy+P8Fj8NvEF3fXbCG1sdF8QT6nqPw88S397c5jgtNO 1q5vnO3MCl0Dc08PVhq43XkfoOU8bcPZu406eM9jiH9iraDv2Tu4NvolJvyP2DrA+tCgAoAKACgD 8pv+Ctf/AAU5/wCHW3wX+G3xe/4Uj/wvP/hYXxQT4b/8I9/wsn/hWX9kb/CniLxP/bP9rf8ACA/E L7fj+wPI+z/ZoP8AW7/N+XY21Gl7aTjzWsj5firiT/VnB4fF/Uvb+0q8lufkt7rle/LO+1rWXqfg N/xGBf8AWPH/AM21/wDyZq6PqX/T38P+CfCf8RZ/6kH/AJX/APuIf8RgX/WPH/zbX/8AJmo+pf8A T38P+CH/ABFn/qQf+V//ALiH/EYF/wBY8f8AzbX/APJmo+pf9Pfw/wCCH/EWf+pB/wCV/wD7iH/E YF/1jx/821//ACZqPqX/AE9/D/gh/wARZ/6kH/lf/wC4h/xGBf8AWPH/AM21/wDyZqPqX/T38P8A gh/xFn/qQf8Alf8A+4h/xGBf9Y8f/Ntf/wAmaj6l/wBPfw/4If8AEWf+pB/5X/8AuJ9dfsHf8HLP /DbX7W3wY/Za/wCGLP8AhWX/AAt3W9b0f/hOv+Gjf+Ez/wCEe/sfwj4h8VfaP+EY/wCFD+FP7W+0 /wBg+Rs/tC22ebv3Nt2NFTC+zhKftL28v+CetkfiN/bOa4PLP7G9n7WTXN7XmtaLlt7KN9rbo/qY rkP00/J/9v8A/wCCzP7FH/BPMXPhr4k+M7r4h/GgWvn2fwN+FQsPEXje2MiK1tN4xu5r208PfD+y l82NwNUuor6a3Yy2tpchSK2p0KlXVK0e58tn3GGTZBeniazqYy38OFnL/t7W0V/id2tUmfyP/tP/ APB0j+3l8Wb3UdO/Z68P/Dn9lzwhL50Vhcabo9j8VfiUIJJnydQ8V+O9Ll8I7zahVU2fhu0licuy yk+WY+yGEpx+Jtv7j8pzLxMzzFSlHAU6eFpdLJTn85SXL90F6n46/EP/AIKT/wDBQT4q3E8/jv8A bS/aa1iG4V1l0q3+M3jvQvDuJVuElMfhfw9rWleHIGkiunjYpaqWibYfkAA3VKmtqa+4+SxHEWfY pt184xLXb2kkv/AU0vwPEl/aV/aNRldPj/8AGxHRgyOvxV8dKyspyrKw14FWUjII6VXLH+VHF/aO Yf8AQfW/8Dl/mfTHwq/4Kuf8FJPgvfW994D/AG1/2hkFrL50Gl+MPiJrHxO8NJIXaVz/AMIn8TZf F/hh1lkcs6tZlZCcsDUOjSlvTX5fkelheKOIsHJSoZziNOkpua/8BnzR/A/vQ/4IHf8ABQf4/wD/ AAUN/ZY+Ifjz9o2TwfqPjj4ZfFuX4bW/iTwn4dHheXxPpKeDPC3iWPVfEWlWt5LoceufbNdljZtO trC0MSIBbqwZn8/EU40ppR2aP3HgXP8AH5/lmIr5hyOvSq8l4rl5lyxd2tr69El5H7n1zn2x/Jl+ 1n/wdE/8Mu/tM/Hb9nT/AIYb/wCE5/4Ur8UPF/w3/wCEx/4aY/4Rn/hJf+EV1e40r+2f+Ee/4Z+8 Qf2N9v8As/mfZ/t135WdvmvjJ7IYTnhGXtN12/4J+WZr4l/2ZmWOy/8AsXn9jVlDm9ta/K7Xt7J2 v2u/U+ev+IwL/rHj/wCba/8A5M1V9S/6e/h/wTz/APiLP/Ug/wDK/wD9xD/iMC/6x4/+ba//AJM1 H1L/AKe/h/wQ/wCIs/8AUg/8r/8A3EP+IwL/AKx4/wDm2v8A+TNR9S/6e/h/wQ/4iz/1IP8Ayv8A /cQ/4jAv+seP/m2v/wCTNR9S/wCnv4f8EP8AiLP/AFIP/K//ANxD/iMC/wCseP8A5tr/APkzUfUv +nv4f8EP+Is/9SD/AMr/AP3EP+IwL/rHj/5tr/8AkzUfUv8Ap7+H/BD/AIiz/wBSD/yv/wDcT+hP /gk3/wAFIf8Ah6F+zp40+P3/AApr/hR3/CIfGrxH8H/+ET/4WJ/wsz+0P7A8DfDjxp/wkX9u/wDC C/D/AOyfa/8AhYH2b7J9il8v7J5nnN5uyPmrUvZSUea+lz77hbiL/WXL62P+p+w5Kzp8vPz3tGEr 35Y/zWtbpvqfp/WR9KFABQAUAFABQB8i/tRft6fsf/sYaV/aX7S3x+8AfDC6lsjqOn+Fb/UpNY+I GtWeZEW50L4d+HINY8b6zavLEY/Ot7CSFX4Z1q4U51Pgi2eTmeeZTk8ebMcfTpO11Fu8mvKCvJ/J H8437SX/AAdo/BPw1PqOi/sq/s1+N/ilcRtLbW3jj4ueIbH4Z+GRLG/yalp/hPQbbxj4l1/TZ1GF jurnQbkbtzKu3Y3VHByfxzt6H57mPipgqblDK8unVf8ANUagvVRXM2vVxZ+LHxj/AODmf/gqT8Tp rtfB3jX4U/AXTblJLdbH4VfCnQtSnS2dWiOdW+LkvxQ1OK9eJstPbSWzLJ88Qi4C7xwtFbpv5/5H x2L8R+JsS37GtSoR7Qgn+NTnd/NW8rH54eOv+CqX/BST4jSXD+KP24/2nvKu1mS6sPDnxg8ZeB9I uYp40jlgn0XwRqnh7SJbd0THltAYxkkDLHOqo0ltTX3HgV+J+IsRf2udYmz6KpKK+6LS/A+ftS/a o/ae1m7k1DWP2jvjzq1/Ksay3upfF/4g313IsSCOJZLm68QyzOscahVBY4AwOKrkgtor7jz5ZnmU 3zTzCu5d3Um/1ILT9p/9pWwuoL2w/aG+OVle2sqT2t3afFrx9bXVtPGQ0c0FxD4gSWGVGGQykEHp RyR/lQLMsxi1KOPrqS/vy/zPbvBv/BTH/goh4Bmt5fC37cP7VdlDasWg029+O3xI13QkY3UV67Hw 9r/iLVNCdpbiIFy1ud6s6NlHdWl0qT3px+47aPEfEFBr2WdYpJdPaza+5tr8D71+EX/Bx5/wVb+F k9mur/Gvwl8ZdIsljSPQvi78LfBeoQSojhmF54g8D6d4D8b3rSgbWeXVXfB+VgcGs5YWi/s29D3M J4hcUYVrnxkK0F0qQi/xioy/8mP2k/Zs/wCDtrwjqM9jo37W/wCy3q/hoSPDHd+PvgH4kh8R2KtN tjaWX4a+OpdG1CwsrR/3kkkXiPUJ2jYhIGdAJcJYN/Yn959jl3irSk4wzXLHH+9Sd1/4BKzS/wC3 2/Lv/TH+yh/wUB/Y8/bd0Y6r+zR8d/BXxE1C2skv9Y8FJeS6B8SPDtufKWSbX/h34jh0rxhp1lFc SeSLw2ZsZpVYQzyAZrknTnT+OLR+j5Xn2UZ1Dmy3HQqSSu47TXrB2kl52t2bPseoPXCgAoAKAOU8 bePPA/w18N6h4x+I3jPwp4A8IaQgl1XxV428RaR4V8N6ZG2QJNQ1zXbyw0yyQkcGSVRTSbdkrsyr V6GGpyrYitCnSW8pNRS9W7JH4p/tE/8ABxn/AMEv/gHJqOmaL8VfEv7QfibT98baL8BPCc/ibTnn 3FIxF478S3nhD4d39qW+Z5bHVbzbGCQrNtRt44WrLpZeZ8bmHiDw1gXKMMVLEVF0pRuv/Anywfyk z8W/jT/wdz+Nrpryz/Z2/Y+8LaIiriw8R/Gn4g6t4padic+ZeeC/A2neDxaqo42Jr827ruHSt44J fan9x8djPFas7rL8pjHs6k3L/wAlio/+lM/MX4m/8HKv/BVv4gS3v/CP/Ff4c/B6zvfMVtP+GXwe 8EzRW0EsLQvb2WofE2y+JOu23DblmW7+0xvgpIpArVYWit4t/M+bxPiLxRXcvZ4qnRT6Qpx/BzU3 +N/M+I/GP/BW/wD4Kb+OZZJda/bp/aXsnlYMw8HfFLxH8O4gVnmuB5cPw/uvDMMK+ZOwIRVBjCof kRFXRUaS/wCXaPFrcV8SV3eed4lf4ZuH/pNj561v9sP9rjxMoTxJ+1N+0b4gQXDXgTW/jf8AEzVV F24cPdBb/wAT3AFw4kYF/vHceeTVKEFtBfccE83zWr/EzPES161Jv82c5/w0n+0X/wBF9+NX/h0/ HP8A8vafLH+VGf8AaOYf9B1b/wADl/mdX4f/AGz/ANsPwl5P/CK/tX/tK+Gfs119ut/+Ef8Ajr8U dG+z3vyf6ZD/AGd4ptvKuv3a/vFw/wAo54FJ04PeC+41p5xm9K3ss0xMbO+lWa/KR9M+BP8Agsh/ wVG+HLwSeH/24fj3qDW2zyx478Vr8UkbyxIq+fH8TrPxfHdZEh3eaH3EAnJVcS6FJ700elQ4u4mw 9vZ51Xdv5pc//pfMfoh8HP8Ag6M/4KVfD6a0i+JEXwO+PWmqkcV+/jP4cjwdr9wqKoa4stT+Feqe CdEsb2V0yzSaXcwYZgsI+UplLCUntdf15nv4TxM4jw7SxCoV49eaHK/vg4pP/t1ryP2p/Zu/4OwP 2WPHEmm6P+018DPiZ8BtTuXS3uvFPgq/svjF4CtSGVX1HUUgs/CPjrTrV1y/kWmkavLH93dJ96sJ YOa+CSf4H2WXeKWV1+WGZYKpQk/tRaqR9X8Ml6KMj+iz9nD9sD9mH9rvwy/i39mv44fD74vaTbxQ y6nB4V1uJvEWgC4wYI/FPg/UEsfFvhO4mDArFqVjaykEYWuWUJwdpxaP0DLs2y3NqftcuxtOrDry vVf4ou0o/NI+kKk9EKACgAoAKACgD89f+Csv/KM39uv/ALNg+Lv/AKiWo1pR/i0/VHgcVf8AJN53 /wBg1T/0ln+TNXsn8sBQAUAFABQAUAFAH+pf/wAEHf8AlEn+xj/2JXjb/wBW78Q68nEfxp/10P6b 4H/5JXJ/8Ev/AE5M/XSsD6s/z2f+Dsf/AJSK/Bj/ALMr+HX/AKvP9o2vSwf8KX+L9Efgnin/AMlB g/8AsDh/6cqn8wVdZ+aBQAUAFABQAUAf1Lf8Gwfxr+FX7O/j79uf4x/Gzx14f+HPw18EfALwXqni PxX4kvVs7G0hHjuWO2s7aMB7vVNZ1S7dLaxsLWOa9v7uWOC3ikmkRG5MXFyVOMVd3P03w1xmFy+v neMxteNPDQoRbk9vi/FvZJat6JNnk/8AwVN/4OG/2gf2wdT8R/CX9l/U/FH7O/7Mpe60uW50q+/s f4wfFjTy7wveeMvEek3DXHhDw9qNv8v9g6Vc7ZIZJEvrq8RxDC6OGjDWes/wOXifj/H5vKphMslL D5bto7VJr+818Kf8sX/ib2X84NdR+eBQAUAFABQAUAFAGtoWva54W1rSvEnhnWdW8O+ItCv7XVdE 17QtRvNI1rR9TspVuLLUtK1TT5re+0+/tJ0V4poZEkjcAqQRmk0mrNaFwnOlONSnNxqRd007NNbN Napn9YP/AATF/wCDmv4ofC2/8OfB7/goK+o/Fr4YO9ppVh+0Hpli9z8WvA9uSYY7vx9pdhCV+KWg 2i+X511DFF4ijjWWZ21WZkhrjq4RO8qej7dP+AfqXDfiRicNKnhM+vVw2yqpe/H/ABJfGvNe/u/f eh/cr8N/iT4A+MPgTwv8Tvhb4v0Dx98PvGukwa54V8X+F9St9W0PXNMuCyLc2V7bO8bNFNG8U0bb ZYJ43ikVJEZRwNOLaasz9rw+JoYuhSxOFrRqYeavGUXdNeT/AKs9GdvSNgoAKACgAoAKAPkX9sj9 uf8AZn/YM+GMvxT/AGkviHZeEtMuftdv4V8L2SLq3j34gavaQCZ9D8DeE4JY77Wr0eZGss7GHT7L zUe7uLeJvMq6dOdR2gjyc3zvLcjwzxWY4hQi/hitZSfaMd2/PZdWkfwVf8FEf+Dij9sL9r+91vwL 8DNV1X9lT4BXDXdjHongXWJIPix4y0yT9yJfHPxLsBbanp0V3b7t+l6E1haeVO8F1JqCqstejTw0 IWctZfgfhvEHiBm+bSnQwUnhcBtaL9+S/vTWq/wxstbNy3P57pZZJpJJppHlmld5ZZZXaSSWSRi7 ySO5LO7sSSSSSTXSfBN31e4ygQUAFABQAUAFABQAUAfs/wD8E+f+C6P7bX7Bl5oXhZfF918efgDp /wBns7j4J/FbVr7U7bR9IiaMeR8NfGkwvfEnw8ntoFdbe2ha60RWkZ5NOlfay4VMPTqa2tLuj7HI eNs5yNwpe1dfAL/l3Nt2X9yWrh5LWPeLP79/+CfX/BTj9lz/AIKP/D+TxT8DfFD6f440Gytp/iH8 GfFr2en/ABJ8BTTGKFri80uG4mh1zwvPdyhLXWbB57GYsscjQ3Ikto/Oq0p0naS07n7tkPEmWcQ0 HVwVW1aK9+nLScfl1j2krr0eh+htZHvhQAUAfym/8Ha3/Jl/7N3/AGc/B/6qn4h12YP+JL0/U/L/ ABU/5E+Xf9hP/tkz+A6vRPwkKACgAoAKACgD9c/+CDv/ACls/Yx/7HXxt/6qL4h1hiP4M/66n1nA /wDyVWT/AOOX/puZ/Q1/wW8/4OCdQ+G2seK/2Qf2CfGFqvjTT/t3h34yftG6DNDeHwbqSSi21LwJ 8Ir9fOs38V2arLBqevoH/sqVjDYMt9G1zac2Hw17TqLTov8AM++4049lhp1cpyKsvbK6qVV9l9Y0 3/N0lL7O0fe1X8P+palqOtajqGsaxqF7q2r6te3WpapqmpXU99qOpajfTyXV9qGoX11JLc3l7eXM rSSyyM0kkjFmJJJr0D8XlKU5SnOTc27tvVtvdt9ylQSFABQAUAf34/8ABpT/AMmX/tI/9nPz/wDq qfh5XnYz+JH0/U/dvCv/AJE+Y/8AYT/7ZA/qyrjP1A/yZf8AgrL/AMpMv26/+zn/AIu/+pbqNezR /hU/RH8scVf8lJnf/YTU/wDSmfntWh4AUAFABQAUAFAH+hN/wacf8o6vjP8A9nqfEX/1Rn7OVebj P4sf8P6s/fPCz/kn8Z/2GT/9N0j+n2uQ/SgoAKACgD5o/aq/bA/Z1/Yq+GF/8XP2kPiZofw88K26 3EWk215KbvxN4w1aCJZV8PeCPC9mJda8U65NvXMNrE6wI3mztDAryrcISqPlirs83NM2y/JsNLF5 jiY06XTvJ9ox3k/Tbd2Wp/Dr/wAFBP8Ag5v/AGm/j5da74A/Y4sLz9mD4SSXEltB46drO/8Aj94o 09DhJptZhlvtB+GsV3gObfR/tOowMuF1VkZkPfTwkI2c9Zfgfi2feJGZY5zoZRF4bCX+LR1ZL11U PSN2v5j+ZfxH4l8R+Mde1bxT4u1/W/FXifXr2bUtc8R+I9Vvtc17WdRuW33Goatq+pz3Woaje3D8 vLNI8jnkk11JJKyWh+cVKlStOVWrUlKpJ3bbbbfdt6tmLTMwoAKACgAoAKACgAoA6Pwj4w8WfD/x NovjTwJ4n8QeDPGHhu/h1Tw94p8K6xqGgeItD1KDPk3+kazpVxa6jp15FuO2SKRHAJGeaTSas1oa 0q1WhUhWoVJQrRd1KLaafdNao/v5/wCDdb/gqx+0t+3OnxX+Av7Sk+i+Odc+Cfgrw54n8P8AxgS3 Gk+M/EmmarrU+hto3jexsYk0TWtRsgqNFqcEVnPKiEXKXEzNcHzsTRhTtKHV7H7t4f8AFGY539aw OYuM50YKSqbSabtaSWjf95Wfe71P6h65D9LCgD+J3/gpX/wc6fGLwb8Tfij+z5+xh8L9I+Hdz8Nv Gvi/4ceIvjV8VrSw8XeKrvXvB2u3/hzVr3wJ4BguLjwdolkmq6VI1tdazJrZu7WQGSxtJeF76WEi 1GU3e/Q/GuI/EnF0cTicBk+GVN05yg6k7SleLabjH4UrrRy5rr7KZ/Jl8eP2nP2hv2oPFDeMv2hf jP8AEb4weIVeZ7S68deKdU1u10dJyGltfDukXE/9jeGtPJGRbafb21uvZBXZGEYK0YpI/LMdmWYZ nV9tj8ZUrVP70m7ei2S8kkjwuqOEKACgAoAKACgAoAKACgAoA7L4f/ETx98KPF2i+P8A4YeNvFfw 78c+HLpb3QPGHgnxBqvhfxLo12oK+fput6LdWWo2bshKtskG5SVOQSKTSkrNXRtQxFfC1YV8NWnT rxd1KLcWvRrU/rJ/4Jx/8HRHxE8F3mgfCz/goZpD/EjwYz2+m2/7RHgvRrWz+InhyEskEV18QPBW j21ro/jnS7WMgzXmlw2WrpFGztBqdw9cdXCJ3dLR9j9T4e8S8RRdPC5/D2lHb2sVaa/xRWkl5xtL ykz+2n4W/FX4b/G7wB4Y+Kfwi8b+G/iN8OvGWnLqnhjxj4S1W11jQ9Xs/Mkt5vIvLV3WO6sruGS3 ureQJcWlzFJDMkcsbovA04tqSsz9mwuKw+NoUsVhK0amHmrxlF3T/wCG2a3T0ep39I3CgAoAKAPz 1/4Ky/8AKM39uv8A7Ng+Lv8A6iWo1pR/i0/VHgcVf8k3nf8A2DVP/SWf5M1eyfywFABQAUAFABQA UAf6l/8AwQd/5RJ/sY/9iV42/wDVu/EOvJxH8af9dD+m+B/+SVyf/BL/ANOTP10rA+rP89n/AIOx /wDlIr8GP+zK/h1/6vP9o2vSwf8ACl/i/RH4J4p/8lBg/wDsDh/6cqn8wVdZ+aBQAUAFABQAUAX4 dV1S306+0e31K/g0nU7iwu9S0uG8uItO1C70tbxNMur6ySRba7uNOXUbgQPIrNCJ5NhG9shSlJRl BSfI7XXR22uvK7t6lCgkKACgAoAKACgAoAKACgAoA/Yn/gkr/wAFfPjF/wAE0fibbabdTaz8Qv2W /GGsrN8U/g39rRmsprwWlpc/EL4bm9ljtNF8faZaWke+Jnistat4ha3RRxbXlnhWoxqrtPufXcK8 WYvhzEqLbqZZN+/T7f34X2kvuktH0a/0yvgv8Zvhn+0N8LPA/wAafg74t0vxx8NviJoNp4i8LeJN JmEtveWV0CsttdQnFxp2r6XdxyWt9ZTrHdWN5DLbzoksbovlSi4txktUf0fg8ZhswwtHGYSqp4ap G8Wu36NbNPVO6eqPUKR0hQAUAFAH5Ff8FYf+CuPwc/4Jj/DK3F3BYfEb9o3x1pt1L8KPgzDqP2d2 gBntB49+IFxbF7vQPh9pl/EyKVC3esXMbWtntEd1dWe1GjKq+0Vuz5TinivB8N4ZXSqZjNe5Tv8A +TT7QT+cnourX+av+1B+1V8eP2yPi3rvxs/aH8f6t4/8da2xhimvHFvo3hvRUnnnsfC/hDQrfZpv hrwzpjXD+RaWyIm5nlkLzSSSP6sIRhFRirI/nTM80x2b4ueNzCu6leX3JdIxWyS6Jeu92fPNUeeF ABQAUAFABQAUAFABQAUAFAHq3wS+OPxZ/Zw+J3hb4yfBDx3r3w4+JXgy9N94f8U+HrkQXls0iNDd 2V3BKk1lqukalau0F5ZXUU1pd27tFNG8bFTMoxknGSujrwWNxWXYmljMFXlTxMHdSX5dmns07prR o/0qf+CPv/BYL4Zf8FLvhkPDviI6N4A/at8AaNbzfFD4Xw3BhsfEljCYbN/iX8NEvJpbvUPB+oXc qC8sy8t3oV3KtvcNJDJaXd35deg6TutYM/orhLi3DcR4b2dS1PNKa9+HRr+eHeL6reL0d003+0lY H2IUAfym/wDB2t/yZf8As3f9nPwf+qp+IddmD/iS9P1Py/xU/wCRPl3/AGE/+2TP4Dq9E/CQoAKA CgAoAKAPQfhd8VPiD8FfG2m/Ef4WeKdS8FeOtFsPEmn6L4p0Z44dY0eLxX4Z1jwhrNxpV28ckmna k+ha9dRwXcOy5tJXWaB45o45FTipK0lodGGxWIwdaOIwtVwrxTSkt1zJxduzs3Z7rdanAMzOzO7M 7uxZmYlmZmOWZmOSzMTkk9aZgNoEFABQAUAFAH9+P/BpT/yZf+0j/wBnPz/+qp+HledjP4kfT9T9 28K/+RPmP/YT/wC2QP6sq4z9QP8AJl/4Ky/8pMv26/8As5/4u/8AqW6jXs0f4VP0R/LHFX/JSZ3/ ANhNT/0pn57VoeAFABQAUAFABQB/oTf8GnH/ACjq+M//AGep8Rf/AFRn7OVebjP4sf8AD+rP3zws /wCSfxn/AGGT/wDTdI/p9rkP0oKACgD8dP8AgrJ/wWG+C/8AwTK8Cw6P9nsvib+0z400iW++G3wb t7/yYLKxaZrRPHPxLvrVzd+HPBUFxHKttGg+3azcwPb2oSNLq7tN6NCVV9odz5Hini3B8N0FCyq5 lNXhTv0/mm+ke3WTVl1a/wA3v9qz9rr9oH9tX4t6z8af2i/iFq3jzxjqbSW+m288j23hrwboXnyT 2nhPwN4cic6b4X8M6e0pKW1uoaWVnnuHmuZZppPThCNOPLFWR/POaZtj85xc8ZmGIc6z27RX8sVt FLsvV3bbPmurPNCgAoAKACgAoAKACgAoAKACgD+uf/g0b/5OL/a7/wCyK+B//U6mrixvww9T9X8K f+Rhm3/XmP8A6Uf3eV55+3hQB/j9/tu/8noftd/9nP8Ax9/9Wt4sr2qf8OHovyP5Mzr/AJHGbf8A YTV/9LkfMFWeYFABQAUAFABQAUAFABQAUAFABQAUAfqt/wAEuf8AgrH8e/8AgmZ8TRfeFri68e/A XxbqlpL8VvgZq+p3SaFrERks4LzxZ4MZpWtvCfxJtdMtRDDqCRvDdxIkF7FPFHD5ONajGqtdJdz6 jhninHcN4nmpN1MDN+/Tb0f96P8ALO3XrtJNJW/04f2df2h/hH+1X8GvA3x6+B3iyz8ZfDb4g6Su p6JqtsPKurWaOR7XVNC1vT3JuNH8R6BqUMtpf2cwEttdQujdAT5UoyhJxktUf0jl+YYTNMHQx2Cq qeHqK6f5pro09GujPbKk7QoAKAPz1/4Ky/8AKM39uv8A7Ng+Lv8A6iWo1pR/i0/VHgcVf8k3nf8A 2DVP/SWf5M1eyfywFABQAUAFABQAUAf6l/8AwQd/5RJ/sY/9iV42/wDVu/EOvJxH8af9dD+m+B/+ SVyf/BL/ANOTP10rA+rP89n/AIOx/wDlIr8GP+zK/h1/6vP9o2vSwf8ACl/i/RH4J4p/8lBg/wDs Dh/6cqn8wVdZ+aBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAf0X/8ABv1/wVhvv2J/jlZf s4/GfxLKv7Kvx38R2dhJd6reuNN+DPxQ1Qxabovj20ad/suneFvEc/kWHiMExRRQiDUGdRZSx3HL iaPtI80V76/E/QeA+KZZNjY5fjKn/CXXlbV6U5vRS8ovRT8rS+y7/wCjpXmH9ChQAUAfnZ/wU4/4 KJfDP/gmz+zXrfxm8Yx2viPx3rb3Phn4MfDM3otb34g+PZLRpreCdkJubPwp4fjZbvWb1VP2e1Aj Tdcz20UmtKk6s+VbdT5/iTiDDcO5dPGVrSry0pw6zl+kVvJ9F5tJ/wCWp+0H8f8A4r/tR/GLx18d /jb4rvPGXxK+Iesy6z4g1m6CwwR/IlvYaRpFhFi20jw/oenwxWlhZQhYbW1hSNAAtetGKhFRitEf zLj8fiszxdfHY2q54mo7t/kkuiS0SWy0PGqo4woAKACgAoAKACgAoAKACgAoAKACgD2X9nz4/fFX 9l34x+A/jx8FPFN54P8AiR8Otct9c0DVrZma3n8vMV/outWQdIdX8Oa9p8klnqNjNmG8s5pInBVj UyipxcZLRnZgMfissxlDHYOq4YinK6f5prqmtGuqdj/VZ/4J1/tz/Dv/AIKGfsteBf2iPAawaTqm oI/hz4m+Bhd/a7z4d/E3RoLY+JvCtzKVSS4ss3MV7ptwyo13pd5bTMsbu8aeRVpulNxZ/T/D+d4f P8soZhQ0k9Jx/kmvij6dU+sWn5H3LWZ7Z/Kb/wAHa3/Jl/7N3/Zz8H/qqfiHXZg/4kvT9T8v8VP+ RPl3/YT/AO2TP4Dq9E/CQoAKACgAoAKACgAoAKACgAoAKACgD+/H/g0p/wCTL/2kf+zn5/8A1VPw 8rzsZ/Ej6fqfu3hX/wAifMf+wn/2yB/VlXGfqB/ky/8ABWX/AJSZft1/9nP/ABd/9S3Ua9mj/Cp+ iP5Y4q/5KTO/+wmp/wClM/PatDwAoAKACgAoAKAP9Cb/AINOP+UdXxn/AOz1PiL/AOqM/ZyrzcZ/ Fj/h/Vn754Wf8k/jP+wyf/pukf0+1yH6UFAH5K/8FeP+CpPgP/gmb+z9J4ghXS/FP7Q3xKtdX0X4 EfDe8kd4LvV7a3jjvvHvi2G3eO5j8B+CZb2CW6jV4ZtSuXisoZIjLJc221Gi6srfZW58rxZxNQ4b wHtFaWYVE1Sh59ZS/uxur93aKtdtf5iHxi+MXxN+P/xN8ZfGP4x+MtZ8f/Erx/rM+u+K/Feuzia+ 1K+mCRxxxxxpFaafpun2kUdtZ2dtHFaWVpFHBBHHDGiL60YqKUYqyR/NmLxeJx+JrYzGVnUxNR3l J7t/olsktErJJJHmtM5goAKACgAoAKACgAoAKACgAoAKAP65/wDg0b/5OL/a7/7Ir4H/APU6mrix vww9T9X8Kf8AkYZt/wBeY/8ApR/d5Xnn7eFAH+P3+27/AMnoftd/9nP/AB9/9Wt4sr2qf8OHovyP 5Mzr/kcZt/2E1f8A0uR8wVZ5gUAFABQAUAFABQAUAFABQAUAFABQAUAf0Cf8EA/+Co19+wx+0jZf Bf4o6+0P7Ln7RHiDTND8WtqN04074YfES8EeleFfihaCV/s1jps85g03xC2Y1OmNHdyMx0+KN+bE 0faR5l8aPvOBOJpZJmKweJqf8JmIklK+0J7Rn5LZT/u6/ZSP9J+vLP6KCgAoA/PX/grL/wAozf26 /wDs2D4u/wDqJajWlH+LT9UeBxV/yTed/wDYNU/9JZ/kzV7J/LAUAFABQAUAFABQB/qX/wDBB3/l En+xj/2JXjb/ANW78Q68nEfxp/10P6b4H/5JXJ/8Ev8A05M/XSsD6s/z2f8Ag7H/AOUivwY/7Mr+ HX/q8/2ja9LB/wAKX+L9Efgnin/yUGD/AOwOH/pyqfzBV1n5oFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAf6Rv/AAbof8FC7r9sT9j3/hTXxH1x9T+On7KSaF4E1m91G7E+reM/hTeW1xF8 MPGNxJKEuL3UNNs9LuNC1GQmeVpNMgu7mUzX4FeXiqfJPmXws/ojw+z95vlH1PETvjcLaLvvKH2J eqs4vfZNu8j+hauY++MPxP4m8P8Agvw14h8Y+LNYsPD3hXwnoereJvEuv6rcJaaZofh/QbC41TWd Y1K6kIjtrDTdOtZJppG4SNCTwKEm2ktyKtSnRp1K1WajShFtt7JJXbfklqf5WP8AwVn/AOCh/iv/ AIKOftaeLvinJe6la/B3whcah4K/Z/8AB1351tD4f+HNlfMINcvNMaR47bxb49mgXVNWcl5Ukkit PMaCztwvsUaSpQS+11P5h4q4gq8Q5rVxV2sJC8aUe0E97fzS+KXyWyR+Y1anzQUAFABQAUAFABQA UAFABQAUAFABQAUAFAH72/8ABvZ/wUEuv2Mv21tD+G3jLW1svgP+1NeaH8MPHcd9OU0zw345lup4 PhX4+BaSOCzbT/EOpNpV9NIywR6Xq088u420JTmxNP2lO6+Jf0z7rgHPnk+cww9adsDimoSvspfY l8m+Vvblk29kf6W1eWf0Yfym/wDB2t/yZf8As3f9nPwf+qp+IddmD/iS9P1Py/xU/wCRPl3/AGE/ +2TP4Dq9E/CQoAKACgAoAKACgAoAKACgAoAKACgD+/H/AINKf+TL/wBpH/s5+f8A9VT8PK87GfxI +n6n7t4V/wDInzH/ALCf/bIH9WVcZ+oH+TL/AMFZf+UmX7df/Zz/AMXf/Ut1GvZo/wAKn6I/ljir /kpM7/7Can/pTPz2rQ8AKACgAoAKACgD/Qm/4NOP+UdXxn/7PU+Iv/qjP2cq83GfxY/4f1Z++eFn /JP4z/sMn/6bpH9Ptch+lHkvx3+N3w5/Zt+DnxI+PHxb1xPDvw5+FfhTVPF/irUyEkuPsOmw5h07 S7V5Yf7R17W754rLTrNGEt5fXEMEeXkUGoxc5KMd2cuOxuHy7B4jHYqfLh6UHKT8l0Xdt6JdW0j/ ACff28/21Pij+35+0z4+/aN+KU721x4iuhpXgnwhFdzXWkfDr4d6TLOnhTwRonmbIxBplrM013Ok cX2/U7i6vHRZLhxXr06apwUUfy3nmc4rPcyr5hinrJ2jHpCC+GK9OveTb3Z8cVoeOFABQAUAFABQ AUAFABQAUAFABQAUAf1z/wDBo3/ycX+13/2RXwP/AOp1NXFjfhh6n6v4U/8AIwzb/rzH/wBKP7vK 88/bwoA/x+/23f8Ak9D9rv8A7Of+Pv8A6tbxZXtU/wCHD0X5H8mZ1/yOM2/7Cav/AKXI+YKs8wKA CgAoAKACgAoAKACgAoAKACgAoAKACgD/AE8P+CBP7b15+2j/AME//Ay+MdV/tP4u/s93UfwM+I1x cTtLqWtW3hrS7Kb4f+ML3zQbiafxD4IuLWG6upHka71WwvZC2SVXycRT9nUdvhep/SfAudPOMhoe 2nfF4d+zn3dkuWT9Y2u+slJn7Z1gfZhQB+ev/BWX/lGb+3X/ANmwfF3/ANRLUa0o/wAWn6o8Dir/ AJJvO/8AsGqf+ks/yZq9k/lgKACgAoAKACgAoA/1L/8Agg7/AMok/wBjH/sSvG3/AKt34h15OI/j T/rof03wP/ySuT/4Jf8ApyZ+ulYH1Z/ns/8AB2P/AMpFfgx/2ZX8Ov8A1ef7Rtelg/4Uv8X6I/BP FP8A5KDB/wDYHD/05VP5gq6z80CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP1N/4I0f tny/sO/t/fBj4m6rq0umfDLxrqQ+D3xlXzvKsX+HfxBu7LT5dY1INLEps/BPiaHTdeY8tt0sqoO4 qca9P2lOS67o+n4Qzh5Ln2DxM52w037Op25J2V3/AIXaX/bp/qrV5B/T5/K//wAHRX7d9x8Ff2cP B/7GvgDX1sfH/wC0w02t/EtLKRRqWlfAnw1fCNrGZhtuLGL4keM7ZLNJEYi4sNI1O2kGyUg9eEp8 0nNrRfmfmPiZnjweXUcooVLV8TrO26pJ7eXPLTzUZLqf5/lekfg4UAFABQAUAFABQB+x37GP/BCT /god+2romj+OfCvwz0v4RfCrXYIrzSPib8dNVuvBGka3YSyIFvfDvhmz0zXPiDrtlc25MtteRaQN NuVA2XXINYTxFKm7N3fkfX5PwRn+cwhXpYZUsLLadV8qa8lZza7Pls+5+v2k/wDBoh8W5tPtZdc/ bX+HOnas6E3tlpPwc8Tazp9vJvYKlrqd5450G5vEMYUlntICGJGCBuOH11dKb+8+sh4UYtxTnnNN T7Km2vv5l+SPkb9of/g1w/4KCfCbSNR8R/CPxF8IP2ktLsIpZxoHhDXtQ8E/EW4gt4Gnnlg8N+O7 HTPDN0wVCscFtr1xdzvhY4WYgHSOLpvSSaPKzDwzz7CwlUwlSjiIrpFuM/uklH5KTfkfztePPh/4 6+Fni7XfAHxL8G+KPh/458MXr6b4j8H+M9C1Pw14l0O/jCs1pquiaxbWeo2M+xgwWSNSysGGQQa6 U00mndH5/XoV8LVnQxNGVOvF2cZJpp+aeqORpmIUAFABQAUAOVmRldGZHRgyspKsrKcqysMFWUjI I6UDP9XP/gkL+17L+21/wT9+AXxm1rUv7S+IVh4eb4Z/FqWR4mvZPiX8OGXw3ruragkBMMF14ysr a018RrgJDq0Y2r90ePWh7OpKPTof1FwnmzznIcBjJyviFHkqd+eGjb/xaS/7ePx7/wCDtb/ky/8A Zu/7Ofg/9VT8Q63wf8SXp+p8l4qf8ifLv+wn/wBsmfwHV6J+EhQAUAFABQAUAFABQAUAFABQAUAF AH9+P/BpT/yZf+0j/wBnPz/+qp+HledjP4kfT9T928K/+RPmP/YT/wC2QP6sq4z9QP8AJl/4Ky/8 pMv26/8As5/4u/8AqW6jXs0f4VP0R/LHFX/JSZ3/ANhNT/0pn57VoeAFABQAUAFABQB/oTf8GnH/ ACjq+M//AGep8Rf/AFRn7OVebjP4sf8AD+rP3zws/wCSfxn/AGGT/wDTdI/p9rkP0o/iR/4Oqv29 J73XPh5/wT48Aa2o0/RYtF+MX7QA0+5dXm1u8huH+F3gDVREyHytP0mdvEV1ayB4pWvNJnGHgGO/ B096r9EfjPifnjlPD5BQn7sbVKtu/wBiL9F77XnB9D+Mqu4/HwoAKACgAoAKACgAoAKACgAoAKAC gAoA/rn/AODRv/k4v9rv/sivgf8A9TqauLG/DD1P1fwp/wCRhm3/AF5j/wClH93leeft4UAf4/f7 bv8Ayeh+13/2c/8AH3/1a3iyvap/w4ei/I/kzOv+Rxm3/YTV/wDS5HzBVnmBQAUAFAHQ6T4R8V6/ bPeaF4Y8Q61aRztbSXWk6LqWpW0dykccr27z2dtNEk6RTIxQncFcHGCKV13NIUqtRXhSlJeSbMOe Ce1nmtrmGW3ubeWSC4t543ingnicxywzRSBZIpYpFKsrAFSMGmQ002mtSKgQUAFABQAUAFABQAUA FAH9Ov8Awau/tG3Xw0/bu8bfs/X1+0fhz9pf4T6vHY6b5xRbr4i/B9L3xz4euxESY5mtPAcnipSo Af8AehgwVWDcmLjempdU/wA/6R+leGOYPDZ5WwEpfu8TSdl/fp3kv/Jec/0Lq80/fAoA/PX/AIKy /wDKM39uv/s2D4u/+olqNaUf4tP1R4HFX/JN53/2DVP/AEln+TNXsn8sBQAUAFABQAUAFAH+pf8A 8EHf+USf7GP/AGJXjb/1bvxDrycR/Gn/AF0P6b4H/wCSVyf/AAS/9OTP10rA+rP89n/g7H/5SK/B j/syv4df+rz/AGja9LB/wpf4v0R+CeKf/JQYP/sDh/6cqn8wVdZ+aBQAUAFABQAUAFAH2P8AsV/s FftOft/fE1vhh+zb4An8S3enJaXXjDxlq80mi/Dv4eaVeySx22q+N/FslvcWulpdfZpjbWkKXOp3 /kSi0tp2jdVzqVIU1eTPYybIsyz7E/VsuoczXxSekIJ9ZS6eS1bs7J2P7PP2S/8Ag1Y/ZG+HGl6V rP7Wvj/xv+0b41MUUureFfDGqaj8KvhLbyvl5tPg/wCEfuYviXrK2zERrejWtL89VLm0hLBU4Z4u b+BWX4n7BlXhhlWHjCea154it1jFuEPTT33680b9kfrr4b/4I5/8Eu/CtgNO0v8AYd+AN1bjbiTx J4QXxlf/ACAgZ1Txfc65qZyDzmb5jyc1i69V/wDLxn1dPhHhmlHljktBrzjzP75XZ8/fF/8A4N7P +CUfxb0y5tYf2cX+FWsyosdv4q+EHj3xt4T1PT1CKhNtod9rWu+A7h3CKS11o9w2QSCCz7qjiay+ 1f1ODF8A8L4qLSy/2U/5qcpRa+Tbj98WfzL/APBQf/g2K/aE/Z50TW/ih+x94q1L9qL4eaUtxfal 8N7nRYdM+POg6XEJpvN0nS9KZ9D+Ki2lvEPNGmR6fqs0sirbaXMNzL108XGWk1Z/h/wD84z/AMNs fl8J4nKarxOHWrha1VLyS0n8rS7RZ/LrPBPazzW1zDLb3NvLJBcW88bxTwTxOY5YZopAskUsUilW VgCpGDXWfmbTTaa1IqBBQAUAFABQAUAFAH+r5/wSE/aZuf2tP+CdH7L/AMXNY1N9W8Yx+AIPh58Q b25kkl1G78c/C27ufAGu6tqrSSSs2o+Jm8Px6s7Zw636sAoYKPHrQ5Ks49Ln9ScJ5k814fyzFzle t7Pkm+vND3W35ytzfM/zrP8Agrr+1vL+2p/wUC/aD+MVjqTaj4F0/wAUy/DP4T7H32cfwy+G7y+G fD19p45eO38WXNrda9IjMxW51aUDC4UenRh7OnGPXqfz9xXmrznPsfi4yvQUuSHbkhomv8WsvWTP zWrU+cCgAoAKACgAoA/tq/4N+/8Agh94Un8JeDf28v2xPBln4k1LxJFbeJP2c/gz4q02K80HSvD8 giuNF+MXjjR7+N4NX1nWv+Pjw7p88bWtnZeVqTia4ntfsPBicQ7unB+r/Q/ZuA+C6TpUc8zeipSl rSpyWiXSpJPdveCeiVpatrl/s5rhP2AKACgD8kv+CsP/AASe+Dn/AAUr+DmpwzaZong79pbwdol7 L8GvjLFZQ22oR6hbQ3NzY+AvHt9bW0l9rfw21u+kKSxOJptJmma8s13+dDc7Ua0qUv7nVHyvFPC2 D4jwck4xhmUIv2dS2t+kZPdwb/8AAd11T/y9/iB4D8XfCzx14y+Gnj/Qr3wx45+H/ijXfBnjDw5q SCO/0PxL4a1O50fW9Ku1VmTz7HUbOSNipZWK5UkEGvWTTSaejP5pr0KuFr1sNXg416cnGSe6admv kzkaZiFABQAUAFAH9mX/AAaQ/tFva+J/2q/2TtUv1+z6vo3hr9oHwVp7PIvlXmi3dr8PfiROis5h klvrXWPDGAoWQJaMTvUfu+HGx0hP5H7B4VZhapmmVSlo0qsV6e5P77w+4+v/APg7W/5Mv/Zu/wCz n4P/AFVPxDqMH/El6fqet4qf8ifLv+wn/wBsmfwHV6J+EhQAUAFABQAUAFABQBveGfC3ifxrrmn+ GPBvhzXvFviXV5xbaT4e8M6PqGva5qdyQSLfT9J0q3u7+9nIBOyONmwOlJtJXb0NKdKrWnGlRpyn UeySbb9EtWfqR8Lv+CF//BV34t2dlqXh39jX4heHtPvPJdpvijrPgX4PXlnBLLFE097oHxR8V+Ev E8fkCXe8K2T3OxW2xsRisniKMd5r8z6bDcE8U4tKVPKKkYv+dxp/hOUZfhc94/4htf8AgrZ/0Qrw V/4fH4Rf/NdU/WqP834M7v8AiHfFX/QDD/wZT/8Akjxj4gf8EHP+Cs3w3huLrWf2OfGWuWUDziO4 +H/jD4X/ABKmu4oXlVbi30jwH448Q6+EuEi3RpLaRzkMoKKx21SxFF/bOPEcD8VYdNzyicl/clCf 4Rk3+B+Z/wATPg58Xfgrra+GfjJ8K/iP8JfEjrKyeH/iZ4H8T+A9bZYDGszLpPinS9Kv2WFpVDER /KWGeorVSjJXi00fOYnB4vBz9njMLUpVO04yi/ukkz+6r/g0p/5Mv/aR/wCzn5//AFVPw8rz8Z/E j6fqftvhX/yJ8x/7Cf8A2yB/VlXGfqB/ky/8FZf+UmX7df8A2c/8Xf8A1LdRr2aP8Kn6I/ljir/k pM7/AOwmp/6Uz89q0PACgAoAKACgAoA/0Jv+DTj/AJR1fGf/ALPU+Iv/AKoz9nKvNxn8WP8Ah/Vn 754Wf8k/jP8AsMn/AOm6R/Sb8Q/Hfhn4W+APHPxN8a6guk+Dfhz4P8TeO/FuqMoZdN8M+ENFvfEG vagyllDLZ6Vp8shGRnb1rlSbaS3Z+iYivTwtCvia0rUacHKT7KKbb+5H+QH+1B8fPFf7Uv7RHxm/ aH8bO/8Awkfxf+IXiTxtdWjy+cmj2Oq6hK2h+HLWTCltO8MaEltp1rnkW9qgOSM17UIqEYxWyR/J uZ46rmeYYzMK38StUcvRN6L0irJeSPCKo4QoAKACgAoAKACgD9cv+Cen/BFn9s7/AIKIfYvFngbw zZ/C34GPeNBd/HP4oxajpPha/jt5RHfReAtHt7aXXviFfwbZI1ayiTS0uY2guL62cHGFWvClo3eX Y+ryDg7OOIOWrQpqlgr/AMSd1F9+Vbzfp7t9HJH9af7Nv/BrZ+wF8K7LTr3486/8Uf2nPFUSwvqU Wr6/c/C34dyzxfNnTfCvw/vLTxdbRO5+dLrxLfK4UDCjcG45Yuo/hSSP1XLvDLIsKoyx1SriavW7 5IfKMHzffNn6reDf+CTn/BM7wLZCw0T9hP8AZevoFiSEP4y+EHg/4i3uxNuCdR+IOm+J9QaU7eXM pduck5NZOtVf/Lx/efT0eFuHKEeWGSYZr+9TjN/fNSZ1F/8A8Ey/+CcepWk1lcfsEfsbRw3CqrvY fs0fBvSrtQrq48nUNL8HWd/bNuUZMciEjIPBIK9rV/5+S+9msuG+HpJxeRYO3lRpr8VG58j/ABZ/ 4N//APglF8WoLgzfsvad8O9Wm88w678JvGnjrwHPZNccu1voOn+IZvBMm1gDGJ9KmWPGECqzBrji a0ft39TysVwHwtik75Yqc+8JSjb5J8v3xZ+IX7U//BpWYrXUtf8A2Mf2lZ7q5iSaay+Gv7Q+mQK9 0VMkwgtvin4D0y3hinZAsUMVx4ZEbOQ0l1GuSN4Yz+eH3HxeZ+FdlKpk+Y3f8lVf+3xX3Xh6s/lk /au/YX/aw/Yj8VReE/2m/gp4u+Gc97PJBoXiK7t7fWfAnikxo0p/4RXx94fuNU8H6/Oluoklt7e9 e6tlYCeKJvlrshUhUV4SufmOaZJmmS1VSzLBzpt7PeMv8MleL9E7rqkf0af8Gjf/ACcX+13/ANkV 8D/+p1NXLjfhh6n6F4U/8jDNv+vMf/Sj+7yvPP28KAP8fv8Abd/5PQ/a7/7Of+Pv/q1vFle1T/hw 9F+R/Jmdf8jjNv8AsJq/+lyPtP8AY+/4Ie/8FFv2y4tK1/wd8FLz4XfDXVWheH4qfHWa5+G3haez nNu8eo6Lo99Y3fj7xZps1vMXiu9J0a9sn8tl85XwDnPEUqejld9kexlPBfEGcKNSjgnSwz+3V9yP qk1zSXnGLXmf0i/s6f8ABpb8B/DsVjqn7Un7SfxE+JuqKqT3PhT4QaLo/wAM/C0M42btPuvEHiKP xz4k1+wwGzNBFoc7bhgJtO/mljJP4IJep+iZf4V4GmoyzPMalSX8tNKEfS75m16crP2Y+Ef/AARG /wCCV/wYigXw5+xp8KvFF1FEiTX3xch1r40y3ki7C9zPZ/FXVvF2jxSzOmWWC2hiGSqoqnbWDr1p b1H+X5H1+E4M4YwaXs8npSfepep+E3Jfcj9BPBfwQ+C/w3SGP4d/CH4X+Ao7Z0lt4/BfgDwp4WSC SMyskkK6HpNisTo07kFcEF29TWTlJ7ybPfo4LB4e31fCUqf+GMY/kkeoUjpMPxB4Y8NeLLB9K8Ve HtD8TaXKsqyab4g0mw1mwkWeGS2mV7PUbe5t3Wa3meNgV+ZGKngkUXa2IqUqdWPJVpxlHs0mvxPg z40/8Emv+Cbvx/tb6H4j/sbfA1r3UVk+1+IvBHg60+Fni2aWQMPtMvi34YN4Q8RXFwhbKtLcv0AI I4rWNarHabPDxnCvDuPUliMooXfWMeSX/gUOV/ifzqftuf8ABqPoL6TrXjX9gn4u6vb63awXd/F8 EPjhfWV9p2ruiy3A0rwd8UdL0/Tp9FnZEWC0t9bsryOWVwbjVLeMM46aeM6VI6d0fn2deF0OSdbI sW+da+zqO6flGaSt2Skn5yR/HB8X/g58UvgD8RfE/wAJPjR4E8R/Df4keDb9tO8R+EfFNhJp+qWE +0SQzoCXt7/Tb+3dZ7S8tpJrS8tnSaCWSJ0c90ZKSUou6PyLF4PFYDEVcJjKEqeIg7OMlZr/ADT3 TWjWqdjzWmcwUAFABQAUAFAH3L/wTL+Kk3wV/wCChP7GfxHS6eztNG/aL+Fmna5cRyJE6eFPFnin T/B/jAB5JYIv3vhXX7xCHdI2DYZgpJrOqualUXke3w3ing8/yfEXso4iCf8AhlJRl/5K2f631eMf 1WFAH56/8FZf+UZv7df/AGbB8Xf/AFEtRrSj/Fp+qPA4q/5JvO/+wap/6Sz/ACZq9k/lgKACgAoA KACgAoA/1L/+CDv/ACiT/Yx/7Erxt/6t34h15OI/jT/rof03wP8A8krk/wDgl/6cmfrpWB9Wf57P /B2P/wApFfgx/wBmV/Dr/wBXn+0bXpYP+FL/ABfoj8E8U/8AkoMH/wBgcP8A05VP5gq6z80CgAoA KACgAoA+yv2Bv2K/iT+39+0/8Pv2bfhq39nT+JJ59Y8aeL5rRrzTvh98O9EaCXxX411OBZbcTppt vPHBaQGWL7bqVzbWodGnVhnUqKnByZ7GRZNic+zKhl2G0ctZS3UIL4pP02S6tpdT/VC/ZI/ZI+B/ 7EnwP8KfAH4A+FIvDXgvw1Ebi9vbgw3PiXxn4luYYI9Z8a+NdZjgt5Nd8Va7JboZpiiRQxJHb28c FrBBBF5M5yqScpPU/pzKsqwWS4KlgMBS5aMd31k+spPrJ9X6JJJJL6XqD0goAKACgD+Qz/g4x/4I 76D4+8E+LP8AgoL+zT4Tt9L+Jvgy3uNf/aW8E6DZ+Vb/ABG8G28StqHxb02xtgIYfG/g2GMz65tQ DVtK828dlu7NhfduGr2apzenT/I/J/EHhGnXo1c+y6lbEw1rRX249aiX80d5fzRu91738J9egfiI UAFABQAUAFABQB/VX/wRt/b0vP2dP+CRP/BWLw4usPYeIPg9pek+P/hdOZ2W7svFv7Suhp8CdIvt NO12Fr4a8d+H9FvHhUqvm3bMNpkkeuOvT5q1F9/01P1DhDPHl/CfFNPntUopSh5SrL2Sa9JKL+fm fyqV2H5eFABQAUAFABQB+n3/AAR6/Ynh/bz/AG8vhF8HPEOmz6h8LfD8938U/jSIneKNvhp4FktL u+0e5mjUyxQeM/EF3p2gs8ZWWMapvVlKblxr1PZ05SW/Q+m4SyZZ5nmEwlSN8LH36n+CO6/7edo/ 9vH+q7aWlpp9pa2Fha29jY2NvBaWVlaQR21paWltGsNva2tvCqQ29vbwoEREAVFAAAAryD+n0lFK MVaKLFAwoAKACgD/AD4/+DqP9lnTvhP+2b8N/wBpDw5pyWOjftRfD2dfE/kxuI7n4ofCA6P4a1zU iQ32eD+0vAuteGx5aqpkuLa4mYu8jkelg53puL6P8z8F8Tssjhc4w+Y042hiafvf46dk384uHzTZ /LxXWfmYUAFABQAUAfs7/wAG/fxhl+D/APwVb/Zlkku1ttF+Jl54z+D2vxtN5AvYvHvgvXLTw1ab 2kSNm/4T600eUIwfzDFsUb2VhhiY81Gfdan2PAeLeE4oy1t2hUcqb8+aLt/5Nyn9Kn/B2t/yZf8A s3f9nPwf+qp+IdcuD/iS9P1P0XxU/wCRPl3/AGE/+2TP4Dq9E/CQoAKACgAoAKACgD9xf+CPn/BF v4l/8FLvFFx8QPGWp6t8Lf2UPBeuJpfjD4hWltH/AMJR461e3jW5vfA/wqi1G0utLl1aCGSMahqt zHNZaSs6Hybub/Rjz166pKy1n/W59rwlwdieI6rr1pOllcJWlP7Un/LC+l+8npG+zeh/oY/sqfsQ /ss/sUeDLfwV+zX8G/CPw5tfsUNlrHiOzsEv/Hfi0xCFnuvGPjrUvtXijxJPNPAsmy5uWghbAhji RVRfNnUnUd5yufvuV5LlmTUVRy7Bwpq2rteUv8Un7z+bt2sfVtQeoFABQBwXxJ+FXwx+MvhW/wDA vxc+Hngj4n+C9TUrqHhT4geFtE8X+Hbv5WQPPo+v2V/YPKiudr7N6E5Ug003F3i7MwxGFw2MpSoY vDwq0XvGUVJfc00eE/snfsRfs4/sQ6R8SPDP7NPgmf4d+Efih48PxH1zwjHrmr61oWmeJZNB0nw9 cnw2muXWoahpGl3Npo0T/YxcSW8MhYQrFFtjWp1JVLObu0jhyrJcvyWGIp5bR9nSqz53G7aTslpe 7S02vbtZaH1nUHqn+TL/AMFZf+UmX7df/Zz/AMXf/Ut1GvZo/wAKn6I/ljir/kpM7/7Can/pTPz2 rQ8AKACgAoAKACgD/Qm/4NOP+UdXxn/7PU+Iv/qjP2cq83GfxY/4f1Z++eFn/JP4z/sMn/6bpH1D /wAHHX7QcvwJ/wCCXfxT0TTb2Wx8Q/tBeLfBfwF0eeBsSix8Q3V54w8axOgIY2ep/D7wPqthK2No +2qDywzGFjzVV2Wp6fiFj3geGcVCMrVMRONJej96X3wjJfM/zOK9U/nAKACgAoAKACgAoA/qj/4I F/8ABEXR/wBrL7F+2P8Atb+Gri7/AGdNG1WWH4RfDG/FxaW3xx8QaLe3FpqfiPxK0UkFzJ8LvC+r WhtltYzt17UYpoZmFnazw33HicRye5B+918j9P4F4Mhmts3zWnfL0/3cH/y8a3b/ALkXpb7Tunom pf346VpWmaFpmm6Jomm2Gj6No9hZ6VpGkaVZ2+n6ZpWmafbx2lhpum2FpHDaWNhY2kKRQwxIscUa hVAAArzj91jGMIxhCKUErJLRJLZJdEi/QUFABQAUAFAHAfE/4VfDT41+CNc+G3xd8B+FPiT4B8S2 r2eueEfGmh6f4g0LUImVlV5bDUYJ4UurcvuhnQLPBIA8bo4DBpuLvF2ZhicLhsZRnh8XQhUoSWsZ JNP5P8+h+Y/7Cf8AwSC+C3/BO39p344/Gb9nfxNr1n8LvjX4A0jw0vwg8Svca5P8Pdc0jxO+uGTw 140u7uXVdX8KXlnN5UVpqaz6hZyQ7mvbpZgsGtSvKrCMZLVPc+ayThPB8P5ljcZl9SSw1aml7N68 jUr6S3cfJ3a/md9P13rE+sCgD8s/2bP+CO37EP7OHxf+IX7Q8Hw3g+K/x6+InxQ8a/FOf4mfFqLT /FV54L1fxn4n1HxQdP8Ahv4fksofDXg2DRbnUnjtr+G1fW2QsJb50KxptKvUlFRvaKVtD5jLuEcl y7F4jMFh/a46pVlPnnaTi5ScrQW0bX0aXN3kfqZWJ9OFABQAUAFABQAUAFAH4Vf8F3P+CY3gz9un 9ljxd8TfCfhqzt/2pPgB4S1jxh8NPE+n20MWs+NfC/h63vNc8SfB7W5gEOraZr1mLifRllYNYa55 bRSRQXN8lx0Yeq6c0m/cf9XPiON+G6Od5ZVxNKmv7ToQcoSW8orV033T1ce0tmk5X/zMa9U/nAKA CgAoAKACgDc8Ma9d+FfEvh7xPYbvt3hzXNJ16y2zSW7fa9Hv7fULfbPCVmgbzrcYdCGXqORSeqaN KU3SqU6sfijJP7nc/wBoevDP7CCgD89f+Csv/KM39uv/ALNg+Lv/AKiWo1pR/i0/VHgcVf8AJN53 /wBg1T/0ln+TNXsn8sBQAUAFABQAUAFAH+pf/wAEHf8AlEn+xj/2JXjb/wBW78Q68nEfxp/10P6b 4H/5JXJ/8Ev/AE5M/XSsD6s/z2f+Dsf/AJSK/Bj/ALMr+HX/AKvP9o2vSwf8KX+L9Efgnin/AMlB g/8AsDh/6cqn8wVdZ+aBQAUAFABQAUAf1yf8GjccZ/aP/a4mMaGaP4I+C40lKKZEjl8dlpY0fG5U kaFCwBwSgz0FcWN+CHqfq3hSv+FHNX19jH/0o/u/rzz9wCgAoAKACgCrfWNlqdleabqVna6hp2oW txY39hfW8V3ZX1ldxPb3VneWtwkkFza3MEjJJG6sjoxBBBoFKKknGSTi1Zp9T/KF/wCCtH7Hkf7D f7evx3+Buj2bWnw+Ovr8QPhIAriFfhf8QUbxF4Z0q3eWSSW5Xwg1zPoUkzEGa40uR8AMBXsUZ+0p xl16n8ucVZR/YmeY7BQVsPzc1P8AwT1S/wC3dY+bifnBWp86FABQAUAFABQB3/hn4l+LPCXgv4k+ ANG1B7fwx8V9O8M6b4y08M/l6jD4Q8T2Hi3QmdA4jL2Wr2CspKkgMwBGTlNJtN7o6KeJq0qOIoQl +7qpKS78slJfijgKZzhQAUAFABQAUAfqB/wTO/4Kk/E3/gmB4g+LHiz4T/Cb4VfEbxJ8WNG8L+Hr /VfiUniqSfw7onhq91fUpdP8P/8ACMa/oBji1+/1KCS988zBzp9tsCbX341aKqqKk2kj6bhzibE8 NVMVVwuFpVKlVRTc+bRJt2XK1u2r37I/XL/iLW/bQ/6Nu/Zg/wC/HxW/+eHWP1On/M/wPq/+IqZx /wBC7Df+T/8AyYf8Ra37aH/Rt37MH/fj4rf/ADw6PqdP+Z/gH/EVM4/6F2G/8n/+TD/iLW/bQ/6N u/Zg/wC/HxW/+eHR9Tp/zP8AAP8AiKmcf9C7Df8Ak/8A8mH/ABFrftof9G3fswf9+Pit/wDPDo+p 0/5n+Af8RUzj/oXYb/yf/wCTD/iLW/bQ/wCjbv2YP+/HxW/+eHR9Tp/zP8A/4ipnH/Quw3/k/wD8 mfmn/wAFLP8Agst8av8Agp74E+Gngf4vfB/4O+BF+Fvi3VfFfh/Xvh5H4zTWJW1vR/7I1TSLs+Jf FGu2n9m3ght5m8uNJPNtY/m25B1pUI0m3GT1PnOI+L8ZxLQw1HF4SjD2U3JOHNfVWa1k9NvuPx5r c+RCgAoAKACgD6V/Yx8ct8Mf2wP2VPiMs6Ww8B/tH/BHxfJNLPHbQJB4d+JfhnVrgXM8zxwR2rwW jLKZGEflk7vlzUVFeE13TPSyev8AVs2yvEX/AIeIpy+6aZ/a5/wdrf8AJl/7N3/Zz8H/AKqn4h1w 4P8AiS9P1P2TxU/5E+Xf9hP/ALZM/gOr0T8JCgAoAKACgAoA9k/Z4+Cfin9pH47/AAg+APgkpH4p +MXxG8I/DvR7uaGS4tNLn8U61Z6VLreoRQssh0vQra4e8uiCNttA7ZGM1MpKEZSeyR2ZfgquY47C YCj/ABa1SMF5cztd+S3fkj/XX/Z1+Afw3/Zd+CHw0+AHwk0WLQvh/wDC3wrp/hfQbRUjFzefZUMu pa7q00aIL3X/ABJq00+oahckb7m9uZZW5c140pOcnJ7s/q7L8Dh8swWGwGEhy0KUVFfq33bd231b bPaKk7AoAKACgAoAKACgD/Jl/wCCsv8Ayky/br/7Of8Ai7/6luo17NH+FT9EfyxxV/yUmd/9hNT/ ANKZ+e1aHgBQAUAFABQAUAf6E3/Bpx/yjq+M/wD2ep8Rf/VGfs5V5uM/ix/w/qz988LP+Sfxn/YZ P/03SPif/g7u+Kk3mfsVfBGzucQBPi/8VPEVmVl/eTFvBfhHwZco/wAsP7lBrysPnb51+4Pv3gl/ El6HjeK+Kd8mwSen7yb/APJYx/8Abj+LGu8/HAoAKACgAoAKAPsr/gn1+ybrH7cH7YvwJ/Zn0x72 0074h+MoP+E11mwRDceHvhx4dtbnxN8QtdhkmH2WK9sPCOkXf2MSlUmvmgh5aRVOdSfs4Sn2PYyH Kp51m+By2N1GpP3mukFrN+qinbzsup/rV+APAXg/4WeBvCHw1+H2gad4V8DeAvDei+EPCPhvSYFt tN0Pw74e0+30vSNMs4V+7BZ2NsiAnLNjJJJJrx22223qz+qaFClhaFHDUKajQpxUYpbJJWS+466k ahQAUAFABQAUAFABQAUAFABQBS1LUtO0bT73VtY1Cy0rStNtZ77UdT1K6gsdP0+ytY2muby9vbqS K2tbW3iQs8kjKiKCSQBQTKUYRlOckopXbeiS8z8Yv2nf+DgX/gmN+zLcX+jSfGu4+O3jDTpZILjw n+zrpEXxH2SRqwYHxxNqOg/CxmSZfLeNNeeeN/vRjBreGGqz+zZeZ8fmXHnDeWuUPrnt6y+zSXP/ AOTXUP8Aya/kfiF8Y/8Ag7q1yWWez/Z+/Y20mxgRm+zeI/jH8TbzVZblW27BP4K8FaBo6WLRkHJX X7jfuHCbfm6I4Jfan9x8Zi/FebbWAyhJd6k7/wDksUrf+BM/Pzxl/wAHSP8AwU58TTTvoVv+zl8O 4pFlWKDwl8KdX1AW++3jgjdH8e+OfGskksMiGYbyUMrtlTHtjXRYSkt7v5ng1vEziSo3yLD01/dg 3/6VKR5J/wARJX/BWz/ouvgr/wAMd8Iv/mRqvqtH+X8Wcn/EROKv+g6H/gun/wDInf8AhD/g58/4 KleGpIX1rXvgX8Qli3b4vF/wftLKO5zcxzjzj4B1zwPKu2JDCPLaP905JzJtkVPCUXtdfM3peJXE 1NrnqUKn+Knb/wBJcfQ+7/hD/wAHc3xbsJrWD49fsf8Aw58VW7pDHe6p8IfiB4m8ATW8gU/aLu10 HxnYfEtLxHfGy3fUoCo6zN3zlgo/Zm/me5hPFbFxaWOymnJd6cnH8JKf3XXqfs3+zf8A8HJ//BM7 47z2Oj+MvGfjj9mzxNebYVs/jb4UNv4amvD5e9Lfx34IvfGPhqxssMxW51aTSUIQ7grFVbCWFqx2 V15H2GXeIvDmOcYVq08NUf8Az8jp/wCBRckl5y5T90fBHjzwP8TPDGleNvhv4z8KfEDwZrkH2nRP F3gjxFpHivwxrFtuK/aNK17Qby/0rUINwI3wyuuR1rnaadmrM+2o16GJpRrYetCpRltKLUov0aum f5AH7VHhLR/AP7T37R3gXw7braeH/BXx5+L/AIS0K1VURbbR/DnxC8Q6PpluqIFRVhsrNFAAAGOK 9qDbhFvdpH8mZnShQzLMKFNWpwr1Ir0U2l+B4NVHCFABQAUAFABQB/seebJ/wzx53mP53/CmPN83 e3meZ/wg+7zN+d2/dznOc14f2vmf11d/2fe+vsf/AG09npHYfnr/AMFZf+UZv7df/ZsHxd/9RLUa 0o/xafqjwOKv+Sbzv/sGqf8ApLP8mavZP5YCgAoAKACgAoAKAP8AUv8A+CDv/KJP9jH/ALErxt/6 t34h15OI/jT/AK6H9N8D/wDJK5P/AIJf+nJn66VgfVn+ez/wdj/8pFfgx/2ZX8Ov/V5/tG16WD/h S/xfoj8E8U/+Sgwf/YHD/wBOVT+YKus/NAoAKACgAoAKAP65/wDg0b/5OL/a7/7Ir4H/APU6mrix vww9T9X8Kf8AkYZt/wBeY/8ApR/d5Xnn7eFABQAUAFABQB/EJ/wd0/Bi0s/G37HH7Q1lbMb/AMQ+ FviT8GPE155DhY7Twbq2ieOPA9sbpVaNmmm8d+IWEbspGwlAwL7O/BS0nH5n4v4r4NKtlGYRXvSj Om/+3WpR/wDSpn8a9dx+QhQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF AF3TdRvNH1HT9W06b7PqGl3trqNjceXFN5F5ZTx3NrN5U6SwS+VPErbXVkbGCCOKCoycJRnF+8nd fI/vk/4O1v8Aky/9m7/s5+D/ANVT8Q687B/xJen6n7p4qf8AIny7/sJ/9smfwHV6J+EhQAUAFABQ AUAfrl/wQfVX/wCCtf7GIZVYDxv40YBgGAZPhJ8QXRsHPzI6gg9iM1hiP4M/66n1fA//ACVWT/45 f+kTP9TGvJP6bCgAoAKACgAoAKACgD/Jl/4Ky/8AKTL9uv8A7Of+Lv8A6luo17NH+FT9EfyxxV/y Umd/9hNT/wBKZ+e1aHgBQAUAFABQAUAf6E3/AAacf8o6vjP/ANnqfEX/ANUZ+zlXm4z+LH/D+rP3 zws/5J/Gf9hk/wD03SPw/wD+DrDxe2vf8FGvh94cjmQ23gb9lb4e6XJbR3cdyItT1n4hfFjxJdXE 8CRo+n3Vxp2q2amJyxaKKOUECQAb4Nfum/P/ACPi/FCr7TiGhTvpDCwXzc5v5aNfgz+Zmus/NwoA KACgAoAKAP68f+DSP4HWHiD46/tWftEajZxy3Pwx+G3gn4W+Gpp0DrFe/FjX9W8Qa9d2W4kRXtlp vwvggaQAOINQZAdsjg8WMlaMI93+X/Dn6x4VYKNTHZpmElrSpxgvWbbdvNKCXoz+7KvPP24KACgA oAKACgAoAKACgAoAKAPwK/4Kf/8ABfr9mv8AYHuda+E/w1tbL9ov9pqx86zv/A2ga2lp4F+Gt95b Kp+J3jGzhvhHq9rMwZtB09JdRIRkupNP3xSt00sNKp7z0gfC8S8d5dkTnhcMliMyW8U/dg/78tdf 7q178ujP4UP20P8Agp9+2p+3trN5c/tA/GPW7zwZJqL6hpXwf8HyXPhL4QeHm+UWsdh4KsLt4dWn 09AVgvdYm1PU1VmzctvbPoU6VOn8Mde/U/Ec44lznPZt4/GSdG91Tj7tNekVvbo5Xl5nwBWh4IUA FABQAUAFABQB9T/srftsftR/sU+NU8dfs0/GPxb8NNRluLafW9E0+8F/4K8Wx2zDZaeMvBGqJeeF vE9v5eUQ3drJLAGLQvG+HETpwqK043PUyvOczyat7fLsXOnLqlrGX+KL91/NadLHiHxO+IGufFn4 lfEL4qeJ4tOg8SfEvxx4s+IHiGDSIJrXSYdc8Za9qHiPVotMtbm5vbi206O/1KQQxyTSukYUM7EF jSSilFbJHFia88VicRiqiXtKk5Sdtrybbtvpd6HD0zAKACgAoAKACgD/AGOf+bdP+6K/+6LXh/a+ Z/XP/Mv/AO4P/tp7VSO0/PX/AIKy/wDKM39uv/s2D4u/+olqNaUf4tP1R4HFX/JN53/2DVP/AEln +TNXsn8sBQAUAFABQAUAFAH+pf8A8EHf+USf7GP/AGJXjb/1bvxDrycR/Gn/AF0P6b4H/wCSVyf/ AAS/9OTP10rA+rP89n/g7H/5SK/Bj/syv4df+rz/AGja9LB/wpf4v0R+CeKf/JQYP/sDh/6cqn8w VdZ+aBQAUAFABQAUAf1z/wDBo3/ycX+13/2RXwP/AOp1NXFjfhh6n6v4U/8AIwzb/rzH/wBKP7vK 88/bwoAKACgAoAKAP5XP+DtLw+tz+w3+z14qKWZfRv2rtH8PrI8QN+i+JvhD8WNRdLafyyY7OQ+E wZ03rvdYjhtuV68G/wB5Jf3f1R+YeKlO+S5fV00xSXnrTm//AG3X5H+f/XpH4QFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAH93f/B0Z/wAo6v2L/wDstXg//wBUZ41r zsJ/Fn6fqft/iZ/yT+T/APX6P/puR/CJXon4gFABQAUAFABQB+uf/BB3/lLZ+xj/ANjr42/9VF8Q 6wxH8Gf9dT6zgf8A5KrJ/wDHL/03M/1MK8k/poKACgAoAKACgAoAKAP8mX/grL/yky/br/7Of+Lv /qW6jXs0f4VP0R/LHFX/ACUmd/8AYTU/9KZ+e1aHgBQAUAFABQAUAf6E3/Bpx/yjq+M//Z6nxF/9 UZ+zlXm4z+LH/D+rP3zws/5J/Gf9hk//AE3SP57P+DnT/lKf4s/7Ir8Hf/TPqFdOE/gr1Z8D4k/8 lPV/680/yZ/PZXSfAhQAUAFABQAUAf3u/wDBpJpFnD+yT+1DryB/t+pftF6dpFySV8s2eifDTwve 2IRQgcOJvEFxuJYggrgDBJ87GfHBeR+5+FUEsqzOp9p4hL7oRt+bP6xq4z9TCgAoAKACgAoAKACg AoAKAP42v+C8X/BeXU/Aup+Mf2I/2IfGEun+L9PlvvDPx8+Pnh25UXPhi5Cvaav8L/hdqkJY2/ia 3LNDrWuQMJdMlDWtm63izT2vdh8Pe1SotOiPyLjjjiVCVbJclrWrK6q1V9nvCD/m/mkvh2Wt2v4h p557qea5uZpbi5uJZJ7i4nkeWeeeVzJLNNLIWklllkYszMSWJya7z8XbbbbepFQIKACgAoAKACgA oAKACgAoAKACgAoAKACgAoA/2Of+bdP+6K/+6LXh/a+Z/XP/ADL/APuD/wC2ntVI7T89f+Csv/KM 39uv/s2D4u/+olqNaUf4tP1R4HFX/JN53/2DVP8A0ln+TNXsn8sBQAUAFABQAUAFAH+pf/wQd/5R J/sY/wDYleNv/Vu/EOvJxH8af9dD+m+B/wDklcn/AMEv/Tkz9dKwPqz/AD2f+Dsf/lIr8GP+zK/h 1/6vP9o2vSwf8KX+L9Efgnin/wAlBg/+wOH/AKcqn8wVdZ+aBQAUAFABQAUAf1z/APBo3/ycX+13 /wBkV8D/APqdTVxY34Yep+r+FP8AyMM2/wCvMf8A0o/u8rzz9vCgAoAKACgAoA/ki/4O4vF9nZfs z/smeAXlQah4l+OnizxfawmSUSSWfgfwBcaLfSpEIjA6RT/EK3DMzq6l1CqwZivZgl7835H5V4rV lHLcqoX96VeUv/AY2f8A6Wj+DmvRPw4KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKAP7u/wDg6M/5R1fsX/8AZavB/wD6ozxrXnYT+LP0/U/b/Ez/AJJ/J/8Ar9H/ANNy P4RK9E/EAoAKACgAoAKAP1z/AOCDv/KWz9jH/sdfG3/qoviHWGI/gz/rqfWcD/8AJVZP/jl/6bmf 6mFeSf00FABQAUAFABQAUAFAH+TL/wAFZf8AlJl+3X/2c/8AF3/1LdRr2aP8Kn6I/ljir/kpM7/7 Can/AKUz89q0PACgAoAKACgAoA/0Jv8Ag04/5R1fGf8A7PU+Iv8A6oz9nKvNxn8WP+H9WfvnhZ/y T+M/7DJ/+m6R/P3/AMHP+m3dj/wVH1e6uY1SHWfgN8IdS09hIjmW0ij8RaO8jKpLRML/AEmddrYO FDdCCenCfwfmz4PxKi48TTb2lQptfivzTP53a6T8/CgAoAKACgAoA/uk/wCDRXxzDf8AwT/bL+Gn 2nM/hX4p/DDxybQpEPLh8feEvEWgLcpIIlmk85/hsVYF2VNikKpYl/Pxq96D8j9t8KK6lg84w19Y 1YS/8Ci1/wC2H9f9cR+shQAUAFABQAUAFABQAUAfz/f8HA//AAU41D9hD9mWz+F3wi8QNpP7S/7R 9vrHh/wfqmn3ATVfhr8O7NIrXxv8SYGhf7Tp+uSC9TS9Bl/dMt9PNeQuz6a8bdOGpe0neS9xHwfH nEksjy1YbCVLZliLqLW8Ifan5P7MfNtr4T/NgllkmkkmmkeWaV3lllldpJJZJGLvJI7ks7uxJJJJ JNeofzs3fV7jKBBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQB/sc/826f90V/90WvD+18z+uf +Zf/ANwf/bT2qkdp+ev/AAVl/wCUZv7df/ZsHxd/9RLUa0o/xafqjwOKv+Sbzv8A7Bqn/pLP8mav ZP5YCgAoAKACgAoAKAP9S/8A4IO/8ok/2Mf+xK8bf+rd+IdeTiP40/66H9N8D/8AJK5P/gl/6cmf rpWB9Wf57P8Awdj/APKRX4Mf9mV/Dr/1ef7Rtelg/wCFL/F+iPwTxT/5KDB/9gcP/TlU/mCrrPzQ KACgAoAKACgD+uf/AING/wDk4v8Aa7/7Ir4H/wDU6mrixvww9T9X8Kf+Rhm3/XmP/pR/d5Xnn7eF ABQAUAFABQB/ns/8HU/7Rtj8Tv24/hz8BNE1BL3TP2afhLbxa/CkjONO+I/xcurXxfrtltDtCP8A ihNO8LyMwAfzHZG+4telg42puXd/l/TPwTxPzBYnOsPgYSvHDUtfKdT3n/5KoH8wVdZ+aBQAUAFA BQAUAFABQAUAFABQAUAFAH7y/wDBHL/gj58M/wDgqh4U+N17rH7SmvfB3xt8GfEPhK1u/Cel/DrT PGEep+FvGmm6tLoviFb298Y+HZonOreHNRtpYkhkWMRRMXzKFrnr13Rcfcumfc8I8JYbieljZTzG VGtRlH3VBSvGSdndyXVNfd3P2i/4hDPhz/0fJ41/8MToX/z0Kw+uv/n3+P8AwD7H/iE+H/6HU/8A wUv/AJMP+IQz4c/9HyeNf/DE6F/89Cj66/8An3+P/AD/AIhPh/8AodT/APBS/wDkw/4hDPhz/wBH yeNf/DE6F/8APQo+uv8A59/j/wAAP+IT4f8A6HU//BS/+TD/AIhDPhz/ANHyeNf/AAxOhf8Az0KP rr/59/j/AMAP+IT4f/odT/8ABS/+TD/iEM+HP/R8njX/AMMToX/z0KPrr/59/j/wA/4hPh/+h1P/ AMFL/wCTD/iEM+HP/R8njX/wxOhf/PQo+uv/AJ9/j/wA/wCIT4f/AKHU/wDwUv8A5MP+IQz4c/8A R8njX/wxOhf/AD0KPrr/AOff4/8AAD/iE+H/AOh1P/wUv/kw/wCIQz4c/wDR8njX/wAMToX/AM9C j66/+ff4/wDAD/iE+H/6HU//AAUv/kw/4hDPhz/0fJ41/wDDE6F/89Cj66/+ff4/8AP+IT4f/odT /wDBS/8Akw/4hDPhz/0fJ41/8MToX/z0KPrr/wCff4/8AP8AiE+H/wCh1P8A8FL/AOTD/iEM+HP/ AEfJ41/8MToX/wA9Cj66/wDn3+P/AAA/4hPh/wDodT/8FL/5MP8AiEM+HP8A0fJ41/8ADE6F/wDP Qo+uv/n3+P8AwA/4hPh/+h1P/wAFL/5M9R/4Os9HXw9+wd+yhoCTtdJof7Q2i6Oly0Yia4XTPg34 9slnaIM4jaYQbioY4zjJqcH/ABJ+n6nT4oQ9nkeV0735cQl91OR/BPXon4YFABQAUAFABQB+uf8A wQd/5S2fsY/9jr42/wDVRfEOsMR/Bn/XU+s4H/5KrJ/8cv8A03M/1MK8k/poKACgAoAKACgAoAKA P8mX/grL/wApMv26/wDs5/4u/wDqW6jXs0f4VP0R/LHFX/JSZ3/2E1P/AEpn57VoeAFABQAUAFAB QB/oTf8ABpx/yjq+M/8A2ep8Rf8A1Rn7OVebjP4sf8P6s/fPCz/kn8Z/2GT/APTdI/Iv/g7T8Aza V+2Z+zj8S1t/KsvGv7NS+DxMkaJHdan8Pfib431W9kdlhUzXUdh8RLJGZpHIiWNcKAN22DfuSXmf KeKlBxzjLsTb3Z4bl+cJyb/CaP5Ta7D8uCgAoAKACgAoA/o5/wCDYb9prTvgn/wUMuPhN4k1JbDw 5+1B8NNa+Hen+fMtvZD4keF7m38c+CJbqWQiMy3unaTrGlWqfelvNUiRTuYK3Li4c1PmW6Z+h+Gu ZRwWfvC1JWp4mm4Ltzx96P4KUV5yR/o1V5h/QYUAFABQAUAFABQAUAFAH+UH/wAFcP2w7n9uD9vj 47fGa01J9Q8A6b4hl+GXwfUXDz2cHwr+Hlzd6J4bvdPV2b7LB4uulu/EE0Skql3q82Cc5r2KMPZ0 4x69T+XOK83edZ7jsYpXoKXJT/wQ0TX+LWXrJn5sVqfOBQAUAFABQAUAbPh7w74g8W61p3hvwpoW s+JvEWsXC2mk6B4e0y91rWtUu2VnW107S9Ngub69uGVCQkUbMQDxxSbS1exdOnUqzjTpQcqj2STb folqz9OPhn/wRG/4KsfFqxi1Hwp+xV8VdNtpolmjHxIufBnwaujGyGRSbD4v+KfA18jFR91ow2cD GSBWTr0Y71F+f5H0uG4M4oxcVKlk1VL+/wAtP8Kkos9U1/8A4N5/+CvXh+xGoSfsmPq1utlaXdym gfGj9n/WL61luWVH046Xa/FM6pe3tm7gS/ZIbiADLLIyBmC+s0f5/wAH/kdNTgHiynHm/sq6t0qU m/S3Pdv0ufm38dP2UP2mv2Y9STS/2hPgJ8Wvg7PcTtb2Fz8QPAviHw7o+sSLvy2ga/fWEeheIYcx sPNsbm4jJRhuypA1jOE/hkmfPY3K8yy2XLj8DVovpzRaT9G1Z/Js+fqo88KACgAoAKACgAoAKAP9 jn/m3T/uiv8A7oteH9r5n9c/8y//ALg/+2ntVI7T89f+Csv/ACjN/br/AOzYPi7/AOolqNaUf4tP 1R4HFX/JN53/ANg1T/0ln+TNXsn8sBQAUAFABQAUAFAH+pf/AMEHf+USf7GP/YleNv8A1bvxDryc R/Gn/XQ/pvgf/klcn/wS/wDTkz9dKwPqz/PZ/wCDsf8A5SK/Bj/syv4df+rz/aNr0sH/AApf4v0R +CeKf/JQYP8A7A4f+nKp/MFXWfmgUAFABQAUAFAH9Lv/AAa7ftN/Db4I/txeM/hT8Qr5dEvf2mPh 3Z+Avh3rlzcQQaW/xA8Pa9F4h0nwpfNOYliuPF1h9qgsHDlpdSigtVjd7pCnLi4OVNNdGfo/hpmW HwWd1sLiJcrxNPlg+nMndRf+JXS87Lqf6I1eYfv4UAFABQAUAfMP7ZH7Vvwz/Yn/AGcPif8AtIfF a/ih8O/D7QLm703RVuobfVfGvi66R7fwn4E8PLMf3+ueKtaaK1i4KQIz3ExSCGWRLhB1JKMd2ebm +aYbJsuxOY4qX7unHRdZS+zFecnp5bvRM/yS/jd8YfHP7Qfxf+JXxw+JeqNrHj34q+M9f8c+Kb75 1gOq+INQnv5bWwhkeT7HpOnJKttZ26nZbWsUcSYRAB7MYqMVFbI/lXG4uvj8XicbiZXr1ZuUn5t3 08lsl0Wh5dTOUKACgAoAKACgD6h+GX7NXiP4l/swftSftHaVHKdF/Zj1z4A2vieTDGEaf8a/EnjH wfZAn7vmrrmk2mD1AYj+Koc0pwj1d/wPTw2XVMTluZ5hD4MNKlzelRyivxSPl6rPMCgAoAKACgAo A/Xn/giP+3lp/wCwJ+3X4G8deNdQaw+C/wAU7Cb4OfGa4eQi10Twv4p1DTrjR/HEys4iSLwL4t0+ xv7uTZJMNJW9jiUySisMRT9pTaXxLVH1nBmeRyLO6FetK2Dqr2dTyjJq0v8At2STf93mS3P9SWCe C6ghubaaK4triKOe3uIJElgnglQSRTQyxlo5YpY2DKykhgcivJP6ZTTSaehLQMKACgAoAKACgAoA KACgAoAKAP5Tf+Dtb/ky/wDZu/7Ofg/9VT8Q67MH/El6fqfl/ip/yJ8u/wCwn/2yZ/AdXon4SFAB QAUAFABQB+uf/BB3/lLZ+xj/ANjr42/9VF8Q6wxH8Gf9dT6zgf8A5KrJ/wDHL/03M/1MK8k/poKA CgAoAKACgAoAKAP8mX/grL/yky/br/7Of+Lv/qW6jXs0f4VP0R/LHFX/ACUmd/8AYTU/9KZ+e1aH gBQAUAFABQAUAf6E3/Bpx/yjq+M//Z6nxF/9UZ+zlXm4z+LH/D+rP3zws/5J/Gf9hk//AE3SPKf+ Dtb4MP4j/Zk/Zh+PNpZvPP8ACv4x+JPh5qVxCgJtdE+L3hNNXFzeEDf9li1r4V2kCMTtSW7CjmSn g5WnOPdfl/w5y+KmD9pluW45LWlWcH6VI3/OCXzP4L69E/DQoAKACgAoAKAOp8DeNvFPw18a+Efi J4H1m88OeNPAfibQvGPhLxBp7iO+0TxL4a1O11nQ9VtHIZVuNP1KzilTII3LyCKTSaaezNaFarhq 1LEUJuNaElKLW6ad0/kz/Vv/AOCZP/BQH4e/8FGf2WvB/wAbfC1xpum+PbC3tPDHxs+H1rOTdfD/ AOJtlZxNrFkttNLLdnwzrp/0/Rbly4uNPmVXYXMNzFF5FWm6U3F7dD+ouG8+w/EOWUcbSaVdaVIf yz6/J7xfVeaaX6F1ke+FABQAUAFABQAUAfnR/wAFXP2svCn7HP7B/wC0P8T9Y8Xad4W8Z6x8NvF/ gD4Nwz3nk6vrvxe8aeHtS0PwTa+H7GEm/wBTutH1K7GqXSwD9xp9jPPI8UUbyprRg51Iq2l9fQ+f 4ozWllGR5hiZ1VGs6co09dXUkmo2W7s/edtkm9Ern+TnXsH8shQAUAFABQAUAfe3/BN/9gP4m/8A BR39prw38APh9dp4b0ZLK48W/FH4iXllJf6Z8Ovh3pNxa2+q69LZRyQNqmr315e29hpdiJI/teoX UQkkht1nuIc6tRUoOTPd4eyLE8Q5lTwGHfLC3NOdrqEFu7dW7pRXVtbK7X+mb+xT/wAE7P2Tv2A/ Adj4M/Z5+GOk6RrH2CG08T/FPX7aw1v4tePbhFBnvfFvjdrG3vp4rifdKun2i2ek2jOwtrSFSVry qlWdR3k/8j+j8m4fyrIqEaOX4ZKdvem7OpL/ABStf5K0V0SPuCsz2goA5/xV4T8LeOvDur+EPG3h rw/4x8J6/Zvp+veGPFWjad4h8O63YSFWksdX0XV7a703UrORkBaKaJ0JAyOKabTunqZ1aVKvTnSr U4zpSVnGSTTXZp6M/jw/4LH/APBud4Hj8GeNf2o/+CfPhi48Na/4Zs9R8VfET9mLSvPvvD3iHRLO GfUdb1v4KWsjT6hoviPT40knPhhHlsr6AeTpUdrNFDY3nbQxTuoVHp3/AMz8k4u8PqCo1szyCk41 IpynRWqa3bp9U1vybNaQs0ov+Iuu8/GAoAKACgAoAKACgD/Y5/5t0/7or/7oteH9r5n9c/8AMv8A +4P/ALae1UjtPz1/4Ky/8ozf26/+zYPi7/6iWo1pR/i0/VHgcVf8k3nf/YNU/wDSWf5M1eyfywFA BQAUAFABQAUAf6l//BB3/lEn+xj/ANiV42/9W78Q68nEfxp/10P6b4H/AOSVyf8AwS/9OTP10rA+ rP8APZ/4Ox/+UivwY/7Mr+HX/q8/2ja9LB/wpf4v0R+CeKf/ACUGD/7A4f8ApyqfzBV1n5oFABQA UAFABQBf0rVdT0LU9N1vRNSv9H1nR7+z1XSNX0q8uNP1PStT0+4ju7DUtNv7SSG7sb+xu4Ulhmid ZIpFDKQQDQVGUoSjOEmpp3TWjTWzT6NH+gN/wR5/4OEvhd+0f4b8J/s9ftreLdB+Fn7R+mWtjoGg /FPxDc2WgfDn45SR7bTT5bzVJjb6T4K+Jl8oRLizuGg07Vbs77F0lnTT4vNr4ZxblTV4fkfvHCXH 2GzGnSwGc1Y0sxSSU3ZQqdtdozfVOyk/h1fKv6jFZXVXRldHUMrKQysrDKsrDIZWByCOtch+mDqA CgD5j/ar/bH/AGb/ANin4a3vxU/aS+KPh74deHIkuE0awvbgXXizxnqkEXmjQPA3hO0Muu+K9blB GYrSF1gjJmneGBJJUuEJVHaKuzzc0zfLsmwzxWY4qNOn0T+KT7RjvJ+m27stT/Nw/wCCtn/BWz4r f8FOfitbs1vqXw//AGbvh/qV3J8IPhBJdxSTpPJFJZS/ED4gS2Ukllq/xB1eykdAEeS00a0ka0tG cvd3d76dGjGlHvN7s/nfirirFcSYpaOnl1N/u6f/ALdLvN/dFaLq5fkPW58mFABQAUAFABQAUAf3 Q/8ABFz/AIJ9D4u/8EKv2rPC+r6On/CVftwT/Fi98D3V2EtgR8N9Jh8J/Bu5uPNwTa6N8YfCV/qC MxVZIpgVwpDnz69TlxEHfSP9P8D9s4OyH63wRmlKcP3uN53H/txctP7qkWz+Ga7tLvT7u6sL+1uL G+sbie0vbK7gktru0u7aRobi1ureZUmt7i3mQo6OAyMCCARXoH4o04txkrSRXoEFABQAUAFABQB/ Z1/wQX/4Lv8AhfwZ4X8G/sPfts+L00HRtBS18N/AH49eI70JomlaIgEGk/Cz4nardOP7I07SMLBo WszMbSC0KWV00EUEErcOIw7bdSmvVH7BwNxxSo0qOS5zV5YR0pVXsl0hN9Etoy2S0dkkz+2SCeC6 ghubaaK4triKOe3uIJElgnglQSRTQyxlo5YpY2DKykhgciuA/ZU00mnoS0DCgAoAKACgAoAKAPy6 /bp/4LC/sN/sA22o6R8WPifB4v8AizaQM1r8DfhZ9i8YfEt7kx74ItftIr620TwJBKCrCTXL3T2k iJaBJyNh1p0KlT4V7vc+Zzvi3JMiUoYrE8+KX/LuFpT+eto/9vNeVz4E/wCCN/8AwWF+NX/BUP8A as/aV0vxL4N8K/Cz4K/Dj4Y+Hta+HHw60TOu6/De6r4uGnTaz4z8dX1ta3Wvay1lE0ax2Vrpmnxx yYNvJIonOtehGlCNneTZ4XCPFuM4mzTMY1KMaWDp0k4QWru5WvKT3fooryvqf0gVyn6Gfym/8Ha3 /Jl/7N3/AGc/B/6qn4h12YP+JL0/U/L/ABU/5E+Xf9hP/tkz+A6vRPwkKACgAoAKACgD9c/+CDv/ ACls/Yx/7HXxt/6qL4h1hiP4M/66n1nA/wDyVWT/AOOX/puZ/qYV5J/TQUAFABQAUAFABQAUAf5M v/BWX/lJl+3X/wBnP/F3/wBS3Ua9mj/Cp+iP5Y4q/wCSkzv/ALCan/pTPz2rQ8AKACgAoAKACgD/ AEJv+DTj/lHV8Z/+z1PiL/6oz9nKvNxn8WP+H9WfvnhZ/wAk/jP+wyf/AKbpH6y/8Fav2apf2s/+ Cdv7Uvwc03TzqXiu4+HF5458BWsMHn39x48+F93afETwtpmmkI8kN54i1Hw0ullkwWhvpEPyswON GfJVhLpc+p4qy55rw/meDjG9V0+aPfmh78UvVrl+Z/k6V7B/LQUAFABQAUAFABQB9ufsEft+fH3/ AIJ2/HCw+NHwN1mJ4rqKHSfiF8O9clu5PBHxO8KLM0r6D4osLWaF1uLN5Gm07UISt3p1yS8bGN54 Zs6lONWPLI9rIs9x/D+NjjMFPR6Tg/hnHtJfk909uqf+jx/wT0/4LAfse/8ABRLw5pNt8PfGll8P vjc9kr+JP2eviBqunab8QdPvoIPM1KTwi0j21n8SfDcDIzx6hpQeRLcxte21jK/kL5lWhOk9VePc /oXIOLco4gpwWHrKnjba0pNKafXl/nXnHp8Si9D9T6xPpwoAKACgDO1bV9J0DTL/AFvXdU07RdG0 u1mvtT1fVr2203TNOsrdDJcXl/f3ksNrZ2sEYLPJI6ooGSQKN9iZzhTjKc5KMErtt2SXmz+dr9v3 /g5K/Y3/AGXLfXvA/wCzrcW/7WfxqtFnsoT4N1Jbf4JeG9SVjEZvEPxOhS4g8VLa7hKtt4bi1GG5 2NDJfWT/ADr1U8LOdnL3Y/ifn+e+ImUZYqlHL39axi091/u0/Of2vSF09nKJ/Ct+2j+3l+05+338 TT8UP2kviFdeKLyx+2weEPB2lxyaN8O/h3pV9JC8+keBfCMU81npEE62sC3N1I1xqeofZ4mvLq5k RXHoU6cKatFH4lnGeZlnuJ+s5jiHJq/LFaQgn0jHp0u9W7K7Z8d1Z5AUAFABQAUAFAH9yn/Bop4O 0CD4Uftm/EBLJG8Uap8QvhZ4On1GRInki0DQfDfibWrSytXMXn26XGo+JJpLgK+yYxQ7lzEprz8a 9aa6WZ+1+FFGmsLnFfl/eupCN/JKTt971+XY/sPriP1sKACgAoAKAP8AHx/bPsbLTP2w/wBrDTdN s7XT9O0/9pX462NhYWNvFaWVjZWnxR8UwWtnZ2sCRwW1rbQRqkcaKqIigAACvap/w4eiP5LziMY5 vmkYpKKxNVJLZLnkfNVWeaFABQAUAFABQB/sc/8ANun/AHRX/wB0WvD+18z+uf8AmX/9wf8A209q pHafnr/wVl/5Rm/t1/8AZsHxd/8AUS1GtKP8Wn6o8Dir/km87/7Bqn/pLP8AJmr2T+WAoAKACgAo AKACgD/Uv/4IO/8AKJP9jH/sSvG3/q3fiHXk4j+NP+uh/TfA/wDySuT/AOCX/pyZ+ulYH1Z/ns/8 HY//ACkV+DH/AGZX8Ov/AFef7Rtelg/4Uv8AF+iPwTxT/wCSgwf/AGBw/wDTlU/mCrrPzQKACgAo AKACgAoAKAP0s/ZW/wCCv3/BRH9jjS9N8L/Bn9pLxafAGlrHBZfDX4hW2k/E/wAC2OnxhNulaFpP jmx1u58HabvjDeXodxpnzFjn55N2U6NKeso6n0eV8WcQZRGNLB5jP2C2hO04pdkpJ8q/wtH6raF/ wdh/8FBtP0+e11r4N/sj+ILwWcsdjqZ8FfFvSp1vmMjRXWqW9n8aGsr63iLKDDbx2TMq/wCsDEtW P1On/NL8P8j6iHiln0YtTweEk7aPlqLXz/ea/Kx4J8Yf+Dmb/gqT8UrC707w54v+EPwKgvYvImm+ D3wttvt6wtCIZltNT+Kus/FPUdPln5fzreWK4idsxPHhcVHCUVum/X/gHDi/EfibFRcadalQT/59 w1++bm18tex+IPxW+MfxZ+OvjG/+IPxo+JXjj4q+N9Tyt54q8f8AifWPFetvD5ss0dnFf61d3k1t p1s8zeTbRFLeBTtjRVwK6FFRVoqyPi8VjMVjq0sRjMTOrWf2pScn976eWyPNqZzBQAUAFABQAUAF AHYfD3wH4p+Kfj7wT8MvA+ly6340+Ifi3w74H8JaPAQJdU8S+KtXs9D0PT42Pyo13qV9FHuPC7sn gUm0k29kbYehVxVejhqEeatUmoxXdydkvvZ/sA/syfAvw5+zJ+zz8Ff2fPCZil0P4O/DTwh4Atr6 K2W0Os3Xh7RrWx1XxFc26s4S/wDEmrRz39zyS1xcuSSTmvFnJzlKT6s/rPLcFTy3L8HgKXwUacY3 72Vm/Vu7fmz/ADf/APgv5+xxP+yN/wAFFvineaNpS2Hwx/aKlm+P/wAO5LaKKOxgl8aahdt8Q/D8 MdskdrZNoXxFh1IwWiBfs+mXNkdoV1z6mGnz0l3Wh/PPHeUPKuIMU4RthsR+9h295++vK072XSLi fidW58YFABQAUAFABQAUAfsF+wR/wW//AG5v2BbXSfBnhLxpZ/F34IaYqW8PwV+L4vvEHh3RrFQI xB4F8Q293a+LfAi20RbyLWzuzpCyNvlsZjWFTD06mrVpd0fW5FxpneRKFGlWVXBL/l3Uu0l/dfxR 8kny94s/qg/Z3/4Oqf2G/iJZ6fZftAfD34u/s6+JHggOp31vpUPxb+HkE5XE4tNc8JJaeOZ0WQZA bw0nykck5rklg6i+Fpr7j9Py/wAT8kxCjHH4erh6nV29pD74+9/5Ifqr8P8A/gsd/wAEuviZDb3H hz9uH4B6bHcrG0a/EDxb/wAKmmUSpO6/aLb4qWngy4tGAt23CVEKEqGwXQNi6FZb03+f5H0+H4u4 ZxKTp51QV/55cn/pfKe/ab+3l+w3rNpHqGj/ALZv7KOrWErSLFe6b+0T8Ib60kaJzHKsdza+MJYX aORSrAMcEYPNT7Op/wA+5fczvjnmSzXNDOMK491Vpv8A9uOI1f8A4Kdf8E4tDgNxfft5/sfuqzi3 aLTP2jPhLrd4kpD8PYaL4s1C+RF8shnMYRTgEgkZfsqv/PuX3MwnxJw9BXlnmE+VWm/wUmz5R+JH /Bf/AP4JNfDWC5+0/tW6T4z1KGKWS30f4b+Afid42nv3iSJzBbaxpPg5/CcEridQhudRt0YhgGyj 7bWGrP7H5Hl4jjvhXDJ3zRTl2hGcr/NR5fvaPyp+PP8Awdr/ALP+gwXdj+zZ+zD8UfiTqQWaC313 4t+IfDnwt8PwzbF8m/h0rw0/xJ1vWLRZCcwSvpUrgffQnjaODl9uaXofL47xVwFNOOXZbVqS71Go L1sudv090/nl/az/AOC+n/BSb9rK31HQL34wxfAvwBqKyQz+Bf2ebK9+HcFxbOxUwaj40bU9X+Je oRTW/wC7ngbWlspwWzbgMVrphhqUNeW78z4HNeOuIs1UqbxfsKD+zSTh98rub81zWfY/GKWWSaSS aaR5ZpXeWWWV2kklkkYu8kjuSzu7Ekkkkk1ufHt31e5/XJ/waN/8nF/td/8AZFfA/wD6nU1cWN+G Hqfq3hT/AMjDNv8ArzH/ANKP7vK88/bz+U3/AIO1v+TL/wBm7/s5+D/1VPxDrswf8SXp+p+X+Kn/ ACJ8u/7Cf/bJn8B1eifhIUAFABQAUAFAH65/8EHf+Utn7GP/AGOvjb/1UXxDrDEfwZ/11PrOB/8A kqsn/wAcv/Tcz/UwryT+mgoAKACgAoAKACgAoA/yZf8AgrL/AMpMv26/+zn/AIu/+pbqNezR/hU/ RH8scVf8lJnf/YTU/wDSmfntWh4AUAFABQAUAFAH+hN/wacf8o6vjP8A9nqfEX/1Rn7OVebjP4sf 8P6s/fPCz/kn8Z/2GT/9N0j+n2uQ/Sj/ACtP+C0X7GUv7EP/AAUE+NHw70rTG0/4afEDUn+NXwd2 Q+TZJ8P/AIi6hqOoDQtPUKFWz8EeKrfU9BiBLO0WmJIxJfJ9ehU9pTi+q0Z/MPGOT/2Ln2Mw8I2w 1R+0p9uWbbsv8Mrx+R+U9bHy4UAFABQAUAFABQBasb690y9s9S028utP1HT7q3vrC/sbiW0vbG9t JUuLW8s7q3eOe2uraeNXjkRldHUEEEUFRk4tSi2pJ3TXQ/Zb9m3/AIL/AH/BT/8AZsstO0Oz+PC/ GjwnpixJbeGP2hNDi+JmYoflWCXxrJdaR8UntxGAgj/t8IiABAuKwnhqU/s2fkfX5dx3xLlyjBY7 21JfZqrn/wDJtJ/+TH6o+Ef+Duf4/WWniLx5+x58H/EmrbIw174R+IfjTwTp5kDzmZxpms6X4/uV R42iCr9rJRkYlmDhUxeCj0mz6el4rY9RtXyijKX92cor7mpfmdhrf/B3r4/uPtP/AAjf7C/g/St9 uq2f9t/HzWvEHkXYiAae5+wfCjwz9rtzPlhEvksEO3zCRuK+pLrU/D/gm0/Fiu7+zySC061W/wAo RPj/AOLP/B1J/wAFEvG0F1YfDjwd+zz8FrWRpfsmq6H4J8QeNPFdsrysYhJfePPFmt+FLloYQq5/ sRNz7mIwVVNFhKS3bZ5GK8T+IKyccPRw9Fd1Fyl98pOP/kp+KP7R/wC3d+2L+11ctL+0f+0b8U/i pYeet1D4X1vxJcWPgKxulkSX7VpXw60FdJ8B6RdM8SFpLXToXby0yTsXG8acIfDFI+NzHPM3zZ3z HMKtWP8AK3aK9IK0V8kfJlWeUFABQAUAFABQAUAFAH9IH/Btr/wUM8E/sfftReMfgl8Ytes/C/wl /aqs/CegW3izVJY7fRvCPxb8KX2qR+AbrXL+dli0fw54mtPFGoaZd3TERQ3ctjJcNHbRSzRcuKpO cFKK1X5H6H4d5/RyjM62CxdRRwuKUVzPaNSLfLd9E+Zxb78reibX+jCrK6q6Mro6hlZSGVlYZVlY ZDKwOQR1rzD+gx1ABQAUAfE37e37enwL/wCCevwG1/41fGjX7Rb37JqNn8Nvh1bX1vF4v+KvjOC2 V7Hwt4XsG8y4eL7RPCdRv/La10q0fz5yBsV9KdOVWXLE8bPc8wOQYGpjMZUXNZ8kL+9OXSMV+b2i tWf5OXxV+IWrfFz4ofEj4r6/a2FjrvxO8e+MPiFrVlpSTx6ZZ6t408Q6j4k1K102O5nublLC3vNS dIRJJI4jADMxyT7EVyxUVskfy1isRPF4nEYqokp1akptLa8m27eWpwVM5woAKACgAoAKAP8AY5/5 t0/7or/7oteH9r5n9c/8y/8A7g/+2ntVI7T89f8AgrL/AMozf26/+zYPi7/6iWo1pR/i0/VHgcVf 8k3nf/YNU/8ASWf5M1eyfywFABQAUAFABQAUAf6l/wDwQd/5RJ/sY/8AYleNv/Vu/EOvJxH8af8A XQ/pvgf/AJJXJ/8ABL/05M/XSsD6s/z2f+Dsf/lIr8GP+zK/h1/6vP8AaNr0sH/Cl/i/RH4J4p/8 lBg/+wOH/pyqfzBV1n5oFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAf1Cf8ABr/+wtN8 cf2q9d/a+8Z6T53w1/ZagNt4Pa8tllsdf+OHi3Srq00dIROjwXH/AAr/AML3VxqspXEtpqNzpUqk ZzXJi6nLDkW7/I/S/DXJHjc0nm1aH+zYX4ezqSWn/gMby8m4s/0H680/ez8Qf+C9f/BPCX9vL9i/ V9T8B6M2p/tBfs6tq/xP+EcNpD5mpeKNNWygHxF+Glvthnnml8Y+HtOjuLGCNQ9xrml2ERdI3lNd GHq+zqa/C9z4vjnh955k85UIXx+HvOn3kvtw/wC3krpdZRitrn+Y4ysjMjqyOjFWVgVZWU4ZWU4K spGCD0r1T+bhtAgoAKACgAoAKACgAoAKACgAoAKACgAoAKAP65/+DRv/AJOL/a7/AOyK+B//AFOp q4sb8MPU/V/Cn/kYZt/15j/6Uf3eV55+3n8pv/B2t/yZf+zd/wBnPwf+qp+IddmD/iS9P1Py/wAV P+RPl3/YT/7ZM/gOr0T8JCgAoAKACgAoA/XP/gg7/wApbP2Mf+x18bf+qi+IdYYj+DP+up9ZwP8A 8lVk/wDjl/6bmf6mFeSf00FABQAUAFABQAUAFAH+TL/wVl/5SZft1/8AZz/xd/8AUt1GvZo/wqfo j+WOKv8AkpM7/wCwmp/6Uz89q0PACgAoAKACgAoA/wBCb/g04/5R1fGf/s9T4i/+qM/ZyrzcZ/Fj /h/Vn754Wf8AJP4z/sMn/wCm6R/T7XIfpR/Pt/wcRf8ABO2f9s/9kCT4t/DnQv7S+Pf7LEGveO/D lvZRk6n4w+GM9pDc/E7wRDHEjS6lqMNhpMGsaXDiSVrrTntbdQ98+7pw1Xknyt+6z4Lj/h95xlP1 vDwvjsLeStvKH24+bslKPmrL4j/Nlr1D+dgoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgD93P2A/8Ag4N/bc/Yh0PQ/hrr91pP7SvwO0G3ttO0f4f/ABUv7+DxP4T0i1EccOl+Bfif Yx3ev6PYQW0KQW9pqcGt6bZQKEtbWEVz1MNTqO+0j7jIuPc6yWEMNUaxOCjoozb5ortGa1S6JSUk lskf0SfC7/g7J/Yo8QadCPi18BP2jfhprzRB54PC1t8P/ib4ZhkCkvDHrs/i7wFrkzFsBD/YyK3J YpgZ5Xg6nSSaP0DDeKeTVIr63gcRTqf3eWcfv5ov/wAlPTNT/wCDqj/gmtY2NxdWfg79qvWbmJU8 nTLD4Y+AYLq6Z5EjxHNqvxc06wjWJXLuXmX5FO0M21WX1Or3j/XyOiXifw5GLao4pvsoR/WokfmV +03/AMHafj/W9P1PQf2Rv2Z9G8CTTq0Vl8Rvjd4iPjDV4IZC6tPafDjwpFpGiafqUMeGikudb1W2 3n57d1XDawwa3nO/ofN5l4qV5xlTynLVB/z1HzP/AMAjZJ+spLyP5Xv2if2m/j3+1l8SNS+LX7RX xR8U/FXx5qSmH+1/El4jWuk2AkeaPRvDOhWUVpoHhTQLeWRnj0/TbW0s43dmWMMzE9kYRguWKsj8 xzDMsdmuIli8wxMqtd9X0XZJaRXkkl5HhNUcIUAFABQAUAFABQB/sc/826f90V/90WvD+18z+uf+ Zf8A9wf/AG09qpHafnr/AMFZf+UZv7df/ZsHxd/9RLUa0o/xafqjwOKv+Sbzv/sGqf8ApLP8mavZ P5YCgAoAKACgAoAKAP8AUv8A+CDv/KJP9jH/ALErxt/6t34h15OI/jT/AK6H9N8D/wDJK5P/AIJf +nJn66VgfVn+ez/wdj/8pFfgx/2ZX8Ov/V5/tG16WD/hS/xfoj8E8U/+Sgwf/YHD/wBOVT+YKus/ NAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAPSvg38IfiF8ffin4C+C/wAKPDl54s+IvxL8 TaZ4T8JaBZDEl7quqTiJHuJ2/c2Om2MO+4vLqUrBaWkUk0rLHGzBSkopyk9EdODwmIx+KoYPC03P EVJKMV5v8kt29krt6H+sR/wT7/Yw8DfsC/so/C79mzwUbW/ufC2l/wBq+P8AxXb27QSePPifrscN 3438YzrLm5EGoamvk2EUrPJZ6VbWtruKwKa8epUdSbkz+pchyehkWV4bLqNm4q8pfzTfxS+b0XaK S6H2jWZ7AUAf583/AAcYf8EnLz9mj4r6r+2t8CvDDj9nv4zeIWuvifomiWLfYPg98Wtdus3V5JBb oYtM8D/EnU5zPZvhbez1mWWzHlJPYRN6WGrc69nJ+8vxR+C+IPCzy7FSznA0v9grS99JaU6j/KM3 quildaXij+XWus/MwoAKACgAoAKACgAoAKACgAoAKACgAoAKAP65/wDg0b/5OL/a7/7Ir4H/APU6 mrixvww9T9X8Kf8AkYZt/wBeY/8ApR/d5Xnn7efym/8AB2t/yZf+zd/2c/B/6qn4h12YP+JL0/U/ L/FT/kT5d/2E/wDtkz+A6vRPwkKACgAoAKACgD9c/wDgg7/yls/Yx/7HXxt/6qL4h1hiP4M/66n1 nA//ACVWT/45f+m5n+phXkn9NBQAUAFABQAUAFABQB/ky/8ABWX/AJSZft1/9nP/ABd/9S3Ua9mj /Cp+iP5Y4q/5KTO/+wmp/wClM/PatDwAoAKACgAoAKAP9Cb/AINOP+UdXxn/AOz1PiL/AOqM/Zyr zcZ/Fj/h/Vn754Wf8k/jP+wyf/pukf0+1yH6UFAH+dP/AMHCH/BJi8/Y4+Mt9+1L8EfDez9l344+ JJrnVNK0ezZLH4LfFTVzNfan4Xmt7dPs+neCvF9ws17oTrsgtZTPpwSNYLQ3Hp4atzx5JP31+J/P 3H3CryjGSzPBU/8AhMry1S2pzerj5RlvHotY6WV/5tK6j86CgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/2Of8Am3T/ALor/wC6LXh/a+Z/XP8A zL/+4P8A7ae1UjtPz1/4Ky/8ozf26/8As2D4u/8AqJajWlH+LT9UeBxV/wAk3nf/AGDVP/SWf5M1 eyfywFABQAUAFABQAUAf6l//AAQd/wCUSf7GP/YleNv/AFbvxDrycR/Gn/XQ/pvgf/klcn/wS/8A Tkz9dKwPqz/PZ/4Ox/8AlIr8GP8Asyv4df8Aq8/2ja9LB/wpf4v0R+CeKf8AyUGD/wCwOH/pyqfz BV1n5oFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAEsEE91PDbW0Mtxc3EscFvbwRvLPPPK4ji hhijDSSyyyMFVVBLE4FA0m2klqf6Gv8Awb8f8Ed5v2N/A0P7Wf7RnhpIP2oPih4eEXg7wnq9nKmo /An4da3bRyz6be2l5FG+m/EzxfAw/tb5RPpljjTwyPLqEcnmYmvzvki/cX4n77wHwi8ooLNcwp/8 KdWPuxe9KD6PtOX2usV7vWR/TTXKfpAUAFAHGfEX4d+B/i54D8XfDD4l+GNJ8Z+APHmgan4X8X+F dct/tOla7oOr20lpf2F3GGSRVlhkO2SNklicK8bK6qwabTTT1RjiMPRxdCrhsTTU6FSLjKL2ae6P 82D/AILH/wDBGH4lf8E4/H198RPhzZ+IfiF+x/4v1Rn8I+PjbS6hqfwwvr+6SO2+HnxTurSAQWV7 HNcJDpWrOsVrrMZUDZdrLAvqUK6qqz0mfzrxdwfieHq8sRh1KplM37st3Bv7E+z/AJZbS9bo/C6u g+JCgAoAKACgAoAKACgAoAKACgAoAKACgD+uf/g0b/5OL/a7/wCyK+B//U6mrixvww9T9X8Kf+Rh m3/XmP8A6Uf3eV55+3n8pv8Awdrf8mX/ALN3/Zz8H/qqfiHXZg/4kvT9T8v8VP8AkT5d/wBhP/tk z+A6vRPwkKACgAoAKACgD9c/+CDv/KWz9jH/ALHXxt/6qL4h1hiP4M/66n1nA/8AyVWT/wCOX/pu Z/qYV5J/TQUAFABQAUAFABQAUAf5Mv8AwVl/5SZft1/9nP8Axd/9S3Ua9mj/AAqfoj+WOKv+Skzv /sJqf+lM/PatDwAoAKACgAoAKAP9Cb/g04/5R1fGf/s9T4i/+qM/ZyrzcZ/Fj/h/Vn754Wf8k/jP +wyf/pukf0+1yH6UFAHnPxc+Enw5+PHwz8a/B34ueE9L8c/Db4h6Dd+G/F/hbWI5GstV0q8CkqJY JIbuyvbS4jS4tbq3kiurO6ijngkjljR1cZOLUouzRz4vCYfHYathMXSU8PUjaUXs1+j6prVPVan+ aN/wWC/4I+/E3/gmj8TT4i8OjWfH/wCyl4/1m4h+F/xQmtxNfeG76YTXifDT4lvZwxWmn+MNPtIn NneBIrTXbSJri3WOaO7tLT1aFdVVZ6TR/OXFvCWJ4cxPtKd6mV1H7k+qf8k+0l0e0lqrNNL8W63P jgoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/2 Of8Am3T/ALor/wC6LXh/a+Z/XP8AzL/+4P8A7ae1UjtPz1/4Ky/8ozf26/8As2D4u/8AqJajWlH+ LT9UeBxV/wAk3nf/AGDVP/SWf5M1eyfywFABQAUAFABQAUAf6l//AAQd/wCUSf7GP/YleNv/AFbv xDrycR/Gn/XQ/pvgf/klcn/wS/8ATkz9dKwPqz/PZ/4Ox/8AlIr8GP8Asyv4df8Aq8/2ja9LB/wp f4v0R+CeKf8AyUGD/wCwOH/pyqfzBV1n5oFABQAUAFABQB9xfse/sBfHT9ubw3+0Fefs+afB4t8c /ALwV4f+INx8NIkYeI/H3h7VNauNH1a08GSmRbe88UaOI0uYdOcK+oxCSO3c3Qgt7nOdSNNx5tme 3lORY7O6ePeAjz16EFPk6yTdny/3lvbrrbWyfxTqGn3+k399pWq2N5pmqaZeXOn6lpuoW01lf6ff 2Uz215Y31ncpHcWl5aXEbRyxSKrxupVgCCK0PGlGUJSjKLUk7NPdPsynQSFABQAUAFABQAUAFAHQ +EvCPirx74m0LwV4G8Na94x8YeKNUs9E8NeFfC+kX+veIvEGs6hMtvY6VoujaXBdajqeo3k7hIoY Y3kdjgA0m0k23oaUqVWvUhRoU5TrSdlGKbbb2SS1bP71/wDgib/wQCsv2Xr3wv8AtY/toaTpHiH9 oW2S21j4ZfB5zZa34b+CF26xz2vifxLdwyXOmeJPitZ5/wBFWAy6doMg86GS5vfJnsvPr4nnvCn8 Pfv/AMA/cuDeBI5ZKlmucQUswWsKe6p/3n0c10tpHdXlZx/qrrjP1AKACgAoAKAOZ8Z+C/CPxG8J +IfAnj7wzofjLwX4s0m80LxN4V8S6ZaazoGvaPqETQXum6rpd/FPZ3tncRMQyOhHfqBTTaaaepnW o0sRSqUK9OM6M1Zxaumn0ae5/Dd/wVV/4NpPHXw4vvEHxx/4J4aZqvxG+HMrXOqa/wDs2z3c2p/E jwUC/nSn4X6hezPdfEbw5GjMI9Lnc+ILdY1SJ9UaQ+T30cUnaNXR9z8U4o8Oa+HlUxvD8XUw+7o7 zj/gb+Nf3X7y6c19P5ItU0rU9D1K/wBG1vTr/R9Y0q8uNP1TStUs7jT9S02/tJWgu7G/sbuOG6s7 y1nRkkikRXRwQQCK7T8qlGUJShOLU07NPRp9mihQSFABQAUAFABQAUAFABQAUAFABQB/aZ/wac/s 9fGrwp4m/aM/aD8UfDjxN4c+DnxB+HfhXwj4C8da5YnStK8a63pniy71DU18Kx3rQ3uvabp0ELLN fW0Ulik4MPm+aGQcOMlFqMU/eTP2Pwty/GUquYY+rh5RwdSnGMZNWUmpXfLfVpd1pfS9z+1euA/Y z+U3/g7W/wCTL/2bv+zn4P8A1VPxDrswf8SXp+p+X+Kn/Iny7/sJ/wDbJn8B1eifhIUAFABQAUAF AH65/wDBB3/lLZ+xj/2Ovjb/ANVF8Q6wxH8Gf9dT6zgf/kqsn/xy/wDTcz/UwryT+mgoAKACgAoA KACgAoA/yZf+Csv/ACky/br/AOzn/i7/AOpbqNezR/hU/RH8scVf8lJnf/YTU/8ASmfntWh4AUAF ABQAUAFAH+hN/wAGnH/KOr4z/wDZ6nxF/wDVGfs5V5uM/ix/w/qz988LP+Sfxn/YZP8A9N0j+n2u Q/SgoAKAOI+JHw28AfGHwJ4o+GPxS8IaB4++H3jXSZ9D8VeEPFGm2+raHrmmXBV2tr2yuUeNmimj SWGRdssE8aSxskiKwabi007MxxGGoYuhVw2KoxqYeatKMldNea/qz1R/Br/wVX/4Nu/it+z5deJf jh+wxp/iH40/A3ff61rXwcRbjWfjB8KrIBrmWDw/GGmv/iv4RsQGETwq3iC2h2JNBehJr8+hRxUZ WjU0l36f8A/DuKPDzFYB1MbkkZVsFq3T3qQXl1nFeXvLqpayP5Yp4J7Wea2uYZbe5t5ZILi3njeK eCeJzHLDNFIFkilikUqysAVIwa7D8xaabTWpFQIKACgAoAKACgAoAKACgAoAKAP15/4Je/8ABHT9 pH/gpP4wsNY0nTr/AOGH7Nek6stv46+PfiDS5/7JlS0n2al4b+GljcfZx488aAIyPHA4sNNYhr6e Fmhinwq140l3l2PrOGuEcx4irRnCLpZcn71VrTzUF9qXpovtNaJ/04/8FHf+Daf4I+NP2dPBLfsD 6BB4D+O3wT8KR6HDo3iHWoja/tFaRDd3mp6g/jzxHdpbW1r8Wri+v5prHWWW3sJEK6bNHb2MdlJp 3LSxUlJ+0d4v8P8AgH6TxD4c4Ktl9H+wqfs8dRhazf8AFWrfM/8An5du0tF9l2jy8v8ACL8QPh94 4+FPjXxL8OPiX4S8QeBfHvg3VrnQ/FPhHxTpd3o2v6Dq1owE9lqWm3scVzbygMGUldskbK6kqyk+ gmmk09D8Qr4evha1TD4mlKFeDtKMlZp9mmcfTMQoAKACgAoAKACgAoAKACgAoAKACgAoAKACgD/Y 5/5t0/7or/7oteH9r5n9c/8AMv8A+4P/ALae1UjtPz1/4Ky/8ozf26/+zYPi7/6iWo1pR/i0/VHg cVf8k3nf/YNU/wDSWf5M1eyfywFABQAUAFABQAUAf6l//BB3/lEn+xj/ANiV42/9W78Q68nEfxp/ 10P6b4H/AOSVyf8AwS/9OTP10rA+rP8APZ/4Ox/+UivwY/7Mr+HX/q8/2ja9LB/wpf4v0R+CeKf/ ACUGD/7A4f8ApyqfzBV1n5oFABQAUAFABQB/XP8A8Gjf/Jxf7Xf/AGRXwP8A+p1NXFjfhh6n6v4U /wDIwzb/AK8x/wDSj99f+Cnf/BCb9l//AIKGf2t8StBKfAP9puaCSUfFnwppMN1onjq6igMdpafF jwck1la+I/uhBq1rJaazEuzzJrqGJLaueliJ0tN4dv8AI+64l4IyzP8AnxMP3GZfzxWkv8cev+JW l3bSsfwj/ts/8Emv24/2CtQ1S5+NXwe1fUvhtY3Rhsvjb8PIrrxn8JtRt5JHjtLi68R2Fqtx4Rnv DG3l2mu22l3jbSViZcMfQp1qdT4Za9up+IZzwtnWRSk8ZhG8On/Eh71N/NfDftJRfkfm3Wp86FAB QAUAFAE9tbXN7c29nZ2893d3c8Vta2ttFJPc3NzPIsUFvbwRK8s080rhURQWZiABmgaTk0krtn7k fsN/8G+n7fP7YtzpXiHxV4Ml/Ze+D120E9x8Q/jZpGo6V4i1DT5Dl5fBnwoY2PjLxBcNCyywSX40 bSrmNsx35PynnqYmnDRO8vL/ADPtcl4Cz3N3GpVo/VsI/t1E02v7sNJPyvyxf8x/ch/wTx/4JF/s if8ABOHQo7r4U+FpfGnxiv7A2fif49fEGGx1T4hamk8ZW+03w6YbePTfAfhmdnZfsOlxxPPEEF7P eSRrLXBVrTq7v3ex+1ZBwplPD0L4Wlz4tr3qsrOb7pdIx8o7/ab3P1ErE+mCgAoAKACgAoAKACgD 8x/28P8AgkV+xL/wUKtZ9U+M/wAOP+Ec+KotRbad8c/hjJY+EvilbpFBFb2kGtap/Z99pPjjTrOG BI4bbXbPUUtY9wtTbs7MdadapS+F6dj5vPOFMmz9OWMw/LiraVIWjP5uzUl2Uk7dLH8e37Yn/Br9 +218ELjVvEf7NWs+F/2rfh9A9zc2ml6VPaeAPjBYWEZ83bqHg3xJqI8N669vC4RG0nWbq8vHjYrY xbkjPdDF05aS0f4H5Jm/hpnOCc6mXTjisP2Xu1EvOLdn/wBuybf8qP54/if8H/iz8E/Es/g34x/D Lx/8KfFttvM3hr4i+EPEHgvXFWN9jSjS/EWn6dePBu6SKhRsggkEV0qSkrxaaPgcThMVgqjo4zDV KVVdJxcX9zSPOaZzBQAUAFABQAUAFAFi0tLvULu1sLC1uL6+vriC0srK0gkubu7u7mRYbe1tbeFX muLi4mcIiICzsQACTQNJyajFXkz9d/2Uv+CFX/BSn9rG40690T4Baz8HPAt9LCJfiL+0ILv4VaJB azrFLFf2XhvV7GX4j+I7C4t5d8VxpeiXlrIBjzVyM4TxFKH2rvyPrMr4I4jzVxcMA6NB/bq+4vVJ rna84xa8z+s/9g3/AINm/wBkL9mq80bx/wDtK6m/7W3xR0/7PeQaH4l0aLRPgboOoCJS4h+HrXOo 3Pjp7aWSRPM1+6uNPuECSf2ZBKoI46mKnPSHur8T9UyPw4ynLnCvmMvreJXRq1NP/Brzf9vNp/yp n9JdjY2WmWVnpum2drp+nafa29jYWFjbxWllY2VpElva2dna26RwW1rbQRqkcaKqIigAACuU/RIx UUoxSUUrJLoWqBn8pv8Awdrf8mX/ALN3/Zz8H/qqfiHXZg/4kvT9T8v8VP8AkT5d/wBhP/tkz+A6 vRPwkKACgAoAKACgD9c/+CDv/KWz9jH/ALHXxt/6qL4h1hiP4M/66n1nA/8AyVWT/wCOX/puZ/qY V5J/TQUAFABQAUAFABQAUAf5Mv8AwVl/5SZft1/9nP8Axd/9S3Ua9mj/AAqfoj+WOKv+Skzv/sJq f+lM/PatDwAoAKACgAoAKAP9Cb/g04/5R1fGf/s9T4i/+qM/ZyrzcZ/Fj/h/Vn754Wf8k/jP+wyf /pukf0+1yH6UFABQAUAFAH5Af8FAP+CI/wCxF/wUAOq+LfFfg6X4QfHO9W4nX44fCS203QvEmr6j KqlJ/iFoL2r+HPiNE8kUYlmvoV1byE8qC/t1JNb08RUp6J3j2Z8ln3BmS59zVatH2WNf/LynZNv+ +tp/P3raKSP44v2xf+Dbn/goR+zPLqWu/Cvw9pv7W3w3tVluIdb+DkFxF8RLa0jyEXWfg9qs8nia bUp2Ulbfw/P4jULtLSKxKjthiqU9G+V+f+Z+R5v4d5/lrlPC01i8OutP4/nTfvX8oOfqfgt4m8Le J/BWuah4Y8ZeHNe8JeJdInNtq3h7xNo+oaDrmmXIAJt9Q0nVbe0v7KcAg7JI1bB6V0Jpq6eh8NUp VaM5Uq1OUKi3TTTXqnqjBpmYUAFABQAUAFABQB+iH7J3/BKX9vj9tKfTrn4Ifs7eNZ/BmoPAf+Fp +OLM/D34XQ2ku0yX1t4y8WDTbDxGlrG6vJBo41K9CMpWBtyg5TrU6fxS17H0GVcL57nDi8Fl8/Yv 7cvch680rJ+kbvyP65v2C/8Ag1z/AGffg1Nonj/9tbxhF+0j4/sZba/T4Y+F/wC1PD3wL0m9gdZV h1Sa5j0/xn8TIobiJXX7UujafPGzQ3OnToTnjqYuUrqmrL8T9WyPwzwGDcK+c1vrFda8kbqkn57S n8+VPZxZ/Up4e8OeHvCOhaT4X8J6Fo3hjw1oFhbaVoXh3w9pdlouhaLplnGsNppuk6RpsFtp+nWF rCoWOGGNI0UAKAK4223dvU/TadOnShClSgo04qySSSS7JLRI2aCz83v2/v8AglX+yH/wUZ8NrbfH DwS+k/EjStO+weEfjf4Eaz0L4oeGYYvtElpp8mrSWd3Z+KPDcNxdSP8A2Xq0F5aIZXeBYJ2Ey606 06T916dj53PeF8p4hp2xtG2IStGpHSa8r/aX92Sa7Wep/Eb+2x/wbeft6/swXmseIfg5ocH7XHwn tPOubXXvhXYvafEyxsVYrGniD4O3d7eeIbjUWxnZ4en8QR7MO7xklF76eKpz0l7r/rqfjOc+Hme5 a51MJD63hV1gvfS86d73/wADn8j8CPEPh3xB4S1rUfDfivQtZ8M+ItHuGtNW0DxDpl7outaXdqqu 1rqOl6lBbX1lcKrglJY1YAjjmuhNPVbHwlSnUpTlTqwcai3TTTXqnqjGpkBQAUAFABQAUAFABQAU AFABQAUAFABQB/sc/wDNun/dFf8A3Ra8P7XzP65/5l//AHB/9tPaqR2mN4h8OeHvF2hat4X8WaFo 3ifw1r9hc6Vrvh3xDpdlrWha1pl5G0N3puraRqUFzp+o2F1CxWSGaN43UkMCKE2ndPUipTp1YTpV YKVOSs00mmuzT0aPnn/hiL9i/wD6NE/Zg/8ADBfCn/5k6v2lT+d/ezg/sXJ/+hThv/BUP/kQ/wCG Iv2L/wDo0T9mD/wwXwp/+ZOj2lT+d/ew/sXJ/wDoU4b/AMFQ/wDkQ/4Yi/Yv/wCjRP2YP/DBfCn/ AOZOj2lT+d/ew/sXJ/8AoU4b/wAFQ/8AkQ/4Yi/Yv/6NE/Zg/wDDBfCn/wCZOj2lT+d/ew/sXJ/+ hThv/BUP/kQ/4Yi/Yv8A+jRP2YP/AAwXwp/+ZOj2lT+d/ew/sXJ/+hThv/BUP/kQ/wCGIv2L/wDo 0T9mD/wwXwp/+ZOj2lT+d/ew/sXJ/wDoU4b/AMFQ/wDkQ/4Yi/Yv/wCjRP2YP/DBfCn/AOZOj2lT +d/ew/sXJ/8AoU4b/wAFQ/8AkT3zwl4P8JeAPDumeEPAnhbw54K8JaJFLBo3hfwlommeHPDukQT3 M15PDpmiaPa2em2EU13cySusUSBpJGY/MxJltt3b1O6lRpUKcaVClGFKO0YpJL0S0R0dI0PHPiH+ zr+z78XNatfEnxX+BXwc+J3iKy0uHQ7LX/iH8MfBPjTWrTRba7vb+30i11TxJompX1vpdvfalczJ bpIIkluJHChnYmlOUdIyaRx4jL8Bi5qpisDRq1ErXnCMnbV2u03a7enmzg/+GIv2L/8Ao0T9mD/w wXwp/wDmTp+0qfzv72Y/2Lk//Qpw3/gqH/yIf8MRfsX/APRon7MH/hgvhT/8ydHtKn87+9h/YuT/ APQpw3/gqH/yIf8ADEX7F/8A0aJ+zB/4YL4U/wDzJ0e0qfzv72H9i5P/ANCnDf8AgqH/AMiH/DEX 7F//AEaJ+zB/4YL4U/8AzJ0e0qfzv72H9i5P/wBCnDf+Cof/ACIf8MRfsX/9Gifswf8AhgvhT/8A MnR7Sp/O/vYf2Lk//Qpw3/gqH/yIf8MRfsX/APRon7MH/hgvhT/8ydHtKn87+9h/YuT/APQpw3/g qH/yJ6L8OvgH8Cvg/e6jqXwk+C3wl+Fuo6xaxWOr3/w6+HPg7wTe6rZQS/aILPUbrwzo2mT31rDO d6RysyK/IGaTlKXxSbOjD4HA4RylhcHSpSas3CEY39bJXPWqk6iKeCC6gmtrmGK4triKSC4t540l gnglQxywzRSBo5YpY2KsrAhgcGgTSaaa0Pya/aR/4Ic/8Eyf2nrrUta8Xfs0eGvAPjDU3ee48Z/B K7vfhJqzXcwb7Rf3OjeE5LTwPq+o3Uj+ZLPf6Tdyyy/OzFixO0MRVhtO689T5bMeCuG8ycp1ctjT rP7VO9N+to+635uLPxz+Jf8AwaL/AAJ1a7mk+D37Y3xY8BWTyu0Nr8R/hp4R+K88MTSRMkTXfhrX /g4srJEHXd5S5LKcfKQ+6xsvtQT/AA/zPkcT4U4Gbf1TN6tOP9+EZ/k6Z83f8QhnxG/6Pk8Ff+GJ 13/56FV9dX/Pv8f+Aed/xCfEf9DqH/gp/wDyZ1/hj/g0GuTIk3jP9vSCOJJ5lk0/wx+zjJNJPbG2 H2eVNZ1X41wLaTi7Yl4zYTKY0wHDPmMeN7U/x/4BrS8J3vWzzTtGl+rqfoz7o+Ev/Bqn/wAE/PBc 8F/8TviD+0L8Z7qJyZdKv/FfhvwJ4UuY+dqPY+D/AAtbeK435+Zk1tQccKOc5yxlR7JI9vCeF+Q0 WpYnEYis+zkox+6Meb/yY/af9nD/AIJ6/sS/sjGG4/Z2/Zn+FXw21mCLyE8X2mgDX/iAbfaFNvL8 RvFs2v8Ajue3bGTHJqLIWyxGSTWE6tSfxTbPssuyDJsps8vy2lTn/Na8/wDwOV5fifZNZnrhQAUA FABQAUAFABQAUAFABQAUAcN8Qfhj8Nfi14euPCXxV+Hngb4meFLvP2rwz8QfCegeM/D1zkYP2jRf Een6lps2QMfNGaabi7xbTMMRhsNiqbpYrDwqUn9mcVJfc00fkv8AGb/g34/4JTfGVr68k/Zqt/hf rt8zN/bnwZ8ZeMPAC2ZcgsLHwlaaxefDq3XI4H9isF6DAraOJrR+3deZ8tjOA+F8ZzSeXeym+tOU o/dG/J/5Kfm/8Qf+DSj9kbVpJ5Phf+01+0N4I81neODxnYfDr4jW1szyIwjiXSfDvw2umt4k3Kgk meTBUs7EHdqsZPrBHzuI8Ksqlf6tmWIh/iUJ/koHy94g/wCDQXVo5Gk8K/t76ddwyXU5S18Qfs3X OnyWlkWY2yNf6b8cNTXULpFIWRhbWqMQWCrnaL+u96f4/wDAPMqeE0/+XWepq/WjbT1VR3+5HNf8 QhnxG/6Pk8Ff+GJ13/56FH11f8+/x/4Bn/xCfEf9DqH/AIKf/wAmbmi/8GgviGZpz4i/b40bTkRo Psy6L+zZfa01wpMn2kTtffHLQRZsgCbCon37jkLtG4+u/wDTv8f+AXDwmqO/tM9S9KLf51F+p9Ge C/8Ag0d/ZpsbiNviJ+1p8cvFNqJcyw+C/CPgHwFcPB51sxjjudci+JMccv2dZl3mJxvdG24Rkkl4 2XSCPQo+FOXRf+0ZrXkv7sYx/PnPu/4Uf8G1f/BKr4aywXOvfDD4j/Ge7tlh8mf4r/FnxO0XnRZz cT6X8Nm+G+i3rTZ+eOe2ltz2jFZSxVZ7NL0R7mF8OuF8M06mGqVn/fnL8ocifzVj9Yfgf+x7+yp+ zVHEvwB/Z0+DHwiuo7U2cms+BPh14X0DxNfW7KUddX8VWemp4k1p3jO1nu7ud2UBSSABWMpzn8Um z6nBZRleXW+oZfRpO1rxhFN+srXfzbPo+pPRCgAoAKAPPviJ8JfhX8XtMsdE+LPwz+H3xQ0bTL8a rpukfETwZ4c8a6Zp+pi3mtBqVjYeJdN1O0tL8WlzJF50aLJ5cjLnDEFqUo6xbTMMRhcLi4xhisNT qwTulOKkk+6TT1PIf+GIv2L/APo0T9mD/wAMF8Kf/mTqvaVP5397OT+xcn/6FOG/8FQ/+RD/AIYi /Yv/AOjRP2YP/DBfCn/5k6PaVP5397D+xcn/AOhThv8AwVD/AORD/hiL9i//AKNE/Zg/8MF8Kf8A 5k6PaVP5397D+xcn/wChThv/AAVD/wCRD/hiL9i//o0T9mD/AMMF8Kf/AJk6PaVP5397D+xcn/6F OG/8FQ/+RD/hiL9i/wD6NE/Zg/8ADBfCn/5k6PaVP5397D+xcn/6FOG/8FQ/+RD/AIYi/Yv/AOjR P2YP/DBfCn/5k6PaVP5397D+xcn/AOhThv8AwVD/AOROj8Jfsp/su+APEWmeL/An7NvwD8FeLNEl ln0bxR4S+Dvw88OeItInntprOebTNb0fw7Z6lYSzWlzJE7RSoWjkZT8rEFOc2rOba9TSlleWUKka tDLqEKsdpRpwTXo0ro98qTuCgAoAKACgAoAKACgD558Q/si/soeLtd1bxR4s/Zh/Z58T+Jdfv7nV dd8ReIfgr8Nta13WtTvJGmu9S1bV9S8NXOoajf3UzF5JppHkdiSxJqlOaVlN29Tz6mU5XVnOrVy3 DyqSd23Tg233bau2Y3/DEX7F/wD0aJ+zB/4YL4U//MnT9pU/nf3sn+xcn/6FOG/8FQ/+RD/hiL9i /wD6NE/Zg/8ADBfCn/5k6PaVP5397D+xcn/6FOG/8FQ/+RD/AIYi/Yv/AOjRP2YP/DBfCn/5k6Pa VP5397D+xcn/AOhThv8AwVD/AORD/hiL9i//AKNE/Zg/8MF8Kf8A5k6PaVP5397D+xcn/wChThv/ AAVD/wCRD/hiL9i//o0T9mD/AMMF8Kf/AJk6PaVP5397D+xcn/6FOG/8FQ/+RD/hiL9i/wD6NE/Z g/8ADBfCn/5k6PaVP5397D+xcn/6FOG/8FQ/+RPY/h58LPhj8I9FuvDfwo+HPgP4Y+Hb3VJtcvdA +HnhDw/4L0W71q5tLKwuNXutL8N6fptjcapcWOm20L3DxmV4reNCxVFAlyctZNtnXh8LhsJB08Lh 4Uqbd7Qioq+ivZJK9ktfJHeUjcKACgAoAKACgAoA8V+NH7N37Pv7RmjL4f8Aj38E/hZ8Y9Jhgnt7 O1+JHgXw34vfTFucebJo11renXl5ol1uAZZrSSGZHAZWDAEVGUo6xk0ceMy7AZhD2eOwVKtDpzxU rel1p6o/Hf4w/wDBtX/wSu+Kk093oHw2+JPwPvrrzGnufg98U9chhMsi7RNBo3xLg+Jfh6w8rAKx 21nDBnqhyc7xxVZbtP1PkcX4dcMYpt08PUoSf/Pub/KfOl8lY/PLx1/waKfBPUHmPwz/AGzfin4R jbP2dfHXws8JfEV4uLXb50nh/wATfC5Z8Mk2dqx5EidPLYy6LGy601/X3ngV/CjBSv8AVs4qwX96 EZ/k4f1+PgN7/wAGhPjmO6nTTv27PCl1Yq5FtcXv7Pur2F1LHgYeezg+LupQ27k/wrPKP9qq+ur/ AJ9/j/wDgl4T17vlzuDj50mv/cj/ADIIv+DQv4gmSMTftz+DY4S6CV4vgLrcsiRlhveOJvipCsrq uSFLoGPG4daPrq/59/j/AMAS8J8RfXO4W/69P/5M9t8Hf8Ghvwzspo2+IH7cPjrxNbiUmWLwd8D9 A8DTPBvhKxx3GtfEn4iRxSiNZAXMbgl1O0bSHl419Kf4nbR8J8NF/v8AOpyX92mo/nOZ9qfDX/g1 q/4JoeC5ILjxhqX7RXxglVVNzaeNPido+g6RLL5aK4t7f4Z+C/Aur29uXUsqtfzSLuIMjDGIeLqv ayPZw3hlw5RadaWIrP8AvTSX/kkYv8T9UfgL/wAEvv8Agnx+zLPp2ofBf9kf4MeGdd0jyjpfi3V/ DC+PvHWnPFkrLZePfiJP4r8Z205PLSJfB3IG4nAxjKrUn8U2fT4HhrIMtcZYPKqMZraTjzSXpKfN L8T7yrM9wKACgAoAKACgDwL43/srfs0/tK6emm/tAfAX4SfGKCG3a1srj4h+AfDXifVNKhcsx/sT W9T06fWdClyxIks54JBuOGGTVRnOHwyaOHG5Xl2Yx5cfgaVZdOeKk16Nq6+TR+QfxX/4NpP+CVnx Jmurnw/8Ofih8Frm8+0PJJ8KPiz4gaGOe4RwZ7XTfidF8TNIsvJkffHDFbpbKVC+Xsyh3WKrLdp/ L/I+SxXhzwxiW3Tw9Wi3/JN/lPnX4W8j4w8Q/wDBpH+yXc3Zfwp+1F+0Votj5tyRb+IdM+Gnie7E DSA2cZvdN8M+EYTLBD8sj/Z8St8yrGPlq1jJ9YI8ep4VZU3+6zPERj5qEvyUfyPO9U/4NEPhJLdF 9F/bX+I1hY7EC2+qfBzwzq90JAD5jm8tPHOiQsjH7q+QCvdjT+uv/n2vvOeXhRhG/czmoo+dNP8A 9uX5Gf8A8Qhnw5/6Pk8a/wDhidC/+ehT+uv/AJ9/j/wBf8Qnw/8A0Op/+Cl/8met+Gv+DSX9kO1u N3jD9p39pDXbTzYz5Hhq0+GPhS48gK/nR/atU8IeM4/NdipV/JwgBBVsgiXjJ9II6qfhVlKf77Ms RJeXJH84yPrv4d/8Gy3/AASr8ENA3iPwH8Xfi4YNhb/hYnxj8S2C3DJGqbp0+FkfwzQ7nXzCFCKW JGNmFEPF1ns0vl/nc9bD+G/C9G3tKFWr/jqNf+kch+l3wb/4Ju/sD/AB7C5+En7IXwB8Kavpnl/Y PE7fDfw74g8aWxiACNH438UWeteLy/GSxvSzNySTzWUqtSXxTZ9Hg+HciwHK8JlNCE1tLkTl/wCB SvL8T0jVf2N/2Q9d1PUtb1v9lX9m/WNZ1i/vNV1fV9V+B3wx1DU9V1PULiS7v9S1K/u/C813fX99 dzPLNNK7SSyMWYkkml7Sa0U3b1OiWUZTOUpzyvDubd23Tg22923y6tlD/hiL9i//AKNE/Zg/8MF8 Kf8A5k6PaVP5397F/YuT/wDQpw3/AIKh/wDIh/wxF+xf/wBGifswf+GC+FP/AMydHtKn87+9h/Yu T/8AQpw3/gqH/wAiH/DEX7F//Ron7MH/AIYL4U//ADJ0e0qfzv72H9i5P/0KcN/4Kh/8iH/DEX7F /wD0aJ+zB/4YL4U//MnR7Sp/O/vYf2Lk/wD0KcN/4Kh/8iH/AAxF+xf/ANGifswf+GC+FP8A8ydH tKn87+9h/YuT/wDQpw3/AIKh/wDIh/wxF+xf/wBGifswf+GC+FP/AMydHtKn87+9h/YuT/8AQpw3 /gqH/wAifSv2Gy+xf2b9jtf7O+y/YfsH2eL7F9i8ryPsf2XZ5H2XyPk8vbs2cYxUHo8qty2XLa1i 1QMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAzbnWdIs5Wgu9V0 21nUKWhub61glUMAylo5ZVcBlORxyKylXowfLOtFS7NpGM8RQpycaleEZdm0n+ZB/wAJH4e/6Duj f+DSx/8Aj9T9Zw3/AEEQ/wDAl/mT9bwv/QTT/wDAl/mbNbnQFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAZes65o nh2xk1TxBrGl6FpsTBZdR1nULTTLGNmDFVku72aC3RiFJALDIBrKtXoYam6uIrQp0l1k1Ffe7Ixx GJw+Eputiq8KdFbynJRX3tpHk4/aU/Z4N0LMfHP4RmYxiUEfETwmbcqW2hReDVfshlJ/5Z79/fGK 8f8A1n4b5+T+38HzW/5/U7ffzW+V7nh/63cKufs/9ZMDzW/5/wBK3381r+V7nrGj63oviGwi1TQN X0vXNMnLCHUdHv7TU7CYrjcIruylnt5CuecMcV7FGvQxNNVcPWhUpPZxakvvV0e5QxGHxVKNbC14 VKL2lGSlF+jTaNStTYKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKAPyV/au/YM+L/x0+NniP4keEvEfw307Q9X0/w7a21p4j1jxPaaskmk6HY6ZctP Bpng/V7NUee2YoVnYlCCQDwPx/i7w/znP89xOZ4PE4WNCcYJKcpqXuxUXdRpyW601Pw7jbwzz7iT iLF5vgcXhIYapGmkqkqil7sFF3UaUlutNdj8cvH/AIK1X4ceNvFXgLXLjT7rWPCGuaj4f1K50qW5 n02e80y4e2nlsZru1sbqW2eRCUaSGJyOqjpX4tmOBq5ZjsXl9eUXWo1HCTjdxbi7OzaTt6peh+BZ pl1bKcxxuWYmUZV6FSUJOLbi3F2dm0nbtdJ+R/XvX9kn93BQAUAFABQAUAFABQAUAFABQAUAFAEN xcQWkE11dTQ21tbQyXFxcXEiQwW8EKNJNNNNIyxxQxRqWZmICgEk4pSlGEZTnJKCV23oklu2yZSj CMpzklBK7b0SS3bfRI868JfGb4S+PdXutA8E/ErwP4r1qzjlmn0rQPE2kapf/Z4HMc1zDbWd3LLc 2sL4Dyxh413LkjcufMwed5PmFaeHwOaUK1eKu4wnGTst3ZPVLutNu55WB4gyPM688Ll2b4aviIq7 jCpGUrLdpJu6XVq627o9Lr1D1woAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKAPmP9qz9o7Sv2bfhu/iVra31bxbrtxJo/grQbiR0gvtUEPm3GoX/k4m/sfRYWWW42FW kZo4Q6NKHX5bi3iajwxljxXKp4yo+WlB7OVtW+vLFavvpG6vc+O424so8I5Q8ZyKeOqPlowezla7 lK2vLBayta+kbpyuv5tPiN8UvH/xa8Q3Pij4h+KdU8TatcO7RtfTn7Fp8Ttu+yaRpkQj0/SLFD0h too4wcnGSSf5jzPNsxzjEyxeZYudWs+70XlGO0V5RSR/I+bZ1mmeYqeMzXGzrV33ekV2jFe7FeUU kcBXnnln29/wTy1zWrD9qn4c6PY6vqdnpOuxeNIdb0y1vrqDT9Xhs/h94r1Gzj1OyilW3vktb+0i mjEqsEljVhhlBr7rw4xFenxbltGnWnGjUVVSim0pWo1GuZbOzSavs0mfo3hXicRS41ymhTrzjQqq qpxTajJKhVkuZLR2kk1fZpM/pIr+mz+twoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKAPMfjJ8VPD/wV+G3ij4leJVkm07w5ZLJDYQOEutX1S7nisdJ0i1Yp Jsm1HUbiOMyFWWFC0rDYjEeVnWbYfI8sxeZ4q7p0o7LeUm7Riv8AFJpX6LV6Jnj5/nWF4eyjG5vj LulRjpFbyk2lGK85SaV+iu3omfhN4k/4KUftL6vr8mp6Hqvhnwno4mLW/hqw8MaTqlmLcFhHFeaj rdtf6vcTFCPMkimt1ZhlUQHbX4FivE7iitiHVoVqVGjfSChGSt5yknJvu015JbH81Yvxd4vr4p1s NXo0MPfSnGnGSt2cpqUm+7Tj5JbH6p/sa/tZx/tL+HNbs9f0zT9B+IXhD7E2t2GmPP8A2Xq+m34k S113SYLuSa6tovtUDxXFu0s/kN5Z8wiVQv61wTxeuKMNXhiKUaeY0bcyjfllF7TindrVNNXdtNdU ftfAHHC4vwmJp4qjClmtC3PGN+WUZbTindpXTUo3ly6a+8j7Ur7g/QgoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAq319ZaZZXmpald21hp2n2txfX99eTR21pZWVpC9xdXd1cTMkVvbW0 EbO7sQqKpJIAqKlSFKnOrVmo04pttuySWrbfRJatkVKlOjTqVq01GlCLcm3ZJJXbbeiSWrfQ/Db9 pD/gpL408Q6pqfhb4Dyjwl4UtpprM+Np7OKbxTr6xlopLrSorxJrXw9pdxyYj5TX5XbJvt2LRD8G 4m8TsdiatXCcPv2OETa9q1epPzje6hF9NOfZ3i9D+cOLfFzMMVWrYLhmXsMEm17ZpOpPpeKd1CL6 ac+zvB3ifMGjfBD9sX4/Wya+nh34n+NbHUozcW+s+NPEUmn2GpQSbJPOsL/xzrWmWl/auYl2tCzx koADkYHytDIuNOIYLELDYuvTlqpVZ2Ul3TqyimvS6PjcPw5x9xRBYpYTGYilNXU6tTljJd4yrTip L0bWh9p/sQ/s2/tFfBz476ZqfxF8Gax4d8Inwv4ktpZ08R6BrOjC7uoYmtIpo/D+varbpLLOhK7l B3c9a+44E4Y4kyXiClVzLBTp4P2U1fnhKN3a1+SclufoXhzwjxXkHE1Gtm2X1KWB9jUV/aQnC7Ss nyTkr37lD4ift5fFz4IftLfE7wtffYfHHw40rxjPaReF9Tgt7LUdM0/yLN5E0DxBZ263VvKpJKpd reQDJARSdwzzLxAzjIeKM1wlTlr5ZCtbkkkpRVl8E0rr/t7mXktzLNvEzPeHOL84wVTlxOUwxDSp ySUoxsvgmldPspcy8luftdX7kf0OFABQAUAFABQAUAFAH8q/7VP/ACcj8cP+ymeLf/TtcV/JfFv/ ACU+e/8AYVU/9KZ/FXGv/JXcR/8AYZV/9KZ/VRX9aH9qhQAUAFABQAUAFABQAUAFABQAUAFAHxx+ 3tpXjLWP2YfHtr4Liv7m4jk0W81+10zzDe3HhWy1S3udbVEhBmltoYo1luUX71rHJuym5T8V4g0s bW4VzCGBUnK8XNR3dNSTltrbrL+6nfS58D4m0cwr8HZnDL4yc04Oaju6aknPbVpaOS/lTvpc/BP9 mjSfGusfHn4VwfD+K+fxHbeNNB1BJ7FZWFjpllqFvNrd/qDRFdmj2+kib7XuIR4CyHO7af594Xo4 6txBlMcuUvrKrwd10imnJv8AuqN+burrqfzLwhQzHEcTZLHK4y+trEQldX92KknOUrfZUb83Rxuu tj+rOv63P7YCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/n+/ 4Kg+MLnWvj3o3hQXDNp3grwPpccdrvVkh1bxDdXerahc7VdjHLdaf9hRgwUlYVOMYJ/nfxVxs6/E NDCc37uhh46dpTbk381yfcj+XvGXHzxHE+HwXN+6w+Gjp2lNuUn848i+SPzo0zTrzWNR0/SdOga5 1DVL2106wtkxvuLy9njtrWBMkDdLPKqjPc1+a0qU61WnRpRvUnJRS7tuyX3n5RRpVK9WlQpRvVnJ Riu7bsl82fu14F/4JcfB2w8N2UfxA8R+MvEPiyeyiOq3WianY6NolnfP5ck0ejWj6RdXckNuwaJZ LmWQzKS/lxkhU/fsB4U5LTwsFmOJr1MY4rmcZKMU+vKuVuy2vJu+9lsv6Uy3wZyClhKazTF4irjn FczhKMIJ9eRcrdlteTd97LZdD8L/APgn5pXwT+PngD4r+APHF9qXhjw7L4nXWPDfi2GF9bii1rwb 4i0G1m0rWdItLWyv2S/1aLfDNa22yFXcTO4EbdOVeHVHIuIcuzfLsfKWFpufNColze9TnBOMopJ6 yV04x0u7t6HXk3hdQ4d4nyvO8rzKU8HSdTnp1Uuf36VSCcZxSUvekrpxjZXfM3ofo7X6WfrIUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAeE/HD9oz4a/s92vh28+I9z rFtD4ouNSttKOkaTLqrPLpUdnLdidYpI/JUJfR7Sc7ufSvAz7iXK+HIYaeZzmo1XJR5Y83w2vftu j5riPizKOFoYSpm06ijWclHli5axs3e226Pnn/h5V+zB/wBBTxn/AOEhd/8AyRXzn/ET+Ff+f1f/ AMFv/M+V/wCIu8G/8/sR/wCCn/mfbnhPxLpfjTwt4a8Y6G80mi+LPD+jeJdIe5hNvcPpeu6dbapp 7z27EtBM1pdIWQklWyO1fdYPFUsdhMLjaDboVqcZxurPlmlJXXR2ex+i4HGUcwwWDx+GbeHr0oVI 3VnyzipRuujs1dHQV0HUfHf7dvw08S/FH9nPxRpHhK1utS1zQtR0jxbBo9kJXutZttFmlGo2NvBE d13cx6ddS3EUIV2mlgVEUyFK+L4/yvFZrw1i6ODg5V6co1FFbyUX7yS6uzbS6tJLWx8F4lZPjM54 TxtDAwlPE0pxqqC3moP3kl1fK3JLW7SSV7H8zxBBIIIIJBBGCCOCCDyCDX8vH8gbH7A/8Eq/hr4l g1z4gfFm8srqz8L3Ph9PBWi3U6yRQa5qEur2WqarNYocJcxaMNIjieXG0SXBjUlllC/s3hLleKjX zHOJwccI6fsot7SfMpSt3UeVJvu7LZ2/ePBTKMZHE5pnlSnKOClS9jBvRTk5KUmu6hypN95WWqlb 9pK/bz+hAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/PH/gpb8RdQ8Gfs/wAPhrSr iS2u/iR4osvDl/JEwjf/AIR2ytLvWtWjWQZkAu7mytbeRRgPBNIrHBKt+b+KGZVMFw7HC0ZNTxNV Qf8AgScpfe1FPum16/lXi9m1XL+F44ShNqeLrKnL/r2k5y+9qMX3TafZ/Dn/AATa/Z98NfE7xj4m +JPjXT7bWdF+HT6VbaFol9Clzp9/4o1Rbq4TUL63lDw3MOg2doHSGRSrXFxHJ/yywfg/DLh3C5rj cVmeOpqdDDcqhFq6dSV3drZqCWifVp9D848I+FsHnGPxmb5jSVTD4RxUINXjKpK75mtmoJXSejlJ P7J++AAAAAAAAAAGAAOAABwABX9CH9ObC0AfzCftgaHrdx+018ZZ7fR9Unhl8Y3TRzQ6fdyxSL9l tPmSRIWR19wa/lfjPD15cU53KNGbi6z1SfZeR/HHHmGxE+MOIJQoTcXiHqotrZeR/T3X9UH9jhQA UAFABQAUAFABQB/Kv+1T/wAnI/HD/spni3/07XFfyXxb/wAlPnv/AGFVP/SmfxVxr/yV3Ef/AGGV f/Smf1UV/Wh/aoUAFABQAUAFABQAUAFABQAUAFABQAUAYOleFvDGhXd/f6H4c0HRr7VH8zU7zStI 0/TrvUZMg+Zf3FpbwzXb5A5kLHiuejhMLh51KlDDU4VJ/E4xSb9Wkm/mc1DBYPDTqVcNhKVOpP4n GMYuXq0k38zeroOkKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg D+bz/got/wAnW+OP+wN4J/8AUT0mv5m8Sv8Akrsf/gpf+m4n8k+K/wDyW2Zf9e6P/pqJ80fBb/ks fwm/7KZ4D/8AUp0qvlsj/wCR1lH/AGFUv/TkT5Dh7/kf5H/2GUf/AE5E/rar+wj+5QoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgD8hf+Cs3/IvfBL/sM+OP/SHw zX434v8A+7ZF/jq/lA/CfHD/AHXh3/r5W/KmfinX4cfzwf1g/s5/8m9/An/sjXww/wDUI0Ov664a /wCScyD/ALAqH/pqJ/bvCf8AyS3DX/Yvw/8A6Zgey17Z9AFAHhviH9mf9n/xXrsviXxB8IfAepa5 c3DXd5fy6BZxvqF07+ZJc6nFbpDb6ncTPy73CSNJ/ETXg4nhfh3F4iWKxOTYeVdu7fItX3lbSTfV u9+p83iuEOF8biZYzFZDhp4lu7k4L3nveSVlJvq5J36nsunadp+kWNrpek2Flpem2MKW1lp2nWsF lY2dvGMRwWtpbJFb28MY4VUUKB0Fe3TpU6NOFKjTjClFWSSSSXZJaJH0FKlSoU4UaFKMKMVZRikk l2SWiXki7VmgUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfl//AMFUvDt7qHwa8C+I raOSW28O/EBLbUNillt7fXNE1GKG7mIHyRLeWEUOc/fnUd6/KvFnDVKmSYDExV408RZ+SlGVn96S 9Wj8a8asLUq5BluLgm4UsVaXkpwkk35Xil6tHj//AASr+J2hWFx8RPhNqd9BZa1rl1p3i7wvbzyL H/a/2OznsPENpas5US31nbQ2k6wrukeATOBthcjxvCXNcPTlmWT1aijXqNVKaf2rJqaXmkou27XM 9kzwfBXOcNSlmuR1qqjiKko1aaf2rJxml5pKLtu1zPaLP2gr9uP6DCgAoAKAM7VtW0vQdL1DW9b1 Cz0nR9Js7jUNT1PULiK0sbCxtImmubq6uZmSKCCCJCzMxAAFZ1q1LD0qlevUjCjCLcpN2SS1bbey RlXr0cNRq4jEVYwoQi5SlJ2UUtW23okkfjp8eP8AgqDfLf33h74A6HZfYIJHt/8AhYHiqznnnvtj YNzoHhmRrZLOAsuY5dQ815I2+a1iYV+LcQeKtT2lTDcPUI+zTt7aom2/OENLLs53bW8Ez8D4m8ZK iq1cLwxho+yTt7eom2/OFPSy7Od21vCLKX7DXxx/aM+L/wAerW68f+LvGfibwWPDviZ7wnTlsPB8 epi3hNks0OjabYaDDdLKp8lSoYHIUdajgLPuJc54gjPMcZXq4H2U76Wp81lb4YqCfb8DPw34j4sz 7iaE80x2IrZd7Kpf3eWlzWVrqEYwT7L7jnP2xP2gv2lvg5+0p49/4Q3xj4y8O+B93hD/AIR23vdL i1HwfPu8DeGZtTTSYde0y+0eUPq73Pn+Rz5/mZIYHHLxpxHxRkvE+YfUsbXpYD93yJx5qb/dQcuV Ti4/FzXt1v1OTj3ini/IOLsz/s/H4ill37r2acVKk/3NNy5VOMofFzXt1v1PTP2f/wDgp3DqmoWP hj4+6Np+ji5aO2h+IPhqC5TTopTsjR/Enh9nu5raKQ5Ml1ZyGNGI/wBGRNzr6nDvinGrUp4XiGhG F9FWgny/9vw1t5yi7L+VLVexwv4xxrVaeD4nw8ad9FXpp8qf/TyGrS7yi7L+RLVfrxaXdrf2ttfW Nzb3tle28N3Z3lpNHc2t3a3MazW9zbXELPDPbzwuGR1JVlIIJBr9khOFSEalOSlTkk007pp6pprd Poz92hOFWEKlOalTkk007pp6pprRprVNbliqKP5V/wBqn/k5H44f9lM8W/8Ap2uK/kvi3/kp89/7 Cqn/AKUz+KuNf+Su4j/7DKv/AKUz+mb4ua1r3hv4U/E7xF4W3/8ACT6B8PfGmteHPLs11CT+3tL8 N6lfaR5dg8cyXz/2hBHiEo4lPykHOK/qPOK+IwuUZricJ/vVPDVZQ0v78YScdNb6paW12P7Az3EY nCZJnGLwX++UsLVnT05vfjTk4+7rf3ktLO+x+EeoftxftvaTZzahqt5eaZYW/l+ffah8LNHsrODz ZUgi865ufD8cMfmTSKi7mGWYAckV+A1OPOO6MJVK05QprduhFJdNW4W30P5qq+I/iNQpyq16koUl u5YaKSu7K7cLb6ep9jfsEftS/Gf47/Efxj4d+JXiGw1jStH8EtrVhBaeH9F0h4tQGu6RYiVp9Msr aWVfs1242MSuTnGQK+08PuLM74gzPG4bM8TGdGFDmSUIx154reKXRs++8MeNOIOJc2zDCZvio1KF PD88UoQjaXPFXvFJ7N6H6sV+tn7YeF/tLeLvGngT4HfEDxb8OxKfGejafp02hCDS49al8+fXdKs7 jZpctvdR3Z+xXEvBjbA+btmvA4oxmOy/IcxxmW3+vQinC0ebVzin7tnfRvofN8X47MMs4czTHZVf +0KcIuFo87u5xT92zvo308z8UtS/bm/bZ0W1N9rGoXOk2SukbXmpfC7RbG1WSQ4jjNxdeH4og7kc DOT2r8Oq8e8dUIe0r1HCHeVCKX3uB/PFbxI8RMPD2mIquFPvLDwivvcEj7t/4J+/tJ/Fz496v8Tr T4m69ZazB4a03wvc6QtpoWj6ObeXU7rW4rxnbS7O1acSJZR4D5C44xk1994d8T5xxDWzWGaYiM40 o03G0IxtzOV/hSvstz9L8LuLs94nr5xTzjExqRowpuNoRjZyc7/ClfZbn6aV+pH7AcN8RviR4L+E /hPUvG3j3XLbQfD2mKolup98k1zcy7vs2n6dZwq9zqGo3bKRHDErO2CcBVZhwZlmeByjB1cdmFdU 8NDq92+iSWrk+iWvyPNzbNsvyTA1sxzPExpYWG7e7b2jFLWUn0SV/kmfjD8Yv+CoXxF128u9O+DO g6f4G0NWeO18QeILO01/xbcqMhLoWE5ufDWk7geYHi1DBAPm4JUfiOdeKuZYic6eSYeOHodJzSnU fnZ3hH0tP1P5+z/xlzXE1J0uH8NHDYbpOaU6r8+V3px9Gp/4uh4LZfFL9vnx2n9t6Fqv7RGvWkqq ReeEvD/iw6UVkaR0aNPDWkRaaoc7tpVRkDA4UAfP0828QswXt8PVzKpB9acKnL/5JHlPmKedeJ2Z L6xhq+a1YPrShV5f/KceU/UWf4tfF/4Y/sBWPxU1a41P/hbWg6fobX0vjzTbqfU5Jr74sWPh+aLX bDUha3rPNoF6YwX2ShWV1YNhq/VpZxnOVeHlPNq0pf2xTjG/tYtyu8QoPnUrPWDt0ezP2aWeZ9k/ hhTzqvKf9uUow5vbRbld4mMGpxlZ6wdtbPZp9TqP2Mv2utS/abs/FeneIvCNj4c8S+DLfR7m/vdF vLibQ9Xh1mXUYopLSwvjNf6VLbvp7Bo3uLoMCGEg+6OvgnjGrxTDF0sTg40sVQUW3FtxkpX2Tu42 ts3L16Hb4f8AHVbjGnjaWLwMaOLw6g5ODbhJTcrWi7yjbl2cpd79D4C+I/7X/wC2roPj/wAeaRoY 1VfD+jeMPFGm6O4+FmnXcS6Pp2tX1tp7C9fw/IbmMWUKHzSzbx8xJzmvzzM+MuOcPmGYUaCn9XhW qKP7hP3VJpa8mui36n5fm3HniHhs0zOhhuf6rTxFSMf9mi1yRm1HXk10S1vruWv2cP24v2jPiJ8c vhp4I8V+LtLvvDviTxLBpurWkPhPw3ZSz2j29xI0aXdppsVzAxaMfMjA1fDPHnEuZZ9leAxeMhLD VaqUkqcFdWfVRuvkXwl4j8WZtxJk+XY3HQlhK1ZRklSpptWfVRTXyP3Xr98P6UK93d2tha3N9fXN vZWVlbzXd5eXc0dta2lrbRtNcXNzcTMkMFvBChZ3YhVUEkgCpnOFOEqlSSjTim227JJattvZLqyZ zhShOpUmo04pttuySWrbb0SS1bex+RH7QH/BTuDS76+8M/ALR7DWfszy20/xA8S29y+myyLuRpPD egLJaTXUcbcx3V46xsw/49nQh2/G+IvFONKpUwvD1GM7aOtNPl/7cho35Sk7f3WtT8J4o8Y40KtT B8MYeNS1069RPl/7hw0b8pSdn/I1q/Mf2O/2g/2lfjF+0r4CHjLxl4x8ReCC3jA+Ibay0yLTvCEI j8D+JZtNXVYNB0yx0eJY9YFt5Pn8+f5YBLkZ8vgviPijOuJ8v+u42tUwH7znSio01+6m48yhFR+L ltfrbqeNwFxTxfn/ABfln9oZhiKuXfvedKKjSX7mo48yhGMPi5bX+1bqdJ+3L8cf2jPhB8erq68A eLvGfhnwWfDvhl7MjTlv/B8mpm3mN6sMOs6bf6DNdNKw85QpYnAYdK6uPc+4lybiCU8uxlelgfZQ tpenzWd/ii4N9/xOzxI4j4syHiac8rx2Io5d7Knb3ealzWd7KcZQb7r7y58CP+CoN+b6y8P/AB90 KyawmdIP+E+8J2c0FxZbjgXGveGle4jvIdzZklsDC8aL8trKxJq8g8VantKeH4hw8fZvT21NNNec 4a3XdwtZbQZpw14y1faU8LxPho+ybt7emmmvOdPW67uFmltBs/YvR9Z0nxDpWn65oWpWWsaNqtrD fabqmm3MV5YX1nOgeG5tbqBnimhkU5BUkV+0Ua9HE0qdfD1YzoTScZRd009mmtz97w+IoYqjSxOG rRqYecU4yi04tPZprRo4L4q/GT4b/BTQI/EnxK8TW3h3TbmaS109Hgu72/1S8jhac2em6dp8FzeX c2xeSqbI8guyg5rz82zrLMjw6xWZ4pUqTdlo25O17Rik238rLq0eZnef5Rw7hVi83xipUW7R0blJ 2vaMYptv5WXVo/Nf4if8FWfD1pLPZ/Cz4ZajrQXcsWueNdSi0a33rwJI9B0hdTurm3kblS97aybQ MoCcL+Y5l4t4aDlDKcrlP+/Vlyr/AMAjzNr1lF+R+R5r42YWm5U8lyedTtOtJQX/AIBHmbXrOL8j 2SH9ob4qePP2E/FHxwsZLLQPiS7aimmP4R0uV7exNl8QLbQ4lsNO1aXXZJnOlhlfzGlJJLccY9qP EebZhwDi8+puNPM/e5fZx0Vqyjopc/2e9z348VZ1mfhrjeI6bjSzf3uX2UdFauoLljJzv7u979z8 tf8Ahan7d2sf6bBr37RFzG37sS6ZpfjCK1Jj4ICadp0VtvGecDd61+Uf2vx/W9+OIzJr+7Gol/5L Gx+Mf234l4j95HE5q1/djVS/8ljYop+1Z+2J8NdQih1f4ifETSrzc0q6f470pNQaZFZVlU2fi/Sb qQx5G07QCmeCCc1muLuNMrqRVbMsTCfarG9/lUizJcbce5RVjGvmuLhU35a0ea/fSrF/8A+9P2cf +CmEfiHWdL8G/HrTNJ0KTUZY7Ky+Imi77LRo7uRljtx4p0m4lmXTLediQ99by+RE5XfBFFvlT9B4 Z8UFia1LBcQUoU3J2VaOkb9PaRd+VPrJOy6xSu1+m8J+L6xeIo5fxNRp0nN2VeGkL9PaRbfKn1nF 8qdrxUbyX67AggEEEEAgg5BB5BBHBBFfsZ+67i0AfNH7Rv7U/wAOP2btEiuPEsz654s1OF5fD/gb Sbi3XWdRQGSNb++eQuui6GJ4yjXcqOWZWWGOZ0ZB8vxLxZlnDNBSxUvaYyS9ylFrml5v+WN/tPz5 VJpo+Q4s40ynhLDxljJe0x017lGLXPL+8/5IX05mn15VJpo/GD4gf8FCf2l/iHqT23hnWrbwDptx OVsdC8E6VBNqDpyII5ta1GDUdauboL9427W0bsSREowB+I5j4jcUZlVccLXWHpN6QpRTfleUk5N+ nKn2P59zTxT4vzWq4YPELC0W9IUYpy8rzkpTb78vKn/KfoX+358UPir8MPhh8IvEXw88T+IfDOo3 WrPD4g1DTAXWdDoNtcRR6stxBcWzhrtGIEy8tuHciv0fxCzXN8qyrJsTluKqUqrnabj19xP3rprf ufqfifnOd5Nk2RYvKsZVo1pTtOUevuJ+9dNb9/M+Svgt/wAFOviX4d1Gx0z4z6dY+PPDckqx3ev6 Tp9nonjCwjbC/aEt7AWXh/V4oAMmE29rK+SfPzgH4/I/FPNMNVp0s7pxxGFb1nFKNRedlaErdrRb /mPh+HvGLN8LVp0eIKUcThG9ZxioVY+do2hJLtyxb/mP228E+NfDHxF8K6J418G6tba54a8QWa3u majalgkse94ZoZonCzW15Z3MTwzwyKssM0bI6hlIH7pgcdhcywlDHYKsqmFqRvGS+5ryad009U00 9T+icuzHB5tgsPmOX11UwlWN4yXXo0+qad009U009UYvxU+KPg/4N+B9Z8f+ONQax0PRol+SFBPf 6lfTkpY6TpdruT7VqOoT4SNSyooy8jJGruuGbZtgslwFfMcfU5aEF01cm9oxXWTe3Tq2kmznzrOs BkGW4jNMyq8uGprprKUntGK6yk9F06tpJtfhn8Qv+Cgn7SXxa8R/2F8KoZ/BOn311JDovhzwZo6+ IvGGox/ehju9UnsL6+ur0KpYjT4LRccFWxk/guY+IvE+cYn6vlEXQpydowpR56kvWTTbf+BR+Z/N 2a+KPF2eYv6tkkXh6UpWhTpQ9pVl2vJxlJv/AAKPoz0v9nW6/brh+Nnw0b4jr8fT4FuvEVvB4k/4 Sez8TT6GumS21wztqy3sEkFpbB1XMkoQI2ASCa9ThqfHyz3K/wC01mH1B1Ep86m48tn8V1ZLzdrH scKT8So8RZQ82Waf2bKqlU9oqjhytP4rqyXm7WPTfi3/AMFAfiH8EP2kviD4D1fw9ofjL4daHq+l 21tYoj6N4m061utA0a9nNhrMBls7rZcXcsnl3VrI0hIQSxLyPUzjxEzLIuJsxy+thqdfLac4pL4Z xThFu0lo9W3aUXfa6PYzzxQzXhzi7NMsr4WniMpp1IpR+CpFOEG+Waunq27Si77c0UfrxX7IfuwU Afkt/wAFLvi18Tfhprnwjg+H3jvxR4Nh1fSvGEuqReHdYvNLS/ks7vw+lq90trJGJmt1uHCE52hz jrX4/wCKGcZpldfJ45dmFWhGcKnNyScb2cLXtva7Pw7xfzzOMnxORRyvM62HjUhVcvZyceazha9t 7XdvU/GXxX4v8U+OtbufEnjLX9V8Ta/eR28V1rGtXs1/qFxHaQJbWqS3VwzyusFvEqICeFUCvxPG Y3F5hXlisbiJ1cRJK8pNtuystX2Wh/P+Ox+NzLETxeYYqdbFSSTlNuUnZWV2+y0R1PwW/wCSx/Cb /spngP8A9SnSq6sj/wCR1lH/AGFUv/TkTs4e/wCR/kf/AGGUf/TkT9Bv2+/jp8ZPAP7Q2peHvBPx N8aeFtCi8K+GLqPSdD1+/wBPsEubq1me4nW2t5kjEszAFjjJIr9G8Q8/zrLuI6mGwOaV6WHVGD5Y zaV2nd2Xc/UvE/iTP8r4qrYXLs4xFHDKhTfLCcoxu07uyfU9V/4Jr/F/4pfErxx8S7Hx/wCP/Ffj Gz0zwppN3p9t4h1m81OGzuZdXaGWe3jupZFilki+UkckcV6/hjnObZpjs0p5jmNatCFGLSnJySbl urnt+EWfZ1m+Y5vTzTNK+IpwoRcVObkk3K11fZ2Pd/2qv29fCnwNur3wP4EtLDxx8TYAYr+KaeQ+ GPCM3/PLXZrOSO41DVVxzYQSRNHnM0sbAI/v8W+IODyGc8BgIRr5ot9fcpv++1q5f3E1bq1s/peN fE3A8NzqZblsI4nOF8Sb/d0n/fa1lL+4mrfaktn+MnxE/ap/aA+KF1NP4p+KHidbOVyy6HoF/L4Z 8PwplvLiXSNBNhaXHko21ZJxNOR952JJP4lmXFvEWazlLF5rV5H9mD5IL/t2Fk7d3d92fz9mvGvF GczlLG5zW9m/sQk6cF292HKnbvK77tn3Z/aepf8ADrH7f/aF99u/4TDb9t+13H2vb/wtby9v2jzP O2+X8uM9OOlff+1q/wDEJ/ae0l7T2+93f+P33P0r21b/AIgt7X2svafWN7u/+899z4T+Hf7VX7QP wvuoJvC/xR8UPZwMCdD1/UJfE3h+WMsDLD/ZGvNf2lsJwMNJbiGYDlXUgEfAZbxbxFlU4ywma1eR fYm+eH/gM7pX7qz7M/Nsq414oyacZYLOazpr7E5OpB91yz5kr942fZo/Zr9lX9vbwp8cruy8DeO7 Oy8D/E24Ai09IZpB4X8XT/MfJ0Ka7lludN1UgcWNxJIZePJmlYmNP23hLxBwefTp4DMIRoZo9tf3 dR9oN6xl/cbd/stvRf0BwV4m4HiSdPLczpxw2cP4bP8Ad1X2g3rGX9yTd/syb0X2f8TfH+k/CvwD 4q+Ieu2uoXuk+EtJm1a9tNKjt5dQuYomSNYbRLq4tLYyySSKPnkRQMnNfb5pmNHKcvxeZV4SlRow cmo2u/JXaX3s/Qc4zShkuV43NcTCUqFCDk1G3M0uiu0vvaPxx8e/8FVviBqLT2/w3+HPhnwxbHdH HqHii9vvFGplcnbcRW1ifD+nWcxGPkkF2i88t1H4rmHi3mNRyjlmWUqUO9RupL1suSKfk+ZH4Fmf jXmlVyhlGU0aMP5qjlUl6pLkin5PmXqfJ3ib9t79qTxUz/bfi7rumRMNqQeGbTR/CyxJvEgVJ9A0 3T71yGH3pJXk28FscV8hiuO+LMW3z5zUiu0FGn+MIp/e7nw+M8ReNMa37TPasI9qahTt84Ri/m23 5n2F+1r428Zj9kH9kvXB4u8TjWtd03T7vW9YGv6qNU1i6fwlbyvc6rqAu/teoXDSysxeZ3YsxOck 19pxhj8cuDOEMQsZV9vUinKXPLmk/ZrWTvdvzbZ97xzmOYLgPgfE/X631irCLnLnlzTfsk7yle8n ru2z859D+O/xs8NSwy6D8W/iRpfkbvLitfGviJbXazmVkksm1BrSaJ5WLFHRlLckZr81oZ/nuFae HzjFQt2qzt917P5o/KMNxLxFg3GWGz3Fwt0VWpb7uazXk0foxZ/8FStY0D4f+EtB07wFceK/HGne HNLsvEnjDxhrMVpZahrttaJFqF7Ho2i2rT3sN1cAuHa6tWI6oCeP0qHivWw+XYPD08vdbHxpRU6l SVk5pavlirtN9eaPofq9Pxnr4XK8DhaWWOvmMKUVUq1Z2Uppe8+SCu03rfmi/I+dvF//AAUV/ah8 U+dHZeKtD8FWs/D2vhDwzp0O1OPkhv8AxAPEOr2+CM7kuVftuxkV81jPEnivF8yhi6dCD6U4RX3O fPJfKVz5TH+K/GeN5lTxtPDwfSlTivulPnkvlK/mfWv7LvxQ+IvxD/ZR/bC13xx438T+KNX0zwZ4 0Gl3+s6xe3k2lL/wrTXrnbpfmS7NNUXAD4gEY3AHqBX2PCma5lmXCHGeIx+Oq1a0KFXlcpNuP7ib 93+XXXSx9zwZnObZrwRx7icxzGtWrww9XllObbj/ALPN+7r7uuultT8ff+Ej8Q/9B3Wf/Bpff/H6 /GPrOJ/6CJ/+BP8AzPwb63iv+gmp/wCBP/M9R8D/ALRnxz+HN3b3XhH4p+NNOS2eN10241u81bQp PKI2Jc6Bq8l9o1ymBtw8B+UkV6uA4lz/ACycZ4PNq8UvsuTlD5wleL+aPZy3iziTKZwngM6xEEn8 Lm5Q07wlzQfzR+zf7K37aOp/tF6Jrnw21WbRfBXxxt/Dd/P4a1v7E154b8RzwWsi/wBrQ6LLcxyL qOlybJ7uxEpSWEPLDiNZI4v27hLjerxLQr5ZWlChnypNwla8JtL4lG+8d5QvqrtaJpf0FwV4g1uL MNicoryp4fiNUW6c7Xp1Gl8Sg38UdHKF7NXlHRNR/IT4y/GT9o7UvF/ibwv8VfiP41k1rQtX1LRN a0KLWbjSdCgvbK5ltbtLbQtEOm6F9mlKHZJHbhZYSpBKkV+NZ3nfE1XGYrC5tmdf29OcoyhzOME0 7O0I8sLdmlqrdD8I4gz/AItrY/GYLO82xDxFKpKE4KbjBNNp2hDlhZ9Go6q3Q8Rj8T+JYZI5ofEO uRSxOskUserX6SRyIwZJI3W4DI6MAQQQQRXhLF4qLUo4momv7z/zPnFjMZFqUcVUUls+aX+Z9QfB v9t34+fCHUrNj4v1Lx34YjkRb7wn43v7vW7We13fPHpurXbz6xoc6IzGJoJfIVyDJDKo2H6rJeO+ Icmqw/2yWIwqetOq3JNf3ZO8oPtZ2vvF7H2WQeIvE+Q1qf8At88Tg09aVaTmmv7snecH25Xy33jL Y/ob+Dnxa8K/G74e6D8RfCEsh0zWYZEuLG5Mf9oaLqtq/k6lo2pRxsyx3ljcDGR8ssTJKmY5EY/0 fkucYTPctw+ZYNv2U1qnvGS0lGXmn96s1o0f1TkGeYLiLKsLm2Ak/Y1FrF/FCS0lCXmn96s1o0bX xK8WyeAfhz4/8dQ2KanL4K8FeKvFsWmyTtax6hJ4c0K/1hLGS5WKdrdLtrMRmQI5QNnacYrfNMY8 vyzMcfGnzOhQqVOW9r8kHK19bXta9jozfHPLMpzTMo0+eWHw9Sqo3tzezhKdr62va17Ox/Of8Tf2 6v2kfiVdXP8AxXd54H0eUusGheAPM8Nw28TsflbWLeR/El0zR4VvNvGQ4+VVyQf5rzTj7ibNJy/4 UJUKL2hR9xL/ALeXvv5y+SP5QzjxJ4uzec/+FOWGw72hQ/dpf9vL94/nO3ZI+Y77xn4w1S5e81Px X4l1G7lJMl1fa7ql3cyFmZ2Lz3F1JK5Z3JOTyST3r5WpjsbVk51cZVlN9XOTf3tnx1XMMfWm6lbH Vp1H1lOTf3tmjoXxL+I3he6W98NePfGegXasHFxo3ifWtNl3DHLPZ3sJYHaMg5BHBrXD5pmeElz4 XMK9OfeM5R/JmuGzjNsFNVMHmeIpT7wqTi/waP0r/Zh/4KO+LtK1vSPBnx8vIfEPhe/mt9Pg8fm2 itdf8PSTSLDDdeIPsiRWutaNCCPOlESXsS7pWecjZX6fwr4mYyjXo4HiGaqYSTSVa1pwv1nbSUV1 dlJbty2P17g7xax1HE0Mv4nqKrg5NRVeyU6d9E520nBdXZTWrblsfYf/AAUY+InjL4ffAzwl4h+H vi7WfCupX/xS0HTpNX8N6nPYXF3pN14P8cXz2purORTNZT3FlBLtyVZo1PYV9p4lZljcuyHB4nLc ZOlVli4LmhJpuLp1Xa66NpP5I+98WM1zDK+G8Disqx1ShWljYR5qcnFuLpVna63TaT+SPwe8cfFr 4m/EuLToPiD478UeModIkuZdLi8RaxeaolhJeLCl09qt1JIIWuFt0DkY3BBnpX8/4/OM0zRU45jm FWvGDfLzycrXte19r2R/NGZZ5nGcRpRzTM62IjTbcfaScuW9r2vteyv6HnleceUfsF+1H8T/AIif DT9mD9i2f4feNPEfg2bV/hf4fi1SXw7qt1pb38dn8PfAb2qXTWskZmW3a4coDnaXPrX7NxXmuZZX wrwRLLsdVoSnhYc3JJxvajSte29rs/euM85zXJ+DfD2WV5hWw8qmDgpezk481qFG17b2u7ep+ff/ AA1T+0j/ANFw+Jn/AIVurf8AyRX51/rbxP8A9D3Ff+DJf5n5b/rrxd/0UeM/8Gy/zPf/ANqf9on4 7eFf2hvix4e8N/Fvx9omhaT4ruLTTNJ0zxJqVpYWNsttassFrbRTrHDEGYnAAGTX0XFvEmf4TiTN 8Nhc4xFPDwrNRjGckkrLRK+h9RxrxXxLguKs8wuEzzFU8NCu1GMaklGKstEk9EeAf8NU/tI/9Fw+ Jn/hW6t/8kV87/rbxP8A9D3Ff+DJf5ny/wDrrxd/0UeM/wDBsv8AM+lfhX+0J8cdV/Z9/ao8Qal8 V/Hd9rnhXSvg5L4b1W58R6jNfaHJrPxMtNM1V9MuHmMlo2oae5hlKEb4ztPFfT5TxHn1bh3izE1c 3xEq9GGG5JObvHmrqMuV30utH3R9fkvFPElfhbjXFVs7xMsTQhhXTk6knKHPiFGXK76c0dHbdaHz V/w1T+0j/wBFw+Jn/hW6t/8AJFfMf628T/8AQ9xX/gyX+Z8h/rrxd/0UeM/8Gy/zD/hqn9pH/ouH xM/8K3Vv/kij/W3if/oe4r/wZL/MP9deLv8Aoo8Z/wCDZf5nv/7LH7RPx28VftDfCfw94k+Lfj7W 9C1bxXb2mp6TqfiTUruwvrZra6ZoLq2lnaOaIsoOCCMivouEuJM/xfEmUYbFZxiKmHnWSlGU5NNW ejV9T6jgriviXG8VZHhcXnmKqYaddKUZVJOMlZ6NN6o/Wr9urxf4p8C/s2+L/Eng3X9V8M6/Z6r4 SitdY0W9msNQt47vxNpltdJFdW7JKiz28rI4B5ViK/X+Psbi8v4ZxmKwWInSxEZ07Si2mrzinqu6 0P3HxJx+Ny3hHH4vL8VOjiozpJSg3GSvUinZrutGfgt/w1T+0j/0XD4mf+Fbq3/yRX8/f628T/8A Q9xX/gyX+Z/M3+uvF3/RR4z/AMGy/wAw/wCGqf2kf+i4fEz/AMK3Vv8A5Io/1t4n/wCh7iv/AAZL /MP9deLv+ijxn/g2X+Z9FfsvftT/ABrj+Jt/q/i74heNPHWieFvhr8V/GU/hXXfFGoyaZrFx4Q+H viHxFZ2lwZvtaQ+ZdacoWXypDEfmCkjFfS8KcWZ6s0qVsZmNfEUKWFxFR05zfLJ06M5pPe2q3s7b n1fBnGnESzirXx2a4jE4ajg8TVdOdSXLN0qE6iTve2sVrZ23see/E39vD9pP4k3NwE8c3HgPR5Sf I0T4eiTw2tuh2jnXIpZvE9w7qg3b70x5J2ogJWvNzTxA4nzOUrY94ei9o0fct/298b+crdkjy848 S+Ls3nNLMnhsO9oUP3dv+303UfneduyWx8vX3jPxhqly95qfivxLqN3KSZLq+13VLu5kLMzsXnuL qSVyzuScnkknvXylTHY2rJzq4yrKb6ucm/vbPjKuYY+tN1K2OrTqPrKcm/vbNDQviT8Q/C92l/4b 8d+MdAvUZXW60fxNrOmz7lyATJZ3sLMMEjByCCR0Na4fM8yws1Uw2YV6c+8Zyi/wZrhs3zXBzVXC ZniKVTvCpOL/AAaP0h/Zm/4KPeMtC1vTPCXx7vl8UeEb6aGyTxx9khh8R+GjJ+7iutVWwhii1/SY 3K+exj+3RpukDzkCJv0zhbxMxuHr0sHxDU9rg5NL2trTh5ysvfj305ktby2P1rg/xazDDYmjgeJq ntsDJpe2slUp+cuVJTj3050ru8vhP3LgnhuYYbm2miuLe4ijngngkSWGeGVBJFNDLGWSSKRGDKyk gg5FfvUZRlFSi04tXTWzR/SEZRnGM4STg1dNapp7NPsfC/7X/wC2no37OsEXhLwvY2Xij4qapZre RabevN/YvhbTpw4tdV8QC2eKe7nu3T/R7GKWGR4wZZJI08sTfA8Z8cUOGorB4SnGrm0435Xflpp7 SnbVt9IpptatpW5vzfjzxCw/CkY4HBU41s6nG6i78lOL2lO1m2/swTTa1bStzfh/8QP2nfj38Tbu 4uPFnxR8Wy21w7H+xdJ1S48P+HokLl44k0PQ2sNNcQghVeSOSUgfM7HJP4TmPFXEOaTlLGZtWcX9 mMnCH/gMbR07tN+Z/OWacY8T5xUnPHZ1XcH9iMnCC8uSHLHTu033bPpT/gm/rGrXv7TWlQXmqajd wnwf4tYw3N9czxFltICrGOWV0LKehxxX0/hnWrVOKaUZ1ZOPsKmjbfRH1/hLXr1OMKMalaco/V6u jba2Xc8cvP2nv2gPhx8RPGX/AAifxZ8ZWtpa+L/EUVvpOp6rL4i0KKGHWrxUii0LxCNU0iFBGgX5 IVO0AZwBjxanFXEWWZljvqeb11BVp2jKXPCyk9OSfNFfJHgVOMuKMpzXMPqOeYiMI16iUZSdSCSm 9FCpzRXbRH7Q/sPftIeMv2jPAnibUvHOm6Jaa34R1qy0Z9Q0OK4tLfV4buwN2l1cafPPdJa3abcP 5TiJycqkY4r9u4D4mxvEuX4qrj6VNV6NRRvC6Urq92m3Z97Oz7I/oLw54tx/FmW4ytmVGnHE0Kih zQTSknG93Ft2fezs+iR9t190fooUAFAHCfE34d+HPix4C8T/AA78VwNPoXijTXsLpotn2m0mWSO5 0/U7JpUkjS/0rUIIrmBmVlWWJSQRkHz80y3DZvl+Ky3Fxvh6sbPunupLzi0pLzSPMzjKsJnmWYzK sdG+GrQ5XbdPeMlf7UZJSXmkfzS/Gv4AfFz9lzxtbPqqajZ21rqaXfgr4keHJL2203UJbZxc2dzp +qweVPpGvWgUNJbOyXEMilkLxbJX/mDPOHc44Ux0XWUoxU70q0LqLtqmpLWM11i7NPa6s3/IfEXC +e8GZjB11OMFO9GvTuoytqnGSs4zXWLtJPVXVpP7F+C//BUHxt4bgtNF+M3hpPHlhCscP/CU6A1r o/itIl2gyX2nOsWha3MFGBsOnseru7ZJ+0yPxVx2FjChneF+sU1/y8haNT5x+CT/APAPNs++4e8Z cxwkYYfiDB/WaS09pC0KlvOOkJv05PNs/Tn4T/te/AH4yPbWXhXx3Y2HiC6wsfhXxUB4b8QPMQrf ZrS3v3Wz1e4AblbGe64BOcKcfqeUcZcPZ2408JmEY4h/8u6nuTv2Sekn/hcj9iyPjvhfiBwp4LMo xxUv+XdT93O/ZKWkn/glI+l6+oPrwoA/DP8A4KV/tGahr3i7/hQfhi/mt/DfhT7Fe+OmtpWjTXvE 1zBDqFjpE7ROVudM8PWk0UjRn5TfyNvXfbRsPwXxP4lqYjGf6vYWo1haNnVt9ubSai+8YJp2/nbu rxR/N/i9xZVxWO/1YwdVrB0LOtZ/HUaUlF94wTTt/O3dXgjtv2GP2HfDut+HtJ+NPxm0dNZi1hUv /A3gfU4d2lHTA2bbxJ4jtHO3VF1LG+zs5VNsbfEsiy+aixd3AXAeGr4ajnmd0edT1pUpfDy9JzX2 ub7MX7ttXe6t6Pht4cYTEYShxDxBh/aKp71GjJe7y9KlRfa5t4xfu8vvNS5lb9jbOztNPtbexsLW 2sbK0iS3tbOzgitrW2giULHDb28KpFDFGowqqAAOgr9qhCFOEadOCjBKySVkl2SWx++U6cKUI06U FGnFWSSskuyS0SItT0vTNasLrStY06x1bS76IwXum6naW9/YXkJIYw3VndRy29xESoO11IyKmrSp V6c6VanGdKSs4ySaa809GKtRo4ilOhiKUZ0ZKzjJKUWuzTun8z8Sv27f2JdE+H2k3fxm+D+mtp/h i3ni/wCE28G2weW10BbuZYYvEOgqzPLBo7XUqpc2vKWpcSR7YAyxfhnH/AtDLqM87yaly4VP97TW 0Lu3PDtG+ko/ZvdWjdL+dvErw6w+V0KnEGQ0eXBp/vqS1ULu3PDqoXdpR2je6tG6j1H/AATM/aM1 KXUbv9nvxZqM15aSWV5rXw1mupDJJYvYRyXmv+F4nd2c2klmHv7WMALD5Fzzh0UdXhdxLVdSfDmM qOUHFyoN9Lazp+lvfiulpd0dng/xZWlVnwtjqrlBxc8O305dZ015WvOK6Wn3SP2br9tP6BP5V/2q f+Tkfjh/2Uzxb/6driv5L4t/5KfPf+wqp/6Uz+KuNf8AkruI/wDsMq/+lM/qor+tD+1T42/4KBf8 mi/Fv/uQv/Vm+DK+K8RP+SOzj/uF/wCn6R8B4o/8kLnn/cH/ANSKR+dP/BKf/ksfxF/7Jm//AKlP h+vzXwk/5HWZf9gv/uSB+UeCf/I/zb/sD/8AckD936/fz+lgoA+A/wDgpV/ybBqn/Y5+EP8A0ruK /PfE/wD5JWt/1/p/mz8w8Xf+SNrf9hFL82fJ/wDwSZ/5GH42/wDYG8D/APpd4mr5Dwg/3nPf8FL8 5nxHgf8A71xF/wBe6P51D9qmZUVndlREUszMQqqqjLMzHACgDJJr9xbSTbeh/QzaSbb0P5nP2uf2 hNf/AGkvi3PaaHNf3ngfQ9Uk8O/Dnw9ZieVdRLXIsv7eWxjybnWPE9zho/k8xLcxQjJUlv5d4x4j xHE+cShQlKWApz5KMFfXW3PbrKb262tHpr/H/HXFOK4uz2UMNKUstpz9nQgrvm1tz26zqPbS6jyx 6a/rD+yh+wx4H+D+haT4r+Iui6Z4t+K93bxXl02pxW+qaL4Nll2yx6boNnMklnJqdmNqzX7CSTzQ wgZIz8/67whwFgMmw9HF5lQjWzdq75rSjT/uwW3Mus9Xf4Wlv+38EeG+XZDhqGOzbDwr53JJvmSl Ck3rywT05l1nq735Wlv+glfop+onxt/wUC/5NF+Lf/chf+rN8GV8V4if8kdnH/cL/wBP0j4DxR/5 IXPP+4P/AKkUj4c/4JM/8jD8bf8AsDeB/wD0u8TV8H4Qf7znv+Cl+cz848D/APeuIv8Ar3R/Oofs n4j/AORe13/sDap/6Qz1+1Yn/dsR/gl+TP37F/7rif8Ar3L8mfzE/sc/8nP/AAW/7HO1/wDSS7r+ WeCv+SqyP/r+vyZ/HXAP/JZcPf8AYQvyZ/UfX9Wn9mn40/8ABTT9ovUIL20/Z78J6i9rb/YrLW/i TNaSsk1yb1Vu9B8KzspVltfshj1C5TkTCW2GcK6t+KeKPEtSM4cOYOraPKpVmut9YU35WtOS63j5 o/APGDiyrGpT4WwNXlhyqeIa3d9YU35WtOS63h2afIfsJ/sSaH8Q9Is/jP8AF/T31DwvNdS/8IV4 Nn3w2niAWM7wS69r4Rkmn0ZLyFkt7T5UuzGXl3W5CTcXAHAtDMqMM7zmnzYRv91Te07O3PPvG6so /atd3jo+Dw18OsNmtCnxBn1JywTl+5pPRTs7Oc+rhdNRjtK15XjpL9t9M0vTNFsLXStH06x0nS7G IQWWm6ZaW9hYWcIJYQ2tnaxxW9vECxO1FAya/dKVKlQpwpUacYUoqyjFJJLyS0R/RVGjRw9KFDD0 owoxVlGKUYpdklZL5Et5Z2moWtxY39rbX1ldxPb3VneQRXNrcwSqVkhuLeZXimikU4ZWBBHUVU4Q qQlTqQUoNWaaumuzT3HUpwqwlTqwUqclZpq6a7NPRo/HT9uX9hrw9o/h7WPjR8F9Hj0aPRo5dS8c +BtNiK6X/Zanfd+JPDdonyaWNLTMl5ZxgW32YNLEsRiZZfxbj3gLDUcNWzvJKKgoLmq0o/Dy9ZwX 2eXeUV7vLqrWaf4J4keG+FoYXEcQcP4dU1TTlWoxXu8vWpTX2eXeUV7vLqrWalwf/BNf9o7UfD3j BfgL4o1GW48L+LTd3Xgc3UjSLoHiiCKa+u9KtXdsW+m+IraKRxF9wX6LsUPcSlvP8MOJauGxv+r+ KqN4Wtd0r/YmrtxXaM1fT+dK2snfzPCLiyrhceuGcbVbwde7o3+xUSbcV2jUV3bbnSsrzd/0W/a0 /ZjvP2nNK8CaBD4ttfCFh4Z17UdX1O/k0qXWbueG6sI7SO3sLJbzToTKWBLPJOoQYIVulfpXGHC0 +KaOX4dYxUadKo5SfLzNpq1krpfe/vP1fjjg6pxjQyzCxx0aFKjVlKUuVzbTja0VeK+bat5n43ft q/s3eDP2bNc+Hnh3wjqev6y+v+HNS1XWdS8QT2Uk097b6klpGLS3sLKygs7RI87UPmPk/NI3Ffiv HHDGB4Yr5bhsHVqTdSlKUpTa1albRJJJeWr82fgPiHwjl/COJyrCYCtVqOrSlKcptXbUraKKSS8t X3bP1p/4J0/8mpeB/wDsM+Nv/Us1av1/w1/5JHAf46v/AKckfuPhR/yROXf9fK3/AKdkfcVfeH6O c74q8I+F/HGiXnhvxj4f0jxNoN+u260rWrC31CykO1lSUQ3COIrmHcTHKm2SJvmRlYA1zYvB4TH0 J4XG4eFXDy3jJJr8eq6NarocmNwOCzLDVMJj8LTrYaW8ZxUl62ezXRrVbpn83X7af7PFl+zx8Wv7 K8OG4fwN4u04+JPCa3MjTzaZEbua11Lw7LcyO0122kXMamOR8u1rPCHZ5A7H+ZeOOG4cN5x7HDX+ oVo89O+rjq1KF93yvZv7LV23dn8k+IXCtPhXPPYYS/8AZteHtKV9XHVqVO+75Xs3ryuN23dn7S/s I/ETUPiP+zT4GvNYuHvNX8LtqPgi+u5JFkkuI/DlwIdHeVsmQzJ4ens0kZyXkdS5J3Zr9w4AzKpm fC+AnWlzVqV6Tffkdo/Pkcb31b16n9CeGua1c24Qy2piJ81ejzUW+/s3aN/PkcU76t69T374tfEn RPhB8OPF3xI8Q5bTfCukS3/2ZXWOXUb+R47TSdJt5GBVLnV9VuYbaNiNqvKCeAa+hzjM6GTZZjMz xP8ACowvb+Z7RivOUmor1PqM8zfDZDlOPzbFfwaFNyt1lLaMV5yk1FebP5t/CHhz4n/tpfH94L7U 2uPEXi69uNY8Ra3NFLNpvhPwxYtEk80FoZgYtL0a1kitbK2Ei+ZK0UW8M5ev5kweGzXjjiJxqVb4 mtJynLeNOC3aV/hirRjG+rsr63P5IwGEznxC4ocala+Lrycqk7NxpU1u0r6RgrRhG+rcY3u7n9Dn wX/Z3+FXwH0O20rwJ4asodSW3EWpeLL+C3u/FetysqCeXUNZaIXCwzOu4W0PlWsWfkjXJz/R+R8N 5Tw/QhRy/CxVW3vVGk6ku95b2f8AKrRXRH9U8PcK5JwzhoUMswcVVtaVWSTqTfVyna9n/KrRXRI9 udElR45EWSORWSSN1Do6OCrI6sCrKynBB4Ir3Wk001dM+iaTTTV0z8nP2+f2O/B03gfWfjX8MdAs PDXiHwrH/aXjLQ9FtYrHSfEHh/zANQ1mLTbWJLS01rR/M+0TSRiJbi2WZpN0qoT+ReIXBeClgK+e ZVh40sTRXNUjFWjOHWXKtFKO7ateN73aR+IeJ3AOAll2I4iybCxo4qguarCC5Yzh9qailZTj8Tat zR5m7tI8Y/4Jd/GO+0fx54h+Cup3ckmh+MNOu/E3hu3kkZksvFOiQRvqcVrEWCxrrHh+N5ZiMndp 8eByxrw/CnOqlHMMTkdWbdCtFzgu1SK95L/FC7f+BeZ8/wCDOf1MPmeK4erTbw1eDqU12qQXvJL+ /C7f+BeZ1P8AwVh8UaqdV+EXgtJmj0RdP8ReKJ7dT8t3qr3NppNpNMpH3tPtI51iIP8Ay9SZ7Y6/ F7FVfa5NgVL9xyzm13ldRTfor2/xM7fG/G1vbZFl6lbD8tSo13ldRTf+FXt/iZ9Mf8E3/hT4W8K/ APRviNbWVlc+L/iPc65darre2Ke7ttK0jX9R0LT9AtbkZMFlCdJa4mjXDNdTMJN3lxhPqPDPKMJh OHqGZRhF4zEuTlLdqMZygoJ9EuW7X8zd9lb6/wAJckwWC4Yw+bQpxePxcpuU9G1GM5QjBPoly8zX 8zd9lb9C6/Rz9UP57P2wf2e/jj4w/aS+KXiTwt8KPHfiDQNU1XSZdN1jSvDmo3un30cXhnRLaV7a 6hhaKVY7iB0JB4ZSO1fzlxnw5n2N4mzbFYTKMRUw85x5ZRg2n7kVo0u6sfyzx5wtxJj+Ls6xeCyT E1cLOcXGUacnF2pwWjS11TR/QnX9Gn9TBQB8bftUfsg6d+0/f+DL++8dXvg8+D7PWrSOO00GDWRf jWZtNmZ3abVNONubc6cAAA+7f2xz8VxZwbS4qqYKpUx8qPsYyWkFK/M4vrJWtY+A414DpcZVcvq1 cylh/q8ZrSCnzc7i+so2ty+e5+DX7SfwatvgJ8XNe+GVpr8/iWDRrLQrtdXudPj0yW4OsaPZ6oyN ZxXd6kYga62A+YdwGeM4r+f+J8kjw9nGIyuGIdWMIwfM1y35oqW13te25/M/F3D8OGM9xOT08U60 acYPmceVvmipbXe17bnJ/Bb/AJLH8Jv+ymeA/wD1KdKriyP/AJHWUf8AYVS/9OROHh7/AJH+R/8A YZR/9ORP3W/aL/YJ0n9oT4l3XxHvPiXqPhea60jSdJOlW3hi21WJF0qF4lnF3LrVi5aYPkr5fy+p r994l8PqPEeaSzOeaSpScIx5VBS+HrfmW/of0pxZ4ZUOKc3nm1TN50ZOnGPKqakvdVr3c1v6Hzx4 s+GNn/wTl+HHjvxt4W+Il34r8c/FKxs/h94QgvPD9npX9i3vmXGpXviZVXVdT+1LounxOyBozH9r aBXBVyK+cxmVw8NMszDHYTMnWx+LiqNNOCjyvWTn8Ur8qvbS3Nyp6M+Ux2T0/CfKcyzHBZrKvmWN iqFJOCjyPWTqfFK/JFNrS3Nyp6M/Gy7u7q/urm+vrm4vb29uJru8vLuaS5uru6uZGmuLm5uJmeae 4nmcs7sSzMSSSTX4pOc6k5VKknKpJttt3bb1bbe7fVn4DOc6s51Kk3KpJttt3bb1bberberb3PqH 9mv9kf4jftKXt3c6FJa+GvBWkXSWeteNNYgnms47pkWV9N0axhMUmuavFBIsjxCWGKJHUyyxmSMP 9VwxwdmfE85yw7VLAwdpVZJtX/lil8UratXSStdq6v8AZcI8DZtxdUqTwzjRy+nK06sk2r78sErc 8ktWrpJNc0ldX/a3/hjfRv8Ahl3/AIZm/wCE51P7D/aH9qf8Jf8A2La/a/tn/CS/8JNj+x/t/k/Z vtX7vZ9o3+X/AB55r9y/1Kof6qf6rfX5+z5ub2nKr35+f4b2tfTfbqf0P/qBh/8AUz/U/wDtKfs+ bm9ryK9/ae0+C9rX0tzXt1PxQ/aS/ZJ+JH7Nl9a3GvG28R+C9WuWtNF8a6PDNFYzXYjaYabq9lMZ JtE1Z4Y2dIneWKZFYxSyFJAn4bxPwfmfDFSEsRargZu0asb2b35ZLeMrapXaavZuzt/PHF3A2b8I 1ISxVq2XzdoVopqLe/LJPWErapNtNJ8snZ2+X7W6ubG5t72yuJ7O8s54bq0u7WaS3ubW5t5FlguL eeJklgnglQMjqQysAQQRXykJypyjOEnGcXdNaNNbNPo0fGwnOnOFSnNxqRaaadmmtU01qmnsz9z9 P+PV1+0D/wAE/vitqGsSi58eeFfDEvhLxcsSjz9Sv4JdNfS9eFunIbX7CRXfaqobxJ1RQqgD97pc QT4i8O83qVnfMKVJ06neTVuWdv7636cylbQ/pGlxNPinwuzuriJXzOjRdKrbeUly8s7f342b6c6k krI/FbXvAPjjwrpmla14n8H+J/Dmk67JcxaLqOu6HqWkWmrvZpBJdf2bNqFtbpfLAlzGWaLco3Dm vw/EZfj8JSo18VgqtKjUb5XOEoqVrX5W0r2utj+esVlmZYKjRxGMwFajQqNqEpwlFSta/K5JXtdX t3OSrjOA/fG7/ZhuP2nv2UP2XdBh8Zw+C4/DHg/QNWuL2XQX8QPcx3nhq1sxFDapq+jKrxld2Wlw RxxX9Bz4VlxVwhwph441UFSowk3yc97wS0XNH8z+nJ8Gy4x4I4MwscwWHVGhCTfJz3vTSslzQ/M+ d9f/AOCT3ja2t7h/DHxf8L6zdIGNtBrvhrVfDkM+ANgmubDUfFD25Y5ziOQD37fN4jwhx0YyeFzm lOfRShKCfq052+5nyuK8EMxhGTwefUak+inTlTT9XGVS33M/Om/+CfxUsZPGDL4F8T3+l+BLnXLf xL4j0/RNUn8MWCeHri4t9Sum15rOLT/sqm1dkYurSIMhe1fm1TI82pvGtYCrKlh3JTmoycFyNqT5 7Wtpp3Pyerw7nVN49rLa0qOGc1UqRhJ048jak+e3LbR211R5ZXknin7Lf8E4fCUfj74AftI+BZr5 9Mi8avdeEpdSjgW6k0+PxH4K1HR3vo7ZpYFuHtFvDIIy6ByuNwzmv2vwzwazDh3ibASqcqrt0+a1 7c9JxvbS9r3tc/oDwlwKzPhfi3LZVOSOIvScrX5faUZQvbS9r3tdXNzVP+CTnhd7B10X4x69baoF Bjm1Twrp97YO6o2Ue2tNWsLiJZJMfMJXKDPyua6KvhDhHTaoZ1UVbvKmmvuUk/xdvM6K3ghgnSaw +f1VW7ypxcfuUov8Xbsz8nPjD8JPFvwQ8f618O/GcNuuraQ0MsV7YvLLpmr6beRiaw1bS554YJZr O7iP8SK8civG4V0YD8gzrJ8ZkWY18txqXtoW1Xwyi9VKLaWj9Lp3T1TPxDPsjx3DmaYjKswivb07 NNX5ZResZRbSbTXldO6eqZnfC3xzqHwz+I/gnx9pk0sN14U8SaVrB8pmU3FnbXUf9pWMm3DNb6jp zS28q/xxSsves8px9TK8zwOYUpNTo1Yy9Un7y9JRun5MyyXMquT5tl2aUZNToVoy06pP3o+ko3i+ 6bP3U/aA/YA0H4+/F27+J58ev4QsNX0PQrfV9N0zw9Dqt7q+saaJrKTVF1GXVLK2tIpdDgs4VzDc MzxlicYU/vnEXh3h+Ic5nmv9oexpzpwUoxgpOUo3XNfmSXuKK2equf0nxR4X4bifPamc/wBpuhSq U4KUYwUnKUbrm5nJJJwUEtJaq58cfHv/AIJo658OvBmteOfhv43l8bW3hywuNW1jwzq2jLp2tnSr GDzr+80e8sLq7tdVubeJXlNs8NsxiRtjySbY2+K4h8L6+W4Gvj8sxzrxpRcpQlG0uVK7cWm1Jrfl tHRaNuyfwHE3hBicpy/EZllGYvEQoxcp05Q5Z8qV5ODi2pNK75Wouy0bdk/y0r8oPxc/YT/glB41 vF1T4sfDmaaR9PmsNG8a6fbneYrW8trhtC1mZBny1kv4LqxVu5FsvpX7N4RY6aq5vlspfu3GNVLs 0+ST+acPuP3rwRzGoq2eZTKTdJxhWiuiafJN/wDbycL/AOFH6i/tA2l1f/Ab422NjbXF7e3vwi+J NpZ2dpDJc3V3dXPg3Wobe2treFXmnuJ5nCoigszEAAk1+rcRQnU4fz2nTi5VJYOskkrtt05JJJbt 9Efs3FEJ1eGeIqdODlUlgMQkkrtt0ppJJatt6JLc/Dz4U/8ABN349fEC0tdW8UjSPhbpF0qyJF4o NxdeJ2hbbtk/4RmwUyWbYzmK+uLOdSOUwQa/CMo8MuIMxhCti+TCUX/z8u5/+ALb0k4vyP5xyTwk 4mzSEK+N9ngqD/5+XdS3/XuO3pOUH5H0/F/wSX0gQBZ/jlqUl1tYNNF8PrWGAuSdjC2fxhPIFUYy PNJOOozx9UvCCjy2ln0nPv7FJfd7R/mfZLwOoctpcSTc+/sEl93tX+Z8KftOfsd+P/2aX07VdS1G x8XeB9ZvW07TfFul2txYeTqQhkuI9N1zSp5Lk6VfXUEEskAS4uYpUibEm5WUfA8U8F5jwu6VarVj WwE5csakU1aVr8s4u/K2k2rOSaT1urH5txjwFmnCDpV61WNfLqkuWNWKcbStflnF35W0m1aUk0nr dNHyLXxx8IfvB8Nvhj/w2l+xJ8H/AAn4g8YXnhu+8GeJGS61iDS01ma5/wCEJg8VeFNHsXhuL+wz v8Pazau8xkZvMiIwdxI/f8syr/XjgXJcHicbKlUoVdZKPM37JVKcVq19iUW3fdH9L5Rk/wDxELw6 yHA4rHyo1MPW1ko87fsVUpQVnKP2Jxbd915nwF+19+yDp37MGneBb6x8dXvjA+ML3XrSSO70GDRh YDRoNLmV0aHVNRNwbg6iQQQm3Z3zx+ecZcG0uFaWAqU8fKt7aU1rBRtyqL6Sd73PzDjzgOlwbSy2 rSzKWI+sSmtYKHLyKL6Sle/N5bHw5XwZ+bn9CGufsr2H7T/7Nn7K1hf+M7zwePB/wm8FXcclposO sm/Os+AvCMLI6zalpwtxbjTgQQX3b+2Of6Mr8J0+KuGOEqdTGyo+xwdJ6RUr81Kmusla1j+psTwV S4y4R4KpVcwlh/q+BovSCnzc9Gkuso2ty+e543/w6Z8Pf9Ft1n/wh7H/AOaavE/4hBhv+h7P/wAF L/5M8D/iB+F/6KKp/wCCV/8ALDe/aV/4J+6R4p1b4wfHOT4nalZXU+n+JPHB8OJ4XtZ7dZdJ0Sa9 XTv7SbW45DHObEKZPJyu7O0456OJ/Duji62c5881lGbjOryezTXuxvbm5utt7fI6eL/C6hja+fcS POJxm4VK3s/Zpq8YN8vNz9eXe3yPw1r8GP5vP0c/YS+Etv8AHPwR+0v8LLrW5vDlv4o0b4VeZrNv YpqU1n/YnjK+8RLsspLqzSb7Q+kCI5kXaHLc4wf0vgDJ459geKMpnXdKNWFD3kuZrlqOe11e/Lbf qfrPhrkcOJMu4vyWeIdKNanhvfS5muSq6m11e/Lbfrc8w/a7/ZGu/wBmG78HT2fiW48YeG/FttqM K6vcaTHpMtjrmlyxPcadNbw32oR+XPYXcUsLl1MhWUbcR5PlcZcHT4VngpQxTrYWsmuZx5bSjvFp N7pprXXXsePx3wLPg2pgJU8Y8RhK6kuZx5XGcbXi0nLeLTTvraWmh8ZV8Sfnx+zf7GP7GXhLVbb4 PftJaH8UNRvZLSdNau/Cz+G7NY7bW9Oa70vWNEl1NNaaZUtNRjkCSm3VpIgj7AHFftvBHBODqxyX iehmspNPmdPkWkleMo83NfR3s7aqztqf0D4feH+BrQyHi7DZzOTi+d0/ZrScbxnBy576SvZ8uqs7 an6Q/tBfBq2+Pfwu1r4ZXevz+GoNZvNGu21e20+PU5bc6PqtrqiotnLd2SSCdrXYT5g2g55xiv0z iPJI8Q5VXyueIdKM5RfMlzW5ZKW11va25+t8U8Pw4nybEZPUxToxqSg+ZR5muWSltdb2tufz0ftY fAHw1+zj460fwHovji88banceH4te1uS40a20hNI+3XdxBpljtt9U1JpLqe3tHndX8vZFJERkPx/ OPF/D2F4Zx9HL6GPlXqunzyvFR5btqK0lLVpNvbRrufyvxvwvhOE8yw+WYfMpYis6SnO8FHlu2or SUtWk272snHufM+nade6vqFhpOmW0t7qWqXtrp2n2cA3TXd7ezpbWltCpIDSzzyqqjuTXy9KnUrV KdGlFyqzkkkt227JL1Z8fSpVK9WlQowcq05KMUt227JLzb0P2hsP+Cey/BTwR8SPiHB8QNS8VeI7 T4F/FvTD4WtPCyRRXeq+Ifhl4h0eW1sLuHVru7uTFdXpEIFvvmIUYBNft9Pw5WR4DM8yjmMquJWA xEfZqnvKdCcbJqTb1eml2f0HT8LFw7l2b5rHNJ18XHLcTH2ap2TlPDzjaLUm3ZvT3bs+VPhV/wAE 3/j78QLa21XxRHpHwt0e4EciJ4qee48SyW8mD5sfhnTlkmtJE5Bhv57GYEfdwQa+Ryjwz4hzGEa2 LUMJRf8Az8u52/wR1XpNxfkfFZJ4S8T5pCFfGqngsO/+fl3Ut39nHVek3B+R9RQf8El9IECC5+OO pSXW0+ZJB4AtYYC5JwUhk8XTyBVGBzIScZ4zgfVx8IKPKufPpOflSSX3e0f5n2UfA6hyrn4jm5+V BJfd7V/mfDn7Tv7Gvj79mqPTtbvtUsfGXgbVr3+zLXxVplnPp0lnqbRSTw6frmkTz3badNeQwSNA 0dxcwuI2BdXwp+D4p4JzDhhU686sa+AnLlVSKcbS3SlFt8raTtZtO26eh+ccY8AZpwgqWIqVo4jL Zy5VUinG0rXUZxbfK2k2mpSTs9U9D49r4w+CP6XP2B/HV747/Zi8CS6ncNdaj4VfVfBM87y+Y7W3 h+8ZNFjfMkkiG28PXFpFhsEhNwAUrX9QeHuPqY/hXL3VlepS5qTflB+790HFfI/r7wxzKpmXB2WO tLmq0HKi35QfufdBxXy7H8+Hxn8a6l8Rfiz8RPGurTTTXfiDxdrV2gnYM9rYR3strpOnLgsBDpel W8NtGMnbHEoycZr+c88x1XMs4zLHVpNzqVpPXor2ivSMUoryR/LXEOY1s2zzNcxrybnVrzevSN7R j6RilFeSR6V+yb8CrD9ob4xab4D1jVrrRtAt9K1HxHr9zpwi/tSfS9Ke0hex0x7iKe2gvLy6vok8 2RHWKMs+xyoRvT4QyCnxHnVLL69Zww6hKc2vicY2Vo3uk22ldp2V3Z7Hr8D8NUuKs/o5ZiK8qeFU JVJuNuZxjZWjdNJttK7TSV3Z7P8Af74WfskfAL4M+IbTxb8P/BM2k+KbTT7rTV1y48UeLdUnltb5 FjvBLY6jrlzo++dVGStsu3+HbX9EZTwfw9kmJhjMuwLhi1Fx5nUqSdnvpKTjr/h9D+oMl4G4Y4fx UMdleXOGNjFx53UqybT3upTcNfKK8rH8znxF/wCSg+O/+xy8T/8Ap7vq/l3M/wDkZZh/1/qf+lM/ j/Nv+Rrmf/YRU/8AS2fsn/wSg/5J98Wf+xy0T/0yPX7X4Rf8i3N/+v8AH/0k/fvBH/kVZ5/2EQ/9 IP1hr9dP28KACgAoAy9a0TRvEemXmieIdJ03XNG1CIwX+lavY22padewNgmK6sryKa2njJGcMpGR WVehQxNKdDE0Y1KMlZxklKLXmndMxxGGw+Lo1MPiqEKmHmrSjJKUWuzTumfnZ8W/+CZfwb8Ztd6n 8ONT1X4XazMZJVsYN/iLwlJMysxH9lahcx6pYCWbH+ovRBCpISDAVR+bZx4W5JjXOrllWeErvovf p/8AgLfMte0rLpE/Kc88HsgzBzrZTWngsQ9bL95Sv/hk+aN3/LOy6R6H5afG/wDYs+OfwMt7vWtb 0GHxP4OtN8kvjHwfJPqul2durcTa1ZyW9vq2hoqsu+WeAWqu21ZnPJ/J894Hz/IYzr18OquCX/Ly neUUu8lZSj5trlvopM/F+I/D3iThuNTEYjCqtgI71aV5RS7zVlKHm5R5b6KTPUv2Xv29viB8INR0 vwt8RdQ1Lx38L3kitJUv5pL/AMTeFLZm2C70HUbiQ3F7ZWiEE2Fw7x+WgWBof4vW4U8QcxyarSwm ZVJYjKr211nTXeEnq0v5G7W0i49fa4M8Tc0yGtRwWbVZ4nJrpPmfNUpLvCT1aX8km1ZWi49f6CrD XdH1XQ7PxLpuo21/oGoaVBrdjqtpJ59nd6TdWi31vf28kYbzbea0cSKRnKniv6Kp4ijVoQxVKopY eUFJSWqcWrprya1P6jpYmhWw1PGUasZYWUFNSWqcWrqS7prU/lW8NW138dv2gdFg1dmNx8V/ivZt rEhk8toovF3ilJtUkDq6lRbW17IQEOcLhOcCv5LwsJ5/xFQjWfvYzFrm/wC4lS8vuTf6H8VYOFTi XijDxrv38djlz+Xtal5P5Jvb5H9W1nZ2un2lrYWNvFaWVjbQWdna26LFBbWttEsNvbwxqAscUMSB VUcAACv64hCFOEKdOKUIpJJbJLRJeh/bNOnClCFKnFRpxSSS2SWiS8kizVFhQBka/oWmeJ9C1rw3 rdst7o3iDStQ0XVbN+EutO1S0lsr23YjkCW2nZc9RmscRh6WKw9fC1481GpBxku8ZKzX3MwxWGo4 zDYjCYiHNh6sJQku8ZJpr5pn8sXw7vtR+C/7RfhaZ7gC8+HnxXtNL1KVAQlxb6P4l/sfW4SBuYQ3 tik8bY52ucc1/J2W1KmScS4STl7+GxijLzUZ8sl81dfM/i3KqtXh7ivBScv3mFxyjLzUKnLNejV1 8z+rSv63P7ZP5V/2qf8Ak5H44f8AZTPFv/p2uK/kvi3/AJKfPf8AsKqf+lM/irjX/kruI/8AsMq/ +lM/qor+tD+1T42/4KBf8mi/Fv8A7kL/ANWb4Mr4rxE/5I7OP+4X/p+kfAeKP/JC55/3B/8AUikf nT/wSn/5LH8Rf+yZv/6lPh+vzXwk/wCR1mX/AGC/+5IH5R4J/wDI/wA2/wCwP/3JA/d+v38/pYKA PgP/AIKVf8mwap/2OfhD/wBK7ivz3xP/AOSVrf8AX+n+bPzDxd/5I2t/2EUvzZ8n/wDBJn/kYfjb /wBgbwP/AOl3iavkPCD/AHnPf8FL85nxHgf/AL1xF/17o/nUP0f/AGufGE/gX9mv4w+IbWVoLoeE bjQrWePIkgufFt3aeEreeJlwUlhm1tWRv4WAPav0zjHGywHDGdYmDtP2Lgn2dRqmn8nI/WuOsfLL eEc+xUJWn7BwT7Oq1STXmnO6PxN/4J2eAbLxz+0x4futQhjubTwDoWs+PjbyiNo3vdMksNG0eYq4 JMmn61r9tdR7fmWWBW6A1+GeG2Xwx/FGGnUinDD05VbecbRi/lKcZLzSP538Kcrp5lxhhZ1Yp08L TnXs+8eWEH/27OcZLzSP6P6/pg/rQKACgAoAxvEf/Iva7/2BtU/9IZ6wxP8Au2I/wS/JnPi/91xP /XuX5M/mJ/Y5/wCTn/gt/wBjna/+kl3X8s8Ff8lVkf8A1/X5M/jrgH/ksuHv+whfkz+o+v6tP7NP 5TfiVqGofGb9ozxbOlyXuvH/AMV73S9LllZWEFpqniT+xtBg3FlQxWOntBEuWA2RjJ71/JGaVKmd 8S4ySl7+IxjjF9lKfLBeiVl8j+J84q1eIOLMdJTvPFY5xi30UqnJBeijyr0R/Ux4b8P6V4T8PaH4 X0O2Wz0bw7pGnaHpVqgRVt9P0u0isrOIBFRMpBCoJAGTziv6ww2HpYPDUMJh48tClBRiuyirL8Ef 2hhMLRwOFw2Dw0OXD0qcYRXaMUkl9yNqtzoCgCvd2ltf2tzY3sEV1Z3tvNaXdtOgkhuLa4jaGeCa Nsq8U0TlWB4INTOEakJU5xThJNNPZp6NEzhCrCdOpFSpyTTT2aejT8mj+UvxZZXfwG/aC1210Yyr P8Kfirdy6G7SsJJrfwt4ma50aV5SWf8A0qztImJOSQ/Pev5HxkJ8P8RYiFG/NhMW+X0pzvH70kfx LjqdThninEww9+bBY18nmqdS8H80l95/VtbXEN3bwXVu/mW9zDFcQSbWTfDMiyRPtdVddyMDggEd xX9cRlGcYzi7xauvRn9tQnGcIzg7xaTXoz8P/wDgq/8A8lC+E/8A2Jmtf+nxa/CfF3/kY5P/ANeJ f+lH85+N3/I1yP8A7B5/+ln3J/wTp/5NS8D/APYZ8bf+pZq1feeGv/JI4D/HV/8ATkj9H8KP+SJy 7/r5W/8ATsj7ir7w/RwoA/Gr/grYiB/gDIEUSOvxTRpAoDskZ+HTRozY3FUaViAeAWOOpr8U8YUr 8PO2v7//ANwn4B45JX4Xdtf9p/8AcB9Af8Ewf+Tbr7/spnij/wBNPhmvovCv/kmKn/YVU/8ASYH1 Hg3/AMkjU/7DKn/pNM4j/gqp4xutK+Ffw98FW05hj8X+MbzVL9EcK11Y+E9NTFrIucvbjUdft5jx xJChyO/B4tY2dHKcuwMZWVas5PzVOO3pecX6pHneNePnQyXKsuhKyr4hyl5qlHb05pxfqkeTf8E9 bjQfhD8B/jx+0ZrumXmpppeqW2gPBp6Wx1NtJ8N6fp2q3sGmtdy28IF/d+KIfM3SKjNarzla8jw5 lh8m4f4g4lr0pTUJqFlbm5YJSajey1c1fX7K7Hh+Fk8LkPDPE3FmJoymoTULRtzctOMZNRu0vedR X1t7q7Hr3/D1j4Of9E6+Jn/fHhb/AOaCvY/4i3kv/QtxX/lP/wCTPd/4jZkH/Qpxn/lP/wCTD/h6 x8HP+idfEz/vjwt/80FH/EW8l/6FuK/8p/8AyYf8RsyD/oU4z/yn/wDJnP8Aiz/gp18FfFPhbxL4 Yuvh18STbeI/D+s6DcCSLwq0Zg1fTrnT5RIp15wyGO4ORg5HY1z4vxTyPF4TFYWeWYrlq05Qf8Pa Sa/n8zmx3jHw9jcFjMHPKcXyVqU4P+HtKLi/t+Z+cP7Fl7cWH7UnwZntXMckniiWyZhnm31LR9U0 67TgjiW0unU+xr8z4HnKnxZkkouz9rb5OMk/wbPyXw9qTpcZ8Pyg7N1rfKUJRf3ps/Tb/gp58Fde 8ZeDfCXxW8NWM+pP8PBq2n+K7O0iaa5i8NasbW6h1sRIC7WeiX1k63G3cUju/NIEcUjL+peKmR4j G4LB5vhabk8NzKolq+SVmpekWtfKV9k2fsPjHw9iswwGBzvB03N4XmjVS1apys1P0g0+bspX2Ta+ Ov2PP257j4A6Ufh3480fUPEnw5fUJr7SrnSHgOu+Ep7+VptSS1tLqSC21XSbu5czmAywSRTPI6s+ /ZXxfBfHsuHqP9m5hRlVyzmvFxtz023eVk7KUW9bXTTu03ex8DwF4kS4Yof2VmdCVbKeZuLjbnpO TvKydlKLetrppttN3sfs/wDDb9pj4FfFpbdPA/xK8N6hqNz5ax6Df3Z0LxGZXHMKaDriafqly0bj aWhikjzjDEFSf27LOKMgzhRWAzSlKo/sN8k//AJWk/kmvM/oPKOL+Gs8UFl2b0ZVX9iT5Kl+3JPl k/kmvM91r3z6QKACgAoA/m8/4KLf8nW+OP8AsDeCf/UT0mv5m8Sv+Sux/wDgpf8ApuJ/JPiv/wAl tmX/AF7o/wDpqJ80fBb/AJLH8Jv+ymeA/wD1KdKr5bI/+R1lH/YVS/8ATkT5Dh7/AJH+R/8AYZR/ 9ORP62q/sI/uU/CL/gqr4ruL/wCLnw+8GiVmsPDXgFtbWL5wsWqeKdd1C2veGAVmaw8NWZ3Lkc4z kED8B8WsZKpnGXYK/wC7pYfm/wC3qkmn+EIn81eNeOnVz3K8v5v3VHC89v71Sck//JacT8uUR5XS ONGkkkZUjjRS7u7kKqIqgszMxwAOSa/KEm2klds/GEm2klds/rW+DXw20r4Q/C/wV8O9Ihiig8Na HZ2l5LGFBv8AWZU+065qkpUANNqerzzTsegL4GAAB/YGSZZRybKsDltGKUaVNJ+ct5S9ZSbfzP7k 4fyihkWTZdlVCKUaNNJtfanvOXrKTb+Z6bXqnsHmXxl+G2lfF74X+Nfh3q8MUsHiXQ7y0s5ZApNh rMSfadD1SIsCFm0zV4IZ1PQlMHIJB8rO8so5zlWOy2tFONWm0vKW8ZesZJP5Hj8QZRQz3JsxyqvF ONam0m/sz3hL1jJJ/I/kqlikgllgmRopoZHilicFXjkjYpIjqeVZGBBHY1/IDTi3GStJM/hyUXGT jJWknZn6g/8ABKzxXdaf8YPHvg7zJBp3ibwCdZeIM3ltqnhfXNOhsXePG3K2HiG8w+cjOOd3H6r4 S4ydPOcwwV37Orh+b/t6nJJfhOR+yeCuOnSz7M8vu/ZVsLz/APb1OcUv/JZy1/zPZ/8AgrN/yL3w S/7DPjj/ANIfDNe34v8A+7ZF/jq/lA+h8cP914d/6+Vvypn4p1+HH88H9VH7K3/Jt3wP/wCyZ+Ev /TTb1/WnCX/JMZF/2C0//SUf2twV/wAkjw5/2B0v/SUe/V9CfTngP7VP/Jt3xw/7Jn4t/wDTTcV8 9xb/AMkxnv8A2C1P/SWfMca/8kjxH/2B1f8A0ln8q9fyWfxSfuL/AMEoP+SffFn/ALHLRP8A0yPX 7x4Rf8i3N/8Ar/H/ANJP6O8Ef+RVnn/YRD/0g/WGv10/bz8HP+Cq8MS/Gj4fTrGizTfDC3jllCgP IkPirxKYUdhyyxmZ8Z6bjX8/+LcUs7y6SXvPCr8Kk7fmfzP41xiuIcrkl7zwau/SpUt+bPy8r8qP xo/sN8Of8i9oX/YG0v8A9IYK/s7Df7th/wDBH8kf3rhP91w3/XuP5I07iCG6gntbiNZre5hkgnic ZSWGZGjljcd1dGIPsa2lGM4yhJXi1Z+jNpRjOMoTV4tWa7pn8b9fxWfwIfpd/wAErv8Ak4Txj/2R rxD/AOpv8PK/UPCb/ko8b/2BT/8ATtE/X/BX/kqcf/2L5/8Ap6gfvxX9Cn9PHhvxP/aU+B3wdeS1 +IHxF0LSNViUM2gWr3OueIhvVWhEuhaHb6jqlqs4YbJJoo4iDksFBI8HNeJ8hyVuGY5lThVX2FeU /wDwCKclfu0l5nzec8XcOZA3DNM2p06y+wrzqeXuQUpK/RtJedj5W1T/AIKh/s42E3lWmkfFLW03 MPtOl+GdBihwoQhtuteLdIuNrliB+7z8pyBxn5Kr4q8M05WhRxdRd4whb/yapF/gfFVvGXhOlLlh QxtRd404Jf8Ak9WL/A5P9qr4xeEP2g/2GvFPxG8J6XrthpC+MvDljZweJ7TTrTVYL7TvFOmWNzOI dL1XWbRY5Ibx1QicsVY5Ark4tzrB8RcBYrM8HSqRo+3gkpqKknGpFN2jKS6vqcXGuf4Dinw3xubY GjVjQ+sU0lUUVJONSKbtGU1s3bU/CCvwA/mg/oq/4Jq/8mwaX/2Ofi//ANK7ev6T8MP+SVo/9f6n 5o/q7wi/5I2j/wBhFX80eA/8FZv+Re+CX/YZ8cf+kPhmvnfF/wD3bIv8dX8oHzHjh/uvDv8A18rf lTPxTr8OP54P6wf2c/8Ak3v4E/8AZGvhh/6hGh1/XXDX/JOZB/2BUP8A01E/t3hP/kluGv8AsX4f /wBMwPZa9s+gPM/jT/yRz4s/9kz8ef8AqLarXl55/wAiXN/+wWr/AOm5Hj8Q/wDIgzz/ALA63/pu R/JLX8fH8NH69f8ABJn/AJGH42/9gbwP/wCl3iav2Twg/wB5z3/BS/OZ+7+B/wDvXEX/AF7o/nUP 0H/bK+EH/C5vgD4z0CytVufEmg248ZeEgIvNnOt+Ho5rh7K1UAubjWdJe6sUwQN9yCeBX6Lxrk39 t8PY3DwhfFU17Sn35oa2XnKPNH5n6lx/kP8ArBwvmGFpwvi6S9rS0u+eF3Zec480F5yP5fq/lY/j Y/YT/glh8XjBf+N/glqt2BFfxjx14RimlCgXlstvp3iiwtw+TJJdWn2S5SJCNq21w+DliP2bwmzn lqY/Iq09JL2tO/dWjUS9VyyS/uyfc/evBbPeWrmPDtefuyXtqV+6tGpFeq5ZJL+WT7n7M3l5a6fa XV/fXEVpZWNtPeXl1cOsUFta20TTXFxNIxCxxQxIWZjwACa/bZzhThOpUklCKbbeyS1bfof0BUqQ pQnVqSUacU229klq2/JI/k6+OfxLuvjB8W/HvxGuWm8rxL4gu7jS4Z93m2mgWpXT/D1jIGd9slno lpbxvghS6kgAHFfyHn2aTznOMwzKV7Vajcb9ILSC+UUl6n8Q8SZxPPs9zPNp3tWqtxT6QXuwXygo p+Z9Uf8ABOT4RD4i/HmDxbqNqZ/D/wAKLJPFM7MMwP4munls/CVtIR8yyxXST6hEQQN+nYOQcH6z w0yf+0uII4ypC+GwcfaPtzvSmvvvNf4D7TwmyL+1uJo46rC+FwMfaPt7R6Ul6p3mvOB/RNX9JH9W nifxO/aN+CXwcZ4PiH8RNA0PU0jWX+wYpZ9Y8R7JFDQu3h/RYNQ1iGKfPySSQpEeTuwCR4ea8S5F kt45lmVOnVt8Gsp+XuRTlr0bSXmfO5xxZw7kDcc1zWlTrW+BNyqeXuQUpJPo2kvM+UtV/wCCoP7O GnTmKz0v4oa9GGKi60rwxokMDAKrBwuueKtGudrFiBmMNlTxjBPyNbxV4ZpytCli6i7xhFL/AMmq Rf4HxNfxl4SpS5adHGVV3jTgl/5PUg/wOV/an+M/hT4//sMeLviJ4Q07XtO0aXxd4b0yG28T2em2 mqx3WmeLtIguJfJ0zVdZtUicTEIwnLFScgVycW53hOIeAsZmWDpVI0HWhFKaipXjUinpGUl+Jxca 8QYHijw3x2a4ClVhh3XpxSqKKleNWKbtGU1101Pwcr+fz+Zz+hH/AIJg/wDJt19/2UzxR/6afDNf 0Z4V/wDJMVP+wqp/6TA/qbwb/wCSRqf9hlT/ANJpn4n/AB/+Hup/C34y/EXwRqdvJA2k+KNUl053 3EXmhalcPqWgX6O2d63uj3cMh5JViVPzKa/DOIsuq5TneZYGrFrkqy5fOEnzQfzi0/wP544oyqtk vEGbZdWi1yVpOPnCT5oS+cWn+G6OQ8A/EDxf8L/FeleNvAut3Ph/xLo0kj2OoW6QTAJPE8FxbXNr dRT2d7Z3UEjJJDNG8bqeRXHl2Y43KsXRx2ArunioPRqz30aad001o000zgyzNMfk2NoZjluIdLGU 3pJWe6s000001o000z9OPAv/AAVb8Y2MdvbfEb4X6D4iKqsc2q+FNYvPDVzgNzcvpmo2/iC1uZmj xuRJrZC2SNowtfqWA8XMbTUY5nlVOp3lTk4P15ZKab+cV6bH7Flvjbj6ahDNsmpVe8qcnTfryyU0 35JxV+2x9o/Cn9tn9lj4r3lppck1n4E8SahIEi0rx9oemaVFdXTvt8u38QwPfeHnknlYCJZrqGeY sAse7Kj7jKOOeE83nCk3HD4qT+GtGMbvymrw16Xkm+1z9ByTxE4LzypCi5Rw2Lk9I14Rjd+U1zQ1 eyck30Vz7fs7GwsUYafZ2dnHKQ7Czt4bdJDjCuwhRFc7ehOeK+7hTp00/ZwjFPskvyP0anTpU0/Z U4xT7JL8i5VmgUAFABQAUAFADXRJUeORFkjkVkkjdQ6OjgqyOrAqyspwQeCKTSaaaumJpNNNXTP5 7P8Agol+zz4d+DnxE0Dxh4JsYdJ8KfE2HV7qTQrVAljonibR5bJtXj06JQEs9L1ODVYJ4bcfLFKJ 1jCxBI0/nPxJ4cw2S5lh8bgaahhMUpPlW0ZxtzW7RkpJpdHzWsrJfyz4rcK4TIM1wuPy6moYLGKT 5FtCpBrm5V0jJSTUej5krRsl98f8E6fF+qeNP2W9Y8M3Dtc3fgrxD4q8JaSrt8z6ZqOl2Wv6dE00 pWMCO+164hQFsRxxqOFxX6D4bYyrjuE6+Fk7zoVKlOP+FxU1r6za8kkfpvhRj62YcGYjBzd6mHq1 KUf8MoqcVf1nJLskuh+Pn7KOpQ6H+0r8Fbq9/dJ/wsTQNNfzCY/Km1a8Gjw+ZlSU2XF6ucgdOSOo /GeEascPxRkc6mi+swj85Pl/Nn4NwRWjhuL+Hp1NF9bhH5yfKvxZ/VBX9ZH9phQAUAFAH8pfxFu1 8U/tK+O7/SlE6+I/jl4nu9NRHUiZdX8fX01mqSP5akSC4UBjtHOTiv5IzKf1vijH1KKuquPm4+fN VbX5n8TZtUWN4vzKrQV1VzKo4+fNWbX5n9Wlf1uf2yfyr/tU/wDJyPxw/wCymeLf/TtcV/JfFv8A yU+e/wDYVU/9KZ/FXGv/ACV3Ef8A2GVf/Smf1UV/Wh/ap8bf8FAv+TRfi3/3IX/qzfBlfFeIn/JH Zx/3C/8AT9I+A8Uf+SFzz/uD/wCpFI/On/glP/yWP4i/9kzf/wBSnw/X5r4Sf8jrMv8AsF/9yQPy jwT/AOR/m3/YH/7kgfu/X7+f0sFAHwH/AMFKv+TYNU/7HPwh/wCldxX574n/APJK1v8Ar/T/ADZ+ YeLv/JG1v+wil+bPk/8A4JM/8jD8bf8AsDeB/wD0u8TV8h4Qf7znv+Cl+cz4jwP/AN64i/690fzq H3V+31bT3f7JPxdit4zJIkHgy5ZQVGILL4ieEby6kyxUYitoHYjqQMDJwK++8QoynwfnKiru1N/J Vqbf4I/SfE6Ep8DZ7GKu7Un8lXpN/ckz8z/+CWGqW9r8dvGWlzMqS6t8L9Ta0Zmx5k+n+JvC8z26 JtO53tpJJM5GFiPXNfl3hNWjDP8AG0pbzwkreqnTdvuu/kfkHgtWhDiXMKMn708FK3rGpTdvuu/k fvlX9CH9OBQAUAFAGN4j/wCRe13/ALA2qf8ApDPWGJ/3bEf4Jfkznxf+64n/AK9y/Jn8xP7HP/Jz /wAFv+xztf8A0ku6/lngr/kqsj/6/r8mfx1wD/yWXD3/AGEL8mf1H1/Vp/Zp/KV4Au08JftJ+Cr7 WEWFPDPxw8OXeqRyttSJNF8e2c18kjqku1UFswJCtgDoelfyPl81g+J8DUrKypY+Dlf+7VTf5H8T ZXNYHi7LquIVlRzKm5X6clZN337M/q1r+uD+2QoAKACgD+WH9rPUbfV/2l/jXc2ZMka/ELXdOyMN uuNJuf7Jugu0kEfarJwO+K/k7jCrGtxRnkoar6zKPzi+V/imfxbxxVhX4v4hnT1X1qcfnF8r/FM/ qH8P2stjoOiWU/mefZ6RptrN5ziSXzbezhhk811+V5N6HcRwTX9V4aDp4ehTlfmjCKfySP7LwsJU 8Nh6cr80acU773SS1PxQ/wCCr/8AyUL4T/8AYma1/wCnxa/DfF3/AJGOT/8AXiX/AKUfzx43f8jX I/8AsHn/AOln3J/wTp/5NS8D/wDYZ8bf+pZq1feeGv8AySOA/wAdX/05I/R/Cj/kicu/6+Vv/Tsj 7ir7w/RwoA/Gz/grb/zb/wD91W/95tX4p4w/807/ANzH/uE/AfHL/ml/+5n/AN1z37/gmD/ybdff 9lM8Uf8App8M19F4V/8AJMVP+wqp/wCkwPp/Bv8A5JGp/wBhlT/0mmeGf8FarK4ksfgPqKrm1tbv 4k2Uz4b5bi/h8DT2y5ClBvj02U8kH5eAeceB4wU5Onw/VS9xOsn6tUmv/SWfN+ONOTpcNVUvcjLE J+slRa/9JZ2P/BPXw34Y+Kv7JfxE+GXiRbmTS9Q+IGv6XrttZ3TWl41hqOheE723nguEVmgEskTo p5OYm7V2+HOGwubcH5lleJu6UsROM0nZ2lCm00+l9V8meh4WYTB53wPmuT4tN0Z4qcZpOz5ZQpNN PpfVfJnrf/DtX9mD/oF+M/8Awr7v/wCR69n/AIhhwr/z5r/+DH/ke5/xCLg3/nziP/Br/wAg/wCH av7MH/QL8Z/+Ffd//I9H/EMOFf8AnzX/APBj/wAg/wCIRcG/8+cR/wCDX/kH/DtX9mD/AKBfjP8A 8K+7/wDkej/iGHCv/Pmv/wCDH/kH/EIuDf8AnziP/Br/AMjr/AP7Bv7P3w28ZeHvHfhjTvFMWv8A hjUE1PSpL3xNc3dql1Gkkame2eBVmTbIeCRXZl/h/wAO5ZjcNmGEpVViKUuaN5tq/mup35Z4Z8L5 RmGFzLB0qyxVGXNG9RtX81bU+y3RJUeORFkjkVkkjdQ6OjgqyOrAqyspwQeCK+1aTTTV0z79pNNN XTPzy+NH/BN/4MfEm7vtc8E3N78KPEV4xlkj0O0g1HwhNcMcvK/haaWzNi0gAG2xurSBeW8pmJz+ cZ34Z5Jmc6mIwMpYTEy/lSdNv/r3pb/t2UV1sflfEHhLw/m86mJy6csDi5a+4lKk339m2rf9uSiu vLc/M74r/wDBPj9ob4YxXOq6Xo9l8SNBtfMmOoeBZp7zVoII/mSS68M3cNrrTTFQSVs0vUTHL9DX 5dm/hzxJlSlWpUY4rDrW9K7kl5waUr/4VK3c/H878LeKsmjOvRw8cXho681FtyS86bSnf/AppdyX 9nP9uf4r/BHWbHQvGWpax48+HUdxHZap4d124lvNe0C1R/Klm8Manfyfa7W4sVHFjPIbNwpjAhZv NSuGuPc3yKvTw+NqzxGWp2lCbvOC7wk9U1/K3yvb3Xqq4T8SM74dxFLDZhWqYnKU7ShNtzgtm6cp apr+Rvle3ut8y/ok0DXdJ8UaFo/iXQL2HUtD1/S7HWdI1CAt5N7pupW0V5ZXUe4K4Wa3mVsMAwzg gHiv6Rw+Io4vD0cVh6ilQqQUotbOMldP5pn9WYXE0MbhsPjMNUU8NVhGcZLZxkrp/NM162NwoA/m 8/4KLf8AJ1vjj/sDeCf/AFE9Jr+ZvEr/AJK7H/4KX/puJ/JPiv8A8ltmX/Xuj/6aifNHwW/5LH8J v+ymeA//AFKdKr5bI/8AkdZR/wBhVL/05E+Q4e/5H+R/9hlH/wBORP62q/sI/uU/n7/4KjWFzbft D6FeSpi31L4X+HpbWQZKt9m1/wAVWs8ZJAAljePJAzhXU96/nbxWpyjxJh5te7LCQt8p1E/69D+X fGalOHFWGqSXuTwULfKdRP8ArzR+dWnXf9n6hYX/AJfnfYry1u/K3+X5v2adJvL37X2b9mM4OM9D X5tSn7OpTqWvyyT+53PyilU9lVpVbX5ZJ29Hc/sK0rU7LWtL03WdNnW507VrCz1OwuUIKXFlf28d 1azoQSCssEqsPY1/Z1GrCvSpV6Ur0pxUk+6aun9x/elCtTxFGjiKMualUipRfdSV0/mmX60NSlqe o2ej6dqGrajOttp+l2V1qN/cvnZb2dlBJc3U74BO2KCJmOOwrOrVhRpVK1WVqcIuTfZJXb+4zrVa dClVr1ZWpQi5SfZJXb+SP489Suxf6jqF8EMQvb26uxGW3GMXM8kwQsAoYoHxnAzX8Y1Z+0q1Klrc 0m/vdz+C60/a1atW1uaTf3u5+if/AAS6sbm4/aJ1y7ijZrfT/hf4ilupcHZGLjXvCtrCm7G3zZZJ cquclVYj7pr9J8KacpcSV5pe7HCTv8500v69T9W8Gac58V4mcV7kMFUbfrOml89fz7H0Z/wVm/5F 74Jf9hnxx/6Q+Ga+l8X/APdsi/x1fygfWeOH+68O/wDXyt+VM/FOvw4/ng/qo/ZW/wCTbvgf/wBk z8Jf+mm3r+tOEv8AkmMi/wCwWn/6Sj+1uCv+SR4c/wCwOl/6Sj36voT6c8B/ap/5Nu+OH/ZM/Fv/ AKabivnuLf8AkmM9/wCwWp/6Sz5jjX/kkeI/+wOr/wCks/lXr+Sz+KT9xf8AglB/yT74s/8AY5aJ /wCmR6/ePCL/AJFub/8AX+P/AKSf0d4I/wDIqzz/ALCIf+kH6w1+un7efhB/wVY/5LH8Ov8Asmaf +pT4gr8A8W/+R1lv/YL/AO5Jn80+Nn/I/wAp/wCwP/3JM/Livyk/GD+w3w5/yL2hf9gbS/8A0hgr +zsN/u2H/wAEfyR/euE/3XDf9e4/kjZrc6D+Nmv4qP4CP0u/4JXf8nCeMf8AsjXiH/1N/h5X6h4T f8lHjf8AsCn/AOnaJ+v+Cv8AyVOP/wCxfP8A9PUD7b/4KC/tR678FfDmjfDzwBfNpnjvx3Y3l5ea 7A22+8MeFYpWsTd6Y4dXtdY1m8WWG2uAGNulvM6bZhE6/deIvFeIyPDUMty6py5hiItua3hT2vHt KTuovolJqzs1+i+KXGeJ4ewmHyrK6vJmWJi25r4qdPa8e0pu6jL7KjJq0uVr+fy5ubi8uJ7u7nmu ru6mlubq6uZXnuLm4ndpZp55pWaSaaaRizMxLMxJJzX87SlKcpTnJubd23q23u2+rZ/Ls5zqTlUq Scpybbbd229231b6s+lfht+x3+0X8VtKtfEHhT4c36+Hr6NJrLW9fv8ASvDVje28vMV1YJrd7ZX2 pWcq8rNbwyxMOjcjP1GWcF8S5vRhiMJlkvq0ldSm4wTXdczTkvNJo+vyjgHizO6EMVgspl9Vkrqc 3Gmmns487Tkn3imvM++/iT8IvGXwR/4Jy+KvAvjuDT7fX4PHmk6nJHpl/HqNqLXUfGmhyWxFzGqK XKocjHFfoWaZNjci8NMXl+PjFYhYiMvdfMrSqxtqfp+b5FmHDvhPjctzKMViliYy92XMrSqwtqfj TX4ofz+f0Vf8E1f+TYNL/wCxz8X/APpXb1/Sfhh/yStH/r/U/NH9XeEX/JG0f+wir+aPAf8AgrN/ yL3wS/7DPjj/ANIfDNfO+L/+7ZF/jq/lA+Y8cP8AdeHf+vlb8qZ+Kdfhx/PB/WD+zn/yb38Cf+yN fDD/ANQjQ6/rrhr/AJJzIP8AsCof+mon9u8J/wDJLcNf9i/D/wDpmB7LXtn0B5n8af8AkjnxZ/7J n48/9RbVa8vPP+RLm/8A2C1f/Tcjx+If+RBnn/YHW/8ATcj+SWv4+P4aP16/4JM/8jD8bf8AsDeB /wD0u8TV+yeEH+857/gpfnM/d/A//euIv+vdH86h+1lfuJ/Qx/MB+2X8IP8AhTPx/wDGeg2Vp9k8 NeILj/hM/CKpH5duuh+IZZ53sbVeQtvourx3VigyW2Wyk9a/lbjbJv7E4hxuHhC2FqP2tPtyzbdl 5RlzRXkj+N/EDIf9X+KMww1Ony4Oq/a0u3JNt2XlCXNBeUUeSfBv4kah8Ifih4I+I+miWSXwrr1p f3VrCypJqGkSFrTXNLDMQq/2po9xPb5P3fMz2rx8lzOpk2a4DM6V26NRNpdY7Sj/ANvRbXzPCyDN 6uRZzl2bUbuVCqpNL7Udpx/7eg3H5n70/t2fG3TvCX7MF5d+GtUinuvjHbab4a8L3lrL/wAfPh7x FY/2prWqRKrxytZz+Flkg3jhJLyLIIOD/QPH2e08HwrOeFqpzxqjCm11hNc0pejp3V+8kf0z4lcR UsDwbUqYOsnPMIxp02usKkeacl1s6d1fo5xP5yq/mo/k4/pG/wCCfvwi/wCFXfs+6Hqd/bmHxH8S 5h461UyIBNDpt/bxReF7Hdw3lJoccd1tYBkmvJRX9NeHeTf2Vw7Qq1I2xOKftZd1Fr3F/wCA2l5O TP638Lsi/sbhbDVqsbYvGP20u6jJJU16clpeTkzkf+CgH7T+s/BDwho3grwFftp3xB8ex3c/9sQh Dc+GfDFk6QXWoWnmI6R6pq105t7WTBMSxzyArIsTVx+InFVfIcHQwOX1OXMcQm+ZbwgtG1/ek9Iv paT0aRweKHGWI4cwGHy7LKvJmmJTfOt6dNaOS/vSfuxfS0no0j+e+7u7q/uri9vrm4vb27mlubu7 u5pLi6uriZzJNPcXEzPLNNLIxZmYlmJyTmv5znOdScqlSTlNu7bd2292292fy1Oc6s5VKk3KpJ3b bu23u23q2+59HfDP9kH9of4t6Tb+IfB/w61BvDt4glstd1y90vw3p9/CwUpc6adcvbG51S0k3fLN bRyxEgjdkGvpcr4N4kzijHE4LLZfVpbTk4wTXePM05LzimvM+syfgTirPKEMVgMpl9UltObjTjJd 487i5LzimvM/QD4k/CLxl8Ef+CcvirwL47g0+31+Dx5pOpyR6Zfx6jai11HxpoclsRcxqilyqHIx xX6JmmTY3IvDTF5fj4xWIWIjL3XzK0qsban6jm+RZhw74T43LcyjFYpYmMvdlzK0qsLan401+KH8 /n9CP/BMH/k26+/7KZ4o/wDTT4Zr+jPCv/kmKn/YVU/9Jgf1N4N/8kjU/wCwyp/6TTPb/wBpb9k3 4eftKaXbvrbz+HPG2kWr2vh/xtpkMc95a25aWZdM1awkeGLWtFFzM0ghLxTRuWMU0e+QP7vFHCGW 8T0ouu3Sx0FaFWKu0v5ZL7Ubu9rpp7NXd/o+L+B8q4uoweIbpZjTjaFaKu0t+WS0U4Xd7XTTvyyV 3f8AHD4jf8E6P2kPBFzcPoGh6X8SNGjaR4dS8J6paxXvkKW8r7VoOty6Zqa3boMtHai8RWOBI3U/ iuZeGvE2BlJ4ehDE0P5qcle3nCXLK/lHm9WfgWbeE/FuXTk8LhoYvDq9pUpJO3S8J8sr+UeZebPk Dxb8O/H3gGdbbxx4J8V+EJ3kMUSeJfD+q6KJ3AY/6M+o2tvHcqyoWVoyysoyCRzXxuMy3MMvlyY/ A1qMr/bhKN/S6V/kfB47KszyuShmWXV6Er6e0hKF/TmSv8jja4jzz9n/APgmf+0b4j1y+1T4D+Mt VutYt7DRZNd+H19qE8lxeafaabJBb6r4W+0zSPLNYRW1xHcWUZ4to4ZkB8vykT9t8L+JcTXqVeH8 bWc4xhz0W3dpRspU7vdWacV9lKS2sl/QXhBxZi8TUrcM5hXlUhGnz0HJ3cVGylTu9XFJqUF9lKS2 sl+w9ftB+9hQAUAfnr/wUY+KPxA+FXwv8D6x8O/Feq+EtU1Hx8mmX17pMkcc1zYHw9rV0bWQyxSg xfaLdH6Zyor858Ss2zHKMqwFbLcXOjVliOVuO7XJJ2+9I/LPFjOc0yTJsuxGVY2dCtPFcrcd3Hkm 7bPS6TNT/gnb8SvHfxT+CnijxB8QvE+p+LNas/ilrejWuo6rJHJcQ6Xb+E/BN7DZI0ccSiGO71Ce QDGd0hrXw3zTMM2yPF4nMsVKtXji5RUpbqKp0ml6XbfzNvCnN8zzrh3GYrNcZOviI42cFKW6iqVF pdNLyb+Z97V+gn6aFAH4tf8ABV/xnpV1qvwk8AWs0U2saRa+JPFGrxq0bSWVprD6VpujI+A0kbXj aVduVJX5URsEFSPxDxdx1GdXJ8ui060FOpLyUuWMfv5Zfcj+e/G7MKE6+R5XCSdenGpUl5KfLGH3 8sn8ke8f8EtdCvtO+AvijWLuNorbxF8SdVn0zcuBcWem6F4f02W7jfcd0bajDPDjAw0Ddc17/hRh 6lLh/F15q0auKk4+ajCEb/8AgSa+R9N4MYarR4ZxmImrQq4uTj5qMIRb/wDAlJfJn5RftS/DvV/g X+0b4z02xE2mQr4k/wCE68EX0ShAujazfyazo09kxBV/7HvRJZlsY8+zfjAr8j4sy2tkHEuOpU7w j7X2tJ/3ZPmi1/hd4+sWfiPGmU1+G+LMwo07wj7b21Fr+ScueDX+B3h6xZ/RB+z78Z9B+PPwt8N+ P9GmtheXdrFZeKNKgk3SaB4ptIYhrGlTRszSxxpO3m27PgzWksUnRxX9IcO53h+IMpw2Y0JLnatO K+xUS96L+eqvvFp9T+q+FuIMNxNkuEzTDyXtJRtUivsVElzxfXfWN94tPqe1V7h9CFAHzb+1Z8dd L+Afwg8ReJ3vYY/Feq2l1oXgTTi6m5vfEt7bvHb3kcH3nstCV/tdy3CBIxHuDyRhvmOLc/pcPZNi cU5pYuacKS6ubWjt2j8UvJW3aPkeNuJaPDGQ4vGOoljZxcKMerqNaO3aHxS6WVr3av8Ahd+wz8Lb 74p/tHeCZHt5LjRfA1/H8Q/Ed2+5o4k8O3EV3o8UrN8s0mo+JTaRGNjl4TK2GVGFfgnAWU1M24mw LcW6GHl7ab/wO8fXmnyq3VXfRn82+G+S1M64sy5uLeHw0lXqPt7NpwXnzVOVW6q72TP6Y6/qI/sA /lX/AGqf+Tkfjh/2Uzxb/wCna4r+S+Lf+Snz3/sKqf8ApTP4q41/5K7iP/sMq/8ApTP6qK/rQ/tU +Q/28tPutT/ZM+L1tZxmWWOy8K6g6gMcWukePPC2q30nyqxxFZWUjnsNvJA5r43xApzq8IZzGCu1 Gm/lGrTk/wAEz4TxMpTrcD59CmryUacvlGtTk/uSbPy6/wCCXnifTNG+P2u6FfzJBc+Lvh7q+n6M XcKbnU9M1XRtbksY0K/M8mk2F1NnIwLcjBzkflPhTiqVDiHEYeo7SrYaSj5yjKMrf+AqT+R+M+DW Mo4fijE4arJKdfCyjDzlGUJ2/wDAVJ/9un9ANf0Qf1CFAHwH/wAFKv8Ak2DVP+xz8If+ldxX574n /wDJK1v+v9P82fmHi7/yRtb/ALCKX5s+T/8Agkz/AMjD8bf+wN4H/wDS7xNXyHhB/vOe/wCCl+cz 4jwP/wB64i/690fzqH65fE/wRafEr4deN/AN8yRweL/DGs6CJ5AStpc6hYzQWV+AoY79PvGjnXg/ NGOD0r9izXAQzTLcdl1TSNalKF+zaaT+Ts/kfumc5dTzfKsxyuppGvRnC/ZyTSl/267P5H8xnwi8 c+If2afj1ofiPVdOuoNT8AeKb7RPGGhfKLqWwWS60HxVpShnWFrsWcs4gZiYxOqPyBX8s5Nj8Twv xBQxNak1Vw9VxqQ621hUj62vbpezP46yLMsVwhxNhsXWpNVsLWcKsOvLrCpHte17dOazP6j/AAv4 n0Dxp4e0fxX4W1W01vw9r1jDqOk6pYyCW3u7Wdcqynho5Y2BSSNwskUisjqrKQP6twmKw+Ow1HF4 SqqmGqRUoyWzT/qzW6ej1P7OwWMwuYYXD43BVo1MLVipRktmn+vRp6p3Ts0b1dB0hQAUAY3iP/kX td/7A2qf+kM9YYn/AHbEf4Jfkznxf+64n/r3L8mfzE/sc/8AJz/wW/7HO1/9JLuv5Z4K/wCSqyP/ AK/r8mfx1wD/AMllw9/2EL8mf1H1/Vp/Zp/M7+3P8Lr34WftHeNZY4JINF8c3r/ELw7dopjikTxD cS3OsQwsnyRSaf4jW6jCAhkiEbYAda/l3j3KZ5TxNjmotUMRL20H/jd5Jek+ZW7WfVH8geJOS1Ml 4szBqLWHxMvb03/jbcku3LU5lborPqj9zv2Uvjrpfx8+EHh3xKt9DN4t0iztNC8e6f5iC7svEllb rFPey264aOy15YvtlswBQrI0YJeKQL+98I5/S4hybDYpVE8ZCKhVXVTS1du0/ij01tumf0jwTxLR 4nyHCYxVU8dCKhWj1VRKzbXafxR6Wdt07fSlfTn1wUAeLftA/GbQvgP8LfEnxA1ma2+1WdrLZeGN Mnchte8V3dvP/YukRIhErrLPEZJymTFaxSynhDXh8RZ3h+H8pxWY15LnirQi/t1Gnyx+b1faKb6H z3FHEGG4ZyXF5piJLnjG1OL+3UafJFddXrK20VJ9D+dz9l/4dav8eP2i/B+mX6S6pBL4kPjnx1eS qNraJpOoR6xrk14Y1Cx/2xdslmpC48+7QYAPH83cKZbW4g4lwVKonOLq+1qv+7F80m/8TtH1kj+V ODcpr8TcWYCjVTnF1vbVm/5Iy55t/wCN2h/ikj+oyv6tP7MPw5/4Kv8A/JQvhP8A9iZrX/p8Wvwf xd/5GOT/APXiX/pR/OPjd/yNcj/7B5/+ln3J/wAE6f8Ak1LwP/2GfG3/AKlmrV954a/8kjgP8dX/ ANOSP0fwo/5InLv+vlb/ANOyPuKvvD9HCgD8bP8Agrb/AM2//wDdVv8A3m1finjD/wA07/3Mf+4T 8B8cv+aX/wC5n/3XPfv+CYP/ACbdff8AZTPFH/pp8M19F4V/8kxU/wCwqp/6TA+n8G/+SRqf9hlT /wBJpnaf8FBvhTefE79njWrvSLZrrXPh1qNv48s4Yk3T3Om6ba3ln4itoyAWKx6Lfy3ewZMj2iqO SK7fEXKJ5rw3XnRjevhpKql1cYpqa/8AAW5efKj0PFLJKmccK4ipQhzYnCTVZJbuMU1UX/gEnK3V xR+Y/wDwTs+P+l/CP4o6j4M8WX8Wm+D/AIoRWGnf2ldSCKz0fxZp0s/9gXd5M7eXa2Gox3s9nNIQ FWWWB5GWKN2H5b4bcRUsnzargcZUUcFi0lzPaNSN+Rt9E7uLfdxbaSZ+O+FPFFHIs6q5fjqqhgMY ox5noo1Yt8jb6Rldxb7uLbSTZ/QzX9HH9UhQAUAM8yMSCEyIJWRpFi3L5hjRlVpAmdxRWcAnGASP WldX5b6iur8t/e7Hwt+09+3Bpf7NPj7SPAt98O9Q8Wy6t4QsPFq6la+I7fR44I7/AFrX9HFi1tNo +oM7xtoJkMm8AiUDaNuT8FxVx3R4XzCjgKmWyrOdFVOZTUbXlONrOL/kve/U/NuMvEajwhmdDLam VSrynQjV5lUUbc05wtZxl/Je9+p9Y/DDxxF8S/h34L+IMGnSaRD4y8N6V4ii0uW5W8ksE1S1jult Xukht1uGhEmC4RA2M4FfXZVj1mmW4HMY03CNelGfLe9uZXteyvb0PuMmzKOcZVl+aRpOnHEUY1OV u/LzK9r2V7d7I7uvQPSPwY/4KjeAPC/hn4p+CvF2hWdrp2q+PPD+qzeJ7e0jSFb3UdDvrWCDXbiN G5vdRtdQEMr7VEn2UMdzlzX8/eK2X4XC5tgcZh4KNbEU5OaXWUWkpPzadm+vLfe5/M3jNleCwedZ djsNTjCviaUnUS0vKDSU35yUrN9eW+9z9GP+CfeoahqH7KHw0bUDI/2SXxfp9jNKJN02n2fjPX47 YB5CRJHa/NAhXCqkQXqpr9K8OqlSpwjlftL+66iT7pVJ2+7b5W6H6x4XVatXgjJ3Vu+V1YpvrFVZ 2+74VbordD7Pr7c/QTJ1bX9C0COGbXda0nRYbh2jgl1bUbPTo55FXc0cL3k0KyOq8kKSQKxrYjD4 dJ168IJ7c0kr/e0YV8VhsKoyxOIhTi9nKSjf0u0fzh/8FBNU0zWP2ovGl/pGo2Oq2MukeDVivdOu 7e+tJGi8K6VHIsdzbSSwu0cilWAbgjB5r+aPEWrSrcV46pRqRnTcKesWmv4ceq0P5M8Uq1HEcZ5h VoVYzpunS1i01/Dj1V0fOXwcnhtvi78K7m5mit7e3+I/geeeeeRIoYIYvE2lySzTSyFUjijRSWYk AAZNfM5LKMc4ymUmlFYmk23slzxPk8glGGe5LOckorF0W29EkqkdWf1Wf8LG+Hv/AEPngz/wqND/ APk6v62/tLLv+g+h/wCBx/zP7W/tbKv+hnh//BkP8z85/wDgqB8JLrxZ8OPCfxZ0O2a7uPh7e3Wn +IPsyGV28K+JWsxDqTsm4vb6RrFpEvyjCpfO5O1SR+aeKuTzxmWYPN6Ebyw0mp2/59ztaXpGSXyk 3sj8o8ZMinjspwOeYaHNPCycZ2/591LWl6Rml8pt7I/CSvwI/mk/Zv8AYd/bk8IaL4Q0b4NfGbWY vDsnh2KPTPBfjTUWYaNc6MGYWeg69dhDHo0ujRkRW11KVtXtVVJGjeMNN+2cB8eYOhg6GSZ3XVJ0 ly0qsvhcekJv7PLtGT93lsm01739A+HHiRgcPgcPw/xBiFSdJctGrL4HDpCb2g4LSMn7rjZNpq8v 1n/4TLwf/wAI/wD8JZ/wlfhv/hFfK87/AISX+3dL/wCEf8nO3zf7Z+1f2d5W7jd5mM1+v/XcH9X+ ufW6X1S1+fmjyW/xX5fxP3H+0MB9V+vfXaP1K1/ac8eS3fnvy2+Z+TX7cP7c3hLWPCOtfBz4Ma1F 4hl8RwzaV418a6czNo1tokmEvtA0G6aPytZl1qEtDc3URa1S1ZkjeR5C0P5Dx3x7g62Dr5LkldVH VTjVqx+FR6wg/tcy0lJe6o3Sbb938P8AEbxIwNfA4jIOH8QqrqpxrVo/AodYQe03NaSkvdUW0m27 x/GKvxI/n0/dD/gmR8Lh4H+GfjH4z+KPs+kp46ubbT9Eu9SlSzit/Cnhya6S61Jp7hoooLbVtcuH TLn5lskYHawJ/e/C3KvqGV43O8XaCxDSi5aWpwbvK72UpNr/ALdT6n9JeD2Tf2dk+P4gxtoLEyUY OTslTpt3ld2SUptrX+RPZnAf8FUPEvhzX9A+DKaD4g0TW3tdX8atcrpGq2GpNbrLZeGxE062c8xi WQo20tjODjpXneLOKw2Iw+SLD4iE2p1b8slK2kN7Nnl+NOMwmKwvD6w2Kp1Gqla/LKMraU97N2Px ur8VPwE/p9/Zh8d+B7D9nf4LWV94y8KWV5a/DjwrBc2l34i0i3ubeaPSrdZIZ4JrxJYZUYYKsAQa /qjhXH4Gnw3kcKmNoxmsNTTTnFNPlW6uf2RwbmWXUuFOHqdTMKEakcJTTTnFNPlWjTd0fUFne2eo 2sF9p93bX9lcoJLa8s54rq1uIySBJBcQO8UqEjqpIr6uE4VYRqU5qUHs07p+jR9lTqU6sI1KU1Km 9mmmn6NaM+ZP2pfGvg2b9n343aVF4t8My6o3w98XWS6bHr2lPfteDTbmI2gs1ujcG5EoKmPbv3cY zXy3FmOwUuHM9pLGUnV+rVFy88b35Xpa97+R8fxpmGAlwtxHQjjqLrfVaq5eePNflata9736bn8v tfyqfxqftR/wS28UeGtA8BfFOHXfEWhaLLceL9Gkgi1bVrDTpJ410Z1aSFLy4haRFbglQQDX7h4U YrC4fLs2jXxNODdaNuaSV/d82j+hvBjGYPC5ZnUcTiqdOTrwspSjG/udLtH623WsaRZab/bN7qun WmkeVbz/ANq3V9bW+m+TdNElrN9ullS18q5eZBG27Dl1AzkV+wSrUYUvbTqxVGyfM2lGz2121urd z9yniKFOj9YqVoRoWT5m0o2ezu3azura63Pwd/4Kha7omvfF34f3Oh6xpWs28Pw4SCafSdQtNRhi m/4SbXpPJkls5pkSXY4baSDgg96/APFavQxGcZdKhWhOKw1rxaavzz7XP5o8ZcTh8TnuVzw2IhUi sJZuMlJJ+0npo2fmZX5cfjx/XZ4M8XeFNX0vQtO0nxP4e1PUBolgxsdO1rTb28Cw2UHnMbW2uZZw sX8R2/L3r+xsDjMJWo4enRxVOVT2a0Uot6JdE7n915fjsDXo4alQxlKdX2cdIzi3olfRO+hs6p4u 8J6Hciy1rxP4e0e8MSTi01TWtN0+5MLllSYQXdzDKYnZGAbGCQfStquMwlCXJXxVOE7XtKUU7ejZ 0VsdgcNP2eIxlKnUte0pxi7d7Np2P4+q/jM/gw/Rv/gmHrWjaF8e/F15rmraZo1pJ8Idfto7rVb+ 1063kuH8Z+AJUgSe8lhjaZo4XYKDuKqTjANfpfhXXo4fiHGTr1owg8FNXk0lf2tHS7trofrPg5iM PhuJ8dUxNeFODwE1eUlFX9rQ0u2tdHp5GH/wUm1a31r9ouC+sdV03WNLPw98MRaZd6XewX9sLaO+ 13z4TcW0ksJlTUjOSAxwCM85rn8Tq0a/EsalOrGdL6tDlcWmrXndXWm9zm8XK8MRxXGpSrwqUfqt NRcWpK153V1pfmufCei3FhZ6zpN3qto1/pdrqdhcalYKdrXthBdRSXlopLIA1zbqyA7h97qK+BoS pwr0Z1oc1JTTku6T1XzWh+a4edKniKE69PmoxnFyj3imrr5rQ/rm8DeMPCHjvwto/ibwJq+l614Y 1CzgfTbvSZImtoohDGVspIIsNYXVmjBJbaRUlgYbHRSCK/sTAY3B5hhKOKwFaFTCyiuVx222t0a2 cXZrZpH905bj8BmeCoYzLcRCpg5xXK42slba32WtnF2cdmkfJX/BRb/k1Lxx/wBhnwT/AOpZpNfH +JX/ACSOP/x0v/TkT4bxX/5InMf+vlH/ANOxP5u6/mY/kk/cn9hf9oD4LfCr9mvTtP8AiB8SvCvh vVY/Fniq6fRbnUFutdS2muYGgnbQtOS81cQzqCY28nD4+XNfvPAXEWR5TwxSp5jmlGlWVao+Vu87 Nqz5FeWvTTU/pDw24o4eyThGjSzTN6FGuq9R8jledm1Z8kbys+mmvQwf+CrjC98IfA/U7bMtjJq/ i5kuNrIpF9pnh64tcq4WRTNDC7AEAjac4Nc/i4+fBZDVhrTc6mvrGDX3pHL42v2mA4crQ1pupV19 Ywa+9Jn4qV+HH88n9B/7HP7Xvwd1X4K+CfB3jXx34Z8CeL/AOgad4RvrLxfq9h4cs7/T9Btk07Rd T0nVNVuLXT72K40m2hWWMSCeK4RwU2GN5P6L4L4yyWtkeBwWOzClh8Zh6aptVJKCagrRlGUmk7xS ur3Tvpazf9TcA8d5BX4ey7AZjmdHDY/C0o0mqso01KMFywlGUmou8Urq91JPS1m/WviX+3P+zb8N tPnnHxB0zxzqqxF7PQ/h5Pb+Kp71+ip/a1jMfDlkoONxnvI2C/dVjxXsZpx7wxllOUv7RhiKttIU Wqjf/byfIvnJfM9zOPEjhHKKUpf2pDE1raQoNVG/+3k/Zr/t6a8kztfid8SfBur/AAN8fTy+JPDm n6nrPwj8TXg0O48QaV/aVtcat4LvLqHT3t2uIrh7oG5VAPLVnOMLziu/NczwVbIcwk8TSjVng5vl c48ycqTdrXvfW2x6GcZvl9fhvM5SxdKFapgaj5HOPMnKk2o2unfW22p/LDX8mn8Wn6xf8Er/ABDo Gga98Zn13XNH0RLnSPBS2z6vqdlpq3DRXviQyrA15PCJWjDqWC5xkZ61+u+E2Jw+HxGdvEV4QThS tzSUb6z2u0ft/gtisLhcVxA8TiadNOnRtzSUb61NrtXP230/UtO1ezh1DSr+y1OwuPM8i+0+6gvb OfypXgl8m5tpJIZPLmjZG2sdrKQeQa/dadWnWgqlKpGVN7NNNPputNz+iqVWlXpxq0KsZ0ns4tNO zs7Nab6ep+bH/BTn4QDxd8JtH+KOl2gk1r4Z6kItVkjB82Xwf4ilgs7ssq8znTdbW0lUEERQyTvk Ddn8x8U8m+uZPRzalC9fCy97/r3Oyfryy5X5JyZ+R+MWQ/Xsjw+c0ad8Rg52l39lOyfryz5X5Jyf c/A2v57P5iP0/wDC7H9pL9gnxJ4UdhffEP8AZi1RPEGjKQjXtz4HFveXIgDqRL5EegHUYI4lU730 q2ByxBH6phP+Mn8PsVhH72ZZVPnj3dKzdvTk50l1dOJ+yYJvi7wyxeBfvZrk0+eHd0bN29OT2iSW 7pQ6nxX+zt8Krj40/GbwJ8PUjlbT9X1mG58QzRbgbXwxpQbUvEE3mqCIZW0y2kihZsAzyRr1YV8P w3lMs8zvL8uSfs5zvPyhH3pvy91NLzaPz3hTJJcQ8QZZlST9lOonN9qcfem/L3U0v7zSP6tbeCC1 ghtbaKOC2toY4LeCFFjihghRY4ooo1AVI441AUDgAV/XEYxhGMIpKKVkuyR/bMYxhGMIRSglZJbJ LZH4Bf8ABUhb4ftEeHmug/2VvhV4d/s0nYU+zr4k8YCcJs6ML0yZDfPyD90rX88eK6qf6yYdz+D6 pDl9Oepf8b/8NY/mDxnVT/WvCufwfUqfL6e0q3/G/n8rH5y2ckEV3ay3UJuLWO5gkuYAxUzwJKrT QhgQVMkYK5yMZr80g4qcHON4Jq67rqj8mpuMakJTjeCauu66o/rm+HXjbwR8QPB+ieJfh5qular4 Vu7G1XTW0kwxw2ESW8QTS57GIK2k3dhGVjktJEjkgI2lRjFf2JluOwGY4KhistrQnhJRXLy200+F r7LWzi7NbWP7pynMcuzTAYfGZVXhPBSiuXltaKt8LS+Fx2cWk47WPlT/AIKLf8mpeOP+wz4J/wDU s0mvkvEr/kkcf/jpf+nInxPiv/yROY/9fKP/AKdifzd1/Mx/JJ+237Anx5+Dfwp/Z3vLH4hfEfwt 4Y1OT4heJr1NHvdRSbW2s5NK8OrFdjRLJbrVvs07wuscnk7JGRgpJUgfunh7xBkmUcNzp5lmdKlV +szfK5Xlblhryq8rPo7a9D+ivDDibIMk4UqUs1zajRrPFVHyuV525YWfIrys7OztZ2dj5h8T/wDB R/8AaPsfEviGx0nV/CDaXZ65q1rprSeEbYyNp9vf3ENmZDJKkhc26LksA2eoBr5XF+JnE1PFYmnR rUfYxqSUf3a2TaXXsfG4zxa4tpYzFU6Feh7GNSSj+6XwqTS69j9Lf2Evjz8Qfj/8O/F/iX4iXOl3 OqaN40bQ7F9K0yLS4VsBoek34WSGJ3Ekv2i8c7jzjA7V+n8AcQZjxFluNxWZSg6sK/KuWPKrcsX+ bZ+veGvE2acUZVj8Xms4OtTxHIuWPKuXkjLZebZ9h+J9K8Na3oGrad4xsNG1LwxPY3J1u08QwWdx ozackLvdSagl+rWi20UIZnd8KignIxmvtMVRwtfD1qWNpwlhXF8ymk42tre+lrdz77GUMHiMLXpY +lTng3F86mk4cttebm0slu3sfyUfESHwtbfEDxzb+B5Wn8FQeMfE0Pg+dpJZWm8LRa1ep4flaWcL NI0mkrCSzgMc5PNfx9mUcJHMcfHAO+BVaapvvT5nyb6/Dbc/hvNY4KGaZlDLZXy5YioqT11pqb5H rr8Nt9T6m/4J5QXsv7Wfw3ktRIYLay8cz6kUJCrZN4D8SW0ZmH8Uf9o3FuAP75U19b4cRm+L8scL 8qjVcvT2U1/6U0faeFcakuOMocL8qjWcvT2NRa/9vOPzP6T6/pw/rkKACgD81f8AgqB4Y8R+Ifgp 4TutB0PVdZt/D3jtNX12TS7G5vhpGlDw9rdq2pagLaORrWwjuJ0RpnAjRnG4jIr8w8VcJicTkeDn h8POcaeI5p8qb5Y8klzO2yu0r7H5D4yYPF4rh3Azw2GnUhSxPNPlTfLHkmuaVto3aTb0VzjP+Cd/ i2PwD+x98afHU1i+pxeCvGvxG8Wy6bHOtrJqEfhz4X+CdYexjuWinW3e7WzMYkKOELZ2nGK4fDfG LL+DM8x8qfMqFetU5b2vyUKUrX1te1r2PP8ACrHLLOAuIcylT544fEV6rje3N7PD0Z2vra9rXs7H R2P/AAVV+Bclsjan4F+LNpdkDzILHTPB+o2yHapYJdXHjPS5ZAHJAJhXIAPGcDqp+LWQOKdXAYxT 7KNNr73Uj+R2U/GvhtwTrZbjo1OyjSkvvdWP5Hk/xI/4Ksxy6fc2Xwm+Gl1bahNG6W+v+O7+2KWL MjKJV8OaJJcJdTIzBlL6gqArhkcHFePmfi2nTlDKMraqNaTqtaf9uRvf/wADt5M8PN/GxSpTp5Hk 8lVa0nWktPP2cL3frO3dM+Cvhr8JvjZ+2J8T7/VN+o61d6rqcNz44+ImsxldG0OArDGWuJ0SG2e5 gskVLPTbYByiqqIkKM6fn+V5PnvGma1Kt5TnOadWtL4YrTd7XS0jCOtrJJRTa/MsoyPiLj7Oata8 6k5zTrV5/BBabvRXSsoU462sklFNr+lH4b+APD/wt8C+F/h94WgaDQvCulQaZZ+YQ09y6l5r3ULt lCo97ql/NLczlQqmaViABgD+ncsy7D5TgMJl2EjbD0YKK7vq2/OTbk/Ns/rrKMrwuS5bg8qwUbYa hBRXd9XJ+cpNyfm2fOH7Yv7LFh+0j4Jt30mW00v4keE0urjwlq1yCltfwzKHu/DOrSoC8en6jJGr RzYc2s4DgFGlV/meNOE6fE2Bi6LUMzo3dOT2ae8JeT6P7L12bT+S4+4LpcW5dF0HGGb0LulJ7ST3 pyf8suj15Xrs2n+G/gX4kfHr9jb4kajZ29vqHhXWoXih8T+CfEttNN4e8SWcMkgtpLyzjmjhvbck ObTUbKZZAjP5M+x3Dfg2AzPiDgrM6kIxlRrr46U03Ca6XV9Vvyzi778srN3/AJwy3N+JuAM2rU4R lQxC0qUaibhUS2urpNb8s4NO1+WVm7/sd+zD+3loX7Qvi60+Hl54B1bwp4sn0jUNUNzbapZ6z4el XSo45Ln9/LHpmpWpmRyY08ibB+UufvV+1cK+IFDiPGQy2eXzo4twcrqSlD3d9fdkr9FZ+p++8G+J mG4qx8MqqZXOhjnTlK6kpwfLvq+WSv0Vn69TB/aW/wCCg+kfAzxx4n+F+h/DzUfEnjHw5FpS3Gpa rqltpfhqObW9B0vxBZywpZrf6pqMUFpq0ayRsLMmRWVX24c8/FHiNRyDH4rKqGWyq42ko3lKSjC8 oRmrWvKVlJXXu6316nNxf4p0OG8xxmTYbKp1sfSUbylJRp3nCM01bmlKykrr3Nb2fU/InXPEPx9/ bN+KNrHLFqPjXxTd74tK0XS4jZ+GvCekvJGJfs0Mkp0/w9o0JCefdXEu+VwpmlklIJ/G6+J4h42z aCalXxcvhjHSFOPktoRWl5N3fVtn4TicXxP4gZ1BOM8RjZaRhFWp0o9bK/LCC0vKTu3bmk2fvl+y l+zVo37Nnw9OhrPbat4z8QyW2peN/EUEbpFe38Mci2ml6f5oEw0XREnkS33hXleSSZlQy+Wn9CcI 8MUOGMu+rqSnjqjUqs11a2iuvLG7S7tuVley/pzgnhDD8I5V9WUlPMKrUq1RbOS2jG+vJC7Ub6tt yaV7LyL49ft++EPgN8TNZ+GmrfD/AMSa/faPaaPdy6np2p6ZbWky6vplrqcaJDcqZlaGO6CtnqRx xXj8QeIeC4fzStldbLqtSpBRfNGUUnzRUuuulzw+JvE/AcM5xiMnr5XWq1KcYvmjKKT5oqWz10vY /B74v+N7X4lfFLx/4/sbG40yz8Y+K9Z8Q22n3ckc1zZw6neS3SW88sOIpJYlkwSvBNfz/nOPhmmb ZjmNOm4wrVpTSe6UnezsfzRn2YwzfOs0zSnTcKeIrzmovVpSd7NrS5+z/hH/AIKfeBPF3ivwx4Ut vhd4ts7jxP4h0Xw9Bdz6xo7w2s2talbabFcTJGm94oHuQzBeSBxX7fg/FTL8Zi8LhI5VWUqtSME3 KNk5SUbv0uf0FgfGTLMdjsHgYZNXjKtVhBNzhZOclG79Ln6ReKfDWk+MvDXiDwlr9v8Aa9E8TaNq Wg6tbAhWm0/VrOaxu0RyreXL5M52NglWwRyK/TMXhaONwuIweIjehVhKEl5STT/Bn63jcJQzDB4r A4qHNh61OUJLvGSafzs9H0P5hvjN8F/il+yn8ToI7h9U006bq39q/D/4g6WJba01iGynE1jqGn3s RZLTVrUBftVozebA/UNE8byfyxneR5twlmsVJzjyz5qNaOikk7pp9JL7Ud0+6ab/AI44g4ezrgnO IqbnDknzUK8bpSSd1KLW0l9qO6feLTf3r8MP+Cqt5Z6ba6d8Xfh1JrF/bQJHL4m8FX1tZS6g8ahB LdeG9TWOzguZgN0jwXkcRcnZDGuFH6BlXi1OFKFPOctc6iXx0mlzesJaJvq1JK+0Uj9NybxrqU6M KWe5U6lVLWpSaTl5unKyTfVqaV9opaHun/D1H9nv/oTvjL/4T3gj/wCeHXv/APEWeHP+gLG/+AUv /lx9J/xGrhb/AKAMw/8AAKP/AMvH/t1+NdK+I/7FWk+PdDt9QtdH8X6t4A8QabbarFbQalBZ6m0t zBFfQ2l1fWsVykbgOsc0qA9GPWnx9jqWZ8DUswoRkqNadGcVKyklLVXSbV/Rv1H4k5jRzbw8oZnh oyjQrzoTipJKSUrtXSbV+9m15n5H/AH9pnx5+ziPGc3gLT/DlzqHjO00eyuL7xBZ3t+NNj0ebUJo 5bC2ttQsIXuJW1BgTN5qAKPkNfjvD3FOYcM/XpZfTpOpXUU3NN8vK29EmlfXrdeR+GcMcYZnwl/a EsspUnVxEYpuacuXlcneKUoq75ut15H79fsc/Efxv8WPgJ4X8d/EK+GpeJdZ1LxP592umWWkxPZW fiHUbPTkgs9PtbS2EENnAiK4Us4XczMxJP8AQ3BWZ4/N+HsJmGZVObFTlO75VHRTajZJJWst+vVs /p7gHNsxzzhjBZnmtXnxlSdS75VFWU5KNlFJWSSV+vVtny5+3R+xNefFSe5+L/wmsUl+IEVrBH4r 8KxmC3HjK1s4hDDq2mSStFEviaytEWN4nYLewRKExOgW4+U494Gnm0pZzk9O+YpL2lPRe0S0Uo/3 0tGvtJK3vL3vjPEnw7qZ1KefZHTTzRRXtKei9qlopRvb94lo0/jilb3laX5qfAX9qz4x/st6nf8A hu1tTf8AhwahK2vfDnxfb3tmllqWY0up7EsIdS8OawyxhZPlaJzgywSMqlfzDh/i7OuE6tTDQhzY bm9+jUTVpdWvtQl36PrF6H5Fwzxtn/BlarhIQ5sJzPnoVU1aXVraVOXfo/tRbtb9JdB/4Ks/B+4s kk8T/Dj4k6PqJVDJa6D/AMIv4kslchvMVL/UNd8KzuqHG0m2Utk5C45/TsP4t5NKCeKyzFQqdock 197nTf8A5KfrmG8bMhnTTxmU4unV7Q9nUX/gUp03/wCS/ccd45/4KvaBHazw/DX4Vaxe3rrKttqP jnVbLTLW1YE+RNPo2gSatLfqwwXiW/tsdBIetcWP8XcOoSjleUzlU6OrJRS7NxhzX9OePqefmXjd hVCUcoySpKo72lWkopdm4Q5nLzXPH1Og/YE+O/xZ+PXxW+K3iH4ja9dalZ2XhTSIdK0mzgaw8LaC 9xrMjm20zToc20VzLDF80srS3cqIN8jhRjo8PeIM34gzfN8TmeIcoRoxUYpWpwvLaMVpfzd5NLVu x1eGHEuecTZ3neKzbEynTjQioxS5acLz2jFaJtdXeTS1bsXfiD/wUz8DaBrPjfwNN8MfFlxd6Lqf iXwnLfxaxo6289xp11e6O93HGyeYsMkkJcKfmCnHWtMx8Ucvw9bH4CWV1nOEp0780bNpuN/TS5pm vjBluFxGY5bLJ67nTnUpOXNGzcW439NLn4+fA/4hWfwp+LPgT4i6hp1zq1l4R12HVrjTrOWKC6vI 44ZojDDLODFG5MuctxxX4xkOZQyjOMvzKpTc4UanM4rRvR7XPwbhzNaeSZ5lubVaTnToVFJxTSb0 asm9Op+737Pv7eXhL9oL4jW3w60fwF4i8PXtzpOqasupalqWmXVqselxJLJCYrVRKXlD4B6DvX7/ AMO+IGD4izKOW0Mvq05uEpc0pRa930P6W4W8TMDxTm0Mpw+WVaVRwlLmlKLXuq9rLXU9T/at/Zr0 X9pP4eHQXmttJ8Z+H5J9T8D+I54i8djqEsaJd6XqJiRrg6HrkUKR3Ajy0ckcUwWQwiN/W4u4YocT 5b9XclDHU25Upvo+sX15ZWSdtmlKztZ+1xtwjh+Lsq+rOShmFJuVGo+kusZdeSaSUrbNRlZ8tn+B Wja58e/2Mvipc+VBqHgvxXZK1pqOmalb/bPDnivR/NyBIgYWHiDRLhl3Q3EEm6J/mikjlUlf56oV +IeCc2laMqGMjo4yV4VI/lOL6NPR7NM/mLD4nifw/wA6nyxlh8dHSUZK9OpH/wBJnB9JRej2akj9 d/2aP+ChGk/HPxx4Z+F2u/DzUfDXjDxFHqq22p6TqttqvhqSXRNA1PxBeTTx3iafqmmRz2ukyrFG ovSJGUM+CWH7Hwv4jUc/x+FyrEZbKljavNaUZKUPdhKbve0o3UXZe9rbXqfu3CHinQ4kzLB5Nicq nRx9VStKMlKn7kJTbd+WUbqLsvf1td9Tf/ae/by0L9nrxdd/Dyz8A6t4r8WQaRp+qC5udUs9G8PR Lqscklt+/ij1PUrowogMieRDk/KHH3q6eKvEChw5jJ5bDL51sWoKV3JRh722vvSduqsvU6eMvEzD cK4+eVU8rnXxypxldyUILm21XNJ26qy9ep+OHjz4l/Hn9sf4j6ZZXMF/4p1meaWDwv4J8NWksOge HbW4kiFy9nZtLKlnbLhDd6hezO+xVM0/logX8VzDNOIONczpU5RlVrt2p0oL3IJ72XRbc05O9vil ZK34Fmeb8TcfZtRpzjKtiG7U6NNNQpp2vZXdltzTm27W5pWSt+5H7HX7K2n/ALN3gu4l1aS01X4l eK4rWbxZq9sGe20+CEGS18M6RK+GbT7CWRmlmCobuc72GxIlT944L4Sp8M4GTrNTzSsk6klsktoR 8l1f2nrskl/R/APBVLhLL5SruM83rpOrJbRS2px/uxe705nrsopdX+01+01oX7M2heGNc1zwxq3i eLxPq15pMEGk3lnZyWslnZi8aaZrwFXR1O0Bec12cU8U4fhfD4XEYjCzqxqzcUotK1lfqd3GHGGG 4Pw2DxOJwc60a03FKLStZXu7n4dfti/tM6F+0z4l8G67ofhjVvDEXhnQr/SZ4NWvLO8kupLu/F4s 0TWYVURFG0g85r8H404pw/FOKwVfD4WdJUqbi1Jp3u79D+cePuMMNxhjMvxOGwc6MaNOUWpNO95X urH0B+zH+374Q+A3we8P/DTVvh/4k1++0e+167l1PTtT0y2tJl1fWbzU40jhuVMymGO6CtnqRxxX 0XCviHguH8lw+V1suq1KkJTfNGUUnzScuuulz6jg7xPwHDOQ4XJ6+V1qtSnKb5oyik+abls9dLn7 U/DXxva/Er4f+DvH9jY3GmWfjHw9pniG20+6kjmubOHU7WO6jt55YQIpJYlkwSvBPSv3DK8fDNMu wWY06bjCtTjNJ7pSV7Ox/QuUZjDN8rwGaU6bhTxFKM1F6tKSvZ200PMv2lP2hNH/AGbPAuleOdb8 Pan4ltNV8WWPhOOw0q6tbS4iuL7R9d1hLt5LsGNoY49CdCo+YtID0Bry+J+I6HDGAo4+vhp1YTrK naLSd3Gcr69Pct8zx+LuKcPwjltDMsThZ1oTrqlyxaTTcZyvr09xr5n4gftm/tYeHv2n/wDhW/8A YPhPWfC//CD/APCYfav7XvbG8+3f8JL/AMIt5H2f7Gq+X9m/4R99+7r5i46Gvwnjbi7DcVf2Z9Xw c6XsPaX5mnfn9na1u3I/vP5y8QON8Lxl/ZH1bA1KP1b2t+Zp39p7O1rduR39T0b9k39ubwp+zp8L bjwBrXgXxD4jvJvFereIRqGl6lptpbLDqNnpVqluYrtTKZY208knoQwr0+EOPcHw1lMsur4CpVm6 0p3i4pWkoq2voevwP4kYLhTJZ5XiMtq1ajrynzRlFK0lFWs9b+6ftb8HviVp3xo+GHhf4j2Ok3Ol ab4usr24j0jUZILq4t4rbUr/AEqWG5eEeRKJWsmbAGNrYNfuOS5nSzzKsJmdOi4Uq0W+WVm1aTjr bTof0NkOb0uIcmwWbU6DhRrxb5ZWbSUpRs7aO9j8VP2y/wBhnxD8MtZ1f4j/AAn0W7134Y6hNcaj qOiaXbvdal4Amldpri3NlCHuLrwpHktBcIrGziBjuMKizS/h3G3AWJyuvWzPKKDqZVJuTjFXlRfV WWrp9mvhWktlJ/zz4geG+LyfEV82yPDyq5NNuUoRV5UG9WrLV0+0l8K0lolKXM/AP/goh8V/hDpd j4V8WWMHxR8I6fHDbadFrGoz6f4n0iyiBSOzsfEYgv8A7VZQIQEivLe4ZERY45I4wFHLw94kZvk1 KnhMZTWLwcdFzSanFdlOzul0Uk7aJNI4+GPFXO8io08FjqSxuAgkoqcnGpFLoqlpXS6KUZWSSTS0 PtOH/gq18JGgRrj4a/EWK5KZkhhk8MzwJJ/dS4fV7aSRM/xGJT7V9xHxcyflXNleJUvLka+/mX5H 6FHxsyNxTnlGLU+y9m19/MvyPG/iD/wVZ8SX1ncWXwx+GOneH7mRCkWveLtYk16WHfwZYNC0610q 1juIl5Rpbq4j3Y3RsAVbxMx8W8TUhKGVZVGnJ/bqS57ekIqKv2vJrumeBmnjZi6lOdPJ8mhSm9p1 Zc7XpCKir9ryku6ex3v/AATl8T/Fn4nfEf4sfFP4kXvifxFBqvhvStHsvE+rQTx6K13BrMtzNoug 7IYNItIbNCXa1s0SOEtkqpbn0fDTFZvmuZZxm2Z1KtWM6UYqck+W6k24w0UVb+WNku2p6fhPjM8z nNs8zrNqlarGdGMFUknyXU23CGiikt3GCSXbU8S/4Kp6Dra/GjwR4mbSdRHh24+F+kaHDrps7j+y ZNZsvFnja+u9KW/8v7KdQt7LUYJWi3bxHKrYwc14Xi1h66zvA4r2MvqzwkYqdny8yqVW432ulJO2 9mj53xqw2IXEGXYx0J/VHgowU7Pl51VrNx5tuZKUXbezTPvHwd+0H4G/Z2/ZQ/Zy8SePbXxFcaX4 g8IeEvD9s/h2wstRmtrz/hGJdTE15Dd6nprLamGwZMxea/mMvy7csPv8FxHgOG+EeGsTmEKjpVKN OC5EnZ8nNqnKOmnS7v06n6XgOKct4U4I4TxeZwqujVoUoL2cVJp+zcrtOUdLRtpd3tpbU47xP/wV B/Z/0nT5pfDmj+PvFeqeUTaWSaPY6JZPP821L7UdS1LzrSH5fmeK2uWG4YQ844sV4q8O0acnhqOI rVbaLlUVfzlKV0vNRl6HBjPGXhehSk8JQxVetbRcigr+cpSul5qMvQ/KDxz4w+Lv7bnxwtZbHQze 69qywaL4a8N6YJX0rwl4YtrqWVTe35iBSwsZL6S4vr+cKGkkYhUXy4l/Isfjc546z6Dp0ObETtGE I/DTgn1fZXblN9X0VkvxHMsfnviLxHB0sNzYqpaFOnH4aVNNvWVvhV3Kc31b0StFf0c/B/4cad8I vhj4K+G+ly/aLbwnodtp0t3t2fb9Rcvd6vqXl/8ALP8AtLVrmefb/D5mO1f0vk2WU8nyrA5ZSd40 aaV+73lL/t6Tb+Z/WWQ5TSyLJ8uyii7woU1G/wDNLeUv+3pNy+Z6RXpnrn5Pf8FX/wDkn3wm/wCx y1v/ANMiV+ReLv8AyLco/wCv8v8A0k/EPG7/AJFWR/8AYRP/ANIPw6r8HP5xCgAoA/r8s9J0zXvB NpoetWNtqej6x4Xt9L1TTryNZrS/06/0pLW8s7mJvlkgubeVkdT1Umv7KhRpYjAwoV6alRnSUZRe qacbNPya0P7wp0KOJy6nhsRTU6FSioyi9VKMo2aa7NOzP59v2sv2IvGfwN1XU/Ffgywv/FXwjubi a5tdQtI5b3VfB0Mh81dO8UQRq0ws7bJSLUQGgkVR5xilZUb+deL+BMbkNari8DTlWydttNaypr+W ot7LZT2f2rN2f8ucceHWYcN162Oy+lKvkUm2pK7lSW/LUW9lsqmz+1yyaT+DK/Pz8yP1h/5xTf8A c5f+9Zr9d/5tJ/3H/wDdg/b/APmyf/cx/wC7J+T1fkR+IH3j+yd+xH4z+Oerab4p8Z2Go+FPhJbT RXN1qd1FJZap4vhQ7/7O8LQzIJWtbnASXUCogiUnyjLKpRfv+EOBcdn1ali8bTlRydNNyekqi/lp p9H1nsul3ofpnA/h1mHElejjcwpToZGmm5NWlVX8tNPWz2c/hS2u1Y/Yz9rDSNL8P/slfFbQtEsL bS9H0f4frpml6bZRLBaWGn2Uthb2lpbQoAscMEEaqoHQCv2ri6jSw/B+b4ehTUKMMNyxitEkrJJL skfvnG9CjheB87w2HpKFCnheWMUrKMU4pJLskfzBV/Kx/G4UAFAH9R37HH/JsHwX/wCxNtv/AEsv K/q3gv8A5JXI/wDrwvzZ/Z3AP/JG8Pf9g6/Nn83vxp/5LH8Wf+ymePP/AFKdVr+Zc8/5HWb/APYV V/8ATkj+SeIf+R/nn/YZW/8ATkjzOvMPHCgD+hH9pn/lHE3/AGTP4D/+pJ8N6/ozin/k2j/7BcJ/ 6XRP6m4w/wCTTP8A7A8F/wCnMOfz3V/OZ/LIUAffn/BNb/k5/Sv+xN8X/wDpHBX6H4Yf8lVS/wCv FT8kfp/hF/yWVD/sHq/kjZ/4Kff8nI2P/ZM/C/8A6dvE1beKn/JT0/8AsFp/+lTOjxk/5K6n/wBg dP8A9KqH51V+bH5QFAH374B/Zb1v44fsj2njvwBZf2j8QPAnxC8Z2kuixGNLrxR4XuNN8M3ctjZP K6LJqmjXYkntYcgzrPMi7pWiRv0PL+FK+fcHQx+XU+bMcPiaq5es6bUHZf3ou7iut5JXdkfqGWcF 4niPgWnmWV0+fNMNiqqcOtSm403ZX+1B3cV1vJK8uVP4Nv7C+0q9u9N1Syu9N1GwuJbS+0+/tprO 9srqBzHPbXdrcJHPb3EMilXR1DKwwRmvz+pTqUpzpVYONWLs00001umnqmuzPzOrSqUak6NanKFW LacZJpprdNPVNdUzR0TxN4k8Mztc+G/EGt+H7lyhe40TVr/Sp2MZ3RlpbC4t5GMbcrk8HpWlDFYn CycsNialOXeMnF/g0a4fGYvByc8JiqlKfeEpRf3xaP1DuPEOv+J/+CYfibVfEuuax4h1R/iPZwPq Wuane6tftDD420EQwteX89xcNFEDhVLYUdK/VpYnEYrwrxNXFV51Kv1lLmlJydlVjbVts/ZZ4rFY zwcxlbF4mpVrfW0uacnKVlWhZXk27I/KCvyI/EQoA/ph/ao+Bd38fP2cYvDWhxxyeMPD9nofi7we kjxxLeavpelvb3GkNM+0INY0m9uII9zJGLloXchUJr+oeLMgnxDwzHC0EvrtOMKlPzlGNnG/96La XTms3oj+v+NeG58T8JRweGSePpRhVpdLyjGzjf8AvxcktUublb0R/NXqOnaho9/eaVq1jd6ZqenX M1lqGn39vLaXtleW0jRXFrd2s6RzW9xBKpV0dQysMEV/MNWlUo1J0a1NxqxbTTVmmt009U0fyJVp VaFWpQr05QrQk1KMk001o009U090ylUGYUAeyftAf8lc8W/9wH/1GdGr2+I/+RzjP+3P/SIn0HFH /I9x3/bn/puB43XiHz4UAf0u/wDBP3/k0X4Sf9z7/wCrN8Z1/UHh3/yR2T/9xf8A0/VP6+8Lv+SF yP8A7jf+pFU+q/FPhrSfGXhrxB4S1+3+16J4m0bUtB1a2BCtNp+rWc1jdojlW8uXyZzsbBKtgjkV 9bi8LRxuFxGDxEb0KsJQkvKSaf4M+2xuEoZhg8VgcVDmw9anKEl3jJNP52ej6H8lvxJ8C6t8MvH3 i/4f64p/tPwlr+o6JPL5bRpeR2lwy2mowI/zC11OzMdxCT1ilU96/kDM8BWyvMMZl1f+LRqOL87P SS8pKzXkz+Hc3y2vk+aY/K8T/GoVZQb72ekl5SVpLyaPpL9hX4rwfDD4/wDh601eRD4T+I8Mnw78 S29wsctm0evywrotzcwz/wCjmKDXordJXb7lrLN2Zgfp+Ac3jlXEOGhWf+x4lexmnt79uVtPTSdr vpFyPrfDbO45NxRhYV3/ALDi17Conqvfa5G09LKfKm+kXLufqj+x5+yfL8C/if8AHbxRqVnJHat4 gk8H/DSafLSS+Bbj7H4olv1mYMtyLlbvT7N5FIK3WnXKMM8D9Z4L4ReQZrn+Lqwah7T2dBv/AJ9O 1S9+t7wjf+aEkftXAXBD4bzniXG1abUPa+yw7f8Az5dqnNfre8IN/wA1OaZ+htfo5+qH5+ft8/sv 6v8AHfwbo/i3wLard/ELwBHfCDSQY45vFHhy9MU17pNvJIyIdUsLiAXFmrMFk3zRjLyJj878QuFK 2f4KjjMBC+ZYdO0etSD1cV/eTV49/eW7R+XeJ3BtfiXL6GOy2HNmuFUrR61Kbs3Ff3otc0V1vJbt H89WpaZqOjX93pWr6fe6VqlhPJa3+m6laz2N/ZXMR2y293Z3UcVxbTxsMMjqrA9RX841aVWhUnRr U5QqxdnGSaafZp6p+p/LFajVw9WpQr0pQrRdpRkmpJrdNOzT8mW9F8R+IfDdw154d13WdAu28vdd aLql9pVw3kuJYt09jPBIfKkG5eflbkc1dDE4nCyc8NiJ0594ycX96aLw+LxWEm6mExNSlPvCTi9N tU1sfqNceIdf8T/8Ew/E2q+Jdc1jxDqj/EezgfUtc1O91a/aGHxtoIhha8v57i4aKIHCqWwo6V+r yxOIxXhXiauKrzqVfrKXNKTk7KrG2rbZ+zTxWKxng5jK2LxNSrW+tpc05OUrKtCyvJt2R+UFfkR+ IhQB1vjrRNZ8P+Ldf03XtJ1LRdQXVL24Nlqtjc6fd/Z7m5lmtrj7PdxRSmC5hcPG+NroQVJBzXZm FCvh8ZiKeIoyhU527STTs3dOz6NbPqd2ZYfEYXHYqliaE6dXnbtJOLs22nZ2dmtU+qP0V/Zy1vWv Df7An7TOueHdX1TQdb03xxpFxp2saLf3el6pYT58Ap51lqFjLBd2suxyNyOpwSM81+k8M16+G8Pe Ka+GrTp1414tSi3GSf7rVNWa+R+r8J4nEYTww4wxOErzpYiGJi4yhJxlF/udVJNNP0Z8CeJfjF8W /Gdg2k+L/ij8RPFOlPs36Z4h8aeI9Z05zHs2M9jqOpXFqzgxqSxTJYZJzzX55is6zjHU/Y43NcTV pfyzqzlH7nJo/McZn+e5hSdDH5zi61D+WpVqTj90pNfgedxxyTSRwwxvLLK6xxRRqzySSOwVI40U Fnd2IAABJJrzUnJqMVds8lJyajFXk9kfvB/wTv8A2VvEHwsstV+L3xG0ybRvF3inS/7F8NeHL6Ly 9R0LwzPPa315qGqwSfPY6trVxawqkDKs1tbREPhp3jj/AKA8N+EsTlMK2c5lScMZVhywg94QbTbk ukpNLTeKWusml/S/hVwVislp189zai6eOrQ5KdNr3oU203KS6Sm0vd0cYrXWTS/UOv1U/ZQoAKAC gDhLz4Z+Bbnwp408FW3hrStE8PfEG11628W2fh2yttC/taTxLo66DrOoTvpkNuTqt5paJG1yczHy 1JYlRXnzyvASwmOwMcLCnhsSpqooJQ5uePJJvlt7zjZc2+iPMqZPls8DmGXQwcKeFxUZqqqaUOb2 keScnype842XNvoux8N33/BLr9nO7mEtvrfxV0tN8jfZ7HxL4dkhKu4ZYy2p+DtRuNkQ+Vf3m7H3 iTzXwdTwp4anK8a+LguynC3/AJNTk/xPzip4M8J1Jc0cTjYLsqlO3/k1KT09TvPCf/BO39l7wvdR 3lz4T1nxdPCweEeLPEuo3Vqjh2YNJp+kNoun3a7TtKTxSxkAZXPNehg/DbhTCTU5YOdaS29pOTX3 R5U/RpryPTwPhTwZg5qpPA1K8lt7WpJr/wABjyRfo015H2ZoWgaF4X0q00Lw1ouleHtF0+PyrHSN E0+00vTLOLJPl2tjYxQW0CknJCqMnmvtsPh8PhKMMPhaEKdCK0jFKMV6JWSP0DDYXDYKhTw2Dw8K WHirRjCKjFLySSSNetjcKAPPviF8Kfhx8V9LTR/iL4M0HxdYw+YbUatZJJd2DSrsll0zUojFqWlz SLwXt5onI7152Y5Rlmb0lRzLBU61Nbcy1X+GXxRfmmjy81yTKc7orD5tl9KvTW3MtY36xkrSi/OL TPDvhZ+xd8FPgz8RIfiT8P7fxPpOqwafqWmxaVca+dU0NbXVI/KuB5epWlzqzOigbCbw4I5zznwc p4IyPJMyWZ5dGrCsoyjyufNG0t/iTl6e8fN5L4fcPcP5rHN8rjWp11GUeVz5oWlv8ScvT3in4/8A 2H/gT8UfifrvxW8eWPifX9a8RSaQ+oaQ3iGXTfD2NG0LSvD9pFBBo9vp2rRxvZ6RG0mbxmaV3IIU qqxmPAmQZrmuIzfMKdWpXqON48/LD3YRgrKKUtoq/vbt+ijNPDnhrOc5xOd5nTrVcRVceaPO4w9y EYKygoy2ir+/u30sl9E+Bfhx4D+GWkf2D8P/AAloXhLSiyyTWuiafBZm7mUFVuNQuEU3Wo3QU482 d5JNvG7FfSYDLMvyuj9Xy7B06NHtFJXfdveT822z6rLcpyzJ6H1bK8DSoUOqhFK77ye8n5ybfmdr XceieAePf2W/gH8T/E154x8efDnTfEXiXUIbOC81W51PxBbSzxWFrFZWiNDYavaWyiC2hVBhASBz k8189mHCnD2a4qeNzDLI1MVJJOTlNXsrLaSWiXY+XzPgzhjOcZUx+Z5TCrjJJJycpptRVlpGSWiV tjjv+GGv2Uv+iO6N/wCDrxZ/80FcP+ofCP8A0JYf+BVP/kzg/wCIb8E/9CCn/wCB1f8A5M0NI/Yw /Zj0HVtM1zSfhPpFlqujajZarpl4mseKHe01DTrmK8srlEm12SJ2guYVYBlZSRyCOK1o8EcLYetS r0cohGtCSlF809GndP4+jRrQ8PuDsNXo4mhkdONenNSi+appKLunrO2jV9T6gr6o+yMTxD4a8O+L tJutB8VaFo/iTRL1Qt3pGu6bZ6rptyFOV86yvoZ7eRkPKkrlTyMGsMThcNjKM8Pi8PCrQlvGcVKL 9U7o58VhMJjqE8NjcNTrYeW8ZxUov1TTR8beKP8AgnX+y54jmluLXwlrfhOaZt8h8L+KNVhh371Y mKz1mTWrG3Vgu3bFEiAE4AOCPisV4bcKYmTlDB1KMn/JUkl90uZL5Kx+f4zwo4MxcpThgalCT/59 1JJfJT50vRJI8+j/AOCWv7OyXRuG8SfFuWIvI32GTxH4VFqFcMFjDxeB473ZDuG3MxY7RuLc585e FHDanzPE4xrtz07f+mr6evqeWvBjhRT5ni8c49vaU7fhRvp6+tz631T9nr4YeIPhL4b+CfiTStQ1 /wAAeF7bQbWxsLzWNQsr64j8ORiPTmvdT0ObSbt3Cj5zGYgxPQV9hV4cyrEZPhsixNKVTLqSgknJ pvk+G8o8r9bWPuq3CuTYrI8Jw7i6EquV0YwSi5yTfs/hvKDi/W1rlbwb+zD+z54BeKbwv8IvBNnd wHMGoX2kRa9qsDZzuh1bxA2qalE2e6yg4qcFwrw5l7UsJk1CM1s3Hnkv+3p80vxIy/g3hbK3GWCy LDRmtpSipyXpKfNL8T3YAAAAAAAAADAAHAAA4AAr3z6XYWgDxv4nfs+fBn4xqW+I3w90DxDfeWsS a15M2meIo4kXbHEniHR5rDWhBEB8sRnMXH3a8XNeHMkzrXMsup1Klvityz/8Di1K3le3keBnHC3D +f65tlVKrUtbns41PT2kHGdvLmt5HyVqv/BL79nDUZzLZ6p8UNBjLFha6V4n0SaBQVVQgbXPCus3 O1SpIzIWyx5xgD4+t4VcM1JXhVxdNdozi1/5NTk/xPhq/g1wlVlzU62MpLtGpBr/AMnpzf4naeFP +Cdf7L3hi6jvLrwrrni6aGRZYV8V+JdQubVHRiw8yw0c6LY3kZzgpcRyxsByprtwnhtwphZqc8JU rST09pNtfdHlT9Gmj0MF4UcG4OaqTwVSvJO69pUk1/4DHkT9JJo+yfDnhjw34Q0qDQvCmgaN4a0W 1z9n0nQdMs9J06ElVVmjs7CGC3V3CDc23LY5Jr7XDYXDYKjHD4TDwpUFtGEVFL5JJH3+EweEwFCO GwOFp0cPHaMIqMV8opI+e9X/AGMP2Y9e1bU9c1b4T6Re6rrOo3uq6nePrHihHu9Q1G5lvL25dIdd jiRp7mZmIVVUE8ADivna3BHC2IrVa9bKISrTk5SfNPVt3b+Pq2fLV/D7g7E162Jr5HTlXqTcpPmq ayk7t6Ttq3fQz/8Ahhr9lL/ojujf+DrxZ/8ANBWX+ofCP/Qlh/4FU/8AkzL/AIhvwT/0IKf/AIHV /wDkzt/h9+zF8CPhX4ji8W/D/wCHmneG/EUNpdWMWp22pa/dSpaXqKl1CItQ1a8tisyKASUyOxFd +XcLZBlOJWMy7LY0sSk1zKU3o91rJr8D0cr4O4ayXFrHZXlUKOLUWuZSm3Z7q0pNa+h7zX0B9McV 46+HHgP4m6R/YPxA8JaF4t0oM0kNrrenwXhtJmAVrjT7h1F1p10VGPNgeOTbxuxXDj8sy/NKP1fM cHTrUe0knZ9094vzTTPOzLKcszih9WzTA0q9DopxTs+8XvF+cWn5nzt4A/Yf+BPwu+J+hfFbwHY+ J9A1rw7Jq76fpC+IZdS8PY1nQtV8P3cU8GsW+o6tJGlnq8jR4vFZZUQklQyt83l3AmQZVmuHzfL6 dWnXpuVo8/ND3oSg7qSctpO3vbpej+Vyvw54aybOcNneWU61LEUnLljzuUPfhKDupqUtpO3v7pdL p2/il+xd8FfjN8RZviV8QIPFGrarPp+maZLpFvr/APZehG20uMxQYj02ztdXEkisd5F5yT8u2rzb gjI87zJ5nmMas6zjGPKp8sLR2+FKXr7xedeHvD3EGbSzfNI1qlZwjHlU+WFo7fClLXr7/pY9x+Hf wn+G/wAJtKbRfhz4N0PwlYS7Ddf2XaAXt+0Q2xy6pqlw0+qarNGvAe5mlcDjNe9luUZZk9F0MswV OjTe/KtX/ik7yk/OTbPo8qyTKcjoPD5Tl9OhSe/KtZW6yk7yk/OTbPQq9E9U8y+Jvwb+GfxksdM0 z4l+FLTxXY6NdzX2mW93d6naLaXdxCLeaZG0y+sZHZ4RtwxYe2a8vNMlyvOqdKlmmEVanBtxTclZ tWv7rXQ8fOMgyfP6dGjnGCjXp05NxTclZtWb91rp3PHP+GGv2Uv+iO6N/wCDrxZ/80FeJ/qHwj/0 JYf+BVP/AJM8D/iG/BP/AEIKf/gdX/5MP+GGv2Uv+iO6N/4OvFn/AM0FH+ofCP8A0JYf+BVP/kw/ 4hvwT/0IKf8A4HV/+TPpTw14b0Twf4f0fwt4bsI9L0Dw/p1rpWj6bFJPLHY6fZRLDa2yS3Ms9xIs USgAu7Me5NfUYXDUMFh6OEwtNQw9OKjGOuiWiWt3959dg8Jh8BhcPgsJSUMLSgoxiru0UrJatvTz ZzPxK+FPw++MGhWnhr4keGrbxTodjq0Gu2mn3V1qNpHDq1tZ39hBeLJpl5ZTs8dnqc6BS5QiQkjI BHLmeUZdnOHhhczwqq0IzU0m2rSSaT91p7Sa+Zx5vkmV59hoYPN8Iq2GjNTUW5K0kpRT91p7Sa3t qeI/8MNfspf9Ed0b/wAHXiz/AOaCvB/1D4R/6EsP/Aqn/wAmfO/8Q34J/wChBT/8Dq//ACYf8MNf spf9Ed0b/wAHXiz/AOaCj/UPhH/oSw/8Cqf/ACYf8Q34J/6EFP8A8Dq//Jn0T4N8G+Gfh94Z0rwd 4O0qHQ/DWhwzQaVpUE11PFZxT3U97MiTXs9zcuHubl3+d2OW9MCvpcFgsLl2Fo4LBUVTwtNWjFXd rtvq292+p9Xl+X4PK8HQwGAoKng6aajFNtJNtvVtvdt6s6euo7D5e+I/7Gf7OHxQup9S8QfDbS9O 1m4ZpJtZ8KTXXhW9mldt0k93Fos1rpuoXMpPzSXNvNIfXNfKZnwTwzms5VcRlkI13vKm3Tb83ytR b85Js+Mzbw/4Szmcq2KyiEMQ950m6bb7tQajJvvKLZ8/H/glx+zqbsXA8QfFhYRjNgPEnhn7I2E2 8u3gtr7lvm4mHPtxXzv/ABCjhrn5vrGM5e3PC3/pq/4ny78GOFOfn+tY7l/l9pTt/wCmr/ieteCf 2B/2XvBM0F4vw9Hiu+g2bLrxtql/4hhcoBkz6LLLB4cuPMIywezYdhgcV7GB8PeFMDKM1l3tqi61 ZOa+cdIP5xPcy7wx4Ny6Uaiyr29Vda0pTXzg2qb+cD6/srKz020trDTrS2sLGzhjtrSysoIrW0tb eJQkUFtbQJHDBDEgAVVUKoGAK+yhCFKEadOCjTirJJWSXZJaJH3lOnTpQhSpQUacVZJJJJLZJLRJ diprWh6L4k0u80TxFpGma7o2oReTf6TrFja6lpt7DkN5d1ZXkU1tOgZQcMpAIB61NehQxVKdDE0Y 1KElZxklKL9U7pkYjDYfF0amGxVCFXDzVpRmlKLXmndM8P8Aip+zF8Kfi54A8M/DPXtP1PR/CXg6 7tbvw3Y+F9QXS20s2dlcadb28DXFtfxNaR2V08YjZGCgjGCAR4ObcK5RnGXYXK8RTlDB0GnBU3y8 tk0krp6WbVrHzmdcHZJnuV4PJ8TSnTwOHknTVOXLy2TikrqStZtWaPm3R/8AgmD+zdpk6TXt/wDE zxDGsiubXWPE+kQQSKOsLtoHhnQ7oRt3KyK/owr5ij4V8M0pKU6mKqK+0pxS/wDJIRf4nyOH8G+E qMlKpVxlVX2nUil6e5Tg/wAbn2d8N/g/8MvhDpkmkfDbwXonhO0uPL+1yafA8mo6gYgREdT1i9ku tX1RogTtNxPKVycYya+3yzJsryak6OWYGnRg97LV/wCKTvKXzbP0DKMhyfIqLoZRl9OhB78q96Vt uabvKVunM2ekV6Z64UAeZfE34N/DP4yWOmaZ8S/Clp4rsdGu5r7TLe7u9TtFtLu4hFvNMjaZfWMj s8I24YsPbNeXmmS5XnVOlSzTCKtTg24puSs2rX91roePnGQZPn9OjRzjBRr06cm4puSs2rN+6107 njn/AAw1+yl/0R3Rv/B14s/+aCvE/wBQ+Ef+hLD/AMCqf/Jngf8AEN+Cf+hBT/8AA6v/AMmH/DDX 7KX/AER3Rv8AwdeLP/mgo/1D4R/6EsP/AAKp/wDJh/xDfgn/AKEFP/wOr/8AJh/ww1+yl/0R3Rv/ AAdeLP8A5oKP9Q+Ef+hLD/wKp/8AJh/xDfgn/oQU/wDwOr/8mfVdvBFawQ20CCOC3ijghjBJEcUK LHGgLEsQqKBySa+ujFQjGEVaKVl8j7WMYwjGEVaKVl6Ieyq6sjqro6lWVgGVlYYZWU5BUg4INNpN NNaFNJpprQ+UPiL+xF+zV8Sri41DVPh3Z6BrFyzSS6v4LurrwtO0kh3Syy6fpzroNzPK/wAzSTWc khbJ3ctn5DMuBOGM0lKpVy2NOs/tUm6b+6PuN+bi2fD5t4dcI5vOdWtlUaWIlvKk3Tfm+WPuNvu4 NmgP2SPhgPgP/wAM7HUPGB8Bf2udY+0HVdM/4SLzj4iPiUW/9ojQxafZVvjsH+jeZ5PBfd89af6n ZV/q/wD6t+0rf2fz81+aPPfn57X5bWvp8N7db6mv+o2Tf6s/6qe1xH9me05780faX9p7S3NyWtfT 4b2631M/4dfsRfs1fDW4t9Q0v4d2ev6xbMskWr+NLq68UzrJGd0UsWn6i7aDbTxP8yyQ2ccgbB3c LjPLeBOGMrlGpSy2NSsvtVW6j+6XuJ+aimZZT4dcI5ROFWjlUauIjtKq3Ufk+WXuJruoJn1eqqiq iKqIihVVQFVVUYVVUYAUAYAFfXpJJJLQ+4SSSSWhgeLPCnh/xz4c1fwl4r02LWPDuvWjWOraZNLc QxXtozo7QvLaTW9yil0ByjqeOtc2LwmGx+GrYPF0lPDVFaUXdXXbRp/icuOwWFzLCV8DjaKqYSrG 0ottJrtdNP7mfOH/AAw1+yl/0R3Rv/B14s/+aCvmf9Q+Ef8AoSw/8Cqf/JnyX/EN+Cf+hBT/APA6 v/yYf8MNfspf9Ed0b/wdeLP/AJoKP9Q+Ef8AoSw/8Cqf/Jh/xDfgn/oQU/8AwOr/APJh/wAMNfsp f9Ed0b/wdeLP/mgo/wBQ+Ef+hLD/AMCqf/Jh/wAQ34J/6EFP/wADq/8AyZ9H+E/Cnh/wN4c0jwl4 U02LR/Dug2i2Ok6ZDLcTRWVoru6wpLdzXFy6h3Jy7seetfTYTCYbAYajg8JSUMNTVoxV3ZdtW3+J 9bgcFhctwlDA4KiqeEpRtGKbaS7Xbb+9ngGr/sYfsx69q2p65q3wn0i91XWdRvdV1O8fWPFCPd6h qNzLeXty6Q67HEjT3MzMQqqoJ4AHFfPVuCOFsRWq162UQlWnJyk+aerbu38fVs+Xr+H3B2Jr1sTX yOnKvUm5SfNU1lJ3b0nbVu+hn/8ADDX7KX/RHdG/8HXiz/5oKy/1D4R/6EsP/Aqn/wAmZf8AEN+C f+hBT/8AA6v/AMmH/DDX7KX/AER3Rv8AwdeLP/mgo/1D4R/6EsP/AAKp/wDJh/xDfgn/AKEFP/wO r/8AJnufiL4YeBPFngH/AIVd4h8O22p+Ajp2i6V/wjktzfxW39n+HbjT7rRbb7TbXcOobbC40q3Z T525jGNxYE59/E5Vl+My/wDsrE4ZSy/ljHku7Wg04q6aejiuvTU+kxeTZZjss/sbFYRTyzkhH2d5 JctNxcFdNS91xj16anhn/DDX7KX/AER3Rv8AwdeLP/mgrwP9Q+Ef+hLD/wACqf8AyZ83/wAQ34J/ 6EFP/wADq/8AyYf8MNfspf8ARHdG/wDB14s/+aCj/UPhH/oSw/8AAqn/AMmH/EN+Cf8AoQU//A6v /wAmdv8AD79mL4EfCvxHF4t+H/w807w34ihtLqxi1O21LX7qVLS9RUuoRFqGrXlsVmRQCSmR2Irv y7hbIMpxKxmXZbGliUmuZSm9HutZNfgejlfB3DWS4tY7K8qhRxai1zKU27PdWlJrX0JfiN+zT8Dv i14gTxT8RPh/p/ibX49OttKTUrrUddtZF0+0luJre28rTdVsrfbFLdyEHZuO7kninmXC+Q5xiFi8 yy6NXEcqjzNzWiu0vdkl1ZWbcIcOZ5iljc1yuFbFKCjzOU17qbaXuyS0u+hwf/DDX7KX/RHdG/8A B14s/wDmgrz/APUPhH/oSw/8Cqf/ACZ5n/EN+Cf+hBT/APA6v/yYf8MNfspf9Ed0b/wdeLP/AJoK P9Q+Ef8AoSw/8Cqf/Jh/xDfgn/oQU/8AwOr/APJnufw5+GHgT4S+H38LfDvw7beGdAk1G51V9Ntb m/uo21C7it4bm5Muo3d7cbpYrSMEb9o28Ac17+W5Vl+T4d4TLcMqWHcnLlTb1dk37zb6I+kynJss yPCvBZVhFRwrm5cqcn7zsm/ebetl1MD4j/AX4OfFvL/ET4d+GvE135YhGrXFmbLXkhVAiwxeIdLk sdciiVQMKtwFGBgcCufM+H8lzjXMstpVZ/zNWn/4HG0vxOXNuGcgz3XNcqo1qlrczVp27c8bTS8u Y+XdW/4Jp/sw6jKZLPTvGugoW3eRpPi64miAxjYDrtprU+3PPLls98cV8pW8MOFajvClXprtGo3/ AOlKT/E+Mr+EPB1WV6dHEUl2jVbX/k6m/wAT1y1/ZE+FFp8ELn9n9ZfFcvgK81yPxBcNLrFr/bj3 keqWmr+UNRi0uKJLV7mzQFRCH2EgMDgj2IcHZRDIpcO3rPL3U537y5r8yl8XLtddtup7sOBMkhw5 PhdSrvLJVOd3mue/MpW5lFaXS6Xt1OB0j/gnZ+ynpjI9z4G1bXGRiw/tfxn4qCltysu+PStV0uKR U242spVgTuDV59Hw24SpNOWAnU/xVKn/ALbKP9bnmUPCngmi055bOo1/NVqf+2yj/W57R4Z/Zf8A 2ePCDRS6F8Gvh/DcQMGgvNQ8O2OuX8DhAgeHUNdj1K9hfavJWQE5OeSc+3heFeG8G08PkmGUls3B Sa9HPmf4n0OD4N4VwDi8Nw/hVNbOVNTkvSU+Zr7z3ZVVFVEVURFCqqgKqqowqqowAoAwAK+gSSSS Wh9KkkkktDwH4ufsu/A743Sm/wDH3gawu9e8tIl8UaTLcaF4j2RhEiW51PS5bZ9TjhjTZHHeLcRx qTtUHmvnc44UyHPX7TMMBF4i3xxvCfzlG3NbopXS6I+Xz3gzhziKXtMzy2MsTb+JFuFTyvKNua3R T5kuiPl4/wDBLj9nT7WLn+3/AIriEDBsB4k8NfZD+7KZLnwYb/O47+Jx8w/u8V8r/wAQp4a5+b6x jOXtzwt/6av+J8Z/xBnhPn5/rWO5f5faU7f+mubz3/A9q+Hv7Df7NHw5urfUtP8Ah5beItXtXSSH U/Gt7d+J2SSNleKVNLvpP+EfinikUMsiWayK3RumPby7gPhfLJxq08tVSstpVW5/PlfuX81G59Fl XhvwhlM4VqWVKrXjtKs3U+fLL3L+ahc6bxT+yH+zj418Q6r4q8UfC7SdV1/W7o3mqajJqniO3e6u SiR+YYLPWbe1i+SNRhEVQB0rrxfBvDOOxNbF4vKYTxFR3k+aau/RSS+5HZjeBOEsxxVfG4zJoTxV SV5S5qiu/RTS+5GB/wAMNfspf9Ed0b/wdeLP/mgrm/1D4R/6EsP/AAKp/wDJnL/xDfgn/oQU/wDw Or/8mH/DDX7KX/RHdG/8HXiz/wCaCj/UPhH/AKEsP/Aqn/yYf8Q34J/6EFP/AMDq/wDyZ9CeBvA3 hT4beFtL8FeCNHh0Dwvov23+zNIt5ru4htP7R1G71a92TX1xdXT+fqN/NKd8jYLkDAAA+jwGAwmW YSlgcBRVPCQvyxTbS5m5PVtvVtvfqfU5bluByjBUcuy7Dqlg6d+WKbaXNJyerbespN6vqdZXYdx4 B49/Za+AXxP8TXnjHx38N9K8QeJtQhs4L7Vpr/XbOe6jsLWKysxNHpuq2du7QWkCRhtm7YgBJwK+ ezDhTh7NcVPG4/LIVMVJJOTc03ZWV+WSWiSWx8vmfBfDGc4ypj8yyiFXGTSTk5TTfKklflkloklt sjkE/Yd/ZVidJI/hBpEckbK8cia54uR0dCGV0ZfEAZWVhkEcg1xLgThJNNZNBNf3qn/yZwLw44KT TWQ001/fq/8AyZ9WKoRVUbiFUKCzM7EAYG53LO7cckkk96+uSskj7dKySHUAFAHlPxF+Bnwh+LSj /hYvw98M+KLlIvIj1O8sFg1yCDBHkW+v2DWmt20POdkdwq5AOMgV5GZZDk2cf8jLLaVWVrczVpJd lNWkl6M8TNuG8hzxf8K2VUa07W5nG00uynG00vJSPljV/wDgmr+zDqUrSWel+M/D6NJvFvpHi66m iRcEeUra9ba3OY8nOWcvkfexxXydbww4VqtuFKvTV9o1G/l76k/xPi6/hDwbWk3To4ikr7Rqtr09 9Tf438z1q2/ZE+FFr8D7r9n5ZvFb+Ar3XI9fuHk1i0/t1r2PVLTVhGNRTS44VtmubNAVEO7YSAwP I9iPBuURyGfDqlW/s+VTnfvLnvzKW/La1122PchwJkkOHJ8LqVd5ZKpzv31z35lL4uW1rpdNupwO k/8ABOv9lPTWDXXgfWNcKsWX+1vGfipVByhXKaRquko6ptOAwIO47s8Y86j4bcJUneWAnU/xVan/ ALbKJ5dDwo4Jou88tqVP8VWp/wC2yie0+Gf2Xv2d/CDxTaF8G/h/Dc253QXl/wCHrLXL+BtqJvhv 9dTUryKTan3lcNyefmbPuYXhThvBtSw+SYdSWzcFJr0cuZ/ifQ4Pg3hXAOMsNkGFU1s5QU5L0lPm a+/82eg+NPhp8PviLpqaT478F+GfFmnwo0dtBruj2OoGxDhVZtOnnha406XCjDwPG4xwa9HHZXl2 ZUlRzDA0q1NbKcU7ejavH1Vj1cwyjK82oqhmeX0a9JbKcFK3+FtXi/NNM8oi/ZS+C+nfDHx18IvD mg6j4W8FfES/g1PxDZ6PrmpXF19ugk0uRZtOu9fn1trFWOkQgxqDEFyFVc8eQuEcjp5XmGT4bDyp YHEyUpqMpN3XLs5uVvhWm3ZHhx4J4epZPmWRYTCzo5di5KU1Gcm7rl1i5udvhWm3ZI+cNP8A+CXf 7OVnMZLjWfipqyF0YW+oeJvD8cKqhYtGG0vwhps+yUMA2XLYUYI5z81T8KeGoO8q+LmuznD/ANtp xf4nydLwa4TpyvPEY2avtKpC3/ktKL19T6e+F37LnwH+DtzHqPgT4daPYa3ED5fiHU2u/EGvwsQV d7TVdduNQudNMinDC1MCMOMV9TlXCnD+SyVTL8thGuvtyvOfylNtx/7dsfY5NwZwzkE1VyzKaccQ vtyvOa9JTcnH/t2yPf6+iPqAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/9kNCmVuZHN0 cmVhbQ1lbmRvYmoNMzcgMCBvYmoNPDwvQkJveFswLjAgMC4wIDkwMi4wIDQ3Ni4wXS9Hcm91cCA1 MiAwIFIvTGFzdE1vZGlmaWVkKEQ6MjAxNDExMjExNDExMjkrMDEnMDAnKS9MZW5ndGggMzEvTWF0 cml4WzEuMCAwLjAgMC4wIDEuMCAwLjAgMC4wXS9PQyA1MyAwIFIvUGllY2VJbmZvPDwvQURCRV9D b21wb3VuZFR5cGU8PC9Eb2NTZXR0aW5ncyAzNCAwIFIvTGFzdE1vZGlmaWVkKEQ6MjAxNDExMjEx NDExMjkrMDEnMDAnKS9Qcml2YXRlL0JhY2tncm91bmQ+Pj4+L1Jlc291cmNlczw8L1Byb2NTZXRb L1BERi9JbWFnZUNdL1hPYmplY3Q8PC9JbTAgMzYgMCBSPj4+Pi9TdWJ0eXBlL0Zvcm0vVHlwZS9Y T2JqZWN0Pj5zdHJlYW0NCnEKOTAyIDAgMCA0NzYgMCAwIGNtCi9JbTAgRG8KUQoNCmVuZHN0cmVh bQ1lbmRvYmoNMSAwIG9iag08PC9Db250ZW50cyAyIDAgUi9Dcm9wQm94WzAgMCA1OTUgODQyXS9N ZWRpYUJveFswIDAgNTk1IDg0Ml0vUGFyZW50IDE1IDAgUi9SZXNvdXJjZXM8PC9FeHRHU3RhdGU8 PC9HUzAgNDEgMCBSPj4vRm9udDw8L1QxXzAgMTQgMCBSL1QxXzEgMTMgMCBSL1QxXzIgMTIgMCBS L1QxXzMgMTEgMCBSPj4vUHJvY1NldFsvUERGL1RleHRdL1hPYmplY3Q8PC9GbTAgMjggMCBSPj4+ Pi9Sb3RhdGUgMC9UeXBlL1BhZ2U+Pg1lbmRvYmoNMiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNv ZGUvTGVuZ3RoIDE0MzU4Pj5zdHJlYW0NCkiJvFfbchu5EX3XV/CRkzJpzoDDi9/stZNyytl1YuUp Tm1RQ5GSS0vSGlFl6euDbvQNGAwp70PKJXoGAzSAvpxz+t3lxevL8vfJYDaeLgaXm4vJeLlcTgcT /68cLOrxZDFYuBoG54PLPy6Gg+LyGy7xX8eTKSwpq+V46haDUTUZz/zI+uI/w7eFq4e7YlTOhteF G/7wf3v/5pePZsM1PMEwvq38A47c8HDr/27h01c3c0U5RUM8uVwM7+AJXxu0yzMe/Rusxxc0gN8G xTLZEh7+KBbDA4zeF7rrCmf89/LvdMXpuJ7BFUdyx3IxLqtwx8/e7n3YpcaTsBV4b4tqCZuVFf0e Cleh/ftwD/l8h79m4MovBxM7WHGLQ5uinNNjQ8dsYEEYQjfR/GBi7V+vT2wRDJwxsilGS38Q/35f VBPvsJFzwcgDfLktyhpdHpwGK3DLnbcygG9wjxW55FrmRDcva1rtH+7IhBs+6ZRwkWiGMdB/wiak UPZeDYUIh+gqMI7vRzw07sBpMJE0mAxGPvz+8f3FsIRCyFTLfDkfVy5USzWuq4rXQMqMOSGW5fBD Ab5y9OZ9UcJVhm14X8MZvrq6lnjRB59YMzxwPdz60SNHsGbvO7gTB4MWrcw+I3E6vG/Asbew+T3k mHdhOTGfg+WdbtLo9uime/AfbhWWmiukV3qArXD+VzctdQnu3j3zgVILV9CJZtPOBWCDK0pKTUGf 2uGQGH5nHL3GbAwplPHHFSaH4yuX4CGwi48NFR574GeNH2KPtbmIhZlvfXI0fVf4KwKESyP2EEIJ Sx7VX1+HsF9zlK3bPaZWAc+vTD4e8OZwLHOaewaeeEc3Y0fHjldL91SawwY/iGOifHEzmx+YT8Fl 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 cg0UXPKBxrj6Ak0DCDAATv4Vhw0KZW5kc3RyZWFtDWVuZG9iag0zIDAgb2JqDTw8L0ZpbHRlci9G bGF0ZURlY29kZS9GaXJzdCAxMS9MZW5ndGggMTY1L04gMi9UeXBlL09ialN0bT4+c3RyZWFtDQpo 3mSOTQrDIBSEr+INXoz5hRAoNDfornRh9ZkIRluji96+SbCBtjCLb2YxMy3JCF1VUdJ1cNZKoUcr cLnSvIEhekdomQFayZeJ0DoD56XCWVttkdCm2vzMFxHNHrQMTlzEgCTPS+AJGQP8YA06YUHBBm3k hgxcSte1uOMNLq8HwmCFk9qOff97sKjhGV1AeTcGVTiM1+MUvkaP+r/OtwADAFDLU68NCmVuZHN0 cmVhbQ1lbmRvYmoNNCAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgMjUvTGVuZ3Ro IDExOS9OIDQvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN4yNFQwUDA0UjAzUTA0VjAEYSDLwlDBxkbf KbE41S0/r0Q/JDM3tVjXKT8nRd81Lzk/JTMvXcHQAKgxSD+4NKmksiBVPwRIGIJJfZAWOztM/UH5 uYl5xGnwSM0pSy3JTE5Es9TEknhL4WYgtBPQDRBgALRDVxsNCmVuZHN0cmVhbQ1lbmRvYmoNNSAw IG9iag08PC9MZW5ndGggMzg4NC9TdWJ0eXBlL1hNTC9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/ eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4Onht cG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDQu Mi4xLWMwNDEgNTIuMzQyOTk2LCAyMDA4LzA1LzA3LTIwOjQ4OjAwICAgICAgICAiPgogICA8cmRm OlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1u cyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxu czpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iPgogICAgICAgICA8cGRmOlByb2R1 Y2VyPkdQTCBHaG9zdHNjcmlwdCA5LjA1PC9wZGY6UHJvZHVjZXI+CiAgICAgICAgIDxwZGY6S2V5 d29yZHMvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiBy ZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh cC8xLjAvIj4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMTEtMjFUMTQ6MTI6NDIrMDE6 MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxNC0wMi0xMFQx MzoyMDoyMCswMTowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+ UERGQ3JlYXRvciBWZXJzaW9uIDEuMy4yPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6 TWV0YWRhdGFEYXRlPjIwMTQtMTEtMjFUMTQ6MTI6NDIrMDE6MDA8L3htcDpNZXRhZGF0YURhdGU+ CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91 dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4w L21tLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnV1aWQ6NDUxNmZjNWMtOTRhOS0xMWUz LTAwMDAtZjYzY2M4NGUyNmRmPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5z dGFuY2VJRD51dWlkOjkxOTViOGY4LTYwOGItNGUwYS04ZjYyLTI3NTIyNmJmNGY2MzwveG1wTU06 SW5zdGFuY2VJRD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRp b24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMv ZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpm b3JtYXQ+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAg ICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Q29udHJhdG9DTElFTlRFUyBOVUVW TzAxMDIxNCBBTkRSRVMgTkFWQVJSTzwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpBbHQ+CiAg ICAgICAgIDwvZGM6dGl0bGU+CiAgICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgICA8cmRm OlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT51c3VhcmlvPC9yZGY6bGk+CiAgICAgICAgICAg IDwvcmRmOlNlcT4KICAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgICA8ZGM6ZGVzY3JpcHRp b24+CiAgICAgICAgICAgIDxyZGY6QWx0PgogICAgICAgICAgICAgICA8cmRmOmxpIHhtbDpsYW5n PSJ4LWRlZmF1bHQiLz4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1yZXBhaXIi Lz4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOmRlc2NyaXB0aW9uPgogICAg ICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAg 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 ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5k PSJ3Ij8+DQplbmRzdHJlYW0NZW5kb2JqDTYgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0Zp cnN0IDUvTGVuZ3RoIDU0L04gMS9UeXBlL09ialN0bT4+c3RyZWFtDQpo3jI0VTBQsLHRd84vzStR MNL3zkwpjja0BAoGKRiCyFj9kMqCVP2AxPTUYjs7gAADACUIDPYNCmVuZHN0cmVhbQ1lbmRvYmoN NyAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNS9MZW5ndGggMTkzL04gMS9UeXBl L09ialN0bT4+c3RyZWFtDQpo3kyO0QrCMAxFf6VvtghrUqegiDC2KaLOMXXvcys4EStpi/j3VhDx 5RJCzsnFCQM2n8vEu4sh7q1vqDdCpqQb15t71jjNs5kCjEEh4EiBgiHgAGDwvQpYmS2/I6s12cAx jEaREnKjX09DneVC7kz3Z0NUGFLF6mcryXS+1cRX5ZatLsY621L/cGwawVjIgz9fdeuC6di7m+ap uTsKP9PtOi+O+YEVp7zeA4aeMUuKrPqskjqpqr1YLN4CDABztkSJDQplbmRzdHJlYW0NZW5kb2Jq DTggMCBvYmoNPDwvRGVjb2RlUGFybXM8PC9Db2x1bW5zIDUvUHJlZGljdG9yIDEyPj4vRmlsdGVy L0ZsYXRlRGVjb2RlL0lEWzw0RjVCNzQ1RDE4QTNFRUVDNTQzN0ZDOTJCMkY0MTNBQj48NjREQkFB QTAzRjdDODE0NEE2NjFDRTMyODFDOUM3NjI+XS9JbmZvIDE2IDAgUi9MZW5ndGggNjUvUm9vdCAx OCAwIFIvU2l6ZSAxNy9UeXBlL1hSZWYvV1sxIDMgMV0+PnN0cmVhbQ0KaN5iYgABJka2xw4MTAwM jD+BJKNFLJjNDCavgkj+SjB7EpiUA6r/eTEHxAbyQCTjfwQbmWT6C5ZlAAgwAAKgCSwNCmVuZHN0 cmVhbQ1lbmRvYmoNc3RhcnR4cmVmDQoxMTYNCiUlRU9GDQoxIDAgb2JqDTw8L0NvbnRlbnRzIDU5 IDAgUi9Dcm9wQm94WzAgMCA1OTUgODQyXS9NZWRpYUJveFswIDAgNTk1IDg0Ml0vUGFyZW50IDE1 IDAgUi9SZXNvdXJjZXM8PC9FeHRHU3RhdGU8PC9HUzAgNDEgMCBSPj4vRm9udDw8L1QxXzAgMTQg MCBSL1QxXzEgMTMgMCBSL1QxXzIgMTIgMCBSL1QxXzMgMTEgMCBSPj4vUHJvY1NldFsvUERGL1Rl eHRdL1hPYmplY3Q8PC9GbTAgMjggMCBSPj4+Pi9Sb3RhdGUgMC9UeXBlL1BhZ2U+Pg1lbmRvYmoN NSAwIG9iag08PC9MZW5ndGggMzg4NC9TdWJ0eXBlL1hNTC9UeXBlL01ldGFkYXRhPj5zdHJlYW0N Cjw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4 OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3Jl IDQuMi4xLWMwNDEgNTIuMzQyOTk2LCAyMDA4LzA1LzA3LTIwOjQ4OjAwICAgICAgICAiPgogICA8 cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRh eC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4 bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iPgogICAgICAgICA8cGRmOlBy b2R1Y2VyPkdQTCBHaG9zdHNjcmlwdCA5LjA1PC9wZGY6UHJvZHVjZXI+CiAgICAgICAgIDxwZGY6 S2V5d29yZHMvPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlv biByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29t L3hhcC8xLjAvIj4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMTEtMjFUMTU6MDA6MzEr MDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxNC0wMi0x MFQxMzoyMDoyMCswMTowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRv b2w+UERGQ3JlYXRvciBWZXJzaW9uIDEuMy4yPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4 bXA6TWV0YWRhdGFEYXRlPjIwMTQtMTEtMjFUMTU6MDA6MzErMDE6MDA8L3htcDpNZXRhZGF0YURh dGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjph Ym91dD0iIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wL21tLyI+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnV1aWQ6NDUxNmZjNWMtOTRhOS0x MWUzLTAwMDAtZjYzY2M4NGUyNmRmPC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06 SW5zdGFuY2VJRD51dWlkOjJlNGYzMjM5LTdiMGQtNDY5Zi1iYTk1LTAyNTQyYTdlMThiMzwveG1w TU06SW5zdGFuY2VJRD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3Jp cHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcv ZGMvZWxlbWVudHMvMS4xLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9k Yzpmb3JtYXQ+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAg ICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+Q29udHJhdG9DTElFTlRFUyBO VUVWTzAxMDIxNCBBTkRSRVMgTkFWQVJSTzwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpBbHQ+ CiAgICAgICAgIDwvZGM6dGl0bGU+CiAgICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgICA8 cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT51c3VhcmlvPC9yZGY6bGk+CiAgICAgICAg ICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgICA8ZGM6ZGVzY3Jp cHRpb24+CiAgICAgICAgICAgIDxyZGY6QWx0PgogICAgICAgICAgICAgICA8cmRmOmxpIHhtbDps YW5nPSJ4LWRlZmF1bHQiLz4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1yZXBh aXIiLz4KICAgICAgICAgICAgPC9yZGY6QWx0PgogICAgICAgICA8L2RjOmRlc2NyaXB0aW9uPgog ICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAg 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 ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQg ZW5kPSJ3Ij8+DQplbmRzdHJlYW0NZW5kb2JqDTI4IDAgb2JqDTw8L0JCb3hbMzI3NjguMCAzMjc2 OC4wIC0zMjc2OC4wIC0zMjc2OC4wXS9Hcm91cCA1NCAwIFIvTGFzdE1vZGlmaWVkKEQ6MjAxNDEx MjExNDEyMjIrMDEnMDAnKS9MZW5ndGggMC9NYXRyaXhbMS4wIDAuMCAwLjAgMS4wIDAuMCAwLjBd L09DIDU1IDAgUi9QaWVjZUluZm88PC9BREJFX0NvbXBvdW5kVHlwZTw8L0RvY1NldHRpbmdzIDMw IDAgUi9MYXN0TW9kaWZpZWQoRDoyMDE0MTEyMTE0MTIyMiswMScwMCcpL1ByaXZhdGUvV2F0ZXJt YXJrPj4+Pi9SZXNvdXJjZXM8PD4+L1N1YnR5cGUvRm9ybS9UeXBlL1hPYmplY3Q+PnN0cmVhbQ0K DQplbmRzdHJlYW0NZW5kb2JqDTU5IDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGgg MTQzNjE+PnN0cmVhbQ0KSIm8V9uS27gRffdX6FFMWbJIiLr4zV47KaecXSeePMWpLQ010oxrVpKH I5XHXx90o28AQWm8DynXyCQINIC+nHP67dWLV1fl75PBbDxdDK42Lybj5XI5HUz8v3KwqMeTxWDh ahicD67+eDEcFFdfcYn/Op5MYUlZLcdTtxiMqsl45kfWL/4zfFO4ergrRuVseFO44Xf/t/dvfvlo NlzDEwzj28o/4MgtD7f+7w4+fXEzV5RTNMSTy8XwHp7wtUG7POPk32A9vqAB/DYolsmW8PBHsRge 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 NBQaPK2DrU+hjjap2KIN/Ng8BqPdaIzlWR+r7ePjUzg1TmpQEaEohoW4hHanTf8kl8Uj4c4tXQKP gJskwl7FCXH+71VVh9ELGC21w/Ai3ld+N7kotprhIS2h26qtLpWTdjgbhrejhPPBDpxwxoGvOPDV dDqZTQ3kjOkdYM50Ju9/Oj/6DLgFZbNazcMK+GdG7aejsgj/Hm+OytPpqijrxXRyuiiW1byoZqfF 49XR9TdH/9xvBl8W734+Op3A0v8Wy+I1mP1HMWj2PVh9ce7uNp2A0RmaKotwqdN6BauX88kyPJx/ SheblZPVdC4QG98q9U1+mU0W9VxD8SsOELIL5MgsxIMS8Xk0r9JjylGK+5+9qKb8Lev0reEywFVo +uExJiEmcDWlrUJUDwrO6aIqylmJzoPholzw8E8aTus0jJNp+PHot+L+aDmp6xo+RKfaEWzAESir Hf6fLyezhfY/nP3kh8en2+umfSq+++7k/ebi6fnhqjj5rXm6evzUPP6nODnHF782N7f3zdPt+r74 /vsXL38sKJlmdV1CCNO106gG7gQPLE6X/5Ohgrm5uZ6FBTA0jM1ALtV3DzZQSC/m0nfLNVBwyQca 4+oLNA0gwADQjhWSDQplbmRzdHJlYW0NZW5kb2JqDTYwIDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURl Y29kZS9GaXJzdCA1L0xlbmd0aCAxOTMvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeTI7BCsIw EER/JTcThGY3VUERobRVRK2lau+1DVgRI5sE8e+NIOJtGGbeDE4YsPlcJt5dDHFvfUO9ETIl3bje 3LPGaZ7NFOAIFALGChQMAQcAg28q1Mps+ZWs1mRDj2EUR0rIjX49DXWWC7kz3R8NUSGOAWL80Uoy nW818VW5ZauLsc621D8cm0YwFvLgz1fdukA69u6meWrujsJmul3nxTE/sOKU13vA8HPEkiKrPlZS J1W1F4vFW4ABAHIWRIUNCmVuZHN0cmVhbQ1lbmRvYmoNNjEgMCBvYmoNPDwvRGVjb2RlUGFybXM8 PC9Db2x1bW5zIDQvUHJlZGljdG9yIDEyPj4vRmlsdGVyL0ZsYXRlRGVjb2RlL0lEWzw0RjVCNzQ1 RDE4QTNFRUVDNTQzN0ZDOTJCMkY0MTNBQj48NUM0MjM4MzNENkU5QTU0RkJFNDc3MjdEODYyMUIy MjE+XS9JbmRleFsxIDEgNSAxIDE2IDEgMjggMSA1OSAzXS9JbmZvIDE2IDAgUi9MZW5ndGggNDEv UHJldiAxMTYvUm9vdCAxOCAwIFIvU2l6ZSA2Mi9UeXBlL1hSZWYvV1sxIDMgMF0+PnN0cmVhbQ0K aN5iYmQ3uMbEwMD4i4nx5/kcpv/sjrwgri+QsEgEEkzyAAEGAIyiBqkNCmVuZHN0cmVhbQ1lbmRv YmoNc3RhcnR4cmVmDQo0OTA1MTgNCiUlRU9GDQo= ------=_NextPart_001_3D9D_24D31021.33550292 Content-Type: application/pdf; name="FORMACION BONIFICADA (FEBRERO 2015).pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="FORMACION BONIFICADA (FEBRERO 2015).pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlcy1FUykgL1N0cnVjdFRyZWVSb290IDMzIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+ Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDMvS2lkc1sgMyAwIFIgMTkg MCBSIDI2IDAgUl0gPj4NCmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAg Ui9SZXNvdXJjZXM8PC9YT2JqZWN0PDwvSW1hZ2U1IDUgMCBSPj4vRm9udDw8L0YxIDYgMCBSL0Yy IDggMCBSL0YzIDEwIDAgUi9GNCAxMiAwIFIvRjUgMTQgMCBSPj4vUHJvY1NldFsvUERGL1RleHQv SW1hZ2VCL0ltYWdlQy9JbWFnZUldID4+L01lZGlhQm94WyAwIDAgNTk1LjMyIDg0MS45Ml0gL0Nv bnRlbnRzIDQgMCBSL0dyb3VwPDwvVHlwZS9Hcm91cC9TL1RyYW5zcGFyZW5jeS9DUy9EZXZpY2VS R0I+Pi9UYWJzL1MvU3RydWN0UGFyZW50cyAwPj4NCmVuZG9iag0KNCAwIG9iag0KPDwvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCAxMDQ0Nj4+DQpzdHJlYW0NCnic5V3bbiTJjX0fYP6hnhaq3amc jMi7YRhISdVqtVWtskqSp8ezD4Zhz5O9WP/lPhr+oQ0yMuOSSVbUhdlj7O5i2pLqkhGHEQzykEGu vt+vfv3r73d3j/er/De/Wd3e363++9tvNnmWw/+pvGtXjdZZuaq6Kiv0qmyzRq/+/udvv/n9v6/+ 9u03qm2yXK9y8/9lndXVqq2yvDKfKbNSr/7012+/+f7xr3/8+c/V6v6/Vr/79pvVdodPqJpMl2pV dyV8qGg7+FpVZ3kbfPkqGJ3yo8PP2o/W9qNq9tHbV/PkD2rVZnm5ev2LGSiOUa3sh5u8yCrzghlf vvoZ/nn49ps/3Nyt65s389+L+e+w3pQ3z4fVurm5xR8/m58e193Nh8f1psa39vD3e/PD81o15gP/ uXr99O03W/NoM9NrB6oM1B070pXwwyqVac097H6t1c0WJrtab6qbD2tV2ikDTru10hYJgOQR3oBQ 4Vv3a5XbF18QL/Mb/h2/DD+5l52Iruqsa7iJPK1VZ589FR3OTXYknYKlzYxkI/2wMtPdEotFUw+r s5Kd2YctCPh22EXbUfbPsmMoiiqrvtaEi6LJWmZRrUBXFkYFvv7pDzc6V9VVj1Y6fnBVZXVx4izx pVG96Qzk1GZFt8qzGlQ5Pu0v/z6o4FC16stUa03o1dqcEubImI50b/TBy7PZ78XN893j83pT3Hxe 3b2tzdI4GI1q/mAUzAGUxiO+dm9eebxqh8SDU2a1tDU3undQ7PdvvRnJkxlJYRZtY0fTr6ub1f2j G97retMa1dHcfL6DEcLL361gxEbjyY1WK/PRihvtdZpj+qQO1AbzpCeY2eNnQGOFMrtOQ04eXeag Ho8tmK0RiNHM5pDYRpDjuLb4wnVn7mRErTFgFDci0bm37RHYcbJmVZmj6uHlbY/7Q+7Zhc6zojhx lnODzRyvleqM9Iz6bVa1Rshoi62YqhX4rI4+qgkVSKqVpsmauQLs11qbQ3xjTvAd2GSPa9XefAaN Yjaqbm9ezBvALIE34GvPn1dfYEvjav4Am/nx7vEzQo3fxS2n00Y+Ud6qNGdyzY19gvRMKZeXoGfw ou3dulHw/nMHUckOokYtPJPiA8hu+3ndGrEp89MKfr83v25BfOY3o43xxwf48c288GL+e8a/XyEw YpxK6axquYGm0KqF0crNGT4DC2Dqn8wSf8T5oy9ycDjdjcB8XhcadkFz09/Cuz2UX1YA8gf48dG+ s7XfegcfwT9tLb6y0JoPKGZSKWAbWWCrMisIZXIcWVyPCN32gMu0v/eLcHzTB3hhimrrQDX42g/g 9+x7gLnH1f7ZvYbfg9L6Af7ZoyxQkEsseGOwZlXBQZKSSysrF+AWLhfL3ikF+NvbAD2KaiKlLyv3 HYju++DQg6Dm7/ZPmO0ZIzMn3t79NOw/YTnl4HLREKXE1AmLSQMvcZmcREExZk9VsgM6az3Iqjpt TnxuWOcvO7fi3q0KsdAuscpUp4HMY0aeWmYql11nxulWcwv1lHUGr64cnI/uJ1Sj211/rr7O4G34 Ab+o4H3be3dk7lCGgxGDSmD8yCDIQdQ48rthQT7JH7Nal1lXcOAlRThjWa8UoQIW+EwRWgMFbb2t F5vfI/Bpj6y0AVhnTcsNXFpPqBZIV+ZhT3Pzwq1UD8vLsJR2W2/x4do7TK1oVXvr8NYu43GJ2gNx D+8zxrjiybpLF6WZaN6diOp8Uc74qesWpa7AaT5/UW6A0TQYb8PzZHrqm9dnu96Zfda9kfZZyhpQ ZaaVBPciL50HV3VZN8d273BFHRifefF+trp7VMvvvTBYeZspbphJrIR9clXCWK4Ha/jz27jX3/3O 3j+4JWh/tz6HW9b7Lzu0R8AjMYdYb7/HvLt3X41HXu9sJzcwcR1RZBAQpEFJikaYqTDLpCBsj6Ro BiCdov7gXgUUreXx6lT53SiLmbIGh2KikLwpM1ErM1cft8+X2btAgMIiM15jw4J160b8NCpJmGF/ b1ej7FCKNis7bii4hLcH2CB73CX+/OxfnAknrGp0W0AkkhlSckELk0m5pvg/0QUt7EMVSJ7S4z66 cW57YAsr8jVcgKEPKDvotsYwEz1oaeuxNQuLe9bLeDr0ntVzMu0dISjNJpl34i48Zf7zJS9L81Wd EUbxy+rwgI4djs/+Fg3LJyeVQSUKL40c/HgGgaQcZGm9qlNZTvB6X1MOD45UPXgjJran/ElpLKLC MjSe3HuSJlqMZCoOmqSAZAm9qq2ygog0/OsIyPMvaNne4pndO07FSw2HvH1d4jRXClQbg1VKYlqW GquaLqt/4S31cQT+01HtZ3ZOUSxJeKmuyBSHSFIusnxX1RiT76vvpH0f7IfB1EWnzpGRQxi8nWwr +7Zfwa+eckNv70Pk6fXiZkIJwQwGLWnPQFdZ23EPQ1/E8jSPzpf64FBCYHczgckOsO7gA6ehMV/B suRYVbeZqn5ZzeJ4Tf+hfud8SZ8nMKU5cQ1biv8H90lplsJ4c03BwZQUlizZVtUa8vtmwjpsD8+Q g/niaB+/nw8uCIEv/HQDx6bnhPuJ6Wo+ttuD1t5a6/WndebUhZMTroTbN6dtQpdD1d7EGvcZfunE D7fClD6zmyxXHExJYcmyfZX5dE24I2cL6/3ZOhDtjTL//bT2ZCnIYv/B2Up+R9kI1R6JvSF74dmJ 8YDfh9L3kYLDyG9vo2gjfh6l+CVyqb1rSbibi3ialYYMOgbUpGhl2cKqyiE9WFK0ehDtQJ4hhGFc DHF98V8Rb0fYzW+eFXR7tP8Ovn9YEuwu9JFTrxe2wVJBEQ9qAJfZ5ZItVsasnoq2xGARA6q0dWCe UrIPc/umDX2TRfJwjP3anjrp+XqWJQsrSNUizNgr1nMxUVXv/qAJkhx2GIL0S2u6CAkTwUVDgxh9 /+pidfZr/WtfpBdrXuH6oRGTXqx5g4uEEc8kvQXV9CebLRmSTUEAJ7CfRvJj9NR23s4KE91k59Md m09y0QvThUWXFYTl++r0LROIsx6us5lcrGOa0Lr1weFtGFwLkd/6FT8lpQZCygUrpBmp1nyOAyEp CmHGsCjgbs9MFLAu3Qr2K92deX1kk1jUn6z/6oJqqEfgDxX5Tq+V0OMYvGnpIHRdZA03yyTWwuSf biiO2NNqb2u71gnn759+H4y5T85iCTAPYxGM27h3+Sjoe4PRqQLvwQYspIM1XZGVNQdASgyFMKOn NcUEXyAGtyW8ZWhDwVs8ov1Z8BpvmYn4wo0gvPjxzgozYasPrRqU3nWtsvImH5yUtzBTqOqsPLLt PHXHR9EHgVsd9Y475hDvLvFDQrdZx409iaAwU6VyivElEETu6m20E3FRg3uVD/+10hlGOaTSM8NL giTMEOUlRSpuI5R8+GRyik5Zv/tIMaB+iTKJpHMxiybLa24OSSRl6Zuy6yjGL7DkEA6nhmk3fTQ4 TrmvI4yl8S81NwvpzIRSQe4G8zA2BU14EE0B58xpM56vHlmGqDS2BkFBbskrPuNx7HL2rIJ3IZ2j Kadund0O69G8+jv43ZEY/hmTHNV+j1Sf9fmsxTWh+o6ly8+ZP2JcjqB/WQeX+LxNctjZEQonYnUQ bGdkkFwJstxK2TYUY/lhgHBYB+Mdx69+dtVgIjFjTCIl65CXxl4juLAT7gXgQeUPNGc2x1nz/SvF RsWb6Az3HF5ZOGdEwdUEBpakcGRd9LKpKc7mFOHAav5hbtTiqTCIwMVk+xHRj6OzE+Q2e4/Fi2Xv fnI6dXrYDj7lO6lL25DO8Y86OayJ60GYoS4g4sgAnhS7LFtQNjnFD0mL3RGOlo2EGHyQzMAeNNvY mrLRy6Xy1WE7FhwgXI2OK+7ltTX3MKvuAlUHtC4RRLf7p5+c6T7Ou2zKm26w3gczh2Q1BFm6paxL inuTXsfIpEzy8EfLZ3vYAwnpvh0PntiimtyI2/e/g69yhpy3pCZvP0LlLMZpQkC2VBywSfHKsitl 1VKcnrR4reHuD59FKJcyzzpuQklYZSmX0hxFBHUmCqvwBcsCTSZ63LgPAgvvlGt9R2wOVQc2B3H5 5p0JInme1udknJFGJW1uNBqi7wxkyQUnS1+VZUMxjScsuK/Gq9j7hMxAk3AJc1SlojjHU29S48qb WNzgHLmFLl5sp4JiO8yok9gJMzQFpolehR1zHgRXNAOTFF8UvwqssoqbShJQYaKjyDN10d4NAP2y WyJ5TOVILDMjlD6DjIao6Gdh6chSu9KRufT+gvooJ05zvhyE2RyNd0UvWA7zHCNRlLo2q2t2fEmU hGkV1UI9PQalISjuwBmhsnqHcPTUEOUNeKuXMSKxxJXXIWLDzCKJpTBXoTTQvhesuKlzvAmiid5c fFrHN/FH1mh22XiSOUhEgTxP9bUE1XVQYZSBKFkVUNgZB3XMHL24sG/7O4xDMgVgoru9QSrrEhYL VnRkBpyETdjJzRUU8iRhe5uTAq7anGwJrtpseHYsT/E9PZt7RWSITx3rmKiQFqL5dMEOOSlEWZe6 6PBjJwuRqcXRE9donr1JSiZeuTfaOmSjczpe07PRfp9ae0lqyrTU5HiAF8Vyd5912WVNwwGbFK+s AwuVedv5STgkOyPMPs2WyS+lC3kcOYqcYEGUMV9hpWCTUndTZpKuI3IKFWFe+BE/d78AIVHUACGD ZFKesh520ZaZYu4JBHIh6g5SwgWhszzxvGKA22KgVKUrBpRY94yZXxJlWV+8aFrgkqmCaMihOe1o MQtu+7krAZ+28Z3YEdUP3tIiWbjhoHQfHSSDCT3Kln4dr7BNBBkHYfyNA46MP5YVOwku+wt0g5Up zPi1uMFo0LmUdumbAN2RMSSXnyxzUTQaIlXTUYzFsVqiNtaoOOO7FUT2y+yenrD/lQOjxkwgCaOs x1/UNUVD+YxDT4OhteczXWT9+zwzWo0bTRITWf++qBXFxdgrTk+jk4P6bbgFJYpFUw1YkKO4tdci gmv/hFWZSkZbImuRGe8yWYvMwy5LrotLYewfHSMz3mhwEV7pe2law0H+dZCDeg4V+zCqanYWw0Qm B4YB8yWTAxtwA08Daq4eZCkraPdDkJAOBlQMFkFExBrd3qH+pzPjh3j/3l2bPPSeS/Jc1Rdih+NH Rk8QAxrjRUHz78fh7/YwXORSIBQPUxwUyRYMstRUYZxJgskMc703TZzrHdXOpKrAfm3DXgPbwUwk CacsZVWUBcU3ejgfrY0eURvH6p8SF/eCW4KjQpkkGUtzqWUOpDcztyTCwnxS0VLU5KRs+QFqcBYB zxzcAubKqGyauBqy8EEPlsnR0W8PkBJfuBzAGaE1KSdznLxgFhUyWr0teRHUbZavOWBUGzPZ5IIR ZqgKTdGgiHhYB2lIqA684tsoVOF13pifDtVJtHxEU7XcmJPICXNB5v0EwzgUDh85toCO3QypQttp 9jmer94ksqU7Dj7ZL753xSk+un7VKLd5ovOvptnNoxOL43NbCv/0PfE2x7X4t3HRM5fzGJvIaPdt 76JvfLVYiC6bAqj+hhNYctkIk1s6hwYNs2UTFCeOijiMNzzJCtyRUuZznsQjKDlqa3omSTyF2RpV UZSlAJ5UcRP54v0YUWQmkYRSmLHJO4p+E4CSOzDk4eyQxqYnkoRTmOzJC4qGE4AzukIpbogpduj9 UFj72dbXGatKHTLgNfwp94vUZzUiN8qIGXhS8rJ+/FDYZjoKe7reyU68hmg2+8i4ZERQB+X8K3KT minymUN1zc1CfJF3meKeFdzp28cXld+DFjvSPmSDvd5Pm/5s9TaypIfuNMWFjau3ZReVt0xtj4cd tIGnltVJES9nwBinb5vZwnXjR8halZsxpu4NUnElg10mGICSYpIlU6BdMcGQnSMmR/UhYnsuAYHA 2ZajGRkVkqcRrhrTwMHOzDmJvCzJotucItPOQd4WaHZJUbNWJDaRQs1ayPmGc052C+PewY1wZsZJ 3GW5Ct2UEA46EffZRWF1UlM551TfOisnuhLMaR81qZQrXbwoh3bdDAJJOcgyH1CxOp+3GpsUZbQd EQ/JtM0jHB2udeEKRh3cpGVmMLnstX92dSTx913Q75H0vdNXy6Og3wkYkPfLF6Ak6yLTioMlubxk GRIYDGN+DEbpZsiJ3I1ZKVHnQ0uiTYLZtDJ1CcOBGxbdjvZdDiwzTMTLXC3zp3WcQSl+4Ryb69Do JEUkS7po8z9Vef4oLuIr9Komh6CotfrR6u71BovRK5DERrf2x3v8q3mDvrnfmp9zs42M3wp/7uw7 XrbQndUsJV3bP7yb17T9yDVbbjoFVdTQ+ZOZQxLGi3gKBsayvKQhu7C/XLTEIAKrPrjvPr8iH2xK l0hg49OxFUXR3LFKj2h4gu7Gdxy7JiweCW8rBpxka3Zhn7DQVIN4V411Yo1u5henJ1HdH51YbJL4 7tmFHYfrS3NvxLceSJphEMhcxFFvW9ixDBxJoQh7gBDQmLcWPP2KpetoO0n3iDrfTlM+lHifBiDB G3Y6SVCFnTudUyb2CaCikvLZTs4u+NGplPCmmHBgFC7+MkP3493u9gukUA1Zp8zTk+IT9hFVRR2p Z93647TalRLfNIkb4vh1sSM6XIcay+L2IdOuhq4d05sDS5NgdQ7dmxigk+IWdkXzjrCGQWXNs6uG m0lbio/x6PVR8QM8wB6kfdAafXly6En8hH2tvKAM+XMADHdKlAf/bl0mafBU1nDDToIn6wWpDklJ 6p6K3ZPBvSDQvq6arr1LEluytob6zqkGwpDymuKLb9IT936x1AtSuq6o1KhVwmdtZvXa40SVF7vu N82Yl+eueM2yTcfy77ug9VyUbCqcr4u5xgz0yQUgGzCHumz5/MjzC+AwprgER0gA24wLS5wP3pz2 95JOSw4On+vNaFt11HLRlBe1l84TV1Z2JGpxiiI6dt53E8+PLxtozs0MZYEmQwX7sJi+9sKZWBjb OCvgXbwpY1edjsh8Y8mmTkA3Ej03LqKzyKbR/eho/edjHqU7jpa9r6ILONmZ0ScxlCVVIGTA3WLb fiIvqI0LzleP/B/xCgo5xPnpsaUA6mQ5DQXBlLmYdrgywp3GFxwNb2ZO27DZfKf+0/MCGY3gcjXc BMSzJTSkBDEPm6wXH7DAFx7c7uvj7KXpBVvz0852ooz37Bx74RMJb0qeBuR8PcrSORBrvS6q7LJx H5xlENZnXzJODF10NDOFJI6yDA60V7qAnOsuIiJoVl2ZjzbDEDJVmxfNFrL/Vqu//0z99cUmB67N Qr97NNsoh8iF0S47+He7boboxeM13vwsDJHnkHZ08WiTkMo6+5B3XOslxinrVAOfOaqTs8bpIx5B v6dRIX4JAhu9U65bV0F17h2U+c3v15tC3WxvnbLQo40pXWyuAr/84pknJSTsuRdOT/0LC2hGTKKD PaFgDnPGYJpn8FNMFgqfoDlUErscUJa1/GktXxhIdxePNLlChamFArvTnT9O30nk9tmd9r+lU8c3 0zvC4mSd8Skvn0oScmGn09gwzQXDRFfB7uNBGUQ32S3sjhUbyDdMX3Gl2CGpXt4VNe+8dE5J6IV9 Va3AEDl/nIP6tDkfZ6pQrI8ZtLSOdKc4499cMcuUNIwdJysOVZuRLDLQi1wmxsjOu6y6ZJT3j2Be HzC1Byzrfzyv7jAHyKYGCRrYXWkEfsVI03he5DpxeBpneJFByoZ4u/qiYfo21reecO/HFGz7Amrp V0eNdcJqIC8hanXh+NMwy3pbXZ61lygrLMDgiwYMnSNHy3fB7mVms+krxp3GV9ZLbM3f28XwVfi/ S+B76bjT+Mr6eE2XFZeQBVGhU4xF7afXNIO6pmONTYyO76JU5E2YIE5d4Ths/+HcH3xTgV8kfLMs z4qLsZjIbBSbGVShsN8PdCXrOhxW3q1qm7HohxXLN/CQ/Md19OE6eVYNn6xte895JU6X54s/PiN9 Rvg1pw8A7LZ4BJCQyY4gvczbS2CgyhoMSNTNZePopMdhrNv5lWG0p3e+WFJv43Dw+1gzlmyad92Q amySSA8piYzKhZExe1fNCekZNLf9UJjUJyTJolIVmS644aRhUdKwYBmJS2AZY+T/IQ1Qk1UVN7A0 QFoYoLJ0fPcxgAISzbOSG3ctk87XeXVhS59j4MObQT6jKMJlXuPGpGeWRrgQRtiociLwN0M4pmte XAFzIrvpSr3VQa9zZlhpeEppeAoinDdD56O/luYT3Y71rrgSoxpak9FjS0NUCUOkGyrYOMPocb61 xrBsIsB99UFYF9wo02jV0mipbH59ewYWpgJsXXKp+DGYQzNFeixpSC6yYo9AoipHCp6FiaoXOgPN nwpuWGl4pK1blUPJt1nayWHf/8MgNLQ/GL3fxyW2UKnRKKAH4u/l0lkWLZGOI6L+6OGk5SNt9edl Vs5PckY+s+gTU7p/vGeEDvPSZnGZd6gj6ZkkEdXC3kIFHcnmFwMkEY1vPQqD2YCPwUwiDaawj1FB 5+y5lhcCU3hnt11WNtyQpdVIl4OlyTzsqzjp0CZOnzpfYqkIe1tV2wCtMx3Hh0j6dz5yiCd0GOYF y9cn3lmyA2B8H3Acu4R49/V2Xh/1ys2ns6bjZpJGVNi7qlpF9Xq/ClG6Qq/05mjbTFX0+LFpZ67q Frt29kp6W5bsk0+RoLADWDUV1c79cgkqe/iENpLdKMI7oejQ72HGn8ZR2EusjF9P9G+Xx/FWfD1a HOnxp3EU9h+ruqTaktM4ziq1BOnRYfTMQxgVOJ99/KM79wPu7FhZ+StPxw6UODPjNPLCbmpVtVlx xunIXwd07bBH4N4n7ZFc8T8LbrTOZSHWGCVgppaGWNjVrSpNNUJnIY4rd7qVnEz0v9L9LLOu48aa xkzY/azKGszYkzF7HWO2vqsMV2LrjFXaRuzMAgtVYeCGmWwS9ELaQy0VGCkkFeL68z3FacpnlY6c hyg+RK/G1RZW0Z/fg3IL04o/8O6x6s8y3GJZ4d0TBqG0pKTdX+irMbd/jkrqaNegqEvBcFNZ3A02 JnCXHPr24AsS+47bT1bYwsdEDucDM6CN/JnUsbMPVvlYcc5VJlxI9VQl8IzMeNILWtpJ1x3FKx1f 0LOi1pv4eiLWMGcq+9mKUvOjlrwUyvTsu1L3N7gd6IkHKhJTzF29QjdYi4qZxHdu685rd1+5RDrU efQIpfdHnWcsGrv+MSb0XBW4I1dlxliu5RSYgi9XjblSWKyCGXR6D0nTMrqgCLdl9hCq6ul1VMpK bcndQ6AhRXGUClUag8ZYcQkbHjhbj9xR6ItvXyPL8MHlEMdLkLih6z/YT78jBYUUS1GZQ0eVHBRp kdTfP/3xbz+vbv78t83bYS28WlVLkZlHV+uDW6eYt9HHzTTE8xGsF0mPMw2etKNu/oegDo/i5ZgN f5zYvfxv8yq33uc5ViDragswb7iZpBGV9svzmiIRjyI6NRjY+LBw7L4DxJgBp4GTds7znGINjwL3 eR21HQmrII1e3YM7e55d8Rfc7PuPEeDiEbMCI2aJSdkMKKKPz3tQnDoKYlCVoq872coGw0D0SJPL oBSmC8quoijMr7cMwv14ini4QsEx2y6felPWmBXJ4JWWmzB5UEI8+pfcvovJrYeQrBnPGNuW34EG Oq05BNOSFPaay7ag2Nr/A5Kcl/kXliOWtmXwS8tR2HMrm4YigI/KEbH6waZ4h+UCnUsy3QwL3Dto NXhazOjTKAoHtctGn01fJ1FceCEWDbpmzNDTEArHs8u6PptXTkLIbfqFMtUK6CVVcVNJQyoc2gZi 61xmMwlpEO5ylw6nnSWFQVWwx5nJpEEVdoaBvT6X6tq7/D5bdxNfYc/Aacrg9Ex7dI1mbHf1w6Tc 9M4FpWble4RJ2gpqUjKApAUj7FOXZXc2q4M9U29dEeXDR7emJ4zb0tYdJMXAeUbPIY2lsJtdlsXZ jM+pWC59rBnLoKm4GSSRrKQ91aKhOoSLIEnYv7RFK5zBNeSEMlNLQyztVBYqaxfa+GdA3In77nkF LgIzvTTM0h6fri9pKK6qizwW5o4+pLARa+4emmzZTlsf11Q3knMePL2bX2rwuJknp6cv7WqoAnpl nD8OaXs9b7KauJz/NhiLj9ZYDG3IIadxXr8i7hZgG93BJp0XrrjS4zGuNzvyNILS5nmuoL/4FQja lFIbV/SBv6NNs05oVRhHW4WvI8MNDWPGc3MPK9mNViz2qDmtV3OyIfx1Y++wPAcz9vT6EfZEio5U yK6Q/XZsO+NzD12oyDoRNtknDBDbCvdhmxbgNl/Wy6S2gb/cVdxE0oAKexBwgamcn7QsoGFpdoTn 9s13c3+ZGAnj32w7De9IzLvRXulIVBChYaaShlTYkYC4a0NclnM52/u4R4enZmyv362zvQIYATbc 6nFIdJJPEifhvrtEHZ+34zJ5J4oSP+quVb1IR9JKsOoYYJICqoX9k6Lpspwxnm393N6JgEyqPfEg n/c3iN8bNCSTzn7UcAWSmWcab2FnBVhXzXjWZ+HtdxD81M9O+FGrP4x8HXJAnjY6Lo24lqwwbaSz isMhLQ9hr6aoG2iBfCT2vhkbtQ7Yxo1aZxnm0x4UT84429+P77F2m2cBhxonO8o2vhtF92j/Huqn UYbCCgpJbAYY6VRUm1fAPMy3pIrv/nhz8OB7GDkj2a1nlM5ubw+SHxcwCCvdZKciRSxl4VAeZI01 c7sUQbSW/edh+W7fe5/pHnYDGZfq08hXz1Ix5xXnY+75eLUoVYdpmeYf38LXN6cfXZuRLh/4742/ ZRMoqqEZWtxSeTMdg7TYCyjrwOCdlrswIwDlVbq5KYGMV3Dp0OoctFBvo4KUA3CgWF4HvJnmROxu 8wsAmwVGhtipja1FlBYNRVokwuQI1APSc2sjEAndEnEzvYPkD3MfQ/Ib9m4B/6GtgCNhJsDZfffD 6vG3XsUvroKfSA8qLV1h4qYwJjxBwdnKSs7UYoIdqp6C97XYL+NxlAU3+DSI0uxF0VIsHAVizFlt fX/xmNwYT4db59sdv4353fjdz+7vsTvvuq58ZwUDj31wTVgPaHcvW2utrCvogcVgJW2LGTtG19zD rNr6NIn870cNj5Lx/jQYDNI3XipoeHAaFMTyleaKCk2RgDM6Y1hKnq6I6jm7+LJ80jb4vPQYpfVK XUBuKfOw8Z5bkCsSWBtBnp4wC9ZCujozpvRikWbBjJ9AEJyXLhbkv07FdfzUoY92p088GdLzzN+k ma4CawYxk08KoZFmurSiKNELhTCxoFU90X7WDBJf1gUe4fRMhK9FQt2gruMednQRxuwrhBss+yq+ vMDkp8eXXl7SxB6cT8f2eGi2M/4VGZwbl90R/3ve+sn3fA4CZvi7D5ZNu6PJ36otOFTS0pGm+VRO 0b8Wsf3zSI4cEPMw/DVIJeBMnR/77vg7d2neN4U6+Juso13Ktm/o32IFM7St3TRBmC6LHYcgHOUK JeN3+RHYSJ5jDh8YRjnu0j7mIGIlhrcFqBPzgaI9Jo4lKg5UUHGg5J6aXozSRF1eUty3T+zcPg8x Ws/Ajfs9ClkFPBhD5Ee5Aaz+cf48eDik/lnApy8KSARgsEjLRJhE08ZivITEbS5ijpjsJt2prJ0P 4u55t1YF9hV7ga5iwCeo6xInZwMw7zaWBTOANAoXMSwcCm15kdXeCDMUumnJHBXHLOy4AF1wSAdx ureRYp+Ykp7je986PhY336/cKb7bjvncH0ct4LIQxyoTs+v9EsEZ1XE4pOUh7HLrpiB7nqTl8SXU h2MUKcD6uEEW5iqMyjQMBE7EiQe/XwpT+c/SGeJ0q/fA25C2yNoW7oIyMKbFKewU67ohe7V4i9kb WIeJz7pzr1AJIl7cyCHurHzxnf2nra0lGJ+XbvctBX2BdVqYKSehb4VdYQ0tHIguMK8OUWYjTW+Z 9zHSzj520Ve/yYQrBEE93bzgZpJGVNj701UFH+DznLYHxGtvO70ExW6IDMZF6g83Glg6ZpzoReAR g47ibiI7Ki/hfaJDpTdMmTUsrGnxCruPusqJzjB0t75QHVHeHooYUwF/u41DE5M7R3tfSGroyBjG j4I8E78J4Sd3JE2c1PvxO4IVF1kW402xRQ4dEsC0HIU9L12WVNMae+v8EHNWp+W4BQVsjujNqXYc zY1QPc50AZ5G6ITb/bhkRiKYeTQ2aRlJe2JFSzTROV1Eqh7yqRyp+9sg6YrIbJlcX7UbK+4QIt+0 TGEwlp5rGnLhdAUNcZK56P//3mllAEkLRjjTQEPsZG4wOlpxwgJNsw168j7H+HevulAQnjI+tY+f /RYvZG/5RYa5dG3IokJ1RUOTFpE0SwDxh6kFusqNcQpEyp/MLpKuyKUaSOAgnztW74wvH7jfDrtp AIs0AIw8fWVPy0n4xAuvag/cwrJ5l/3DsAyENyiWQWZmn5a+NCehKrpn8ObS9GFnKeysjYhm9rSK 47hTvRtLVbpwlSHxTz6CYNMsrQX66vJZPrtkNHwTdP1GlTBv+X11SkvVcsClBSjNQuQd0c83CK0d EKEgPTIsUbo5hYPvfWpRwiT3p91LuELEbXJo9d0wU09KoJMmI/KS4qO8CN79UdL/ymV+p1qlu4gp utx6+C40p1fO/rMVyWcGpTDaFVTaZ6aZhluYqVBdS3FQO0+j7t+Gc/zo/ZO4jOfL6Lr2U8vt87qd vO8lUksutGXz1OMrKGhzvpst0vmT7KrO60yJvKbkcEnLR5hqMF9IMVrnyMfzn1EkWY1Vx+l9Evid wmUMkMph5iWdw5jXYB4wDwvb7oFvvbfGzuBtfPEr169Tf/L6NUpY1bv+8wJVzirQGSciR6xMYfLE eDcUGWftlN+N6njGaXFWRWvDW0+DcnYq+TCrEEhHY6al12PjKbhJyp7QR28W8RfN8VLRk1sc4pdL kNFmwE4LXZiNUa0iiDuboO4rLk5TSrztA0vihyhRxsrkJX5fkAyDW9KG8saQjfSBjAmr9MzSAAtz L6qpsnIuaHGE/doP0nx++ZhkqVAWNAhpYQjzLaruCD7uZFlMbm3C3z/1fNrewiGUvIIm0/SU0sgK 0ySqLihGzVl14y2oUWn/6D2n4e7g/ChYTaqf3DlpRNVMXFLTkutY4bUpZpZptIVpCVW1FDlmTzpw iLoTjfu9T4i+95mG8gUeQQfQY05jJ8wIqEpT1NKkYtidh8X58BEh43u7BUp2czzvR96aKPMC1yU9 pxS2Ohf29VVZU6xPeAU5vAY506whCxbXJ6Vzf1zY5+QwHc1ljyk99hu+n3u4Y5gu2ifScTrYJzWH YVqW0kRCmRP00UWifN9i3MLzMA+D9iel9PV4MoXFCeiJpvGWJgYg7jE/W04GfHGDA/p4gu9NjzON l7S7qjuK0LkKr4kxPcbKfMDL5U1TJMFYrCC8cv8cq4zdlr2uKk57aTC5GZTS0pL2M41TRpAcYUbs KlIFTjnbKIfsSoYyvBU3pjQ20i6i0UMXcAE6l8zKVkpletjWmarNq2aX23+r1d9/pv768uBqcx7W G4WFa/TNywtU6Hwyf8iNEDftzbPZHMXN781fIcP99hpGsJqOvVHIPV449l/n+a36jWCWvXFzwdK9 FMproJmPpYY6yRePBa8kvD2BljPbU7f2ToK7qHBv5NtcVZxiOuBS5XCd9OIBX3PazceC6TtSgiS2 7kXuN7d1czPaRUYp7LZ2babbS0TrUuNuA9cVnd0gU9xVqwkoA2frH0rpfNsGruBfOqM09MJeL8QY LtLu4zF82P5jHeanfokNoIMLqbgCU0/+/WVu9P+mUDfbWy58+NFRNzt33bKKnTyUo/g1Nax1fik8 STkqYQ8bwgaXLLhfXI7fRZlJB2+Of4kMc9zU/W5dtuOT+vftS+S2m608RIF+unHxz5NLBv+0Fo7n FCX07bpULukFpBbslDrWnT97KY1iMngPYsLwGoiqE1K6s8OuLqCn+kVDnqA8Av2/QHiQNg0KZW5k c3RyZWFtDQplbmRvYmoNCjUgMCBvYmoNCjw8L1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dp ZHRoIDQ0OS9IZWlnaHQgMTEyL0NvbG9yU3BhY2UvRGV2aWNlUkdCL0JpdHNQZXJDb21wb25lbnQg OC9GaWx0ZXIvRENURGVjb2RlL0ludGVycG9sYXRlIHRydWUvTGVuZ3RoIDg3NjY+Pg0Kc3RyZWFt DQr/2P/gABBKRklGAAEBAQAAAAAAAP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8e HRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAHABwQMB IgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUE BAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1 Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOk paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAf AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQF ITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdI SUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APf6 KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKq3t9aafavc3txFb28f3pJWCqPxN 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 IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMjE4L1dpZHRocyA2NTcgMCBSPj4NCmVuZG9iag0K NyAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9BcmlhbC9GbGFncyAzMi9J dGFsaWNBbmdsZSAwL0FzY2VudCA5MDUvRGVzY2VudCAtMjEwL0NhcEhlaWdodCA3MjgvQXZnV2lk dGggNDQxL01heFdpZHRoIDI2NjUvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvTGVhZGluZyAz My9TdGVtViA0NC9Gb250QkJveFsgLTY2NSAtMjEwIDIwMDAgNzI4XSA+Pg0KZW5kb2JqDQo4IDAg b2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YyL0Jhc2VGb250L0FyaWFs LEJvbGQvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDkgMCBSL0ZpcnN0 Q2hhciAzMi9MYXN0Q2hhciAyMTEvV2lkdGhzIDY2MSAwIFI+Pg0KZW5kb2JqDQo5IDAgb2JqDQo8 PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FyaWFsLEJvbGQvRmxhZ3MgMzIvSXRhbGlj QW5nbGUgMC9Bc2NlbnQgOTA1L0Rlc2NlbnQgLTIxMC9DYXBIZWlnaHQgNzI4L0F2Z1dpZHRoIDQ3 OS9NYXhXaWR0aCAyNjI4L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgMzMvU3Rl bVYgNDcvRm9udEJCb3hbIC02MjggLTIxMCAyMDAwIDcyOF0gPj4NCmVuZG9iag0KMTAgMCBvYmoN Cjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjMvQmFzZUZvbnQvQUJDREVFK0Nh bGlicmkvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDExIDAgUi9GaXJz dENoYXIgMzIvTGFzdENoYXIgMzIvV2lkdGhzIDY2MiAwIFI+Pg0KZW5kb2JqDQoxMSAwIG9iag0K PDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9BQkNERUUrQ2FsaWJyaS9GbGFncyAzMi9J dGFsaWNBbmdsZSAwL0FzY2VudCA3NTAvRGVzY2VudCAtMjUwL0NhcEhlaWdodCA3NTAvQXZnV2lk dGggNTIxL01heFdpZHRoIDE3NDMvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvU3RlbVYgNTIv Rm9udEJCb3hbIC01MDMgLTI1MCAxMjQwIDc1MF0gL0ZvbnRGaWxlMiA2NjMgMCBSPj4NCmVuZG9i ag0KMTIgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL05hbWUvRjQvQmFzZUZv bnQvVGltZXMjMjBOZXcjMjBSb21hbixCb2xkL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250 RGVzY3JpcHRvciAxMyAwIFIvRmlyc3RDaGFyIDMyL0xhc3RDaGFyIDMyL1dpZHRocyA2NjQgMCBS Pj4NCmVuZG9iag0KMTMgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvVGlt ZXMjMjBOZXcjMjBSb21hbixCb2xkL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDg5MS9E ZXNjZW50IC0yMTYvQ2FwSGVpZ2h0IDY3Ny9BdmdXaWR0aCA0MjcvTWF4V2lkdGggMjU1OC9Gb250 V2VpZ2h0IDcwMC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDQyL1N0ZW1WIDQyL0ZvbnRCQm94WyAtNTU4 IC0yMTYgMjAwMCA2NzddID4+DQplbmRvYmoNCjE0IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlw ZS9UeXBlMC9CYXNlRm9udC9BcmlhbCxCb2xkL0VuY29kaW5nL0lkZW50aXR5LUgvRGVzY2VuZGFu dEZvbnRzIDE1IDAgUi9Ub1VuaWNvZGUgNjU4IDAgUj4+DQplbmRvYmoNCjE1IDAgb2JqDQpbIDE2 IDAgUl0gDQplbmRvYmoNCjE2IDAgb2JqDQo8PC9CYXNlRm9udC9BcmlhbCxCb2xkL1N1YnR5cGUv Q0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAxMDAwL0NJRFN5 c3RlbUluZm8gMTcgMCBSL0ZvbnREZXNjcmlwdG9yIDE4IDAgUi9XIDY2MCAwIFI+Pg0KZW5kb2Jq DQoxNyAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3RyeShBZG9iZSkgL1N1cHBs ZW1lbnQgMD4+DQplbmRvYmoNCjE4IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnRO YW1lL0FyaWFsLEJvbGQvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgOTA1L0Rlc2NlbnQg LTIxMC9DYXBIZWlnaHQgNzI4L0F2Z1dpZHRoIDQ3OS9NYXhXaWR0aCAyNjI4L0ZvbnRXZWlnaHQg NzAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgMzMvU3RlbVYgNDcvRm9udEJCb3hbIC02MjggLTIxMCAy MDAwIDcyOF0gL0ZvbnRGaWxlMiA2NTkgMCBSPj4NCmVuZG9iag0KMTkgMCBvYmoNCjw8L1R5cGUv UGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YzIDEwIDAgUi9GMiA4IDAgUi9G MSA2IDAgUi9GNiAyMSAwIFI+Pi9YT2JqZWN0PDwvSW1hZ2U1IDUgMCBSPj4vUHJvY1NldFsvUERG L1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldID4+L01lZGlhQm94WyAwIDAgNTk1LjMyIDg0MS45 Ml0gL0NvbnRlbnRzIDIwIDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1Mv RGV2aWNlUkdCPj4vVGFicy9TL1N0cnVjdFBhcmVudHMgMT4+DQplbmRvYmoNCjIwIDAgb2JqDQo8 PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDEwODcxPj4NCnN0cmVhbQ0KeJztXd1u7LiRvh9g 3qEvTy/GGpHULxAEkG0dH5+47R637YyT7EUQZHOVLDZvuI8QzN0+zapIkUVSUrNdXfJxsrvBzrHb UouqKpJVX31V3Py43/zqVz/urm6vN/mPd3/82182n/78t4vnw/bXv95cXl9tLp++/+7Hz2ojRJYX m6f/+P47scmH/4mNrGVW1ptaFlk5/OWv33+Xb/4C/7n5/rvff9ps/33z9PX77/rhfvgOd1dbZ6Xy 7wqv3fS7q83GG5XwBmK/pCkzMYxG5CKrq5kvCR4o20yo5WsnD5TjA//r++8u8iyH/xN522xqIbOi 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 pKspbVDMIKMYnG0K5I32hPSZ41qc5gGCLgJR+4EklwsHgNkoy/31DPs1EfqEyasTbCZkf92531dL S5WyzVqyntIGxQxDilLR8PVDf2NXlEdcUWz2ADthxORg67v2kb69fOWRplQ26bS7jHebiyCXjYmL LzYwOwSZamfM/KSutqBLNa1/ZvhTFDUNMD8cj3i+eVEQVPWVJf390prgRhYLSYPME5rwgMTjjBDm Wn19fDv5pbiblYKP29KHEyOsdvmYocm4hKkHJDiTBw2si8YVFZzRwyX3GbPnhl1VRSysMuxwI/zd bNMbLe4z2acuq64dp5GHgSX9Tt+aKndnl7XYGrwWYLMI7WpZ9LbNREMXcsocZM6Nzqp8lXSBzEkA 5UI3ACEL2vSCwv9rXfj/WXcE0GXtV9sLoVdnOf6oP32437xuy0+bwQ4VNAS5EKW5ZgMXDR74y/DP WBh/DiIwrYdvJRyL4b3jKeLlBvREk61RDi9zbtRJyEyRthRYp3YuqxCFL7MO0mxk9TngftgCTGFT xG9KU3tBH6x2EVyALeBXOHGSLMe0xrlBnbzKyrMShVhZhqybo+2fo1haH1F5v1zZFNRqhjZlERjv QaJid0JUCR01yIJKq5QbVsnzjJw9GDdz9LjF8KHg7kzZZDV9nGmBMsMKrfnDGh2sI1JNQD27CDLj R6hnkf/GXJZTZ3VLFkF4Vuyx2btWCKHXY+rw06bGjGA0bbbOOJnj+0Zl1ToDJUVkC55tXa+kdkEK FKbOqbm1KrKiONU3FczchLLOBIOnYsf6v7Q7gyQNCmVuZHN0cmVhbQ0KZW5kb2JqDQoyMSAwIG9i ag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTAvQmFzZUZvbnQvQXJpYWwvRW5jb2RpbmcvSWRl bnRpdHktSC9EZXNjZW5kYW50Rm9udHMgMjIgMCBSL1RvVW5pY29kZSA2NTQgMCBSPj4NCmVuZG9i ag0KMjIgMCBvYmoNClsgMjMgMCBSXSANCmVuZG9iag0KMjMgMCBvYmoNCjw8L0Jhc2VGb250L0Fy aWFsL1N1YnR5cGUvQ0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9E VyAxMDAwL0NJRFN5c3RlbUluZm8gMjQgMCBSL0ZvbnREZXNjcmlwdG9yIDI1IDAgUi9XIDY1NiAw IFI+Pg0KZW5kb2JqDQoyNCAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3RyeShB ZG9iZSkgL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjI1IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNj cmlwdG9yL0ZvbnROYW1lL0FyaWFsL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDkwNS9E ZXNjZW50IC0yMTAvQ2FwSGVpZ2h0IDcyOC9BdmdXaWR0aCA0NDEvTWF4V2lkdGggMjY2NS9Gb250 V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDMzL1N0ZW1WIDQ0L0ZvbnRCQm94WyAtNjY1 IC0yMTAgMjAwMCA3MjhdIC9Gb250RmlsZTIgNjU1IDAgUj4+DQplbmRvYmoNCjI2IDAgb2JqDQo8 PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jlc291cmNlczw8L0ZvbnQ8PC9GMyAxMCAwIFIvRjIg OCAwIFIvRjEgNiAwIFIvRjcgMzAgMCBSPj4vRXh0R1N0YXRlPDwvR1MyOCAyOCAwIFIvR1MyOSAy OSAwIFI+Pi9YT2JqZWN0PDwvSW1hZ2U1IDUgMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1hZ2VC L0ltYWdlQy9JbWFnZUldID4+L01lZGlhQm94WyAwIDAgNTk1LjMyIDg0MS45Ml0gL0NvbnRlbnRz IDI3IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCPj4v VGFicy9TL1N0cnVjdFBhcmVudHMgMj4+DQplbmRvYmoNCjI3IDAgb2JqDQo8PC9GaWx0ZXIvRmxh dGVEZWNvZGUvTGVuZ3RoIDkyMTI+Pg0Kc3RyZWFtDQp4nO1d224kuZF9H2D+oR5Vi1FOkknmZWEY KEkptYQuqUbVrXWPZx+MhXewD15j7S/0N/iHlkEmr8kslqIie3qB9cAzqqq8kBFkMOLEbfPjYfO7 3/24v32829S///3m5u52c/Pp++9+vG82jFW12Hz6z++/Y5ta/cM2vOOV7DYdF5VUv/xFXfdw5P3m 179//129+dV8HKaPD99/98erzfbfN5+evv9uVM/cjPvbzSZ4IQteaF/R1E2lHsFZb18RPyS6tudV 3y1fO3shn174P99/d11XNfyP1UO/6RivhNjIQVYN38i+avvN3/78/Xf/9i+b/1av67uq5vqdoq1a uellVUtNBcE3/wFUePzLn379s9zc/XXz0/Ra9QopK9myzaCIJdWMRFd1zaateTV0wdPD8TV+fPpm fW8b3RoOzDCKb9qISebOduAVM0SpK6aGof4tzL/l5m+/5r591Rx73LL+6vluK64+b69Zd3Xcdlef tte8v3p93PL6anfcDorK15xd7bacX33cXvdXj/stY1ejuvQZrm3NT6/6AY87uO0Y8EXR6J0zZDya ImuGivNwjjHjf8rwXmBoq6iZ7oGJvH0La+L95C0NUxIPs654ixjm7qPi8uP2urvaj8/bXq0Apph6 q/56hL9e4Bf4fgN/fFH/bvXHz9uGw2rpFO97c/8tfKX/Cm5Sjzjs4JKdvvUj/LXlwjxOv2uEX+F9 43QZfHcHf95dsJIyhGKDmjeeUCV+trT87NTdiFECIT1LJzJO3Ju+V/S1rIYvXx3bdhX8pi81Vx00 u/ylMw6rjxv7njHDYLj1BR4FrN3vpkdfg6xRl+iH6O+4+pnD0yr4VKtP9v//Gl1jv5W0K4Pzvuo6 NM1LK6OjXRmtGixG3o+GG4qUHy1bHhxDPM++6B2437l9rRfRE/w++gWin3PzGnH71j7WLJzRiBLi TazO7AFPgxKremJWNUriIDj1B6DpQQvET47amsaj33THEa7SLPysLoz5decuiwW8ldoTe4FBJaaq W/QPE1fhF/MIavE8VGJA06zE2YGWs7KrGswC/GC59ODErN6X48btR/P51QryjbtmQ0xwpfbzC6by 0R3Xj1bW32nNoL86TpqBO1n02aCm0zQnlyLxBNVR3/T4CZaWFKuJ1xSrZI9kxPgAFI5VtpGWnF1X Deqri4aZCpuDPlb0Wp+rnONRLxstyox2sd/5ZaO3hL6hoj5iOtATsdOk3qVS27zo4Xxwm/DBbVVP OnNkE+86ASNFD/iaejitkXLfCDt7dQN+NEezAR6d9eTVtBe3szLa+CVGeU5hbpqq/3b2CG9kxSV+ OI/OmjEHlz5359bOpPwYqeQOrfGoNlZHvYv4IAE9oqLw/OxitGeXkFWPQUn22rwcn2arN1Qrjmap T1zJHROKAcsww6hvvHEm53TcZNAK+3p36+HVqb9Wt7n1SrkaxTGn2fTR3rRjpd6DbVspMqIpX1wh nHiF1FWNwV3MCtG0PQD9P1pM48XpmInU0xiI/kHr07tjYqFG0MV0sbGfjMn6aG1k/SrDYb0ktKL1 pl4+BAuJmq11C8g7mlxFtqKg52W2NqJq1ueq3f4z48FsQuIzuqlhS2GnVuQAMUDNnVPkt2SB3iWL 4tLJwEmj70EoK5HpsCZyJQsYiKVMkYPE2D3nVYc55Pcem/Uq/d6q+BF/NCdvQBRKi9b3c5VRM+Mn gyjZ4/HZCDl3mM6OZqMwKWZOZ3OkMAU3uiM2Pp3n4IFDmJxu668OluCWN1d5HJtYIncDOCrRXCqu JmLPAetwDqtnv/UNWG/5fO8QeyTuuMwpLQ7e4Hka+SfG9cF2ri+gSJFzxMi+AeRoOHdj3WrJ/j4a pMhwzvKh5CeKDE2/Gd8qeBQ101rj8sUSo8g0Yoy/liin0fMk7VIfat7v6kh+Z6/0OHygtGpllhol lhrOQU6zyA1aXF4OQ9Vh3AfRtrhUoGlZ6f2chkv74BA7HG7Vs26pNw4HMYcmQYlVnBbuluruuluH VcYOXIQ+x9CnMh1jLlwhcILdOW32dS5IDwaK02Jz9MJRv9nvV486WIMyuJbaiy0AlEPTtch/WshI 9n3VrLRVrQ87Y+AsxjAs6acL/tO5pNYaTLqE5tCDFh4HeOi4hhuVK+OVMzx1i6uAFhaSPa8k5mAx QvV22rkZk+YILAcfesTv1wy/p5gZi+C9XxkKOW9Vr52DotYOieBKvRUDnpJFjtMiRrJrq27AclyT 9mdH+ZtHC/cuiwEKjXeVgxpLiCLDaAEm2bGqxgBhTr11gKom8c8L8jMDv48/Gc5Zrh3caXpMztnP lmsxePs0at9AItvN8Z/zClDjUINhNJKARWvAbwkflbN3yqdfyj5+6KR7w8uxhUOP2NPOh1ZrLFj6 FDcCLU4nW1nxVTQrFAKUDweXENTeTaHSdy+3o2Lk8+32mkmIz74kNDt+W99VUlEpet0lbt3Z84eK 9cnzLwkNSJ8/sEopzOuNf+A6WiZ6/mHb6dD5Ox0uryPnH9TmawBM4+xS/qSh83yoWn5ygvOFSAto Scnf8W5aXEaKthrY9O6PTiE7BEeQ9frtfJhRYi0G4HaMVfvI9d1tdPK8eY3/l6vjZPhZGRvI3BFQ VKmf5VBz9aIVAt4jQlBHs6hdJEX8itFZ0g/2dNKaOHWABOu1nRO++pct9TsGiAs/RcH5MiYGtASr mJzevWDzWO8M6dyVNdFAplT4/inEwq1wv60MIvb0YiNjdiuMiPFOL+dgQBMaQ+z9BaQzes3HtWYk 1JUJjXefA8edxXmPXsDsdz8YE5d2JF2f0nY0wcfECrGs2nY24VBLjUM0nILrIDQtWb6QB5AZ0GTG dPL3dEagBO8JAuw/b7twZwO66EyAfxqaEHs2u6pJhlOSbw0xCqx2W7OGEdyg0MoFnRryg5CQBaRT atnxDOmUoAG+vJqvQRPcfNnKq43OqdTq4JRUqfMrH/dTSHcf5lu+bEBhvAO1fvOmbh6VLsmvPuiM zdvPW2HSNF8uCYnpUlWS1wyyYQMynEF/YpyQO1WSeJ0Qo1vga8bYsib1w/uLlrARLf/urTTU2KLR Ur2Dnlo6MtZoLQ87NX2iHZNgE3O6XNswZgeUOqVxd58iF1o/91lrbubUajOYnhdMt7jiiOE5cJRj doZJwBgLni4NYsNJdEaMpHZqwDJ8C+PI1glBZ20DWT3o2Re5RIwdgf8c4485aJq/KatqWMIDPac8 vm0kyYNRI118nmZWAnlqpkXCw+nzd9H7NBf3N2l42fSABGfNZ+qciE3zwu1t/LANrBvruVsj0rOp ayjwgGZOcRHRhnYJcO1jXDyTC8QnX3kjPRTEdkmYVIhDBSxd8KcGbq8Zqrx3Kf27+LLD6L1sDzYt 3P/sBb6OY6KGKlrIEUGTkBw56ap2wA/HIVFJ6YWdY+eNkbqPLiI+44o2BgetTaHuZt03Q2cu20q9 Bz2cLz76/3gYb62b8N6hgeZwpPaL1NXQkNFwLpZoYV4xNNWAMY++ZbFkvIwmYHq6lFgAyEowPO3u HUJkgj6X41qOB5jDGMLMQ+iJvaN3fEJukuzwkysuYFpfgej7imNU/f9fwHjanb2AH+mLvfQDftyn D11gzG750AVur3Ho9kIfGNg5FfcbrVND9LwSaxhtAgVO5kE/0UmoOYda2JrV/QT/vTwAYmdAQP0b qR8eKtkpIqNHWyQpbdSnaIeVxkmLN4pWVAxjEk5OGmd9j5GZvoBfDcEREjhAprpouhhQmkMXSxqL 3pDCvkwKyMQISHEGG2jhVCH7qqGwj6zus3jK5BLHvUHqqT/hk6D03zsgrBxBQOw3HCAVDU2cIhNp EUoheSXXUAMFCqNbEPdC4nRVUwDT+22gjOYmFvm8N26cWx/3c1mVzHgCrFYazQUzKJIZiWJlydwM Vb0G1CaIbdqmwY0zEt9ax9WW11nhrsYVcjA6u9Hsk4iL0R4Kn238srYJnm0g0qMLQnevKBfnIpZO nNWQL4umYJHTxMYf7wAYfP84XSpe7jwvRDqbGAZrJByc188mtdgDJVwdBkH/x4OvGWdA93sHpH9y 3E+8aGGoEHG1Cq5RVSwNi7wmNjw4g1QJZO3Mk/suZ7eWN96QFwPW23Lw68CtDOrAHw7pnWjCFKsc 04aLCCbhtm+OgUFZTpeMorfozleMStx0/oGrpe4OTSUuoFmRt8SmYT1AySsEb4GM7ZT5cDgvsyTc Y0n9KCtev/ljtgHfJZpqRe4SG9S1gBA7JE64O45eKTKo6cGBnNpI9hWl14iGZXVXDfg5eBDA5Iob t7h3uvvjerIYIqGwQvCEHKB+Mno+xbVDiwI0Qw/uhPWCqpwc90jKx20QwJLki4+uLm+yCDWrfEzD Cfwgy2rySpw9wARo6hW5TAsTNAOHbDAs5GYCZXzphX8mbjCneE9pclMu4YKyTH0Uc73h0FMssoI2 WqmBRiho2O1MVlhR7Qsi5LE1ak40kBaFnmGRE7QhP03PwJj+NjiR5NwauGLvk3Kzso0+4Z21bcXw lClykBZJajr1H4z6fRYHX1w0iq/SNX6iVn6EPkewEykSnBbQaVqdtYUuaG9RmYUuKompF6qc11FG tVFLX8C2OG5OgTJrVIdVM9Q8w9KCWn9uG3AloYfzy9XbnxSl/gZhqf+lk5n/CnT+O9CdOusP2ga0 F4y1uNxpMa2mFTiclTjAEkyKC0ZzopQlcWJjp94q8ANNgpd/gL+CI7RYawRZvWESMaxdJ+kROt1d wL2MJDTn1qPHL52POrGmkj4i04k3Ba/6zLeyF504pKaHnCc0RYrtwmiB0Ub2OAR+vzObLgCqDB5m /BNnVvQdE9TUFLmyS4B1CRN/uYLflUgfrv5mxXm/kjRXWssg8PQp8pEWBG0kxwHxYTZPrkZ+VEFy Kues1ZwbSP5p4hZTvd3CUKlgwjgiBSbGLtbxSaBJUWQZLbLZiBaHr5v9Abhztq9BBrXe2QBQlyHz FlZEYqeaLU4t/aI9GQLYgTtz1eAVXteQ+YCmWpG7xNijqHH4+tncdWCiOSzDkqE6xit0HtmD0+fg +SqkPofvB4dAfphk9n68zVzncv2+pNJBr57gwI6im45BGS5/AKfLMfPIY1plLwQUaJVRwztILses MSsZaQelxFrLBX5Ud9uwvmGQaweH6S4plWbKti+GESzACq4G6ldAFdTB3FxAjaIcIEan+YBD0c+R A37/7Z7iEvjjezkYdm2YiXNT2W0V/QpLniIbiZFt3uAQ+PexMQaQbvIdh6IGG+4USKsmzRNk8xp2 PBTv7ig1dEif+w7AEc4sarEwNb5C86m4nojxedbj/AjvW0/6YgctnC5kvHyEL9Qlzx3V+YqoS5Ey 715ttlflydW2hkbAOM5p8OJWvDkRp/L7tPqBrHgr8GMsLn1ixwZ0qsKc3JrlXjraKMl39hZ30kpX 08uIwK+FFDFpsDMsOYpsI3aPKPsLhWtrtmmnxmFJDnyJtZUjBGMN2gjJnWMe/4RcdXn1tGg4TEAE /OICLr4SGAG1jxS50FQrcpfWGwDHJwqv/D9aZ+R9TahPYFgrxF9CebWW4VlCXQqhG0BVQQ8n54Nb CbSFwtDigqGWNl1HC77zfsCBy14C+njUQo2cxQzCDFzoDYV/PEwove9ha1UZX0Isi/GumT0wVdpC k6/IZiQ2n0tc4tBeYY3jvUOh0fkkNq5USFSPuuNUmfrh86vOUdPpakGZ6jvaytuyF/ixFgmKAoAX CNr263TX7WjRKd5yO86poqrDf7yrLtPBLY5+DexDYxtqebSbrgQVzB+hY1CTljpuVbSgUEdzmtkD NvhWqSyzQtpzj/EYWdKR5hI7Mk9oLuR1iWoWz7G4ZmihMC4722LYVeGNToEzAqczpaC9+/5t9Fwp 3D7jSqBPMssVX1060SWXWjeNYSzBzpddiXXdBbuTqWtq+rpOoNaEhC8ynRav4pJNTY2DVNV94FXI dUVxfiLTKM1SSDex2i25KuOyzkEcga9iHtJeuyKJkWmdJR/OuEhsWoSEC2kbEAfUdnR1IlpjZEsl OB1FC31Xo7RSvTf0NrFnQbJRRt/UwHh3grb21mo6Cb9Eec5xy14bJJKiBMQClGtrJiRxkb20SApv BqvBEBWceHCnbnS6LuBheUlLjG3pEiDRTAugALiojw8OjqM2GQadshQNqMh2YoilEbad8B9n594y gBLFvHloYnezewIFJm2P7gUp7OI4OXyVUOFoWiWS9sQGNO9ts9+gm3EGZRxzxW9sjtzG2bhePaTG eqHHJo/HW6QVbYQY57xyDTm+Mmj3y9Xb1BXPac0rxeuFsywSmDaei7MWyqmYdweKaSjTnIapi4La mJZsWH8AeGpvmjv17+KFm0rztKfQ5MIb4/BLpyt8dNw1CTlm0D+vkH7DudQnb0imIotog7I4Y9W5 Fal6lKW9AAfUAtUFe79lTdD5S6Mr0MgB4nbUb1IJNPd90Ovhksj3XJEgjp9BkcqEpZigNvLZOl1P ax9NHa1wdX92QUOw686m050sBJO1hPNh8zGsW6xLQY1YsK4D/QBNoCIjaW0vyGhAwYvnN+JwjsmF LIeZKvdxBeWNDyCF0bMlb54FxjZ6ND79/jlY1qlFmSulZPNi9i55P6nRuooNWg8QpERF/PmWoLVX IbGtxoDZdFsi9NNq8ehxZmpx1bSgR6LnXOQNrVHJOmEtit9QXGnNcXSROT4L3J9Aqxj1ArrPoUlQ YtVAa6yytkepUFSc8tH92k54M+UCx7QjtskeuNG6wO6JXhvQZhqWFkWW0drM0HG9wygtzlAbXZ7F rP/DebGYYVJjUNItsL/nal2EqlrNThmb5MxsBygUhqZSkZu0BjqTLVy/Yo7cQqNTjGOskAb7aHOw Ul2+X1GV54xDzgWajkV+01r7TEKv7ksiFqeAQat9zHKPrjNdGl6cGI4SMYwX3G5o7zH3G9rbauQ1 u/oLiGHR4xszweDU90TIdCB9NPthlWXIBeSMoGdUXIa0MRbqxSAlkcswFfvXaaSraQ4RiZbroG2E OvavXRgYLML7SJkOvE4LMu1LUX4Rx3Y1cJigiVZkLm0wBAOHEr4DTM4hGwRFM5P7aL2xxNV5egii w06gSGdifA28TJj1sND7fJYPecYZPUud9Y515/RYPMmXBP4aGfBoYhWZSoy18b7ChEYiwl/PVaYX Tju7EIwvJjntJuG5zmEHxXiHDk2qIkeRUFEWf+cQobnGIJGYSXaQTFRrbA1WE6MFSjx3a2g3rCa2 keH6dSiKMv9m7WimW2s7ynPejDJEFt7cdYoAZ7+ZVvdUBvo6rEFpUQsEkl11Pn1QasXCi0VTLcQC 2Xert0BapTDt34Zhw2Wv25S2PZyw/j3xIINjMry9j27vim7N6d52YFWLYaMOwX+AyPxhajdj3MVz X9L7RpkQE0qdNEM4zHMY2eNolFnqlky9xJGpPNaBfKzdUKGaBh0cyH4boVGnQtf3o1NpX5wduOhs DAI0rSrlcic/OuPEW5FBSS+jMwUlgF5jfDMXeW2DgV26nr4oqI6nkS/tW1jQmC/kiGQ1aC1YjszR movHw8HzhB3PGNspR5vo1TTZNPyMunrp+KFzcktFz/lmZDX9ZhRgCeMK64w+ZGP/6Mh6RuGmax+x ex1VV/LB1TtX0dJup/ChS9kUARztAu29nWTxILB4PtvRBNbwwvIZ8s6KufdI20A5n3vi2iBedZaV 6oYGY4L4QpRBfrEXbXd57M1YlXH0gY+pmUQm9Uz7Bpq1omda3mCMfIO1UMEKI8yCBgvGVI8zF3I2 /sIe8OfLDz6fZ/ZbCtY/7UzCha9KQsxN6GvXSTyFytzk5NyULoATy82c5An3U+/K1QTRrC6KwKCj idDL7EQXMXsS376d3uSTnndJdyXyI1JIBrYEmpBlpjf0TLeRs+8b6nkniUXlkrPJ5DGczdSFIsjU zGO9tnaQBPFRGH7RTYHXkOlhIj6DjKy7GD1Ou0MWwtQunWvfQYQadq7ldSrI16nQ1QEx9YyXC4nn QOUbEz6TcSgkhdGmxc9at/gzwoiab1zoNYolRplxkpxxSD/Ue/k2pVPou8an+EzJVMHQkVI6us01 cnNt3daxR0XDoG02lh5l1rX0rGsgpuur8I5amW6V8S8vmEGwhJb6rxqTSJ9NaW1+ffVzYPmpX96M Z9hjNpehdVn1QyubF7HNhbe8Y89dSquVTEZ1O8MYUnNGhVlv1IMVTSUvGGxZLCAx61OEVf/B2DTv EAseJ5wK+p0ojOlUKqPkmwMgX1+OTfUi0uT2Vc7qlgH6hKZWmbP0SDtrcUj7eYGU1FtHKhk/4Aet K1L8wWngTm3fvW4jQzIogqojqF+McO9n2F5QtfkwFTZnbYjnX58uRRMkgZ+Mf7jOI+7evLaXpiXY TZeHhzj5N25xSW8Uy1aCaEOzqbwP6L04rEZh3GfHE/ulV9FrPlzDiMgprKCJNVXbocfjpbc9PWzd BL146ck3yKr/lsg3dBWnIF9is1ZOL81XaPYB50F6CSzY6eLp10MiXMxB/MFaUi5qfibFVpAz6qBV au83wzkJtnp/AedcfbV7K5zjqm1BzW5bCHeh4C2BBCfbEnP5zekdf7WsUI4/lACPUIagEJ1TWRUj k6tccX/vZNS3eJPxB7c/U2ffYm5RUOnJ7DaT8LVkksVofEZb8JP96hpDq3cOlovlFUfuCZPDUDWY xLdTK47c1OSAiaCHml3+56rOQbEZX2IxKYJU8g8dvRLugrO/yoIUHeDkaMKV1yO5L08ODdhGK0rA FCff5UySN7dE3sYgbziJLbjdhvmUSX5xso7mjts+aFNND6l1ut4Zmpxl1pN79GTfgQb7m2RDnh2e lHJVR8UkNRCDMJSNKZoSOQVN5fe30d61AoLTQ19xND3LvCf3ksmeww0r8n6mNbgidB4k9eCdC2yK hH4EleiAQ1/6YTpP7Pb+2eEgpeKRl/JatOCdQROwzGxyz5rslJq0VuuqWE3dJy0ZMuBVRp0Epwe9 m74eKibxky8zityPJrsaIJCvwajJHCTHcJQI7PDzyNg3G4cenGhQag+T2BOTCzNZdvOqS++tKNqN WmeZlRGKBVkaqBwYVDcGnU30l9BCY21eXPUrQEPT6mpFNWB2wlJg1ilT0CE7N3o9jicqwFw6u67X 1gp2duV9Tu4Yk1KLpkvrEny0n8p60zmQv8fj1DWrs02wFjRlNCnKbCP3eknZQFDNmmzz0sSoxPud s3kWgtusdfwl6Yyl5aFHXX3JrAzCc+90qcDNGfRy/xD95AVsUKKQHtuBrmh4kpeXB7kzSIquarFt 7eaIx3UImptqrTZF/SU4wfUVKwTFsAE/oSLxG3IkVwoGmgeiDsOjieGgJiGvoUQJelj7m9h0/vKj WRrWxZJudGNAx4UJ3hlVfczudVtqKBJfuxSZCSUIeXhEB9Xd0JR0hY5vM1LMlFKmHvGgPdjoEZe3 Dz0s3Wirlqy6RrZxaxa86YNqt+ScaCD1+oLZlTlBD8g2NQ48PuPoD0v6mFa956sY176T07IsMXU0 fgMjAIQEE3jilRlND79CEatVVJsGCRcuZJ9L1kGyCiL1Y7+97qcc9HErr543h+0147pQ+esRcn+e fWb6ZWlys6F3rBIdfuhlGiNROr68HtR/VhJS9ECVUs45RjP8YAW/b0RpektuXCStkxwu089pQtav nQ3tvA9+dPZTIO3i4z+o0pdp63xx9kUL+BeaSmWO0kMSdQ0bBhOre9w96U56k7fP1ScIs7oitXVS F3yUgHPS+DMsyPKaYXjGg6Cf7I3ZeSvfxCuxkt+vZXAfmnxlVpPDGGIQVYcRNAmrfeip8+3vLO3X iuRteTVI/AzK1CZHBUTfw5Avpnbi1HSZtF8iRfvVqXJPQSOosGYICLxMMvsMVycXiTq6E00NW5UP DowkOzcD5H+a0BTf9nEFd79o8dMpLkRBjpCIvgFQB7EQHaldzptvFPRgvH6no858jFpsLvqSMkmd 3SCWdLl2jQl0ZK6ptZVGwZlvckJ8FkewB9ZYER2eyOUFQW7zC2UcCyxeObpY0/EPzqxzoacBJ73z 68We1fTbsYE65A1+RmXqk9v5ECqG8pGabaZlvLfPxyTGNxWR5Bk1HSxz9BzK9CY3t0XbVvW6tUaP DhrZHWK1KIl2DLPQfjJFR63Q/DiBKnB+r1C3gHd4QpSZRh6mJNoahvx1mDbZhupXaxwmpobdbN5f E6QpmKgmX1pmb4otacjzKfxhdBnlTmZmwgqCdWIE7L17vQ+iDXSdFbIkdE0sNAfKq4U8zklIASmy K6+WLNRw2SKZ9PxA6aFXT0QDyCiaREffps4b3kHVr2mNWi3to4P0vUtqBRexUcKxcyovUXLgTIge qj1dsESDeiNLyvMs0zkyJM359GjMPdCEX+lT0XRmIXquZb6Qw19C8JWAYoHEbxbAeNG0VYPyc2/1 gaG0kjsPus87CrxviGkdWChZMoRjPIdA9JALeIFWObMkvVWujtkWI7ysBWBPpn1ibn2YPHQmG5be AmgZxIagh18mNb29q/TfHiOPpn7hgYn1HEZv7SIETgtjLXaDImXRibheEgq4u0WHn2iZKfRmMGuq GlUI+VRmWZJmafp6vEYMS7pl0bOCaaQaO70yK+gt5LqD5l7vH6vTRtxi1yInCSc6eps4CNEOeg+v AQoB5IydVpkF9PZuzSBq7AIWPMe8yNfNiZB/g0scRndD2KIwUyfc+1XP3ILmTdbTe+/24n4MmF85 2ycuP+7mMrqHmtK8T96Bu3HLaeOwMQ9D7wxJqG0PobvEohlWXlzk5rGuWIE5qy9YXMZh41kVWy9p j7FsMFmwBFcIQVd2Cpoud64wvd0O6vM5R9J1O5FsYTPQByRyMJTREy0vVnJDuRnqqsboMEt1oq9P 1EvXsQcmqdG3Kra5o2G0/GGMKtCOawJwoFoziSdEmWnkVnTTi4pjtJ0TTJtV5D65c4K4xikD2Ymq MRMcHZ81XmIZHPYTPMyBeWk7sIOyCtSyicvcZFTLQIKtBIChyV5eIuTBJzpbC6tkLi8RZruvJVyw uaXafFvH6YieUZn65MhI0/Gqw+qXJ6l/4gCPXBofrNP+eHh0EV/WFAg3UaRxTkmr71I4rZ3u88b3 K0aai36oLqBvcS205MgT5OrWGG3gYS7x8oU+MplmaYgOMOQtgFMWigmkLTo9HwNZuwpbGwmObjSt ynwlh7kAmUOhnylfyTOiBJjj6OHRBxNynRWCHtA56913lXFfGTDR6pG+iM0+WO8PTmYtaxVWjq5R flwOZHzKLHlyELGREodCI0QZ+jC6n35U/N4HvmN6o1aCwx5NkjL7yIHHRgw4vPprss/HPa4cWyVq fSWaKGUGksOWjRA4lPsSBup7dzeOgy7dIEhzv/lsocAXx1FffoM+Kph14P9Ek6PMOnpQsOlx6Pgl rDt4+RdCKDmzfFL7tIXwszUgRoM9juSRC1PbFDRRygykB8oajkOg9X7xJcp9LGkaV71KYq7khtDI wZcJTQ9uKXURhZ46BOlhckfENcu8p+KfMRKVdK23JniMUh6n0syfEo0x7EQRGVCfJ+Pc7Ev7Kbbr w3b3Vnc1ptqjDZZ8XMOA7vklVCYHzRvI4kcPqLxE6cE1znBY8cEtnP2s/GZWUXJNWdaoAi8lfiZl qtODaqBxY457PNUz9XBzdVHNZXdbX8BstzoqKtR9jcQTpcjAjh4JqwccgnshAw+2ol3JHBlzbboD cBO+CwHOVexKqauZoGlV5is9ElY3ODT24BLdvFaUCbnNceUcs/I8Vxb9xuSQNIsmSpmB5LgOH9R9 6I2pW8zeaBeuzLl9b6IKKYECnOmyHfWIfU4iGcgBgAZ2GnryZUaRIzh84DiwUEu3ndNA90vFS2+n SPXA+a5NlIMtQrP3PvsV4tlbKC2JnmSZIeSIDO9bHPwXe/BsaYa5mPPlhb64v4zH3RdbOJmlELdM Ne7D44s3L6zRn5gvBj13CVPLnYSnQZNn+Sr1FE9dXzzJC/rj4zowPtRIEPihlhctORbF+3olyLND wi4LSRjcFPtH7S7eXx22sPxXcK+JBj+0Mg3JERWublhnaZJb1rzluEbKv1y9+cCGdRx2TdPAlfgh bulHJCA5BD2iMoPJjXgu23W6LfdoczUvesQA964xULT9tTBQtSpXEUQ9vZ3R6OqBa4yVXtVuGPS8 WmOsSC20m6UBTjezwY70nLcj1YnFt9eykue/ndwvw5T5ttL6Rx7ES5RSk7cjPeftyLN18e0dtwrL 7O12AP8LsOppMg0KZW5kc3RyZWFtDQplbmRvYmoNCjI4IDAgb2JqDQo8PC9UeXBlL0V4dEdTdGF0 ZS9CTS9Ob3JtYWwvY2EgMT4+DQplbmRvYmoNCjI5IDAgb2JqDQo8PC9UeXBlL0V4dEdTdGF0ZS9C TS9Ob3JtYWwvQ0EgMT4+DQplbmRvYmoNCjMwIDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9U cnVlVHlwZS9OYW1lL0Y3L0Jhc2VGb250L1RpbWVzIzIwTmV3IzIwUm9tYW4vRW5jb2RpbmcvV2lu QW5zaUVuY29kaW5nL0ZvbnREZXNjcmlwdG9yIDMxIDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIg MzIvV2lkdGhzIDY2NSAwIFI+Pg0KZW5kb2JqDQozMSAwIG9iag0KPDwvVHlwZS9Gb250RGVzY3Jp cHRvci9Gb250TmFtZS9UaW1lcyMyME5ldyMyMFJvbWFuL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAv QXNjZW50IDg5MS9EZXNjZW50IC0yMTYvQ2FwSGVpZ2h0IDY5My9BdmdXaWR0aCA0MDEvTWF4V2lk dGggMjU2OC9Gb250V2VpZ2h0IDQwMC9YSGVpZ2h0IDI1MC9MZWFkaW5nIDQyL1N0ZW1WIDQwL0Zv bnRCQm94WyAtNTY4IC0yMTYgMjAwMCA2OTNdID4+DQplbmRvYmoNCjMyIDAgb2JqDQo8PC9BdXRo b3IoYW5kcmVzKSAvQ3JlYXRvcij+/wBNAGkAYwByAG8AcwBvAGYAdACuACAAVwBvAHIAZAAgADIA MAAxADApIC9DcmVhdGlvbkRhdGUoRDoyMDE1MDIwMzA5NDUyOCswMScwMCcpIC9Nb2REYXRlKEQ6 MjAxNTAyMDMwOTQ1MjgrMDEnMDAnKSAvUHJvZHVjZXIo/v8ATQBpAGMAcgBvAHMAbwBmAHQArgAg AFcAbwByAGQAIAAyADAAMQAwKSA+Pg0KZW5kb2JqDQo0MCAwIG9iag0KPDwvVHlwZS9PYmpTdG0v TiA1MDAvRmlyc3QgNDcyNS9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDUwMjM+Pg0Kc3RyZWFt DQp4nJ1dy8pmyXHcG/wO3xv0yUvdQGhnb7wZJO+MV0YIgw1CSAu/vSPqxK+F3TOjDpB0ar4+lXWy KiIzK9Qp1f48n47PiE/nJ578dH1i1Kf7k09/enxyjE/PTz3z0+tTY316f/rBvw/++HzGg9nXwpj1 GfmZMT6wMOf6jP6swCvjsxb//LMTr6zPXnhlf07ilfM563zmg9UrMBnPjdn4mqjxgcmIvT6zP5GF 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 8i8+hKMIhiMJhqMJhiMKhqMKhiMLhqMLhiMMhqMMhiMNhqMNhiMOhqMOhiMPhqMPhiMQhqMQhiMR hqMRhiMShqMShiMThqMThiMUhqMUhiMVhqMVhiMWhqMWhiMXhqMXhiMYhqMYhiMZhqMZhiMahqMa hiMbhqMbhiMchqMchiMdhqMdhiMehqMehiMfhqMfhiMghqMghiMhhqMhhiMihqMihiMjhqMjhiMk hqMkhiMlhqMlhiMmhqMmhiMnhqMnhiMohqMopqMopqMopqMopqMopqMopqMopqMopqMopqMopqMo pqMo5s8oivOXJhUbr3/H1uv7yPdR76Pfx3gf832s96F55z7G8z5eK+O1Ml4r47UyXivjtTJeK+O1 Ml4r87UyXyvztTJfK/O1Ml8r87UyXyvztTJfK+u1sl4r67WyXivrtbJeK+u1sl4r67WyXiv7tbJf K/u1sl8r+7WyXyv7tbJfK/u1sl8r57VyXivntXJeK+e1cl4r57VyXivntXJeK+ypfp+hZ+pZerae Q8+p59Jz6yl7IXsheyF7IXsheyF7IXsheyF7IXspeyl7KXspeyl7KXspeyl7KXspeyV7JXsleyV7 JXsleyV7JXsCNfuk77NlTygPwTyE8xDQQ0gPQT2E9RDYQ2gPwT2E9xDgQ4gPQT6E+RDoQ6gPwT6E +xDwQ8gPQT+E/RD4Q+gPwT+E/xABQgwIUSDEgRAJQiwI0SDEgxARQkwIUSHEhRAZQmwI0SHEhxAh QowIUSLEiRApQqwI0SLEixAxQswIUSPEjRA5QuwI0SPEjxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI 8SPFjxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI8SPF jxQ/UvxI8SPFjxQ/UvxI8SPFjxQ/UvxI8SPFj3z58YvJ55//849//fMfvpeBvp/pfn2eKpl3j42J 7yb/nWny+e5i+RL8Z3OrM6mdScOZNJ1Jy5m0nUnHmRTWQX0VTj846/sI/LVZFirCgkVYuAgLGGEh IyxohIWNtLCRFjbSwkZa2EgLG2lhIy1spIWNtLCRFjbKC/AWNsrCRlnYKAsbZWGjLGyUhY2ysFEW NtrCRlvY6Ps/fNbWqbV1am2dWlun1taptXVqwzq1YZ3asBg9LEYPr0C0sDEsbAwLG8PCxrCwMS1s TAsb08LGtLAxLWxM7/ZgYWNa2JgWNqaFjWVhY1nYWBY2loWNZWFjWdhY3tXSwsaysLEsbGwLG9vC xrawsS1sbAsb28LGtrCxPd3Bwsa2sHEsbBwLG8fCxrGwcSxsHAsbx8LGsbBxPFHKVKU8WerxdKnH E6YeT5l6PGnq8bSpxxOnHk+dejx56vFQ4oqXHkpM+dLUL00B01QwTQnT1DBNEdNTMcOTMcPTMcMT MsNTMsOTMsPTMsMTM8NTM8OTM8PTM8MTNMNTNMOTNMPTNMMTNcNTNcOTNcPTNcMTNsNTNsOTNsPT Nv/W6PKj08z/xsxDiaeihiejhqejhiekhqekhielhqelhiemhqemhienhqenhieohqeohiephqep hieqhqeqhierhqerhieshqeshiethqethieuhqeuhievhqevhiewhqewhiexhqexhieyhqeyhiez hqezhie0hqe0hie1hqe1hie2hqe2hie3hqe3hie4hqe4hie5hqe5hie6hqe6hie7hqe7hie8hqe8 hie9hqe9pqe9pqe9pqe9pqe9pqe9pqe9pqe9pqe9pqe9pqe9pqe95s9or7/8l4lT/QCpfoBUP0Cq HyDVD5DqB0j1A6T6AVL9AKl+gFQ/QKofINUPkOoHSPUDpPoBUv0AqX6AVD9Aqh8g1Q+Q6gdI9QOk +gFS/QCpfoBUP0CqHyDVD5DqB0j1A6T6AVL9AKl+gFQ/QKofINUPkOoHSPUDpPoBUv0AqX6AVD9A qh+A/19K7zP0TD1Lz9Zz6Dn1XHpuPWVP/QClfoBSP0CpH6DUD1DqByj1A5T6AUr9ABWyp36AUj9A qR+g1A9Q6gco9QOU+gFK/QClfoBSP0CpH6DUD1DqByj1A5T6AUr9AKV+gFI/QKkfoNQPUOoHKPUD lPoBSv0ApX6AUj9AqR+g1A9Q6pcp9cuU+mVK/TKlfplSv0ypX6aG7IkfJX6U+FHiR4kfJX6U+FHi R4kfJX6U+FHiR4kfJX6U+FHiR4kfJX6U+FHiR4kfJX6U+FHiR4kfJX6U+FHiR4kfJX6U+FHiR4kf JX6U+FHiR4kfJX6U+FHiR4kfJX6U+FHiR4sfLX60+NHiR4sfLX60+NHiR4sfLX60+NHiR4sfLX60 +NHiR4sfLX50fDUhyp740fnVlSh74keLHy1+tPjR4keLHy1+tPjR4kfXV5uj7IkfLX60+NHiR381 SYofLX70V9fkV9vk3/omZe+rc/KrdfKrd/KreVL8aPGjxY8WP1r86PHViCl74keLHy1+tPjR4keL H/3yw8hU389u/fLr5yaplPk//TW/MqmdScOZNJ1Jy5m0nUnHmfRVvfzgrLBmfb9/6tdmWagICxZh 4SIsYISFjLCgERY20sJGWthICxtpYSMtbKSFjbSwkRY20sJGWtgoCxtlYaMsbJSFjbKwURY2ysJG WdgoCxtlYaMtbLSFjbaw0V6lYWGjLWy0hY22sNEWNtrCxrCwMSxsDAsbw8LG8MpQCxvDwsawsDEs bAwLG9PCxrSwMS1sTAsb08LG9O4oFjamhY1pYWNa2FgWNpaFjWVhY1nYWBY2loWN5V1gLWwsCxvr /2HjfwHmlT1JDQplbmRzdHJlYW0NCmVuZG9iag0KNTQzIDAgb2JqDQo8PC9UeXBlL09ialN0bS9O IDExOS9GaXJzdCAxMDQ1L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjUwNT4+DQpzdHJlYW0N Cnic7ZndihxHEkbvDX6HeoOu+MnIKjCGZW2zi7EQkmEvjC7GUq8kLM2Y8Qjst9+I7lOysLVmibsF wcxEdUzm19FV34msyh6uy7oM9/zNn7HIumWMRUIzzkUlMm6Lzhq2L6Y5bqyLzRw3ZHHLcUMX33Lc sByT40prr3FjCa9xscy1xs1ljhq3LZvUuH3ZIsfFuuyS40KWfea4fG9ZNQeGVUE5MkeJ2MiDLFH2 ymSN6pWZi9hamS0PRmX2Rbz0s2bxnDGmLDK0Mqk8ZmVSOawyqRxbZVJ5VvUzledemVTeRmVSeV8r k8p7VjuyJl0lM5vkQZ2bTfNcaWUsD6rmzRfVqjnVVavmPEdqVfOWJ9ar5i3PrFfN277oqJpznNan HHsqR9W8p3JUzXsqz6o5z63Oqjmr1K1q3lN5q5r3VN6r5n1b8qxUJi/amjVHvp9J1hyr5MGsjOb1 1MpYHmyV8cXMKjPyYK9MLOZembnYWCuTypdLu6ZyZM31a5E1h6Ty1Mqk8pyVSeXNKpPK21aZVN69 Mqm875WZi6+jMtuS160yex5UzanlWjVrWq08GKrlucpYHlTN6Uj3qjmz7lVzWsfLzKGpXJ87NJWj atZUnlVz1uSzarZU3qpmKxdXzZbKe9VsqbxXzXUV16rZ0pRr1WxzGVI1W/pWq2bb86BqruthVbNL HlTNXixVzV6AVM0F3Kiayw11zcPL7lVzQpfGXa/kzAtCe/ksM+PiocwkeGmL/ARFz141J4Jz5MmO ZHCWf7LSWWc2P8ycWVt+llkXIt90W6NOfTF4cV1CN8p1iYR4vvzii9Pji/S6PDk9PT0+ff/bz+fT 04f7d88fvn5zfnv69ofUeLacHr9MZ9aoL7/8/LP/aZa0ZmlrlrVmeWvWaM2K1qzZmrW1Zu2dWXvL G3vLG3vLG3vLG3vLG3vLG3vLG3vLG3vLG3vLG7K2zCFryx15F9Gb1vKHrC2D5IrXm9ayiKwtj+Rt WG9azyXSc4n0XCI9l0jPJdJzifRcIj2XSM8l0nOJ9FyiPZdozyXac4n2XKI9l2jPJdpzifZcoj2X aM8l1nOJ9VxiPZdYzyXWc4n1XGI9l1jPJdZzifVc4j2XeM8l3nOJ91ziPZd4zyXec4n3XOI9l3jP JaPnktFzyei5ZPRcMnouGT2XjJ5LRs8lo+eS0XNJ9FwSPZdEzyXRc0n0XBI9l0TPJdFzSfRcEj2X zJ5LZs8ls+eS2XPJ7Llk9lwyey6ZPZfMnktmzyW9jVbp7bRKb6tVenut0ttsld5uq/S2W6W33yr/ ZcPV4q9m1ZdV+e+MQZzEjbhf41yJQlSiEZ2I3kRvojfRm+ht6G3obeht6G3obeht6G3obeht6O3o 7ejt6O3o7ejt6O3o7ejt6O1Xvfre6RqFqEQjOnEQgziJGxE9QU/QE/QEPUFP0BP0BD1BT9BT9BQ9 RU/RU/QUPUVP0VP0FD1Dz9Az9Aw9Q8/QM/QMPUPP0HP0HD1Hz9FxdBwdR8fRcXQGOgOdgc6groHe QG+gN9Ab6A30Ar1AL9AL9AI9uBhwMeBiwMWAiwEXAy4GXAy4GHAx4GLAxYCLARcDLgZcDLgYcDHg YsDFgIsBFwMuBlwMuBhwMeBiwMWAiwEXAy4GXAy4GHAx4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi 4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLgIuAi4CLg IuAi4CLgor6ovUb04CPgI+Aj4CPgI+Ajrnw0VoCPr/Z/PefjS/31lNScm/uHj03jnCi1K7UrTCss 6zjWJHo3TAbj4sr+s4V3/uCdvr8/n5/c3T2cnty9OX938/NyvTxV0fn28t/leqEu5cRxyt7/99H5 14dvz78thvQ3qXV793A+Pao/X9+++P3F9zn0x7tfT0/Pzx9O/zjfvDjfX49rznH8z9s3r2/PT1/d VIWV+NttKtw8vL675fX9w+t/3+TB5dW/7u5/+vHu7qfTV3fP373Nmi6ZX16dzw/Xk/rdzfP7uw9e //1V/v3g9Vevb97cvfwg8fTN6xfnD8Ze3yeHvby/eXv65vXLd/dnPuujd29/STssOFUuX9Rfrsfl m/r3Z/yH9xcQb2NlnIyR8bEfl/IajsX7Go6l9hqOhewaaE9Hd6fp0itpcXQmGgp9AHyhDljwzTVA FEDB01WFbk4zp5fTyunkNHL6OG2cLk4Tp4fTwungNHD6N+2b7k3zpnfTuuncNG76Nm2brk3TpmfT sunYNGxZV6IQlWhEJw5iECdxI6JHwxYattCwhYYtNGyhYQsNW2jYQsMWGrbQsIWGLTRsoWELDVto 2ELDFhq20LCFhi00bKFhCw1baNhCwxYattCwheYkmFoODGjYgssFmws+F4wuOF2wuuB1weyC2wW7 C34XDC84XrC84HnB9ILrBdsLvheMLzhfsL7gfcH8gvsF+wv+FwAQCBAQEBgQIPhzRB8sBC4EMAQy BDQENgQ4BDoEPAQ+BEAEQgREBEYESARKBEwETgRQBFIEVARWBFgEWgRcBF4UXhReFF4UXhReFF4U XhReFF4UXhReFF4UXhReFF4UXhReFF4UXhReFF4UXhReFF4UXhReFF4UXhReFF4UXhReFF4UXhRe FF4UXvRYzOFF4UXhReFF4UXhReFF4UXhRf24ObjoPVsuCw0wHHcCv98xMAkoFCgUKBQoFCgUKPTQ AQoFCgUKBQoFCgUKBQoFCgUCBQIFAgUCBQIFAgUCBQIFAgUCBQIFAgUCBQIFAgUCBQIFAgUCBQIF AgUCBQIFgj9H9IFCgUKBwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKA woDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwoDCgMKAwlhE 7LjxggNjETEWEWMRMbgxFhGDF4MXgxeDF4MXgxeDF4MXgxeDF4MXgxeDF4MXgxeDF4MXgxeDF4MX gxeDF4MXm8eNJnrwYvBi8GLwYvBi8GLwYvBi8GLwYvBi8GLwYvBi8GHwYfBh8GHw4fDh8OHw4fDh 8OHw4fDh8OHw4fDh8OHw4fDh8OHw4fDh8OHw4XLcmaMHH67HrTp68OHw4fDh8OHw4fDh8OHw4fDh dtz7owcfDh8OHw4ffjw5wIfDhx+PEsezxPuHCfSOx4njeeJ4oDieKODD4cPhw+HD4cOPdeV40oQP hw+HD4cPhw+HD7/ycV2k/vBY+v5x9tPW6qet1Uv8tLVK/LS1eo2ftlYv8f9ta/Xzz/4D+xs3aA0K ZW5kc3RyZWFtDQplbmRvYmoNCjY1NCAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0 aCAyMjQ+Pg0Kc3RyZWFtDQp4nF2QwWrDMAyG734KHdtDcdJdQ2BrGeSwbizbAzi2khkW2SjOIW8/ 2QsdTGCD/P+f+C196a4d+QT6jYPtMcHoyTEuYWWLMODkSdUVOG/T3pXbziYqLXC/LQnnjsagmgb0 u4hL4g0Ojy4MeFT6lR2ypwkOn5de+n6N8RtnpASValtwOMqgFxNvZkbQBTt1TnSftpMwf46PLSKc S1//hrHB4RKNRTY0oWoqqRaaZ6lWIbl/+k4No/0ynN1PtbjPVf1Q3Pt75vL37qHsyix5yg5KkBzB E97XFEPMVD4/CUlvKw0KZW5kc3RyZWFtDQplbmRvYmoNCjY1NSAwIG9iag0KPDwvRmlsdGVyL0Zs YXRlRGVjb2RlL0xlbmd0aCA1NTUxMS9MZW5ndGgxIDE5NzQ4ND4+DQpzdHJlYW0NCnic7J0JfFNV +vefc+7NnjQbSdombZKmTaWltLTQllLadINqZW3BFkFaoLIoghTcxTqKQl1wHIdRdMRtFHGUtCBT 0BkYcUURt3FhFCowLjMiOP9xXOl9n3NzW2ltxzDv27cf/5zvzfmd9d773JuTk/PkJjdAACAWRYTm 8uozx4uTl94A9OMOAPfN48srxq356pYzgcaGAOgz4ydPqjbbFx0E6hYBWpPGV08rPVBaPwXoK2dg +zvPqq4ZtzhtoRrX34VbTTy7prry4J6KuQApnwGYzp1UnZltGXF1C25Li/X1k8vOrjlxZVEZbp/l c6eXT6idfPuiLwFyKgGsd8xd3LAUaodvArLqelynbe4ly333e975B5D1CwDUNecvnb/4lcvr1gNZ nY/5i+Y3NC2FWNABdX2N27PMv/Dy8zv1HfVA7nsaYHLSgnmLL7tm5aqbAMrfBxLauKCxYd7+2Ycn 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 LFncJjPVO5jbaHK7/cSI/s8oMavVb5ESLBYJPZIkMea24lFPlMJEmgjr9FuCFmY5RDf+yG/abTpi kkyH6KEDG7XO51DQpN8fdCx1POeQHEgUNPmJLyHxiUze+eQvPsttttb7pu/92vdrgQizrb3Abm/S XWCifJ8vfnY7t8oK5Wh8oFrl0TViYKvOb0eXD8WA1syXUHxllA9mvSllLr7HIKXMrQYy3wKZUqZk pZTxU64DqXxB7EgwI7XMjYGvBLDakjwVbleS52IFM4QKSQZm5ssyBZiqZbnKzJa0zIspScusMJs4 xjhmcXsQ5/YgjmMM2AVj8Hwah2Pkjc5yGh3rKWNNwshmjFhOUdPyCVMvoZOGhodZ/pmRXRmZUxNH drPz7GcjN/dULr2c3jBcc/4jZp5SujR9hIqP/WhPLwttPqgYyyX5IlTu1D6Xhxv2qaANiOyDJ3HP yOdVXmHzvwteBETOgeeCqSt5pkKb3Egb9Y3mV/UyNyK9YjDq9Ua9ZDRZ+B4Gv8mcYDKZ9ZLeKPGh chKPlfyM4sFF9RaznmIoRM2HmC9oNJlgV3h+2g4xb9BoMS4Lmq4xMVjOgaDVbLb4ibRsCdslLOhA 0IjeNCE2cwqaxfDIog2J/qgNkpj3oNWmWdU5dV2Ob6McVoO3+EioArhYV0YXeFNBfr6Cp5pObH3i 2E18w5MD3sJHPeisUvlWJ8VitMiHo2eJFD0rNsyJkScVMyajeA8CgNm8+piPT4bGvp+S6RxToJNd NPyr92jm0rlzNtDUPw7/iLVKNSPzduzo2k0fOb9v+KtcS7kYNT4qtGR5zGXjZme3Okuq6Xyl2iiZ FLMx9nizWYjNSs3pFjyZ0vVo5sMVlcNHtSae/wMZMqZUNppkxWTKTsssyTHRjzDk8lMZzyTZlGNO LaHc4xreh1DmmnbzWGTRpRv0zGxKR+M2/YQe4B+JgvhTiKFICWJwcaml0kzNyTZKdPrLiM/KR554 7tScRSvlmwwqas52VjhOOs6P7pSocJYJ6xYHITt587U5tEdHeI3Y+yzeKRlZVmYZ9WbydvfqAV8Z yxLyxMyylE6fwceu1JCZmMs+WFp9/lk5+fzxNdID+6Uf1F/6wx+eN2z9IaZLl0bfllPlWSSHzGBT gpONVmOez5qcl2vNyyuzTk+ckVKetyCv1lqb12xtyttUdKv1xty7k76Z/KA1MSf2fnSSOGXJsb2+ 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 NM1pWtXUrF4139e8v/mp5lfUq5aElpyWipal6lUra01qzWudpeZv61XD9s1q2FEhUimdSZ15ncHO VZ0tndd1fr3zYRFr7dnTc6jnmZ7Xe872Kr2pvUW9Vb2re1t6r+m9Q+U2wv97jocNKrVImxr2Vavh 9kE1vOKvarodDVrYJqyN7riLUHuHkFATeYXqobdiGqQbaAe9jj7DGCthYbaD3cruANzD9rAB9hR7 B03HJvkBl0odUq/0lPQbPCOS5dVyWL5Z/q78kK5Yd5/0lO5pvV/frO/Q79W/ItkMekMCcsAZ5hhW GzYY6g39hpNKufKQckx5XvnYmGosNgaNDcY7jOdMJaYB8yJzm/k2813m+8z95pMWl6XKsspyh+W3 VmI1WYusc6wd1rute6wD1het52yKrdjWbbvddsj2tO13tj/aZXuWfbL9Ulg7X5HjK2sV0RP0L9Fd 9CPAJ9FdjAKM0RPMBLDjPhVrfUax1sdX7vi6HV/l42t2a3B/LWA94CCuJbEax1fhOHWDWO8by9Mo 8qxH3EHclcVaGF8J4ytgfOVLFvzwdb5ylS+0aJEG9PjqHKfL1/bSBf1GsbbHV/bmAaoBfMWMr+7x 9Tm+srca4VrkWw+wilU+lUqVWN9L5yuVoMJX26oRz1f4+Poez81zcj4tYuWNr/HxtTe+vpcO4Ct8 fH2vWuQ4IVb2Vgsp/Bk9QqxWfHWP14yv7KVHr4wrq0rjtIosx/UKhKuRZg2AkQVckmSikOQuUepB soj3NEjpBLDReEoOiPVYSdSWy/8E0bEp0U1sOmAR4LLoIFsRHUR7sEczkCcDI6Q90HMV9FwFPVex 5OgDbBJZTXSIPYHYE4jlmv8ZNP8zIiH2ydErmRZH/8RSo79ngehxdlv0T8REC6J/ooWAqYBpuOsA eAB+QBYgG5CPlEY6OfoSnQJquuhLsK5GUG0E1UaWhPIgU9CEpfGySALS7kTanaA+D5TngfI8cN4P bhrBYyN4bASdncwavYe5gLuj+5kXYTLCFIRpAH90Hmq2meVG5xEGui+gtBfQw3MrhqX+W/zoeWqe Ukt1SywVsSP258i/CzyeggROgc9T4PMUUv4cUjgFKZxiPkAGwA/IBuQC8qOnPkN3tPRRPbx0gR70 mk19DHv6OF4KhEEn90AX95BMraUIPcPmMmBzGSjjBLg8AS4zaBFgKmCasIPBT0nzBKR5ApxnMORn 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 IVpqy/TJ+jR9pj4bryKpbvMojEXr8zD0hc+J+mK9QouUSasga1vXp98M7arvx4VVu/AQ2zDIutdv BdToDc+J2Hf0DXoriQMxmnjRvH6rfru+VSfoO3TV+i69U+/Xh/V7JO+GiFoHbfdFV6Z+EKJrAANb Mxo79An6A/pD+sNbZjWL4P0riqHtF3G0NVwBO1wxXDO0GToNN7QaHA+BxxWwfbGuuvKgtkhZALEZ wTwqxWg0GmP7GJa0Bw352PJaFcxeZLhtuFtLa0tq5bVJtam1GVpVcbOuv3ZjbW5tgbaxdlNtaW15 bVVtda1OoaqtrzXXNtVu0qxUDoG10nHMhZgN0am2pbYd6wTzXeuNRkrswWDV2dpdtQLZC//m/6Mn qBbUQd6Z4/9rj56FHReQ+qwAyQtJhNQCqQ9S/7Pnn90PaRjSJkgjkPohjUH6T/LOBzyr4sr/c+97 33/5AyFCSDGkKYQkQoAspRQoS6JFRIrUTSObUkoRERFTRERk/fEgtej6sOhGoRRdpCxYl1JEliKy NiKixZSySClQiqj8K4uIiJhSSyH5nfOZed+8SUFtd7f+nuf33Ge+c94zZ86cOXNm7tw/yV0rh/I2 yFEnxxY5xshRL8eOz+/Q/24Z+1ZsHP/F82pzjfj1WvMV2VdcJ7uDiPmaeC9d/PxNc5nxMo5nnMEi nnUNrjPelUMk3yL58FCfwRvKA1KdS0pvkVTvfu+QtNvx90s66Pj1jlffql6CPubyBH+/S7tT6B0p 9EmXdrv8YEpZIp1x5TtSdNW5PJFS+5PIEza21ncxm1JtS02Xqts6aV8/dG02pvQ9YVe9Kz/Wyt7W qXX79SmpLiUlbDvp6u12bSZ8sz+FnxjD+uY+6tHCj4l8f4p8Ipey8rQU36aWJWyQvDzL5TkpNtS1 arvOjWciT7V9h83L8y5Sf0t5iz6Wd5FUIqlXSztb9KW1ra390Dpv3WbrsUhNqTGb6EPCfyebdZT3 /Yi2Ltb/1ja0zo+ljEOi/QSvde5kygdKqpD0oKSHP8Iv/6/kCf8m8kuN18fkyX5/TN7axwk/fVze Yn61zvdfxP6E/qHlyblTPkJSpaMrU+RSYrm8OkVmrNVP3Lv1unyCpMkpPkuNDR3/qeUt5mH5DEmz JN2X4vdErCyU9Hh5ci4m5+QyZ8tT5S3Xmi3lybWufKOk1ZauWCRpiaTlklaWs65XrHG89ZKed23r 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 9wx1xFnsfMCzMj2rdaikOvbAlpC6BZNnHyjb5h6nqlUa4Pb017MV9cpjXj7/pUYQ5BR9urTz7GEh ek/yT729cyf26jxjytYEpm3KZisx2Wy5P6pCcbPZNF4k9D8eyr++Bv2ppRD8EsrKWYzs99nj/HEd iIV/57c1iCuOX1wtGC6P4RlzLUy5M/4lemvXdu+dlcrpnjfTP3t66Y7dYSZ3ov9iKX5EEnMzinyS l17q2z5RKn9hybvc7t7BvJP7nHp2mMgG8JRK6r0ndXmtnCu+3uF9qozWzVWzlPMiB3kflZTE15Sf 5D02+Mlu7tprcmNDDwc+2jay/LGLn8CcvksXx75TKHu2yHB95f79Nvl15uHav1XNEnUS/bQmgjV8 tD68ZYJFWtiCR/WfUg849ez9bfsicWGFXeO6E0Ov020vM0sPiN9VUp5UbLph8E5gRqYmFeEa+iBx w0+RUb9KzejMWRHcuVpptdiCjqnzYtLMVIH1FPnNa0watp2a/G7byNra9XCe7pBy4z7nWxpJpeEt M6/o8dbu0c6Lqtkx8ZW//WBG3LD8Qdsaowta5sdeuRmOwof//wCHZN5VDQplbmRzdHJlYW0NCmVu ZG9iag0KNjU2IDAgb2JqDQpbIDBbIDc1MF0gIDNbIDI3OF0gIDlbIDY2N10gIDExWyAzMzMgMzMz XSAgMTRbIDU4NCAyNzggMzMzIDI3OCAyNzggNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1 NiA1NTYgNTU2IDI3OF0gIDM2WyA2NjcgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCA1 MDAgNjY3IDU1NiA4MzMgNzIyIDc3OCA2NjcgNzc4IDcyMiA2NjcgNjExIDcyMiA2NjcgOTQ0IDY2 NyA2NjcgNjExXSAgNjhbIDU1Nl0gIDc2WyAyMjJdICA4MlsgNTU2XSAgODVbIDMzMyA1MDBdICAx MDFbIDY2NyA3MjJdICAxNzdbIDU1Nl0gIDIwMFsgNjY3XSAgMjA3WyA3NzhdICAyMTBbIDcyMl0g XSANCmVuZG9iag0KNjU3IDAgb2JqDQpbIDI3OCAwIDAgMCAwIDAgNjY3IDAgMzMzIDMzMyAwIDU4 NCAyNzggMzMzIDI3OCAyNzggNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2 IDI3OCAwIDAgMCAwIDAgMCA2NjcgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCA1MDAg NjY3IDU1NiA4MzMgNzIyIDc3OCA2NjcgNzc4IDcyMiA2NjcgNjExIDcyMiA2NjcgOTQ0IDY2NyA2 NjcgNjExIDAgMCAwIDAgMCAwIDU1NiAwIDAgMCAwIDAgMCAwIDIyMiAwIDAgMCAwIDAgNTU2IDAg MCAzMzMgNTAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA2NjcgMCAw IDAgMCAwIDAgMCA2NjcgMCAwIDAgMCAwIDAgMCA3MjIgMCA3NzggMCAwIDAgMCAwIDAgNzIyXSAN CmVuZG9iag0KNjU4IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDIyND4+DQpz dHJlYW0NCnicXZDBasMwDIbvfgod20Nx0l1DYGsZ5LBuLNsDOLaSGRbZKM4hbz/ZCx1MYIP8/5/4 LX3prh35BPqNg+0xwejJMS5hZYsw4ORJ1RU4b9PeldvOJiotcL8tCeeOxqCaBvS7iEviDQ6PLgx4 VPqVHbKnCQ6fl176fo3xG2ekBJVqW3A4yqAXE29mRtAFO3VOdJ+2kzB/jo8tIpxLX/+GscHhEo1F NjShaiqpFppnqVYhuX/6Tg2j/TKc3U+1uM9V/VDc+3vm8vfuoezKLHnKDkqQHMET3tcUQ8xUPj8J SW8rDQplbmRzdHJlYW0NCmVuZG9iag0KNjU5IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUv TGVuZ3RoIDQ4NTE2L0xlbmd0aDEgMTg3Nzg4Pj4NCnN0cmVhbQ0KeJzsnQlAlVX+93/nPHdjuXDZ d+6Dl0VBFHEBDfWyuUQlChqYTaDYaCsT2GKT2uJU2GKb00yLZJM5WvlwcQq3kWqaadd2a2qiaS/9 a5s1ljzv9zkgXJTwMvPy553X88HzPec55/c75zzLPTy/ey+PxIgoGmKiFUVl06cufWfS68Sf/Iko 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 OslzfdmWNyYK2P5c9jhqg9AGefyeTyOwdnstnx4/KAbT7udHhtLV3KfSbfAi7UrZDQplbmRzdHJl YW0NCmVuZG9iag0KNjYwIDAgb2JqDQpbIDBbIDc1MF0gIDNbIDI3OF0gIDE2WyAzMzNdICAxOFsg Mjc4IDU1NiA1NTYgNTU2XSAgMjRbIDU1Nl0gIDM2WyA3MjIgNzIyIDcyMiA3MjIgNjY3IDYxMSA3 NzggNzIyIDI3OF0gIDQ3WyA2MTEgODMzIDcyMiA3NzggNjY3XSAgNTNbIDcyMiA2NjcgNjExIDcy MiA2NjcgOTQ0XSAgNjBbIDY2N10gIDEwMlsgNzIyXSAgMTc3WyA1NTZdICAyMDdbIDc3OF0gXSAN CmVuZG9iag0KNjYxIDAgb2JqDQpbIDI3OCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzMzMgMCAy NzggNTU2IDU1NiA1NTYgMCAwIDU1NiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDcyMiA3MjIg NzIyIDY2NyA2MTEgNzc4IDcyMiAyNzggMCAwIDYxMSA4MzMgNzIyIDc3OCA2NjcgMCA3MjIgNjY3 IDYxMSA3MjIgNjY3IDk0NCAwIDY2NyAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgNzc4XSANCmVuZG9iag0KNjYy IDAgb2JqDQpbIDIyNl0gDQplbmRvYmoNCjY2MyAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2Rl L0xlbmd0aCA3NzA3Ny9MZW5ndGgxIDE2OTQ3Nj4+DQpzdHJlYW0NCnic7F0JeJTVuT7nn31LJiEJ CQPMH4aEQELCbliEgWzsWxhMACGTySQZyeZkQgBBI7jQiIq7qFXUqlVchsEl7ihutW61tlqtFlvb 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 WHmjTdlulPbiJ0tC+/TW8nj7Da1FbynJ3X+iDKaM6Phym7KlpZh3zisdd3bMby0HOh2lHDdKZ9tP leTBnZM79+vyeJuywSy7frIUdmk+U1I6pnRtLRNiZfJPlnSzzIwdzy3ZsU/jud1mKWotLbWPpNSl Dkidm/pa6jajnN966o6fKi2tp/4ttTJWGs8W41dSm83fyja4cGqvUa1laq/prWVurMyjZPea13sY ZXyfwX0m9JrH5+A+u/rmX1JslsZ+sykL+velDOpf2T8Klf1/GJA/8DWj9K8c+OnAyMDIINugpEEd B31MKRo8lpI+ePaQV2PFf1n28L7Dq0c8d8UIytiRKSNnj8y8cmesfHrl7iuLRg2gXDlq3ejDY+xm eWbMLrOcHnvF2Hdj5cMxpzl/d2ydeVY3zjrOOvbdcYPGPz3+06sHXzeLcuSGe8Y80/I0x7qWpyaN NZ6bNHVyz8lDJ4+dvG1KX7OkT5lnlswp66a8ymfmlALK0akrp2ZPPXLjAsrGtAyeSk87kHZgSgGf h41vlMo0Na15WrZZtk7bZ5Yj01Q4Mk1Pt03Tua+mz04/nF550xLKc9Mv5rmt0/SWO9NXTtOnH5te OyN95u5Zs36T/Jvuv+l7t+3u2XeX3t185njPIMrO+e3m91yQueChBbkLKheoC/SFtoXDFk5YeNfC BQtXLnx04caF7y78cGHewkOLFix6btG2RQ2LxeLkxRMXz1n86eLiJSOWzFny6tKZSx9d6l/auMy+ bNCy65e9u+z48gnLmzO7Z16fmZG5KPPVzB2ZpSt6rvj1ig9XlK5oXule2XnllSuvWTl35daVpasG rJqw6rZVm1ZtX3V4lf7A+AdWPvBplj1rfNairPezdmedXt119T2rt65W14xak7lmR3b6v5mrPjx/ Pjp3tsledrYY80j2G2dLywzyb8be5PNH3LnjpCXTf3LWOTPztCnnzh3Zu88WY3bILjpbWuYFYw5t tz1ld5cNzMNlY+uYNc052Dwy37ZPZ37dlLS53cbEwtY5k2fb673mGnUTP0zadHbubFGJ2XmCOf+2 PNUzafMZ9YyrxlxsPltm3DefjylIux8mHmMm30yNMrO1Qnq3kWOZWc6uDpHzVoUJbdaBsyvBZqPf P5r9t/9o9k+IzfmPm/O9Ocub7VA7aQLfN52ZCfFjW8wv5qaW+adlfov5yJzIDGi4Nrd1djzjKHNc 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 KBKcnaAzdIEUSIWu0A26A/100k8n/XTST6cHekIv6A194BJZ4xzIO9oguBQGc85OwXkZ38/MxCP4 fgWMhCvhF8QxCqby/UbgPdc5jXrpMs95E0yHX8km5+308y6eO3+W5n3Xyfuuczlk0YfVsAayef4x fpvxb87aGzluot2X4GV4Bd6mvW1wZhZ/h2t46NSo+71sihfyWLyFvZJTqvHoGZ/AsT3XOwi3ObOz QsV34VoKpALzcXx34++SxkiP7auyGKEBc4+2q/X6fK6vMP+OYuy3akWcdaL8tXKj/JzdaYLxty3u 1YhB1qEyYh0BI2EcTJQHrZPkXusUuJFd+Qx5hN3FYXYXhxNmyb0Js+ERGUl4FB6Dx+EJeBKeAt7l EtbDM/AsPAfPwwZ4ATbCi7AJXoKX4RV4FX4Pr8Hr8Aa8CZvhLdgiI+6BMiIUeqpbZ/FOvIh36NH0 X6P/mnWUDNF/zXotx8dkhfVx3l1uFZcyf13Kk3sTbpahhFtgJvwa7pAVCfPgPpgPC2AJPCI1YtOI TSM2jdg0YtOITSM2jdg0YtOITSM2jdg0YtOITSM2jdg0YtOITSM2jdg0YtOITSM2jdg0YtOITSM2 jdg0YtNck2WFawpMhRshDaZBOtwkK4hdw8ORsgSH9llNH2W++ZfDHsS+jbi3WW+VO6xz4X54TOai Qa7x/k3s24h9G7FvI/ZtxJ5L7LnEnkvsucSeS+y5CZlyR8IKWAUPwsNyB/3KpV+59CuXfuXSr1z6 lUu/culXrrgaB7w44KVvVTjgpX9NZFAjGdRIP8vpSSk9KVVm/NCozPpBY3VJxJkhrC6JuDMk9o6f R3Y1kl2N9K6U3pXSu1J6V0rvSuldKc54ccaLM16c8eKMF2e8OOPFGS/OeHHGizNenPHijBdnvDjj xRkvznhxxoszXpzx4owXZ7w448UZL854ccaLM16c8eKMF2e8KFCKAqUoUIoCpShQigKlKFCKAqU4 4xXXokIGKmTgxR5UyMCPPdaJ4kKiTyP6tNjfW5+IvU8PQIXOqDAcFTqjwvDYX4l/hVd78GoPXu3B qz2okYYaaaiRhhppqJGGGmmokYEaGaiRgRoZqJGBGhmokYEaGaiRgRoZqJGBGhmokYEaGaiRgRoZ qJGBGhmokYEaGaiRgRoZqJGBGhmokYEaGaiRgRoZqJGBGhmokYYaaaiRhhppqJGGGmmokYYaaaiR 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 fZOxbzK34Fbchtthvpk7cRfuxj24F9MwHffhfszAA5iJX4N9Mg/hYfwGj2BW1Lt6Iq7DJFyPyWDb arat/gns72r7u9r+rra/q42z2jirjbPaOKuNs9o4q42z2jirjbPaOKuNsdoYq42x2hirjbHaGKuN sdoYsydGvXtVIYPq4l81SSyxU9aKRsVPxd8e6V9+rWiWLf11gRTSqETxryhmUI1s6Rfss6JZlgIo UAAFCqBAARQogAIFUKAAChRAgQIoUAAFCqAg8h0k8h1ECbRSAq2UQCsl0EoJtFICrZRAKyXQSgm0 UgKtlECrKHmFKHmFKHlF9K8hjkZgJH6AURiNH+JHuBJjcBWuDiNE1CtF1CtF1CtF1CtF1CtF0+Gi 6XDRdLhoOlw0HS6aZkTTjGiaEU0zomlGNM2IphnRNCOaZkTTjLzbJO82ybtN8m6TvNsk7zbJu01R 8fuOOXgMj+P5aIDIO0D+jeXfWP6N5d9Y/o3l31j+jeXfWP6N5d9Y/o3l31j+jUXrMaL1GNF6TLRR LbsJLWjFZrRhC2K0Yys6sC1ME9lni+yzRfbZIvtskX22qD5eVB8vqo8X1ceL6uNp+jxNn6fp8zR9 nqbP0/R5mj5P0+dp+jxNn6fp8zR9nqbP0/R5mj5P0+dp+jxNn6fp8zR9nqbP0/R5mj5P0+dp+jxN n6fp8zR9nqbP0/R5mj5P0+dp+jxNn6fp8zR9nqbP0/R5mj5P0+fLvhL1KzsfX8XX8HXcH3IyUU4m yslEOZkoJxPlZKKcTJSTiXIyUU4myslEOZkoJxPlZKKcTJSTiXIyUU4myslEOZkoJxPlZKKcTJST iXIyUU4tMV8tsVAtsVAtsVAtsVAtsVAtMV8tMV8tMV8tMV8tMb/sL1GmrBaLsSTKyGJZWSwri2XL hxb/j6rj5xzPDpNls/Nks/NK2ezi0FZ+OUbIbu/LauWjQ5vMdqbMNlJmO1NmG6kWvy1xdXgysSC8 mngx6pV4RfZbop6vV6c3RP1luVZZLpFYob5/L9NVyHSDS78x2er6ZplnbJSV5bKyXFaWy8pyWVku K8tlZbmsLJeV5bKyXFaWy1LSrZR0KyXdSkm3UtKtlHQrJd1KSbdS0q2UdCsl3UpJt1LSrclpIU5O x324HzPwAGbi13gwDJc5h8ucw9Vd89Vd89Vd82XRjCyakUUzsmhGFs3IohlZNCOLZmTRjCyakUUz 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 +4q79a7Uu5IpvRsn9uhvL6vsD8vUmN3Jqijl3W5PLVNLdntymLg0qnuDXrpVqZ1G1pbY7bhXr/t4 5ntv7tNrt+q004jbkpWOGaOodv29lvaZwQ5eN0pd2xWVaaVdK91aCVrYVOo7FZV5u93b3d4O3tzU M4bji3bqvt0Y1nj7aG83entnYo8dWxz9Pn68n8d10wkh7DeWNVo7WmuNWtuZrAq50qyqrXM2OkCl 3Krl/cb0ZDGLhnIt7jKOVYnuqNxbu/S9Klnj83FhUPGJ7iWe2Ki/oqUKntiozaKVCtrYyrr/sF5W v2edvP2frE/p2dK6ePY/WQ9z/B+ug3j6X7S/KPO/bHdz/A/sXbrz79o56pXsG1UlDza+Q6JMcqDW DvXOYTTDB3w+3L0j3DvKvcHOj3FviHvHygfJZD89HOrukY7HWJNssq8zNUSyv/4H6uFQPRXbOtz1 I1wf5Ppg149xXTtWofh0sedDe54o9lRsq49xlbu7PtnPlf44JDrc+Pp4cr02Dze+cuMr99b65JHu D8JRrg/2zDGuDfH52OJfJdfKKmMtzrA8OcBYB0YVPa0U315l/MUZliePdm+we++9XW6+fXEw3+tn zIdod6C5HGr1D9PXB4rzcv8I9490/yj3B7t2jPtD3D/W/MzC2hys3X6u9schYbkxdLPOmuRh1vID 5ny4Z47wzJHuD8JRnjnaM4M9M8Qzx8psxXXKlux6SNTXOIoW22UcfY2j2jiyJdse5XxwyYK7jKGv MVQXVyVKlOY+sMfO742+aL1Ead7vvdHeM+ryqPd/1yfs2pj9/sEv7PaPRDX/Vd/w1klR+j/yD3eP iQ763/IRrX3QrP+bfuLt46ID/6e+opXTizP63/EXK/Hn0jr+t3ymlBtq/qt+U4rqxyV2dreIpJeJ OIeJaucm9nS3i2qfT+zrbhV9LhfVjhTVhiYrultE1MtEo8NEtXOTVd3totrnk9XdrSLT5aLakaLa 0GTf7p0s8iEWOZ5Fjk8e4nxA+CCL9DKqk1llCKsckzzc9SM8d6RnBv0f6r4Dvopi+//MzO7M3pvZ JCQBktCLFEEFpChFwa7oQ58dRLBiAfUhIiJFQAUEpSmgIKBgAXzYQUHBAiIWUJEi0pHee2f+35l7 ExMTCO3p77/72cns7Jlyd89853tmdk9wlMV5OciVh9wZkKsAuYrQmggsNw2b60Jh/6/P15QKtpsG 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 USFySeQSUTVyWeQKcVbkqkhjUS1yTaSJqBG5OXKLqBV5KNJW1ImWjpYX9a13N9HIencTV1pvbeIq 661NPGK9tYknrLc20c16axO9E25IuEuMt1/tiSnWW5v4WiudJH6wftrEPN1M3ye2WT9t4oj10+Z5 1k+bp6yfNi9q/bR5CdZPm1fY+mnzils/bV4J66fNK239tHlV9Bg93qtq/bR5Na2fNq+u9dPmXWj9 tHkNrZ82r5H10+Zdaf20eddaP23eddZPm3eDXqFXek2tlzXvNutlzWtuvax5d1ova9591sua96D1 sua1SeSJgfdQok5M9B5LTElM8zpYz2rek4l7E/d6XZIoiXldibOVQL1EWHxJlEyMCmEXlIJx2KN0 jN0+RvUzkF4Bu6KKGAUDqgqUjAAP65EGHtr/83CB+w8YFjETHWImATFvQq6bsRcCbjZHibfTXdSQ 7gaGNgKGtgVzeBT7RdSOOlBhegJ7EepIXVBzVyBsOhBWUwYLWSJlui+Ei7FkYO5ZwNyKSKnEKlE1 VpmdifQqrAriVYHFGQ6LqwOLmyC8Foh8qfMXmsGaA5drOFyu4XD5XOByJ6R3Zj2pJuvFeqHM3kDq YkDqflSb9WcvUR02GKhd3aF2dYfa1R1qVwNqj0V8HLC7GrB7BsaDb9g3VI/NZN9TffYD0LyBQ3MO NK+JsBYwXTpMT3aYzh2mJztMT3OYfrHD9HMcpp/nML04MH0sleLj+Dgqwcfz/1IZPgEoX9ahfFmH 8qWB8p8h/BxYX9JhfXmH9SWA9T8inA3ELw3E/wnhz8D9kg73SzrcLwfc13SGCIH+FRz6V3LoXxHo n05nigyRQVVEpsikS+xIgDhGAqqMkaAiwkqiMnJhPKCqdjxArrqiLsJ6oh6uNhANEF4gLoAMxgaE GBuQYr+1vtx9a32F+776cvd99RXum+rLME50pQu8p7yexDBa9Kckb4A3mM73hnhDKdV72RtBdb2R 3mtU1Hvd+y9leBO8jykTI8okqmG9iVJNO65QfTuukLbjCsJkP5ka+YX8QlTdji5UA6PLryT8ef48 Ku3P9+dTkr/AX0Cev9D/jXyMOouRssRfgpSl/lJS/jJ/GQX+cn85FfZX+CsowY5JFNoxCZLr/HVU yF/vr6cUjEwbifmb/M2ocYu/lVL9bf42KmrHKtS4299N6f4efw818Pf6e9G2ff4+tGe/vx/xA/4B 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 vrn8r1CWzt5/jDn/NAqMiNBazRl2e8z6YK4S/zTe8afx7r/DmD+NcbCUcbRuQdODW3nqHyLrlSoP 5f0nqTtBCb0+FfqnjoWpyD91LErF/omjpVfSf4z/2CeWXsH/Meb4U1hWX20k6VV/DM2gRbSWdtJx SrVsK9YqYlWwalgNrTZWkjXQGmPNsBZZa62d1nErVdiioKgjeovhYryYI5aKTWKfOCvSOMz5uRRX 5trchDtybx7O43mOnoOmrSg/ZrlutvNW2c5HZDsfecu5na08pKf5HpLWLefhCrefe9Nvr6+u364/ tsnt57npdv25Y7OdF8smXzPbebNs59n6k3vf7ed5SmQ7r5/tvNft9heYenv53ctvPy96f7bz0rec 6/lXND5b+QCcC50fcvo9LF7fP5bwe27rmMujc1WxgLs9OO4LjseD4+U/ki61MDguD47JwXHH7Vbc p27v5X1Lbz8vM+B2+TIHbj8vu/n283LfZjtfcvt5+YbZzp/Pdt4l23nXbOdjb4kyTVQcl+186e3y FbON0t+Vb812vj3b+Y7bR/HhrRqV9kxr6yNqZ01Etm2l/0jP1DFkOTHOHVgrclLIq6WSvZpqrVql VmtOyLpgXdByl63LZFkpVgoJ65p1jVhVU9XIVk+oJ/S6aeJB8JNc07QncorcmmN+QaSMPRzRNUvr 8zz6bqQrTaRkOkxpVqy2IUpbFes1IOHV9BI01vKe01hbWx+jc3KcvluI1/c8VdRpYhGjbTqDY7LS d1oitz4/h2Oy2kVCn+3RmKz2adyg+2oiND8VUoe1rat06REck9VRfVytz4/hmHyL5PFA8kQgeTKQ PBVI/sXeZ2BvHdj7LOz9S0ldlNRDSf1bS9QmWLgZFm6FhX8p2Y6SHSjZiRJBUug/Pc1cYd7cjhEx 2qu5tVfZe8p7Wnt9lVpFIW3Tau0p1hLmaaS/6uuppeu3xHgRRsqy0qw0PWpZVpb2liP0dQ/0OtAb gl4p8ov8FCUKiUIULUqIEhTmmno0XaeV04o8p43ThiJOO6cdKae9055yOF2drhTjJDlJdIfTw+lB OVWciqNcqpAqpPtURBWh3KqYKkZ5VAml7/lUKVWK8qr71f2UT5VWpSm/ilfx+C53eSqgHlQP0t3q IfUQFVQPq4fpHvWIeoTi1KPqUbpXPaYe06Nj4q0w4q2Ielo9TUVVc9WciqnWqjUVV21VWyqhXlGv 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 3Vg7t53HvtPOa+ez85tv32mJv7UrqAjlsHPauWzHDtnSjrKj7bDt2p4dsZWdw46xzX6XrfvWT5tg 6gj7UbsqeXY1uxopXVaR8vIsns3z+Atey+s4mdfzBt7Im/hH3sxb/sjjZreMZ/JMrfEz87tmnstz tb8XsM6j2nNrdHtH+dxftc/UUnN16VJexst5Ba/k73kV/8Crec0fjTG0z+JZWvtsnm3eyOR5WvsX rLOztnCL1m76YbSXptg/1PoH/YDPjgY+M/X+ZHShnokGXc/pLBbROzSQBtFgGkJDaZie1+/SCPx3 0fdpFH2gZ/loGkMf0Vj6mMbRJ3rOT6CJNIkm0xSaStN0BviUZtBMmkWf0Wz6XOeDuTSP5tMC+oK+ pK90dviaFtE39C0tpiX0nc4Vy2g5raCV9D2toh905lhDa2kdJdN62kAbdR75kTbTFtpK22g7/aSz ys+0k36hXbSb9tBenWP20wH6lQ7SITpMR3TGOUbH6QSdpFN0ms7o/HOOztMFukiX6DJd0dnoKqXS NbpOv9EN+p3S6CalUwZlUpYOaEs0EAniOdFQNBLPixdEY/GiaCKaimaiuWghXhIvi5ailWgt2oi2 op14RbQXHURH8apIFJ1EZ/Ga6CJeF1PFHrFX7BP7xQHxqzgoDonD4og4Ko6J4+KEOClOidPijDgr zonzHBYXxEV2xSVxWVwRKeKqSBXXxHXxm7ghfhdp4qZIFxkiU2TpFGTetme22eEQS47iaG7ACfwc N+Rm3Jxf5pbciV/ngTyIB/MQHs2f8ET+kr/ir3kRL+HveCtv4+38E+/gn3kn/8K7eDfv4b28j/fz Af6VD/IhPsxH7EfsKub/tto77V/sXfZue4+9195n77cP2L/aB+1D9mH7iH3UPmYft0/YJ+1T9mn7 jH3WPmefty/YF+1L9mX7ip1iX7VT7Wv2dfs3+4b9u51m37TT7Qw7085yIk5OWU1Wl0/IGvJJ+ZR8 WtaUtWRt+YysI5+VdWU9WV82kAnyOdlQNpLPyxdkY/mibCKbymayuWwhX5Ivy5aylWyt/9rqv1f0 XwfZUb4qE2Un2Vm+JrvI12VX2U0mye6yh+wpe8k3ZG/910e+JfvKfrK/fFsOkO/IgXKQHCyHyKFy mBwu35Uj5HtypHxfjpIfyA/laDlGfiTHyo/lOPmJHC8nyIlykpwsp8ipcpqcLj+VM+RcOU/Olwvk F/JL+ZVcKL+Wi+Q38lvzv1/ld3KpXCaXyxVypfxerpI/yNVyjVwr18lkuV5ukBvlJvmj3Cy3yK1y m9wuf5I75M9yp/xF7pK75R65V+6T++UB+as8KA/Jw/KIPCqPyePyhDwpT8nT8ow8K8/J8/KCvCgv ycvyikyRN+TvMk3elOkyQ2bKrCiKsuRMOUt+JmfLz+UceVWmymvyuvwt3Cv8Rrh3+M1wn/Bb4b7h fuH+4bfDA8LvhAeGB4UHu2+6fdy33L5uP7e/+7Y7wH3HHegOdoe4Q91h7nD3XXeE+5470n3fHeWO dye4E91J7mR3ijvVneZOdz91Z7gz3VnuZ+5s93N3jjvXne8ucL9wv3S/che6X7uL3G/c791V7g/u aneNu9Zd5ya7m9wf3S3uVnebu939yd3h/uzudH9xd7l73CPuMfeEe8o9455zL7lX3KtuqnvNve7+ 5t5wf3fT3JtuupvpZnnkWZ7w2LM9xwt5x7zj3gnvpHfKO+2d8c5657zz3gXvonfJu+xd8VK8q16q d8277v3m3fB+99K8m166l+FlelkRilgREeGIHXEioYiMREWiI+GIG/EikYiK5IjERO6I5IzkisRG ckfyRO6M5I3ki+SP3BUpELk7UjByTyQucm+kUKRwpEikaKRYZEJkYmRSZHJkSmRqZFpkeuTTyIzI zMisyGeR2Xj6jB1Z7Iz2E1OEzqDY75zGtfX6/gs/q9f33dyEm9JebsEv0X6sob9yF+5CB/WK9zYd 4g/5QzrG43gcHcfKfgLr1kmsW6ewbp3GunWGv+XFdBYrxHn7YbuyRdg3FU7YCVvxTowTY5XFzmi5 0JHQSeu0jJcVrIvYJb0aHhKeIER4Zvh7cWd4Y/iGKIe90lbYJZ2lV/sUitZXB4X0ml9XXwGN1yvA Sp2ddRPuIBJqI6h5oMwzmhjKQwXc9fp8t7tB4153o8b97ua/yu7W1A8Upa8l8lJBfQVQyn965O41 fHe/xh/dXzVucQ9p3OZeMDVVbqNR5TEa1Z1GI3RlQOtfntFE67N1KqxxvXJvK8mBkhiU3HFbSV6U 5ENJfpQIitajFq/HrpIw/y3pEfEICfGUeIpY1BK1yBb1RD1ywqPDoykUXhxeTDJ8OXxZ6xPObPHT f9Mae/sK+z97ff1/s8KaNfTPrpv/nWtmTtlGtpPt5Zt6BTIr55N6zayD1ayBXplGYp1srNdIszr6 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 Tax6H1K1f2lpt+QX0b5rfdGzeZV55/VLpEt1lHIvXjHYaDHq+dNVgzfk3HCb0WpBwl7XgWcnbTL5 XP3wQrzirEmldbfQHseadxm1Kmq29GOLeXO8B5gPKnbNuamgdDS8/4nSTK8BcWv2FO+Z4XjslUgl Y8Sbsze9q0fW3bq1oe5t9XmlbSkXZt8J2ulamGHzW6urjtIoF2ppVoLJ5Le9o3M299zjdjFiWtdx ug5vPBYUZMsK+07dZl28bOXx9VcMd5bxOuMNNZQs93Z57XWzD39ntnn8xIqU2zWr15/M9E5N5zDG JGCM6dKAMZHKwzoRhiRq3I9ojDN/Y6/+CjgOPI8RxwEDDu/G2wubDsImn/YvubSG46I/Of6XWFN4 lZ1+an9F+0Un1rk7bjTpMeBq4j4j4+LcykdFZYfPm+23V52690q49UfnbgaaVkU5Stc1lieZdxzT pLXXhulttvhPUrqclbtxvuR0mG9670cvP3G3x6Qtdziedu/5nchlo0XFfvXnPdXObz7WR+n0yFfF 6kqfIhLMxw+ZVrxx7/gHWttn7nvTZGdU+FPVavdnRr2mbsocfMDvztzJQyMW3d84tMJluoOGnfrV qKNFumuDFvTb+JuhGz/o5vR+/rcP679WCk7zsntAmyYYDWi/efbBrW5HvFcO7K0dsD7n4oyxnsPY tpdWbB1ncuD2q5FxWwLSSs28OuRHakQE8pXZNaelKRnPunYaepbpmp7VgDXv+aw3pO6bKgs9FndC SXmjDltj1GZGRuf3oR0W3NO6mDDWkbY1e/BraBJwoqmJWJtvkvnrbu4rfKCZuBXvwbsVuBQ4TXDo n5aW4m5nF52aaDvwqw1to5MH2qUMiBf22qWkJscMiU4bbOcTghuaLd7Ft/v6k5iHtOTdedev2zw1 wbrhhEOHDv3VCWNTG50p7acORNCmTVhySL8lhmMdgftdq0PLjY8vZY15pjQ8bWjQ/LbaNUgzfvTV qJmFn/sty79rbvGh68WFdcFlfRS37Vr1NLtmgUFyjw9vXt6SnZvKeDbRMjxTvsOvLWMWEabYIfcF U7W7U9KL2+3UzJ2mGqVW9925KV7NNPfZQ0fFq6OTkmezXY5Zdmy/zt56woNlVeFme/e2vNlr61jp bif9oHF+bev35C7robB23vVhpWFjVq4OrHq1MT/P6/bx3qae18Y4tg18e6py5OLHO4/mR2uEbNqY 9/xi2amCZevnHhthNdG6/MjlT4miK2WuG1+e6a2jpVz+7ljmKhVG9/pMk/ubl3X0fLRZ1WwYV2G9 a8WAIzktMdosxmgz/ivatM94StCG/vvQJjR+YOzgtMiBKY3Rxpl3kzvzcicne0Jv5GTTnhc2+axV /5Jra8E3/+IoDZJ84lP6x6Ya+ob4GfqFBLrLeV9XGydXRxcbH29/168fFKkb/IkSIbGp6fHRsX8J UI9209GVl4cXjfP1XLnt4NOOS0yr3dINFC/YB3Qfdtbq8kqFmc/vt/pYapax/OO9UaPtT11uNdXN 5dX7Sx6OTX6bnf3R8Un/8am6OTdLOt4sGV/jwFIVhemDnTqGvyy+FTCqaUnusKv1BuM1vf0HnRzT IkztzNggj1Mfbryd+rQ1unP+RmSt1vQOK7Javolv8+jW5DKFoN1pIx/K7rV9tD7x5fl+Wcz7JsdG qe8ZfFux44eoj08L3PLc6x6rVkYaRHW/xIaOPe/RocPtrqV2EbozZtM+V8IfZ7Mm8xULaHns1DmB Bl5GhbNnfvbz9Ut22uLnsjF+bWyto88Wrf0ebrdUpr3SnXgnNLiZx2L5xsYA9R2QRqe+sG3dzeJm 83f9S+BTh1ujT93x/AF7kh8Etp6/y3F9hwk5e/MfbfDw8jl8+n+FPWmDU6Ij/0+w5+uZ0n6FoMwf UPgXABU/IltR1uTMjVP+k23LzjiOyBrTwtzLsuac0Wxu/sa+IX0sap9WhAasGfVO/bRUo7bTqwma KOnO2Kbmfqut3eyvJ+e59Hxm0iUnVDS99er8GNe3zpUaPjvdPRccVTowKMu8Jm61/Hbv8JzaLl1u 9X48Z+bieMWOk8+cSe/oqJRwK8N3tVWvsaFj/Ex1mh+c4n+o+R2dzHgLjbdah18YW2f597F6Xbvq 8FBPk+TaVTHjZxRGKa21MVhzb6bnmPrNMz7Nf/Lys3jTifYne6Zt+FCj3kzP7eTy7Rf2vt7+rHLj q24GH1u+rLxg6bu3LL/1qDjtE1sNo9ljbVrF2utkbC1pVWHWLtBYZ2HSNL7i5awfAUolQbowqBw1 X6961a9Z9xH9Cn+Gqb8n+GpAJ97R0UVAJze8+TcEX38Azr/Cm2suSR83VXoHDNKuPNnOM6T8w3qN 3db2e9SCulSOferpcLm9fLb5zlkxN5sFj9u9v8OZMfT750P2TT2y5nxRfErcsBZxD3YWPx+/68Sz dZ/VVkh7GFvYnWpzuZtYL33HwJiBAaFXr7+8UbZ07JHM6jEdKZfcN+VLmG4G/dueuFye3ttu1M7m 4u3deiXoR9dnZrR8dl7cvJPb0DSF8P29L01wsR5ylHtk4KaYkV63ODFpxM0nnjnzlwzi+loGaUdF 2C85OzbQyrh3f7+pN+zGqQRvrd2hOz3xWfNF6u+Pq1wcz73OTh/sfHjuiMKqCMkTevMEh+L3ub3G eY3rPj43aXMz63ZVyfk+NxMejDGbMeAL3mSDOa4R01/30P8X4ZeKRLFhAFQThJgKNULPX4Kjzrcv aFBimQGLQtAQFIV8kNePodkf4rpfAFRuJ1X5/ozgPaozlkUqADctxW/688Ghpa0VaZv6ks4h4/Wf us0qXt5NemPaTg+9Mx83rD5avKWzkV4yEz96gKjQ2P9p4vaBGcYl/ufG1UxX3qcwxbni8eiHKeF+ S2efrTp5fUb5rTLLExlPjhbZn5+463j0Qecz2kZl6Tc88rbpDV5iNOnS9u1qodNe5++PDcgzN8uP mKLscUQ9dli7Pac2jnUP2hzV/Qb/8KFb0zuTX11xy6pVN5oWkxktEc97lUf52I30n7S7nrocWxtw 44oobc42OklWtfiaeWRGu5da+apGrpT+xA2SQ/PsS+61ORzSqnTt5BsP4lymvzael1+1eWhoZ/cL qb5bTd7Ks8WbMEitpwD4rIl/Y1T2Q6z4fYy7IOsKr/HN3uYgVxDRZPWy0AoajKkokssaD6vjq/m+ JZVzfOOjmrzJ9y+K5biNvcsJUMjqMOvGDiYvePPkss/mQbN28DGNviKTd+NDCywzzVEnFI+iUSpK JiPzcSgNGaJQNByl4K1+eH8kLvVHw5eZZZr+qXtNG56S3C81MqX/cMOf4E2cDciw7PeSHjrIXSNP d1KnkzVzN+fPaVP4iHMIEz9zHez/6dOWooXPb/J3Rk958/i1aOSb871r36QtzpQmbbtSZCdKEqc8 El14qzXZpnzcXJeVpzzHhYdxw49e0rlU9tlh6pJr2wwLi/0f7xq99Ommcs/Dj8p8q8947X3/UENn SoeXc8DvVF8H2dQxRdOW+0yv/BRYH71x9oET8hZdB2+PKJ4lfndUKb2o3bAiKi/zWNEsR2ezw7/H yApmUEcHNhtVNLqb08Fz6hlbvY3nLjw1IjAlfXmR1SHj+yMGXwwvyFn2PCxITlmppPt+yPXXj8pV H5mTcXecyc3liwJdxIc7xq17sPLKyu4moybzZ5ppLMummvHZlN53G0nk2ZQM72L+7U30Z4/0Q4Ch 0NBEC8J57cYtUfp9Fgjwb347QsuVsat1lfP22NHauzk49fxDQ6TqTbnqnZHTw2378pP8dN9suvnk /U+YJTSR6vkHAhib6pKjeqsuG9FHZE/iJpjWe1OnfF6UVi4zTJ93e++tOTPU2tw2syxcNWtq5DTt 2irLLcG6E9+PnPUo5FCbB3tswnNO+s6OSeoW0dxbemQClen1zHjhyEP2I4KfJU66+8FZ683hqbOj mobm/XZPXW3ZhcVF7+rD3EVtH55/1r0mztOrX4c+xftKL4+3uRtWUjlrfdSghNar1Zn9p6yqhtxY OGX4sJSxG/3z9m8bOzmwrbvV2BAj+zV1j460TkunyovWpYaEl/Q/MvqxvFX/vBaZNdslm++fK1G1 zj6bWLapetDWB2Oj1uyEdP4K1yZkay+65t125xg6xEhzaj//JJWEgT3UuyRtV0L/BVME/QYNCmVu ZHN0cmVhbQ0KZW5kb2JqDQo2NjQgMCBvYmoNClsgMjUwXSANCmVuZG9iag0KNjY1IDAgb2JqDQpb IDI1MF0gDQplbmRvYmoNCjY2NiAwIG9iag0KPDwvVHlwZS9YUmVmL1NpemUgNjY2L1dbIDEgNCAy XSAvUm9vdCAxIDAgUi9JbmZvIDMyIDAgUi9JRFs8RDRGMEREQjEwOEQ0RTg0N0FGMDQ3OTZFOUNE MkY2RTE+PEQ0RjBEREIxMDhENEU4NDdBRjA0Nzk2RTlDRDJGNkUxPl0gL0ZpbHRlci9GbGF0ZURl Y29kZS9MZW5ndGggMTMwOT4+DQpzdHJlYW0NCnicNdcH1FZzAMfx5/dmtVBG2khEqVSiQSiJtHcy WjTIKJGtjOxNRPZKmdkzRSEze2STmT0y8r7383rOPc/n3HvuPc859/n//9/zL5XKP2vWpPy7VqlU wYlYVJBVBc2rFvT6s6D3lQV9phX0bVTQrwrmF/SfUzCgf8HA7liCzwsGTceygsGLC4asLJg+r2BG M3h8xoqC01w8vX7BGWML5vrZuZ8W3FEXSwvmPVgqlZUfjUtH4ihMxhHllJqVXkXlnVPKn5t/SXFW fjEoQxWshbWxDtbFeqiKaqiOGqiJ9bEBNkQt1MZG2BibYFPUwWaoi3qojwZoiEZojM2xBbZEE2yF ptga26AZtsV2aI4W2B4t0QqtsQPaoC3aYUe0x07YGR3QEZ3QGbtgV3TBbtgde6ArumFPdMde6IG9 sQ96Yl/0Qm/0QV/0Q38MwEAMwmAMwVAMw3DshxHYHwfgQByEkRiF0RiDsTgYh2AcxmMCJuJQHIZJ OByVc+VIHIXJmIKjMRXH4FhMw3E4HifgRJyEk3EKTsV0zMBpOB1n4EzMxFk4G+fgXJyH83EBLsRF uBiX4FJchstxBWbhSlyF2bga12AOrsV1uB434EbchJtxC27Fbbgdc3EH5mE+7sRduBv34F7chwW4 Hw/gQTyEh/EIHsVjeBxP4Ek8hYV4GouwGM/gWSzBUjyH5/ECluFFvISX8Qpew/KyYi2vHJGvO6sc mG8UpPLtvom38Dbewbt4D+/jA6zAh/gIH+MTfIrP8Dm+wJdYia/wNb7Bt/gO32MVfsCP+Ak/4xf8 it/wO/7An1iNv/A3/sG/WONlqWHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwa Rg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoY NYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHU MGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHD qGHUMGoYNYwaxtoTi07UMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHD qGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhqnIYPkiXvl3qGHUMGoY NYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHUMGoYNYwaRg2jhlHDqGHU MGoYNYwaRg2jhlHDqGHUMHY2EcUsx+uozKD+Rf+if9G/6F/0L/oX/Yv+Rf+if9G/6F/0L/oX/Yv+ Rf+if9G/6F/0L/oX/Yv+Rf+if9G/6F9+NkIqNn4LZ/+/nQvKUAVrYW2sg3WxHqqiGqqjBmpifWyA DVELtbERNsYm2BR1sBnqoh7qowEaohEaY3NsgS3RBFuhKbbGNmiGbbEdmqMFtkdLtEJr7IA2aIt2 2BHtsRN2Rgd0RCd0xi7YFV2wG3bHHuiKbtgT3bEXemBv7IOe2Be90Bt90Bf90B8DMBCDMBhDMBTD MBz7YQT2xwE4EAdhJEZhNMZgLA7GIRiH8ZiAiTgUk3B4+UR44aViPixbXUFuaVlw69kFt88smLug grJxlxWMn1owsQ16V1Bl1lN4v1T6D4VeoY0NCmVuZHN0cmVhbQ0KZW5kb2JqDQp4cmVmDQowIDY2 Nw0KMDAwMDAwMDAzMyA2NTUzNSBmDQowMDAwMDAwMDE3IDAwMDAwIG4NCjAwMDAwMDAxMjUgMDAw MDAgbg0KMDAwMDAwMDE5NSAwMDAwMCBuDQowMDAwMDAwNDk1IDAwMDAwIG4NCjAwMDAwMTEwMTcg MDAwMDAgbg0KMDAwMDAxOTk2MSAwMDAwMCBuDQowMDAwMDIwMTIxIDAwMDAwIG4NCjAwMDAwMjAz NDUgMDAwMDAgbg0KMDAwMDAyMDUxMCAwMDAwMCBuDQowMDAwMDIwNzM5IDAwMDAwIG4NCjAwMDAw MjA5MDkgMDAwMDAgbg0KMDAwMDAyMTE1MCAwMDAwMCBuDQowMDAwMDIxMzMwIDAwMDAwIG4NCjAw MDAwMjE1NzQgMDAwMDAgbg0KMDAwMDAyMTcwMyAwMDAwMCBuDQowMDAwMDIxNzMzIDAwMDAwIG4N CjAwMDAwMjE4OTAgMDAwMDAgbg0KMDAwMDAyMTk2NCAwMDAwMCBuDQowMDAwMDIyMjEyIDAwMDAw IG4NCjAwMDAwMjI1MDQgMDAwMDAgbg0KMDAwMDAzMzQ1MiAwMDAwMCBuDQowMDAwMDMzNTc2IDAw MDAwIG4NCjAwMDAwMzM2MDYgMDAwMDAgbg0KMDAwMDAzMzc1OCAwMDAwMCBuDQowMDAwMDMzODMy IDAwMDAwIG4NCjAwMDAwMzQwNzUgMDAwMDAgbg0KMDAwMDAzNDQwNSAwMDAwMCBuDQowMDAwMDQz NjkzIDAwMDAwIG4NCjAwMDAwNDM3NDcgMDAwMDAgbg0KMDAwMDA0MzgwMSAwMDAwMCBuDQowMDAw MDQzOTc2IDAwMDAwIG4NCjAwMDAwNDQyMTUgMDAwMDAgbg0KMDAwMDAwMDAzNCA2NTUzNSBmDQow MDAwMDAwMDM1IDY1NTM1IGYNCjAwMDAwMDAwMzYgNjU1MzUgZg0KMDAwMDAwMDAzNyA2NTUzNSBm DQowMDAwMDAwMDM4IDY1NTM1IGYNCjAwMDAwMDAwMzkgNjU1MzUgZg0KMDAwMDAwMDA0MCA2NTUz NSBmDQowMDAwMDAwMDQxIDY1NTM1IGYNCjAwMDAwMDAwNDIgNjU1MzUgZg0KMDAwMDAwMDA0MyA2 NTUzNSBmDQowMDAwMDAwMDQ0IDY1NTM1IGYNCjAwMDAwMDAwNDUgNjU1MzUgZg0KMDAwMDAwMDA0 NiA2NTUzNSBmDQowMDAwMDAwMDQ3IDY1NTM1IGYNCjAwMDAwMDAwNDggNjU1MzUgZg0KMDAwMDAw MDA0OSA2NTUzNSBmDQowMDAwMDAwMDUwIDY1NTM1IGYNCjAwMDAwMDAwNTEgNjU1MzUgZg0KMDAw MDAwMDA1MiA2NTUzNSBmDQowMDAwMDAwMDUzIDY1NTM1IGYNCjAwMDAwMDAwNTQgNjU1MzUgZg0K MDAwMDAwMDA1NSA2NTUzNSBmDQowMDAwMDAwMDU2IDY1NTM1IGYNCjAwMDAwMDAwNTcgNjU1MzUg Zg0KMDAwMDAwMDA1OCA2NTUzNSBmDQowMDAwMDAwMDU5IDY1NTM1IGYNCjAwMDAwMDAwNjAgNjU1 MzUgZg0KMDAwMDAwMDA2MSA2NTUzNSBmDQowMDAwMDAwMDYyIDY1NTM1IGYNCjAwMDAwMDAwNjMg NjU1MzUgZg0KMDAwMDAwMDA2NCA2NTUzNSBmDQowMDAwMDAwMDY1IDY1NTM1IGYNCjAwMDAwMDAw NjYgNjU1MzUgZg0KMDAwMDAwMDA2NyA2NTUzNSBmDQowMDAwMDAwMDY4IDY1NTM1IGYNCjAwMDAw MDAwNjkgNjU1MzUgZg0KMDAwMDAwMDA3MCA2NTUzNSBmDQowMDAwMDAwMDcxIDY1NTM1IGYNCjAw MDAwMDAwNzIgNjU1MzUgZg0KMDAwMDAwMDA3MyA2NTUzNSBmDQowMDAwMDAwMDc0IDY1NTM1IGYN CjAwMDAwMDAwNzUgNjU1MzUgZg0KMDAwMDAwMDA3NiA2NTUzNSBmDQowMDAwMDAwMDc3IDY1NTM1 IGYNCjAwMDAwMDAwNzggNjU1MzUgZg0KMDAwMDAwMDA3OSA2NTUzNSBmDQowMDAwMDAwMDgwIDY1 NTM1IGYNCjAwMDAwMDAwODEgNjU1MzUgZg0KMDAwMDAwMDA4MiA2NTUzNSBmDQowMDAwMDAwMDgz IDY1NTM1IGYNCjAwMDAwMDAwODQgNjU1MzUgZg0KMDAwMDAwMDA4NSA2NTUzNSBmDQowMDAwMDAw MDg2IDY1NTM1IGYNCjAwMDAwMDAwODcgNjU1MzUgZg0KMDAwMDAwMDA4OCA2NTUzNSBmDQowMDAw MDAwMDg5IDY1NTM1IGYNCjAwMDAwMDAwOTAgNjU1MzUgZg0KMDAwMDAwMDA5MSA2NTUzNSBmDQow MDAwMDAwMDkyIDY1NTM1IGYNCjAwMDAwMDAwOTMgNjU1MzUgZg0KMDAwMDAwMDA5NCA2NTUzNSBm DQowMDAwMDAwMDk1IDY1NTM1IGYNCjAwMDAwMDAwOTYgNjU1MzUgZg0KMDAwMDAwMDA5NyA2NTUz NSBmDQowMDAwMDAwMDk4IDY1NTM1IGYNCjAwMDAwMDAwOTkgNjU1MzUgZg0KMDAwMDAwMDEwMCA2 NTUzNSBmDQowMDAwMDAwMTAxIDY1NTM1IGYNCjAwMDAwMDAxMDIgNjU1MzUgZg0KMDAwMDAwMDEw MyA2NTUzNSBmDQowMDAwMDAwMTA0IDY1NTM1IGYNCjAwMDAwMDAxMDUgNjU1MzUgZg0KMDAwMDAw MDEwNiA2NTUzNSBmDQowMDAwMDAwMTA3IDY1NTM1IGYNCjAwMDAwMDAxMDggNjU1MzUgZg0KMDAw MDAwMDEwOSA2NTUzNSBmDQowMDAwMDAwMTEwIDY1NTM1IGYNCjAwMDAwMDAxMTEgNjU1MzUgZg0K MDAwMDAwMDExMiA2NTUzNSBmDQowMDAwMDAwMTEzIDY1NTM1IGYNCjAwMDAwMDAxMTQgNjU1MzUg Zg0KMDAwMDAwMDExNSA2NTUzNSBmDQowMDAwMDAwMTE2IDY1NTM1IGYNCjAwMDAwMDAxMTcgNjU1 MzUgZg0KMDAwMDAwMDExOCA2NTUzNSBmDQowMDAwMDAwMTE5IDY1NTM1IGYNCjAwMDAwMDAxMjAg NjU1MzUgZg0KMDAwMDAwMDEyMSA2NTUzNSBmDQowMDAwMDAwMTIyIDY1NTM1IGYNCjAwMDAwMDAx MjMgNjU1MzUgZg0KMDAwMDAwMDEyNCA2NTUzNSBmDQowMDAwMDAwMTI1IDY1NTM1IGYNCjAwMDAw MDAxMjYgNjU1MzUgZg0KMDAwMDAwMDEyNyA2NTUzNSBmDQowMDAwMDAwMTI4IDY1NTM1IGYNCjAw MDAwMDAxMjkgNjU1MzUgZg0KMDAwMDAwMDEzMCA2NTUzNSBmDQowMDAwMDAwMTMxIDY1NTM1IGYN CjAwMDAwMDAxMzIgNjU1MzUgZg0KMDAwMDAwMDEzMyA2NTUzNSBmDQowMDAwMDAwMTM0IDY1NTM1 IGYNCjAwMDAwMDAxMzUgNjU1MzUgZg0KMDAwMDAwMDEzNiA2NTUzNSBmDQowMDAwMDAwMTM3IDY1 NTM1IGYNCjAwMDAwMDAxMzggNjU1MzUgZg0KMDAwMDAwMDEzOSA2NTUzNSBmDQowMDAwMDAwMTQw IDY1NTM1IGYNCjAwMDAwMDAxNDEgNjU1MzUgZg0KMDAwMDAwMDE0MiA2NTUzNSBmDQowMDAwMDAw MTQzIDY1NTM1IGYNCjAwMDAwMDAxNDQgNjU1MzUgZg0KMDAwMDAwMDE0NSA2NTUzNSBmDQowMDAw MDAwMTQ2IDY1NTM1IGYNCjAwMDAwMDAxNDcgNjU1MzUgZg0KMDAwMDAwMDE0OCA2NTUzNSBmDQow MDAwMDAwMTQ5IDY1NTM1IGYNCjAwMDAwMDAxNTAgNjU1MzUgZg0KMDAwMDAwMDE1MSA2NTUzNSBm DQowMDAwMDAwMTUyIDY1NTM1IGYNCjAwMDAwMDAxNTMgNjU1MzUgZg0KMDAwMDAwMDE1NCA2NTUz NSBmDQowMDAwMDAwMTU1IDY1NTM1IGYNCjAwMDAwMDAxNTYgNjU1MzUgZg0KMDAwMDAwMDE1NyA2 NTUzNSBmDQowMDAwMDAwMTU4IDY1NTM1IGYNCjAwMDAwMDAxNTkgNjU1MzUgZg0KMDAwMDAwMDE2 MCA2NTUzNSBmDQowMDAwMDAwMTYxIDY1NTM1IGYNCjAwMDAwMDAxNjIgNjU1MzUgZg0KMDAwMDAw MDE2MyA2NTUzNSBmDQowMDAwMDAwMTY0IDY1NTM1IGYNCjAwMDAwMDAxNjUgNjU1MzUgZg0KMDAw MDAwMDE2NiA2NTUzNSBmDQowMDAwMDAwMTY3IDY1NTM1IGYNCjAwMDAwMDAxNjggNjU1MzUgZg0K MDAwMDAwMDE2OSA2NTUzNSBmDQowMDAwMDAwMTcwIDY1NTM1IGYNCjAwMDAwMDAxNzEgNjU1MzUg Zg0KMDAwMDAwMDE3MiA2NTUzNSBmDQowMDAwMDAwMTczIDY1NTM1IGYNCjAwMDAwMDAxNzQgNjU1 MzUgZg0KMDAwMDAwMDE3NSA2NTUzNSBmDQowMDAwMDAwMTc2IDY1NTM1IGYNCjAwMDAwMDAxNzcg NjU1MzUgZg0KMDAwMDAwMDE3OCA2NTUzNSBmDQowMDAwMDAwMTc5IDY1NTM1IGYNCjAwMDAwMDAx ODAgNjU1MzUgZg0KMDAwMDAwMDE4MSA2NTUzNSBmDQowMDAwMDAwMTgyIDY1NTM1IGYNCjAwMDAw MDAxODMgNjU1MzUgZg0KMDAwMDAwMDE4NCA2NTUzNSBmDQowMDAwMDAwMTg1IDY1NTM1IGYNCjAw MDAwMDAxODYgNjU1MzUgZg0KMDAwMDAwMDE4NyA2NTUzNSBmDQowMDAwMDAwMTg4IDY1NTM1IGYN CjAwMDAwMDAxODkgNjU1MzUgZg0KMDAwMDAwMDE5MCA2NTUzNSBmDQowMDAwMDAwMTkxIDY1NTM1 IGYNCjAwMDAwMDAxOTIgNjU1MzUgZg0KMDAwMDAwMDE5MyA2NTUzNSBmDQowMDAwMDAwMTk0IDY1 NTM1IGYNCjAwMDAwMDAxOTUgNjU1MzUgZg0KMDAwMDAwMDE5NiA2NTUzNSBmDQowMDAwMDAwMTk3 IDY1NTM1IGYNCjAwMDAwMDAxOTggNjU1MzUgZg0KMDAwMDAwMDE5OSA2NTUzNSBmDQowMDAwMDAw MjAwIDY1NTM1IGYNCjAwMDAwMDAyMDEgNjU1MzUgZg0KMDAwMDAwMDIwMiA2NTUzNSBmDQowMDAw MDAwMjAzIDY1NTM1IGYNCjAwMDAwMDAyMDQgNjU1MzUgZg0KMDAwMDAwMDIwNSA2NTUzNSBmDQow MDAwMDAwMjA2IDY1NTM1IGYNCjAwMDAwMDAyMDcgNjU1MzUgZg0KMDAwMDAwMDIwOCA2NTUzNSBm DQowMDAwMDAwMjA5IDY1NTM1IGYNCjAwMDAwMDAyMTAgNjU1MzUgZg0KMDAwMDAwMDIxMSA2NTUz NSBmDQowMDAwMDAwMjEyIDY1NTM1IGYNCjAwMDAwMDAyMTMgNjU1MzUgZg0KMDAwMDAwMDIxNCA2 NTUzNSBmDQowMDAwMDAwMjE1IDY1NTM1IGYNCjAwMDAwMDAyMTYgNjU1MzUgZg0KMDAwMDAwMDIx NyA2NTUzNSBmDQowMDAwMDAwMjE4IDY1NTM1IGYNCjAwMDAwMDAyMTkgNjU1MzUgZg0KMDAwMDAw MDIyMCA2NTUzNSBmDQowMDAwMDAwMjIxIDY1NTM1IGYNCjAwMDAwMDAyMjIgNjU1MzUgZg0KMDAw MDAwMDIyMyA2NTUzNSBmDQowMDAwMDAwMjI0IDY1NTM1IGYNCjAwMDAwMDAyMjUgNjU1MzUgZg0K MDAwMDAwMDIyNiA2NTUzNSBmDQowMDAwMDAwMjI3IDY1NTM1IGYNCjAwMDAwMDAyMjggNjU1MzUg Zg0KMDAwMDAwMDIyOSA2NTUzNSBmDQowMDAwMDAwMjMwIDY1NTM1IGYNCjAwMDAwMDAyMzEgNjU1 MzUgZg0KMDAwMDAwMDIzMiA2NTUzNSBmDQowMDAwMDAwMjMzIDY1NTM1IGYNCjAwMDAwMDAyMzQg NjU1MzUgZg0KMDAwMDAwMDIzNSA2NTUzNSBmDQowMDAwMDAwMjM2IDY1NTM1IGYNCjAwMDAwMDAy MzcgNjU1MzUgZg0KMDAwMDAwMDIzOCA2NTUzNSBmDQowMDAwMDAwMjM5IDY1NTM1IGYNCjAwMDAw MDAyNDAgNjU1MzUgZg0KMDAwMDAwMDI0MSA2NTUzNSBmDQowMDAwMDAwMjQyIDY1NTM1IGYNCjAw MDAwMDAyNDMgNjU1MzUgZg0KMDAwMDAwMDI0NCA2NTUzNSBmDQowMDAwMDAwMjQ1IDY1NTM1IGYN CjAwMDAwMDAyNDYgNjU1MzUgZg0KMDAwMDAwMDI0NyA2NTUzNSBmDQowMDAwMDAwMjQ4IDY1NTM1 IGYNCjAwMDAwMDAyNDkgNjU1MzUgZg0KMDAwMDAwMDI1MCA2NTUzNSBmDQowMDAwMDAwMjUxIDY1 NTM1IGYNCjAwMDAwMDAyNTIgNjU1MzUgZg0KMDAwMDAwMDI1MyA2NTUzNSBmDQowMDAwMDAwMjU0 IDY1NTM1IGYNCjAwMDAwMDAyNTUgNjU1MzUgZg0KMDAwMDAwMDI1NiA2NTUzNSBmDQowMDAwMDAw MjU3IDY1NTM1IGYNCjAwMDAwMDAyNTggNjU1MzUgZg0KMDAwMDAwMDI1OSA2NTUzNSBmDQowMDAw MDAwMjYwIDY1NTM1IGYNCjAwMDAwMDAyNjEgNjU1MzUgZg0KMDAwMDAwMDI2MiA2NTUzNSBmDQow MDAwMDAwMjYzIDY1NTM1IGYNCjAwMDAwMDAyNjQgNjU1MzUgZg0KMDAwMDAwMDI2NSA2NTUzNSBm DQowMDAwMDAwMjY2IDY1NTM1IGYNCjAwMDAwMDAyNjcgNjU1MzUgZg0KMDAwMDAwMDI2OCA2NTUz NSBmDQowMDAwMDAwMjY5IDY1NTM1IGYNCjAwMDAwMDAyNzAgNjU1MzUgZg0KMDAwMDAwMDI3MSA2 NTUzNSBmDQowMDAwMDAwMjcyIDY1NTM1IGYNCjAwMDAwMDAyNzMgNjU1MzUgZg0KMDAwMDAwMDI3 NCA2NTUzNSBmDQowMDAwMDAwMjc1IDY1NTM1IGYNCjAwMDAwMDAyNzYgNjU1MzUgZg0KMDAwMDAw MDI3NyA2NTUzNSBmDQowMDAwMDAwMjc4IDY1NTM1IGYNCjAwMDAwMDAyNzkgNjU1MzUgZg0KMDAw MDAwMDI4MCA2NTUzNSBmDQowMDAwMDAwMjgxIDY1NTM1IGYNCjAwMDAwMDAyODIgNjU1MzUgZg0K MDAwMDAwMDI4MyA2NTUzNSBmDQowMDAwMDAwMjg0IDY1NTM1IGYNCjAwMDAwMDAyODUgNjU1MzUg Zg0KMDAwMDAwMDI4NiA2NTUzNSBmDQowMDAwMDAwMjg3IDY1NTM1IGYNCjAwMDAwMDAyODggNjU1 MzUgZg0KMDAwMDAwMDI4OSA2NTUzNSBmDQowMDAwMDAwMjkwIDY1NTM1IGYNCjAwMDAwMDAyOTEg NjU1MzUgZg0KMDAwMDAwMDI5MiA2NTUzNSBmDQowMDAwMDAwMjkzIDY1NTM1IGYNCjAwMDAwMDAy OTQgNjU1MzUgZg0KMDAwMDAwMDI5NSA2NTUzNSBmDQowMDAwMDAwMjk2IDY1NTM1IGYNCjAwMDAw MDAyOTcgNjU1MzUgZg0KMDAwMDAwMDI5OCA2NTUzNSBmDQowMDAwMDAwMjk5IDY1NTM1IGYNCjAw MDAwMDAzMDAgNjU1MzUgZg0KMDAwMDAwMDMwMSA2NTUzNSBmDQowMDAwMDAwMzAyIDY1NTM1IGYN CjAwMDAwMDAzMDMgNjU1MzUgZg0KMDAwMDAwMDMwNCA2NTUzNSBmDQowMDAwMDAwMzA1IDY1NTM1 IGYNCjAwMDAwMDAzMDYgNjU1MzUgZg0KMDAwMDAwMDMwNyA2NTUzNSBmDQowMDAwMDAwMzA4IDY1 NTM1IGYNCjAwMDAwMDAzMDkgNjU1MzUgZg0KMDAwMDAwMDMxMCA2NTUzNSBmDQowMDAwMDAwMzEx IDY1NTM1IGYNCjAwMDAwMDAzMTIgNjU1MzUgZg0KMDAwMDAwMDMxMyA2NTUzNSBmDQowMDAwMDAw MzE0IDY1NTM1IGYNCjAwMDAwMDAzMTUgNjU1MzUgZg0KMDAwMDAwMDMxNiA2NTUzNSBmDQowMDAw MDAwMzE3IDY1NTM1IGYNCjAwMDAwMDAzMTggNjU1MzUgZg0KMDAwMDAwMDMxOSA2NTUzNSBmDQow MDAwMDAwMzIwIDY1NTM1IGYNCjAwMDAwMDAzMjEgNjU1MzUgZg0KMDAwMDAwMDMyMiA2NTUzNSBm DQowMDAwMDAwMzIzIDY1NTM1IGYNCjAwMDAwMDAzMjQgNjU1MzUgZg0KMDAwMDAwMDMyNSA2NTUz NSBmDQowMDAwMDAwMzI2IDY1NTM1IGYNCjAwMDAwMDAzMjcgNjU1MzUgZg0KMDAwMDAwMDMyOCA2 NTUzNSBmDQowMDAwMDAwMzI5IDY1NTM1IGYNCjAwMDAwMDAzMzAgNjU1MzUgZg0KMDAwMDAwMDMz MSA2NTUzNSBmDQowMDAwMDAwMzMyIDY1NTM1IGYNCjAwMDAwMDAzMzMgNjU1MzUgZg0KMDAwMDAw MDMzNCA2NTUzNSBmDQowMDAwMDAwMzM1IDY1NTM1IGYNCjAwMDAwMDAzMzYgNjU1MzUgZg0KMDAw MDAwMDMzNyA2NTUzNSBmDQowMDAwMDAwMzM4IDY1NTM1IGYNCjAwMDAwMDAzMzkgNjU1MzUgZg0K MDAwMDAwMDM0MCA2NTUzNSBmDQowMDAwMDAwMzQxIDY1NTM1IGYNCjAwMDAwMDAzNDIgNjU1MzUg Zg0KMDAwMDAwMDM0MyA2NTUzNSBmDQowMDAwMDAwMzQ0IDY1NTM1IGYNCjAwMDAwMDAzNDUgNjU1 MzUgZg0KMDAwMDAwMDM0NiA2NTUzNSBmDQowMDAwMDAwMzQ3IDY1NTM1IGYNCjAwMDAwMDAzNDgg NjU1MzUgZg0KMDAwMDAwMDM0OSA2NTUzNSBmDQowMDAwMDAwMzUwIDY1NTM1IGYNCjAwMDAwMDAz NTEgNjU1MzUgZg0KMDAwMDAwMDM1MiA2NTUzNSBmDQowMDAwMDAwMzUzIDY1NTM1IGYNCjAwMDAw MDAzNTQgNjU1MzUgZg0KMDAwMDAwMDM1NSA2NTUzNSBmDQowMDAwMDAwMzU2IDY1NTM1IGYNCjAw MDAwMDAzNTcgNjU1MzUgZg0KMDAwMDAwMDM1OCA2NTUzNSBmDQowMDAwMDAwMzU5IDY1NTM1IGYN CjAwMDAwMDAzNjAgNjU1MzUgZg0KMDAwMDAwMDM2MSA2NTUzNSBmDQowMDAwMDAwMzYyIDY1NTM1 IGYNCjAwMDAwMDAzNjMgNjU1MzUgZg0KMDAwMDAwMDM2NCA2NTUzNSBmDQowMDAwMDAwMzY1IDY1 NTM1IGYNCjAwMDAwMDAzNjYgNjU1MzUgZg0KMDAwMDAwMDM2NyA2NTUzNSBmDQowMDAwMDAwMzY4 IDY1NTM1IGYNCjAwMDAwMDAzNjkgNjU1MzUgZg0KMDAwMDAwMDM3MCA2NTUzNSBmDQowMDAwMDAw MzcxIDY1NTM1IGYNCjAwMDAwMDAzNzIgNjU1MzUgZg0KMDAwMDAwMDM3MyA2NTUzNSBmDQowMDAw MDAwMzc0IDY1NTM1IGYNCjAwMDAwMDAzNzUgNjU1MzUgZg0KMDAwMDAwMDM3NiA2NTUzNSBmDQow MDAwMDAwMzc3IDY1NTM1IGYNCjAwMDAwMDAzNzggNjU1MzUgZg0KMDAwMDAwMDM3OSA2NTUzNSBm DQowMDAwMDAwMzgwIDY1NTM1IGYNCjAwMDAwMDAzODEgNjU1MzUgZg0KMDAwMDAwMDM4MiA2NTUz NSBmDQowMDAwMDAwMzgzIDY1NTM1IGYNCjAwMDAwMDAzODQgNjU1MzUgZg0KMDAwMDAwMDM4NSA2 NTUzNSBmDQowMDAwMDAwMzg2IDY1NTM1IGYNCjAwMDAwMDAzODcgNjU1MzUgZg0KMDAwMDAwMDM4 OCA2NTUzNSBmDQowMDAwMDAwMzg5IDY1NTM1IGYNCjAwMDAwMDAzOTAgNjU1MzUgZg0KMDAwMDAw MDM5MSA2NTUzNSBmDQowMDAwMDAwMzkyIDY1NTM1IGYNCjAwMDAwMDAzOTMgNjU1MzUgZg0KMDAw MDAwMDM5NCA2NTUzNSBmDQowMDAwMDAwMzk1IDY1NTM1IGYNCjAwMDAwMDAzOTYgNjU1MzUgZg0K MDAwMDAwMDM5NyA2NTUzNSBmDQowMDAwMDAwMzk4IDY1NTM1IGYNCjAwMDAwMDAzOTkgNjU1MzUg Zg0KMDAwMDAwMDQwMCA2NTUzNSBmDQowMDAwMDAwNDAxIDY1NTM1IGYNCjAwMDAwMDA0MDIgNjU1 MzUgZg0KMDAwMDAwMDQwMyA2NTUzNSBmDQowMDAwMDAwNDA0IDY1NTM1IGYNCjAwMDAwMDA0MDUg NjU1MzUgZg0KMDAwMDAwMDQwNiA2NTUzNSBmDQowMDAwMDAwNDA3IDY1NTM1IGYNCjAwMDAwMDA0 MDggNjU1MzUgZg0KMDAwMDAwMDQwOSA2NTUzNSBmDQowMDAwMDAwNDEwIDY1NTM1IGYNCjAwMDAw MDA0MTEgNjU1MzUgZg0KMDAwMDAwMDQxMiA2NTUzNSBmDQowMDAwMDAwNDEzIDY1NTM1IGYNCjAw MDAwMDA0MTQgNjU1MzUgZg0KMDAwMDAwMDQxNSA2NTUzNSBmDQowMDAwMDAwNDE2IDY1NTM1IGYN CjAwMDAwMDA0MTcgNjU1MzUgZg0KMDAwMDAwMDQxOCA2NTUzNSBmDQowMDAwMDAwNDE5IDY1NTM1 IGYNCjAwMDAwMDA0MjAgNjU1MzUgZg0KMDAwMDAwMDQyMSA2NTUzNSBmDQowMDAwMDAwNDIyIDY1 NTM1IGYNCjAwMDAwMDA0MjMgNjU1MzUgZg0KMDAwMDAwMDQyNCA2NTUzNSBmDQowMDAwMDAwNDI1 IDY1NTM1IGYNCjAwMDAwMDA0MjYgNjU1MzUgZg0KMDAwMDAwMDQyNyA2NTUzNSBmDQowMDAwMDAw NDI4IDY1NTM1IGYNCjAwMDAwMDA0MjkgNjU1MzUgZg0KMDAwMDAwMDQzMCA2NTUzNSBmDQowMDAw MDAwNDMxIDY1NTM1IGYNCjAwMDAwMDA0MzIgNjU1MzUgZg0KMDAwMDAwMDQzMyA2NTUzNSBmDQow MDAwMDAwNDM0IDY1NTM1IGYNCjAwMDAwMDA0MzUgNjU1MzUgZg0KMDAwMDAwMDQzNiA2NTUzNSBm DQowMDAwMDAwNDM3IDY1NTM1IGYNCjAwMDAwMDA0MzggNjU1MzUgZg0KMDAwMDAwMDQzOSA2NTUz NSBmDQowMDAwMDAwNDQwIDY1NTM1IGYNCjAwMDAwMDA0NDEgNjU1MzUgZg0KMDAwMDAwMDQ0MiA2 NTUzNSBmDQowMDAwMDAwNDQzIDY1NTM1IGYNCjAwMDAwMDA0NDQgNjU1MzUgZg0KMDAwMDAwMDQ0 NSA2NTUzNSBmDQowMDAwMDAwNDQ2IDY1NTM1IGYNCjAwMDAwMDA0NDcgNjU1MzUgZg0KMDAwMDAw MDQ0OCA2NTUzNSBmDQowMDAwMDAwNDQ5IDY1NTM1IGYNCjAwMDAwMDA0NTAgNjU1MzUgZg0KMDAw MDAwMDQ1MSA2NTUzNSBmDQowMDAwMDAwNDUyIDY1NTM1IGYNCjAwMDAwMDA0NTMgNjU1MzUgZg0K MDAwMDAwMDQ1NCA2NTUzNSBmDQowMDAwMDAwNDU1IDY1NTM1IGYNCjAwMDAwMDA0NTYgNjU1MzUg Zg0KMDAwMDAwMDQ1NyA2NTUzNSBmDQowMDAwMDAwNDU4IDY1NTM1IGYNCjAwMDAwMDA0NTkgNjU1 MzUgZg0KMDAwMDAwMDQ2MCA2NTUzNSBmDQowMDAwMDAwNDYxIDY1NTM1IGYNCjAwMDAwMDA0NjIg NjU1MzUgZg0KMDAwMDAwMDQ2MyA2NTUzNSBmDQowMDAwMDAwNDY0IDY1NTM1IGYNCjAwMDAwMDA0 NjUgNjU1MzUgZg0KMDAwMDAwMDQ2NiA2NTUzNSBmDQowMDAwMDAwNDY3IDY1NTM1IGYNCjAwMDAw MDA0NjggNjU1MzUgZg0KMDAwMDAwMDQ2OSA2NTUzNSBmDQowMDAwMDAwNDcwIDY1NTM1IGYNCjAw MDAwMDA0NzEgNjU1MzUgZg0KMDAwMDAwMDQ3MiA2NTUzNSBmDQowMDAwMDAwNDczIDY1NTM1IGYN CjAwMDAwMDA0NzQgNjU1MzUgZg0KMDAwMDAwMDQ3NSA2NTUzNSBmDQowMDAwMDAwNDc2IDY1NTM1 IGYNCjAwMDAwMDA0NzcgNjU1MzUgZg0KMDAwMDAwMDQ3OCA2NTUzNSBmDQowMDAwMDAwNDc5IDY1 NTM1IGYNCjAwMDAwMDA0ODAgNjU1MzUgZg0KMDAwMDAwMDQ4MSA2NTUzNSBmDQowMDAwMDAwNDgy IDY1NTM1IGYNCjAwMDAwMDA0ODMgNjU1MzUgZg0KMDAwMDAwMDQ4NCA2NTUzNSBmDQowMDAwMDAw NDg1IDY1NTM1IGYNCjAwMDAwMDA0ODYgNjU1MzUgZg0KMDAwMDAwMDQ4NyA2NTUzNSBmDQowMDAw MDAwNDg4IDY1NTM1IGYNCjAwMDAwMDA0ODkgNjU1MzUgZg0KMDAwMDAwMDQ5MCA2NTUzNSBmDQow MDAwMDAwNDkxIDY1NTM1IGYNCjAwMDAwMDA0OTIgNjU1MzUgZg0KMDAwMDAwMDQ5MyA2NTUzNSBm DQowMDAwMDAwNDk0IDY1NTM1IGYNCjAwMDAwMDA0OTUgNjU1MzUgZg0KMDAwMDAwMDQ5NiA2NTUz NSBmDQowMDAwMDAwNDk3IDY1NTM1IGYNCjAwMDAwMDA0OTggNjU1MzUgZg0KMDAwMDAwMDQ5OSA2 NTUzNSBmDQowMDAwMDAwNTAwIDY1NTM1IGYNCjAwMDAwMDA1MDEgNjU1MzUgZg0KMDAwMDAwMDUw MiA2NTUzNSBmDQowMDAwMDAwNTAzIDY1NTM1IGYNCjAwMDAwMDA1MDQgNjU1MzUgZg0KMDAwMDAw MDUwNSA2NTUzNSBmDQowMDAwMDAwNTA2IDY1NTM1IGYNCjAwMDAwMDA1MDcgNjU1MzUgZg0KMDAw MDAwMDUwOCA2NTUzNSBmDQowMDAwMDAwNTA5IDY1NTM1IGYNCjAwMDAwMDA1MTAgNjU1MzUgZg0K MDAwMDAwMDUxMSA2NTUzNSBmDQowMDAwMDAwNTEyIDY1NTM1IGYNCjAwMDAwMDA1MTMgNjU1MzUg Zg0KMDAwMDAwMDUxNCA2NTUzNSBmDQowMDAwMDAwNTE1IDY1NTM1IGYNCjAwMDAwMDA1MTYgNjU1 MzUgZg0KMDAwMDAwMDUxNyA2NTUzNSBmDQowMDAwMDAwNTE4IDY1NTM1IGYNCjAwMDAwMDA1MTkg NjU1MzUgZg0KMDAwMDAwMDUyMCA2NTUzNSBmDQowMDAwMDAwNTIxIDY1NTM1IGYNCjAwMDAwMDA1 MjIgNjU1MzUgZg0KMDAwMDAwMDUyMyA2NTUzNSBmDQowMDAwMDAwNTI0IDY1NTM1IGYNCjAwMDAw MDA1MjUgNjU1MzUgZg0KMDAwMDAwMDUyNiA2NTUzNSBmDQowMDAwMDAwNTI3IDY1NTM1IGYNCjAw MDAwMDA1MjggNjU1MzUgZg0KMDAwMDAwMDUyOSA2NTUzNSBmDQowMDAwMDAwNTMwIDY1NTM1IGYN CjAwMDAwMDA1MzEgNjU1MzUgZg0KMDAwMDAwMDUzMiA2NTUzNSBmDQowMDAwMDAwNTMzIDY1NTM1 IGYNCjAwMDAwMDA1MzQgNjU1MzUgZg0KMDAwMDAwMDUzNSA2NTUzNSBmDQowMDAwMDAwNTM2IDY1 NTM1IGYNCjAwMDAwMDA1MzcgNjU1MzUgZg0KMDAwMDAwMDUzOCA2NTUzNSBmDQowMDAwMDAwNTM5 IDY1NTM1IGYNCjAwMDAwMDA1NDAgNjU1MzUgZg0KMDAwMDAwMDU0MSA2NTUzNSBmDQowMDAwMDAw NTQyIDY1NTM1IGYNCjAwMDAwMDA1NDMgNjU1MzUgZg0KMDAwMDAwMDU0NCA2NTUzNSBmDQowMDAw MDAwNTQ1IDY1NTM1IGYNCjAwMDAwMDA1NDYgNjU1MzUgZg0KMDAwMDAwMDU0NyA2NTUzNSBmDQow MDAwMDAwNTQ4IDY1NTM1IGYNCjAwMDAwMDA1NDkgNjU1MzUgZg0KMDAwMDAwMDU1MCA2NTUzNSBm DQowMDAwMDAwNTUxIDY1NTM1IGYNCjAwMDAwMDA1NTIgNjU1MzUgZg0KMDAwMDAwMDU1MyA2NTUz NSBmDQowMDAwMDAwNTU0IDY1NTM1IGYNCjAwMDAwMDA1NTUgNjU1MzUgZg0KMDAwMDAwMDU1NiA2 NTUzNSBmDQowMDAwMDAwNTU3IDY1NTM1IGYNCjAwMDAwMDA1NTggNjU1MzUgZg0KMDAwMDAwMDU1 OSA2NTUzNSBmDQowMDAwMDAwNTYwIDY1NTM1IGYNCjAwMDAwMDA1NjEgNjU1MzUgZg0KMDAwMDAw MDU2MiA2NTUzNSBmDQowMDAwMDAwNTYzIDY1NTM1IGYNCjAwMDAwMDA1NjQgNjU1MzUgZg0KMDAw MDAwMDU2NSA2NTUzNSBmDQowMDAwMDAwNTY2IDY1NTM1IGYNCjAwMDAwMDA1NjcgNjU1MzUgZg0K MDAwMDAwMDU2OCA2NTUzNSBmDQowMDAwMDAwNTY5IDY1NTM1IGYNCjAwMDAwMDA1NzAgNjU1MzUg Zg0KMDAwMDAwMDU3MSA2NTUzNSBmDQowMDAwMDAwNTcyIDY1NTM1IGYNCjAwMDAwMDA1NzMgNjU1 MzUgZg0KMDAwMDAwMDU3NCA2NTUzNSBmDQowMDAwMDAwNTc1IDY1NTM1IGYNCjAwMDAwMDA1NzYg NjU1MzUgZg0KMDAwMDAwMDU3NyA2NTUzNSBmDQowMDAwMDAwNTc4IDY1NTM1IGYNCjAwMDAwMDA1 NzkgNjU1MzUgZg0KMDAwMDAwMDU4MCA2NTUzNSBmDQowMDAwMDAwNTgxIDY1NTM1IGYNCjAwMDAw MDA1ODIgNjU1MzUgZg0KMDAwMDAwMDU4MyA2NTUzNSBmDQowMDAwMDAwNTg0IDY1NTM1IGYNCjAw MDAwMDA1ODUgNjU1MzUgZg0KMDAwMDAwMDU4NiA2NTUzNSBmDQowMDAwMDAwNTg3IDY1NTM1IGYN CjAwMDAwMDA1ODggNjU1MzUgZg0KMDAwMDAwMDU4OSA2NTUzNSBmDQowMDAwMDAwNTkwIDY1NTM1 IGYNCjAwMDAwMDA1OTEgNjU1MzUgZg0KMDAwMDAwMDU5MiA2NTUzNSBmDQowMDAwMDAwNTkzIDY1 NTM1IGYNCjAwMDAwMDA1OTQgNjU1MzUgZg0KMDAwMDAwMDU5NSA2NTUzNSBmDQowMDAwMDAwNTk2 IDY1NTM1IGYNCjAwMDAwMDA1OTcgNjU1MzUgZg0KMDAwMDAwMDU5OCA2NTUzNSBmDQowMDAwMDAw NTk5IDY1NTM1IGYNCjAwMDAwMDA2MDAgNjU1MzUgZg0KMDAwMDAwMDYwMSA2NTUzNSBmDQowMDAw MDAwNjAyIDY1NTM1IGYNCjAwMDAwMDA2MDMgNjU1MzUgZg0KMDAwMDAwMDYwNCA2NTUzNSBmDQow MDAwMDAwNjA1IDY1NTM1IGYNCjAwMDAwMDA2MDYgNjU1MzUgZg0KMDAwMDAwMDYwNyA2NTUzNSBm DQowMDAwMDAwNjA4IDY1NTM1IGYNCjAwMDAwMDA2MDkgNjU1MzUgZg0KMDAwMDAwMDYxMCA2NTUz NSBmDQowMDAwMDAwNjExIDY1NTM1IGYNCjAwMDAwMDA2MTIgNjU1MzUgZg0KMDAwMDAwMDYxMyA2 NTUzNSBmDQowMDAwMDAwNjE0IDY1NTM1IGYNCjAwMDAwMDA2MTUgNjU1MzUgZg0KMDAwMDAwMDYx NiA2NTUzNSBmDQowMDAwMDAwNjE3IDY1NTM1IGYNCjAwMDAwMDA2MTggNjU1MzUgZg0KMDAwMDAw MDYxOSA2NTUzNSBmDQowMDAwMDAwNjIwIDY1NTM1IGYNCjAwMDAwMDA2MjEgNjU1MzUgZg0KMDAw MDAwMDYyMiA2NTUzNSBmDQowMDAwMDAwNjIzIDY1NTM1IGYNCjAwMDAwMDA2MjQgNjU1MzUgZg0K MDAwMDAwMDYyNSA2NTUzNSBmDQowMDAwMDAwNjI2IDY1NTM1IGYNCjAwMDAwMDA2MjcgNjU1MzUg Zg0KMDAwMDAwMDYyOCA2NTUzNSBmDQowMDAwMDAwNjI5IDY1NTM1IGYNCjAwMDAwMDA2MzAgNjU1 MzUgZg0KMDAwMDAwMDYzMSA2NTUzNSBmDQowMDAwMDAwNjMyIDY1NTM1IGYNCjAwMDAwMDA2MzMg NjU1MzUgZg0KMDAwMDAwMDYzNCA2NTUzNSBmDQowMDAwMDAwNjM1IDY1NTM1IGYNCjAwMDAwMDA2 MzYgNjU1MzUgZg0KMDAwMDAwMDYzNyA2NTUzNSBmDQowMDAwMDAwNjM4IDY1NTM1IGYNCjAwMDAw MDA2MzkgNjU1MzUgZg0KMDAwMDAwMDY0MCA2NTUzNSBmDQowMDAwMDAwNjQxIDY1NTM1IGYNCjAw MDAwMDA2NDIgNjU1MzUgZg0KMDAwMDAwMDY0MyA2NTUzNSBmDQowMDAwMDAwNjQ0IDY1NTM1IGYN CjAwMDAwMDA2NDUgNjU1MzUgZg0KMDAwMDAwMDY0NiA2NTUzNSBmDQowMDAwMDAwNjQ3IDY1NTM1 IGYNCjAwMDAwMDA2NDggNjU1MzUgZg0KMDAwMDAwMDY0OSA2NTUzNSBmDQowMDAwMDAwNjUwIDY1 NTM1IGYNCjAwMDAwMDA2NTEgNjU1MzUgZg0KMDAwMDAwMDY1MiA2NTUzNSBmDQowMDAwMDAwNjUz IDY1NTM1IGYNCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDA1MjE3NCAwMDAwMCBuDQowMDAwMDUy NDc0IDAwMDAwIG4NCjAwMDAxMDgwNzggMDAwMDAgbg0KMDAwMDEwODQyNiAwMDAwMCBuDQowMDAw MTA4OTM2IDAwMDAwIG4NCjAwMDAxMDkyMzYgMDAwMDAgbg0KMDAwMDE1Nzg0NSAwMDAwMCBuDQow MDAwMTU4MDcwIDAwMDAwIG4NCjAwMDAxNTg1MTQgMDAwMDAgbg0KMDAwMDE1ODU0MiAwMDAwMCBu DQowMDAwMjM1NzEyIDAwMDAwIG4NCjAwMDAyMzU3NDAgMDAwMDAgbg0KMDAwMDIzNTc2OCAwMDAw MCBuDQp0cmFpbGVyDQo8PC9TaXplIDY2Ny9Sb290IDEgMCBSL0luZm8gMzIgMCBSL0lEWzxENEYw RERCMTA4RDRFODQ3QUYwNDc5NkU5Q0QyRjZFMT48RDRGMEREQjEwOEQ0RTg0N0FGMDQ3OTZFOUNE MkY2RTE+XSA+Pg0Kc3RhcnR4cmVmDQoyMzcyODENCiUlRU9GDQp4cmVmDQowIDANCnRyYWlsZXIN Cjw8L1NpemUgNjY3L1Jvb3QgMSAwIFIvSW5mbyAzMiAwIFIvSURbPEQ0RjBEREIxMDhENEU4NDdB RjA0Nzk2RTlDRDJGNkUxPjxENEYwRERCMTA4RDRFODQ3QUYwNDc5NkU5Q0QyRjZFMT5dIC9QcmV2 IDIzNzI4MS9YUmVmU3RtIDIzNTc2OD4+DQpzdGFydHhyZWYNCjI1MDc4MQ0KJSVFT0Y= ------=_NextPart_001_3D9D_24D31021.33550292-- From sandeen@redhat.com Fri Feb 20 09:50:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 483917F56 for ; Fri, 20 Feb 2015 09:50:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 182B4304066 for ; Fri, 20 Feb 2015 07:49:59 -0800 (PST) X-ASG-Debug-ID: 1424447383-04bdf06a59542b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id A4ceTtvrkd5MD3E3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Feb 2015 07:49:43 -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 (8.14.4/8.14.4) with ESMTP id t1KFnb6A031399 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 20 Feb 2015 10:49:38 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1KFnY5r016223 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 20 Feb 2015 10:49:37 -0500 Message-ID: <54E7578E.4090809@redhat.com> Date: Fri, 20 Feb 2015 09:49:34 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Michael Kerrisk , "Theodore Ts'o" CC: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424447383 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 2/20/15 2:50 AM, Michael Kerrisk wrote: > Hello Ted, > > Based on your commit message 0ae45f63d4e, I I wrote the documentation > below for MS_LAZYTIME, to go into the mount(2) man page. Could you > please check it over and let me know if it's accurate. In particular, > I added pieces marked with "*" below that were not part of the commit > message and I'd like confirmation that they're accurate. > > Thanks, > > Michael > > [[ > MS_LAZYTIME (since Linux 3.20) > Only update filetimes (atime, mtime, ctime) on the in- > memory version of the file inode. The on-disk time‐ > stamps are updated only when: "filetimes" and "file inode" seems a bit awkward. How about: > MS_LAZYTIME (since Linux 3.20) > Reduce on-disk updates of inode timestamps (atime, mtime, ctime) > by maintaining these changes only in memory, unless: (maybe I'm bike-shedding too much, if so, sorry). > (a) the inode needs to be updated for some change unre‐ > lated to file timestamps; > > (b) the application employs fsync(2), syncfs(2), or > sync(2); > > (c) an undeleted inode is evicted from memory; or > > * (d) more than 24 hours have passed since the i-node was > * written to disk. Please don't use "i-node" - simply "inode" is much more common in the manpages AFAICT. > This mount option significantly reduces writes to the > inode table for workloads that perform frequent random > writes to preallocated files. This seems like an overly specific description of a single workload out of many which may benefit, but what do others think? "inode table" is also fairly extN-specific. -Eric > * As at Linux 3.20, this option is supported only on ext4. > ]] > From willy@linux.intel.com Fri Feb 20 16:16:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 123BF7F56 for ; Fri, 20 Feb 2015 16:16:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D790F8F8064 for ; Fri, 20 Feb 2015 14:15:58 -0800 (PST) X-ASG-Debug-ID: 1424470557-04bdf00ecc06f80001-NocioJ Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id 4KQSKYaAa0DlrVA3 for ; Fri, 20 Feb 2015 14:15:57 -0800 (PST) X-Barracuda-Envelope-From: willy@linux.intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.24 X-Barracuda-IPDD: Level2 [linux.intel.com/134.134.136.24] Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP; 20 Feb 2015 14:11:47 -0800 X-Barracuda-IPDD: Level2 [linux.intel.com/134.134.136.24] X-Barracuda-IPDD: Level2 [linux.intel.com/134.134.136.24] X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.09,617,1418112000"; d="scan'208";a="530570513" Received: from pgadde-mobl.amr.corp.intel.com (HELO thog) ([10.254.105.215]) by orsmga003.jf.intel.com with ESMTP; 20 Feb 2015 14:07:06 -0800 Received: from willy by thog with local (Exim 4.84) (envelope-from ) id 1YOvrT-000709-S3; Fri, 20 Feb 2015 17:15:51 -0500 Date: Fri, 20 Feb 2015 17:15:51 -0500 From: Matthew Wilcox To: Jan Kara Cc: Matthew Wilcox , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "david@fromorbit.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150220221551.GB2780@wil.cx> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150218104009.GB4614@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1424470557 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > So to handle this it can start transaction in ext4_dax_fault() / > ext4_dax_mkwrite() if write is requested and call ext4_jbd2_file_inode() > after dax_fault() / dax_mkwrite() returns. Complete function will look > something like follows: How about this? I tried to encompass both the unwritten extent conversion as well as starting the journal at the right point in the locking hierarchy. If we're going to expose do_dax_fault(), I think it needs to be called __dax_fault(). I decided to return VM_FAULT_RETRY and a new flag VM_FAULT_UNWRITTEN from __dax_fault(), rather than convert it to return an errno. P.S. I love patches which touch *both* fs.h *and* mm.h. In case there were any files that weren't already being rebuilt. diff --git a/fs/dax.c b/fs/dax.c index 556238f..81dbdaa 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -316,7 +316,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, return error; } -static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, +int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, get_block_t get_block) { struct file *file = vma->vm_file; @@ -329,7 +329,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, sector_t block; pgoff_t size; int error; - int major = 0; + int ret = 0; size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; if (vmf->pgoff >= size) @@ -367,13 +367,15 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, error = -EIO; /* fs corruption? */ if (error) goto unlock_page; + if (buffer_unwritten(&bh)) + ret |= VM_FAULT_UNWRITTEN; if (!buffer_mapped(&bh) && !buffer_unwritten(&bh) && !vmf->cow_page) { if (vmf->flags & FAULT_FLAG_WRITE) { error = get_block(inode, block, &bh, 1); count_vm_event(PGMAJFAULT); mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); - major = VM_FAULT_MAJOR; + ret = VM_FAULT_MAJOR; if (!error && (bh.b_size < PAGE_SIZE)) error = -EIO; if (error) @@ -407,7 +409,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, } /* Check we didn't race with a read fault installing a new page */ - if (!page && major) + if (!page && (ret & VM_FAULT_MAJOR)) page = find_lock_page(mapping, vmf->pgoff); if (page) { @@ -421,12 +423,14 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, error = dax_insert_mapping(inode, &bh, vma, vmf); out: + if (error == -ENOSPC) + return VM_FAULT_RETRY | ret; if (error == -ENOMEM) - return VM_FAULT_OOM | major; + return VM_FAULT_OOM | ret; /* -EBUSY is fine, somebody else faulted on the same PTE */ if ((error < 0) && (error != -EBUSY)) - return VM_FAULT_SIGBUS | major; - return VM_FAULT_NOPAGE | major; + return VM_FAULT_SIGBUS | ret; + return VM_FAULT_NOPAGE | ret; unlock_page: if (page) { @@ -435,6 +439,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, } goto out; } +EXPORT_SYMBOL_GPL(__dax_fault); /** * dax_fault - handle a page fault on a DAX file @@ -455,7 +460,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, sb_start_pagefault(sb); file_update_time(vma->vm_file); } - result = do_dax_fault(vma, vmf, get_block); + result = __dax_fault(vma, vmf, get_block); if (vmf->flags & FAULT_FLAG_WRITE) sb_end_pagefault(sb); diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 4340e38..84b4f1c 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -194,7 +194,58 @@ errout: #ifdef CONFIG_FS_DAX static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { - return dax_fault(vma, vmf, ext4_get_block_write); + handle_t *handle; + int create = (vmf->flags & FAULT_FLAG_WRITE) && !vmf->cow_page; + struct inode *inode = file_inode(vma->vm_file); + int ret, err = 0; + int retries = 0; + + if (create) { + sb_start_pagefault(inode->i_sb); + file_update_time(vma->vm_file); + retry_alloc: + handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, + ext4_writepage_trans_blocks(inode)); + if (IS_ERR(handle)) { + err = PTR_ERR(handle); + goto err; + } + } + + ret = __dax_fault(vma, vmf, ext4_get_block); + + if (create) { + if (ret & VM_FAULT_UNWRITTEN) { + loff_t offset = (loff_t)vmf->pgoff << PAGE_SHIFT; + err = ext4_convert_unwritten_extents(NULL, inode, + offset, PAGE_SIZE); + ret &= ~VM_FAULT_UNWRITTEN; + } + if (!err && + ext4_test_inode_state(inode, EXT4_STATE_ORDERED_MODE)) + err = ext4_jbd2_file_inode(handle, inode); + + if (err == -ENOSPC) { + ret |= VM_FAULT_RETRY; + err = 0; + } + + ext4_journal_stop(handle); + if (err < 0) + goto err; + if ((ret & VM_FAULT_RETRY) && + ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry_alloc; + ret &= ~VM_FAULT_RETRY; + } + + out: + if (create) + sb_end_pagefault(inode->i_sb); + return ret; + err: + ret = block_page_mkwrite_return(err); + goto out; } static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 85404f1..8f1ea7d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -657,18 +657,6 @@ has_zeroout: return retval; } -static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate) -{ - struct inode *inode = bh->b_assoc_map->host; - /* XXX: breaks on 32-bit > 16GB. Is that even supported? */ - loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits; - int err; - if (!uptodate) - return; - WARN_ON(!buffer_unwritten(bh)); - err = ext4_convert_unwritten_extents(NULL, inode, offset, bh->b_size); -} - /* Maximum number of blocks we map for direct IO at once. */ #define DIO_MAX_BLOCKS 4096 @@ -706,11 +694,6 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock, map_bh(bh, inode->i_sb, map.m_pblk); bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; - if (IS_DAX(inode) && buffer_unwritten(bh) && !io_end) { - bh->b_assoc_map = inode->i_mapping; - bh->b_private = (void *)(unsigned long)iblock; - bh->b_end_io = ext4_end_io_unwritten; - } if (io_end && io_end->flag & EXT4_IO_END_UNWRITTEN) set_buffer_defer_completion(bh); bh->b_size = inode->i_sb->s_blocksize * map.m_len; diff --git a/include/linux/fs.h b/include/linux/fs.h index 239c89c..2af5050 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2597,6 +2597,7 @@ int dax_clear_blocks(struct inode *, sector_t block, 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); +int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); int dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, unsigned int flags, get_block_t); #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) diff --git a/include/linux/mm.h b/include/linux/mm.h index ceb50ec..ffc9947 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1100,7 +1100,7 @@ static inline int page_mapped(struct page *page) #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ #define VM_FAULT_SIGSEGV 0x0040 - +#define VM_FAULT_UNWRITTEN 0x0080 /* Unwritten extent needs conversion */ #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ #define VM_FAULT_RETRY 0x0400 /* ->fault blocked, must retry */ From david@fromorbit.com Fri Feb 20 17:09:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B9387F56 for ; Fri, 20 Feb 2015 17:09:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BFE18AC002 for ; Fri, 20 Feb 2015 15:09:22 -0800 (PST) X-ASG-Debug-ID: 1424473759-04cb6c4bd300df0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mzYTz7eDH4UyJho4 for ; Fri, 20 Feb 2015 15:09:20 -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: A2BTCgDrvedUPDkjLHlbgwaHYql+Bpg9BAICgRhEAQEBAQEBBQEBAQE4O4QPAQEBAwE6HCMQCAMOCgklDwUlAwcaE4gnB9QAAQEBBwIgGIVshQuEDBEBUAeEKwWZEIEcgxWGPIF4hk2CJByBZCoxgQuBOAEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Feb 2015 09:39:11 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOwh4-0004wV-HD; Sat, 21 Feb 2015 10:09:10 +1100 Date: Sat, 21 Feb 2015 10:09:10 +1100 From: Dave Chinner To: Michal Hocko Cc: Johannes Weiner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220230910.GG12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150218082502.GA4478@dhcp22.suse.cz> <20150218104859.GM12722@dastard> <20150218121602.GC4478@dhcp22.suse.cz> <20150219110124.GC15569@phnom.home.cmpxchg.org> <20150219122914.GH28427@dhcp22.suse.cz> <20150219214356.GW12722@dastard> <20150220124849.GH21248@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150220124849.GH21248@dhcp22.suse.cz> 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: 1424473759 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15602 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 20, 2015 at 01:48:49PM +0100, Michal Hocko wrote: > On Fri 20-02-15 08:43:56, Dave Chinner wrote: > > On Thu, Feb 19, 2015 at 01:29:14PM +0100, Michal Hocko wrote: > > > On Thu 19-02-15 06:01:24, Johannes Weiner wrote: > > > [...] > > > > Preferrably, we'd get rid of all nofail allocations and replace them > > > > with preallocated reserves. But this is not going to happen anytime > > > > soon, so what other option do we have than resolving this on the OOM > > > > killer side? > > > > > > As I've mentioned in other email, we might give GFP_NOFAIL allocator > > > access to memory reserves (by giving it __GFP_HIGH). > > > > Won't work when you have thousands of concurrent transactions > > running in XFS and they are all doing GFP_NOFAIL allocations. > > Is there any bound on how many transactions can run at the same time? Yes. As many reservations that can fit in the available log space. The log can be sized up to 2GB, and for filesystems larger than 4TB will default to 2GB. Log space reservations depend on the operation being done - an inode timestamp update requires about 5kB of reservation, and rename requires about 200kB. Hence we can easily have thousands of active transactions, even in the worst case log space reversation cases. You're saying it would be insane to have hundreds or thousands of threads doing GFP_NOFAIL allocations concurrently. Reality check: XFS has been operating successfully under such workload conditions in production systems for many years. > > That's why I suggested the per-transaction reserve pool - we can use > > that > > I am still not sure what you mean by reserve pool (API wise). How > does it differ from pre-allocating memory before the "may not fail > context"? Could you elaborate on it, please? It is preallocating memory: into a reserve pool associated with the transaction, done as part of the transaction reservation mechanism we already have in XFS. The allocator then uses that reserve pool to allocate from if an allocation would otherwise fail. There is no way we can preallocate specific objects before the transaction - that's just insane, especially handling the unbound demand paged object requirement. Hence the need for a "preallocated reserve pool" that the allocator can dip into that covers the memory we need to *allocate and can't reclaim* during the course of the transaction. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Feb 20 17:15:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 180A07F56 for ; Fri, 20 Feb 2015 17:15:19 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DEA158F8073 for ; Fri, 20 Feb 2015 15:15:15 -0800 (PST) X-ASG-Debug-ID: 1424474113-04bdf05c0100f00001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id hDTiAuEdpTiBTxfq for ; Fri, 20 Feb 2015 15:15:13 -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: A2BUCgAYv+dUPDkjLHlbgwaHYql+Bpg9BAICgRhEAQEBAQEBBQEBAQE4O4QPAQEBAwE6HCMFCwgDDgoJDQEXDwUlAwcaExuIDAfUAAELIBiFbIULhG4HEgGEGAWVQoFKggSBHIlRhQeDPoQkKjGBBAcXgSEBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Feb 2015 09:45:12 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOwmt-0004x4-Ll; Sat, 21 Feb 2015 10:15:11 +1100 Date: Sat, 21 Feb 2015 10:15:11 +1100 From: Dave Chinner To: Tetsuo Handa Cc: hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150220231511.GH12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> 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: 1424474113 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15603 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 20, 2015 at 07:36:33PM +0900, Tetsuo Handa wrote: > Dave Chinner wrote: > > I really don't care about the OOM Killer corner cases - it's > > completely the wrong way line of development to be spending time on > > and you aren't going to convince me otherwise. The OOM killer a > > crutch used to justify having a memory allocation subsystem that > > can't provide forward progress guarantee mechanisms to callers that > > need it. > > I really care about the OOM Killer corner cases, for I'm > > (1) seeing trouble cases which occurred in enterprise systems > under OOM conditions You reach OOM, then your SLAs are dead and buried. Reboot the box - its a much more reliable way of returning to a working system than playing Russian Roulette with the OOM killer. > (2) trying to downgrade OOM "Deadlock or Genocide" attacks (which > an unprivileged user with a login shell can trivially trigger > since Linux 2.0) to OOM "Genocide" attacks in order to allow > OOM-unkillable daemons to restart OOM-killed processes > > (3) waiting for a bandaid for (2) in order to propose changes for > mitigating OOM "Genocide" attacks (as bad guys will find how to > trigger OOM "Deadlock or Genocide" attacks from changes for > mitigating OOM "Genocide" attacks) Which is yet another indication that the OOM killer is the wrong solution to the "lack of forward progress" problem. Any one can generate enough memory pressure to trigger the OOM killer; we can't prevent that from occurring when the OOM killer can be invoked by user processes. > I started posting to linux-mm ML in order to make forward progress > about (1) and (2). I don't want the memory allocation subsystem to > lock up an entire system by indefinitely disabling memory releasing > mechanism provided by the OOM killer. > > > I've proposed a method of providing this forward progress guarantee > > for subsystems of arbitrary complexity, and this removes the > > dependency on the OOM killer for fowards allocation progress in such > > contexts (e.g. filesystems). We should be discussing how to > > implement that, not what bandaids we need to apply to the OOM > > killer. I want to fix the underlying problems, not push them under > > the OOM-killer bus... > > I'm fine with that direction for new kernels provided that a simple > bandaid which can be backported to distributor kernels for making > OOM "Deadlock" attacks impossible is implemented. Therefore, I'm > discussing what bandaids we need to apply to the OOM killer. The band-aids being proposed are worse than the problem they are intended to cover up. In which case, the band-aids should not be applied. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Feb 20 18:13:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 32F787F47 for ; Fri, 20 Feb 2015 18:13:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13358304032 for ; Fri, 20 Feb 2015 16:13:01 -0800 (PST) X-ASG-Debug-ID: 1424477579-04bdf05c0001e80001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id swlcFqfVYpLlHrXj for ; Fri, 20 Feb 2015 16:12:59 -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: A2BYCwBHzedUPDkjLHlbgwZShxCpbBIGBZJFhXMEAoEaRAEBAQEBAQUBAQEBODuEUBwjGCQ0BSUDBy2ILtQsGIVsiXkdhBUFhWKNSoVkgRyDFYYhghODD4M+hCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Feb 2015 10:42:30 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YOxgK-000549-P8; Sat, 21 Feb 2015 11:12:28 +1100 Date: Sat, 21 Feb 2015 11:12:28 +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] xfs: PNFS block layout support for 3.20-rc1 Message-ID: <20150221001228.GS4251@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: PNFS block layout support for 3.20-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: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1424477579 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15605 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the updates from the tree below? It contains the changes to XFS needed to support the PNFS block layout server that you pulled in through Bruce's NFS server tree merge. I originally thought that I'd need to merge changes into the NFS server side, but Bruce had already picked them up and so this is purely changes to the fs/xfs/ codebase. It should merge cleanly with your current tree - if it doesn't then I've probably done something wrong. -Dave. The following changes since commit bad962662dbc60e76ec1baae34af56b1ba2dfa5f: Merge branch 'xfs-misc-fixes-for-3.20-4' into for-next (2015-02-10 09:24:25 +1100) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-pnfs-for-linus-3.20-rc1 for you to fetch changes up to 781355c6e5ae87908de27dec3380a34918c33eee: xfs: recall pNFS layouts on conflicting access (2015-02-16 11:59:50 +1100) ---------------------------------------------------------------- xfs: pnfs block layout support for 3.20-rc1 This update contains the implementation of the PNFS server export methods that enable use of XFS filesystems as a block layout target. ---------------------------------------------------------------- Christoph Hellwig (2): xfs: implement pNFS export operations xfs: recall pNFS layouts on conflicting access fs/xfs/Makefile | 1 + fs/xfs/xfs_export.c | 6 + fs/xfs/xfs_file.c | 14 ++- fs/xfs/xfs_fsops.c | 6 + fs/xfs/xfs_ioctl.c | 9 +- fs/xfs/xfs_iops.c | 13 ++- fs/xfs/xfs_iops.h | 1 + fs/xfs/xfs_mount.h | 11 ++ fs/xfs/xfs_pnfs.c | 322 +++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_pnfs.h | 18 +++ 10 files changed, 393 insertions(+), 8 deletions(-) create mode 100644 fs/xfs/xfs_pnfs.c create mode 100644 fs/xfs/xfs_pnfs.h -- Dave Chinner david@fromorbit.com From service4@mx1.allarelbus.com Sat Feb 21 00:37:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=DATE_IN_PAST_12_24, MISSING_MIMEOLE,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 4ABEC7F58 for ; Sat, 21 Feb 2015 00:37:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29CD08F8070 for ; Fri, 20 Feb 2015 22:37:55 -0800 (PST) X-ASG-Debug-ID: 1424500666-04cbb0611007190001-NocioJ Received: from mail.mx1.allarelbus.com ([23.88.239.84]) by cuda.sgi.com with ESMTP id hfAVyh4ZLFtnQUfs for ; Fri, 20 Feb 2015 22:37:47 -0800 (PST) X-Barracuda-Envelope-From: service4@mx1.allarelbus.com X-Barracuda-Apparent-Source-IP: 23.88.239.84 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.mx1.allarelbus.com A71AC19DC91E2 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mx1.allarelbus.com; s=mx1.allarelbus; t=1424449808; bh=9MD2jSlfj2RBW7A9rtFarEb1aCWXuZ5u6FuFJcNVMAc=; h=Date:From:To:Reply-To:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding; b=wgAOYkDeib4b8Xwp+uGTb26Zh3XLy4eDS6SkvAkZ8PDdQ2wbC3AO06PJqw/BGqC6z DajUK9nmnumAj6LiTfZEK5G81TEmkF11ckghRQYQCxkMZx0Iaxy+FkUxybS69dt2aE vxsCFL53hRW8Ej+lNZ/SpglLbzWRpfuPsLuLz6pM= Date: Sat, 21 Feb 2015 00:30:01 +0800 From: "Raymond" To: "xfs" Reply-To: Subject: =?GB2312?B?bW9iaWxlIGJvYXQgaG9pc3QgIC8gdmVzcw==?= =?GB2312?B?ZWwgaGF1bGVyIC8gbWFyaW5lIGhvaXN0IA==?= =?GB2312?B?IC8gbWFyaW5lIHRyYXZlbGlmdA==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?GB2312?B?bW9iaWxlIGJvYXQgaG9pc3QgIC8gdmVzcw==?= =?GB2312?B?ZWwgaGF1bGVyIC8gbWFyaW5lIGhvaXN0IA==?= =?GB2312?B?IC8gbWFyaW5lIHRyYXZlbGlmdA==?= X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[23.88.239.84] X-Barracuda-Start-Time: 1424500667 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.45 X-Barracuda-Spam-Status: No, SCORE=2.45 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, DKIM_SIGNED, K2_MISSING_MIMEOLE, MISSING_MID, MISSING_MIMEOLE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.20 MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.19 K2_MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Message-Id: <20150221063755.C2DDE106C290@cuda.sgi.com> RGVhciBmcmllbmRzLA0KDQpXZSBzcGVjaWFsaXplIGluIGRlc2lnbmluZyBhbmQgbWFudWZhY3R1 cmluZyBtb2JpbGUgYm9hdCBob2lzdC4NCg0KWW91IGNhbiBjYWxsIGl0IHZlc3NlbCBoYXVsZXIs IG1hcmluZSBob2lzdCBvciBtYXJpbmUgdHJhdmVsaWZ0LiANCg0KSG9wZSB0aGUgYXR0YWNobWVu dHMgY2FuIGZpbmQgeW91IHVuZGVyc3RhbmQgb3VyIHByb2R1Y3QgYW5kIGNvbXBhbnkgd2VsbC4N Cg0KVGlsbCBub3cgd2UgYXJlIHRoZSBvbmx5IGZhY3Rvcnkgd2hpY2ggZXhwb3J0IG1vYmlsZSBi b2F0IGhvaXN0Lg0KDQpUaGUgbGlmdCBjYXBhY2l0eSBvZiBvdXIgbW9iaWxlIGJvYXQgaG9pc3Qg aXMgdXAgdG8gMTAwMHQuIFRoZSBrZXkgY29tcG9uZW50cyBhcmUgZnJvbSBVU0EgYW5kIEV1cm9w ZWFuIGJyYW5kLiBFc3BlY2lhbGx5LCBvdXIgcHJpY2UgaXMgcHJvdmVkIGJlIG1vcmUgY29tcGV0 aXRpdmUgYnkgb3VyIGNsaWVudCB3aG8gYm91Z2h0IG1vYmlsZSBib2F0IGhvaXN0IGZyb20gRXVy b3BlYW4gYnJhbmQuDQoNCldlIHdvdWxkIGxpa2UgdG8gc2VlayBzb21lb25lIGZvciBtdXR1YWwg d2luLXdpbiBjb29wZXJhdGlvbiBmb3IgcHJvbW90aW5nIG91ciBtb2JpbGUgYm9hdCBob2lzdCBp biB5b3VyIGNvdW50cnkuDQoNCllvdXIga2luZCByZXBseSB3aWxsIGJlIGhpZ2hseSBhcHByZWNp YXRlZC4NCg0KUmVnYXJkcyENCg0KUmF5bW9uZCBXYW5nDQo= From mtk.manpages@gmail.com Sat Feb 21 01:57:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 948BF7F58 for ; Sat, 21 Feb 2015 01:57:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 827F68F8064 for ; Fri, 20 Feb 2015 23:57:10 -0800 (PST) X-ASG-Debug-ID: 1424505427-04cbb0610e07f90001-NocioJ Received: from mail-wg0-f48.google.com (mail-wg0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id Ofyl1rkkFSNyVTB5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 23:57:08 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wg0-f48.google.com with SMTP id l18so16931526wgh.7 for ; Fri, 20 Feb 2015 23:57:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=MbGBs06GcQ8Iv5nmW1wnMeqScN7uYJs/vur75usbSFM=; b=Ycx6y5J0L1k8923jHfuz5orIW6pB/36Aq0XwIYvBYF+8Vkl4Bmv1NRKSOYStj+HwrL 48Nr/J4AOmqZWdsPkaKR2BijzoFunU8sDjRrLBavxQtTyGNlW3hQJVSypUyusZLZjfsx JJSh9RVu8cWXHpQ2nY/0bDcZNTombzg6icBhBc0e5U3/t953fM09VmE4iCKvuXftbocn Xh5wnJuuVsFhhEdJrZrp5ju+0Hx0aM21KcmoGfpFE0miq4SIUGeS8n8/PG24xnW48n76 0pdDYrQqZLMBE4jxGhPDX2YM9L7SWqbLrxaMxizI2b5LCXHUFn9U3O+pWUyLcJj/yFlb U69g== X-Received: by 10.194.83.98 with SMTP id p2mr2448037wjy.125.1424505426923; Fri, 20 Feb 2015 23:57:06 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id dj4sm45556969wjc.13.2015.02.20.23.57.05 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Feb 2015 23:57:06 -0800 (PST) Message-ID: <54E83A51.6000807@gmail.com> Date: Sat, 21 Feb 2015 08:57:05 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Eric Sandeen , Theodore Ts'o CC: mtk.manpages@gmail.com, Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <54E7578E.4090809@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-wg0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1424505427 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15616 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 02/20/2015 04:49 PM, Eric Sandeen wrote: > On 2/20/15 2:50 AM, Michael Kerrisk wrote: >> Hello Ted, >> >> Based on your commit message 0ae45f63d4e, I I wrote the documentation >> below for MS_LAZYTIME, to go into the mount(2) man page. Could you >> please check it over and let me know if it's accurate. In particular, >> I added pieces marked with "*" below that were not part of the commit >> message and I'd like confirmation that they're accurate. >> >> Thanks, >> >> Michael >> >> [[ >> MS_LAZYTIME (since Linux 3.20) >> Only update filetimes (atime, mtime, ctime) on the in- >> memory version of the file inode. The on-disk time‐ >> stamps are updated only when: > > "filetimes" and "file inode" seems a bit awkward. How about: > >> MS_LAZYTIME (since Linux 3.20) >> Reduce on-disk updates of inode timestamps (atime, mtime, ctime) >> by maintaining these changes only in memory, unless: > > (maybe I'm bike-shedding too much, if so, sorry). Nah it''s the good sort of bikeshedding ;-). "filetimes" was a wordo--I meant "timestamps". I've taken your wording mostly. > >> (a) the inode needs to be updated for some change unre‐ >> lated to file timestamps; >> >> (b) the application employs fsync(2), syncfs(2), or >> sync(2); >> >> (c) an undeleted inode is evicted from memory; or >> >> * (d) more than 24 hours have passed since the i-node was >> * written to disk. > > Please don't use "i-node" - simply "inode" is much more common in the manpages > AFAICT. Yup, that was a typo. Fixed. >> This mount option significantly reduces writes to the >> inode table for workloads that perform frequent random >> writes to preallocated files. > > This seems like an overly specific description of a single workload out > of many which may benefit, but what do others think? Fair enough. I reworded that to note it as an example. > "inode table" is also fairly extN-specific. I'll await further input on that point. Now we have: MS_LAZYTIME (since Linux 3.20) Reduce on-disk updates of inode timestamps (atime, mtime, ctime) by maintaining these changes only in mem‐ ory. The on-disk timestamps are updated only when: (a) the inode needs to be updated for some change unre‐ lated to file timestamps; (b) the application employs fsync(2), syncfs(2), or sync(2); (c) an undeleted inode is evicted from memory; or (d) more than 24 hours have passed since the inode was written to disk. This mount option significantly reduces writes to the inode table for some workloads (e.g., when performing frequent random writes to preallocated files). Cheers, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From tytso@thunk.org Sat Feb 21 01:57:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=DATE_IN_PAST_03_06, 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 9AD0B7F58 for ; Sat, 21 Feb 2015 01:57:28 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C9CB8F8070 for ; Fri, 20 Feb 2015 23:57:28 -0800 (PST) X-ASG-Debug-ID: 1424505445-04bdf05c02079d0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id zfhsVNCHAzozVcxm (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 23:57:25 -0800 (PST) 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=fFzKaOxz2WvXsvM8899XCK0oXtDU74B9Kvrj+7q9s7Y=; b=sWqhuntVl92FFFyM0qzq0FcHvTon2+R2ityF4z4CXY0UvxMpYdnmCUqYM+WN80uI6Xdcw3Uu2K9OYdiA/g4lR6hvoHM9byyGJqrRMEiCy2D8gEN+WOwqYW6X6sNZOnyaZZJrImBoSO+CCZV7DH/npmBoCPmiUd4FbAW33zDnzQ0=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YP4wF-00015a-2X; Sat, 21 Feb 2015 07:57:23 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 8900C58048C; Fri, 20 Feb 2015 21:56:36 -0500 (EST) Date: Fri, 20 Feb 2015 21:56:36 -0500 From: Theodore Ts'o To: Eric Sandeen Cc: Michael Kerrisk , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150221025636.GB7922@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54E7578E.4090809@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1424505445 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 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, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15616 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 On Fri, Feb 20, 2015 at 09:49:34AM -0600, Eric Sandeen wrote: > > > This mount option significantly reduces writes to the > > inode table for workloads that perform frequent random > > writes to preallocated files. > > This seems like an overly specific description of a single workload out > of many which may benefit, but what do others think? "inode table" is also > fairly extN-specific. How about somethign like "This mount significantly reduces writes needed to update the inode's timestamps, especially mtime and actime. Examples of workloads where this could be a large win include frequent random writes to preallocated files, as well as cases where the MS_STRICTATIME mount option is enabled."? (The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat system calls will return the correctly updated atime, but those atime updates won't get flushed to disk unless the inode needs to be updated for file system / data consistency reasons, or when the inode is pushed out of memory, or when the file system is unmounted.) - Ted From tytso@thunk.org Sat Feb 21 01:57:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=DATE_IN_PAST_03_06, 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 9A6FA7F62 for ; Sat, 21 Feb 2015 01:57:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8826E304066 for ; Fri, 20 Feb 2015 23:57:31 -0800 (PST) X-ASG-Debug-ID: 1424505449-04cb6c4bd107a90001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 5GeTgleK6k7KEe4m (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 20 Feb 2015 23:57:29 -0800 (PST) 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=GTsRvxHuT3C3/mCWzfje0PHMJi+qCfQCut2hf2tED6s=; b=KSNY3gLIxRQXAGHgqcaQ+KMSv8Klbyw6hg5E7RVt0r7FQtnAKjoR1tcan4imzUwjKBg/VnYvZxSJVkxP8v2dgA8LtUnx4N9PwmlK3RkBnFqFFfZsrNHeD79ZGUpA2ghKawmcjHjppn7AMnf1cP7ykCiLWaDRXsC4OQBNGa37o9w=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YP4wE-00015W-Rk; Sat, 21 Feb 2015 07:57:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 581B65804E9; Fri, 20 Feb 2015 22:20:00 -0500 (EST) Date: Fri, 20 Feb 2015 22:20:00 -0500 From: Theodore Ts'o To: Dave Chinner Cc: Tetsuo Handa , hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150221032000.GC7922@thunk.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150220231511.GH12722@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1424505449 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.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=BSF_SC5_SA210e, DATE_IN_PAST_03_06, DATE_IN_PAST_03_06_2, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date -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 BSF_SC5_SA210e Custom Rule SA210e 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2 +akpm So I'm arriving late to this discussion since I've been in conference mode for the past week, and I'm only now catching up on this thread. I'll note that this whole question of whether or not file systems should use GFP_NOFAIL is one where the mm developers are not of one mind. In fact, search for the subject line "fs/reiserfs/journal.c: Remove obsolete __GFP_NOFAIL" where we recapitulated many of these arguments, Andrew Morton said that it was better to use GFP_NOFAIL over the alternatives of (a) panic'ing the kernel because the file system has no way to move forward other than leaving the file system corrupted, or (b) looping in the file system to retry the memory allocation to avoid the unfortunate effects of (a). So based on akpm's sage advise and wisdom, I added back GFP_NOFAIL to ext4/jbd2. It sounds like 9879de7373fc is causing massive file system errors, and it seems **really** unfortunate it was added so late in the day (between -rc6 and rc7). So at this point, it seems we have two choices. We can either revert 9879de7373fc, or I can add a whole lot more GFP_FAIL flags to ext4's memory allocations and submit them as stable bug fixes. Linux MM developers, this is your call. I will liberally be adding GFP_NOFAIL to ext4 if you won't revert the commit, because that's the only way I can fix things with minimal risk of adding additional, potentially more serious regressions. - Ted From akpm@linux-foundation.org Sat Feb 21 03:19:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8F9077F51 for ; Sat, 21 Feb 2015 03:19:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F6868F8070 for ; Sat, 21 Feb 2015 01:19:50 -0800 (PST) X-ASG-Debug-ID: 1424510388-04cb6c4bd309050001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id yyWefgbrdKfUdFah (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 01:19:49 -0800 (PST) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from localhost (c-67-161-9-76.hsd1.ca.comcast.net [67.161.9.76]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 6BB848A1; Sat, 21 Feb 2015 09:19:47 +0000 (UTC) Date: Sat, 21 Feb 2015 01:19:07 -0800 From: Andrew Morton To: "Theodore Ts'o" Cc: Dave Chinner , Tetsuo Handa , hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-Id: <20150221011907.2d26c979.akpm@linux-foundation.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? In-Reply-To: <20150221032000.GC7922@thunk.org> References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1424510388 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15619 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, 20 Feb 2015 22:20:00 -0500 "Theodore Ts'o" wrote: > +akpm I was hoping not to have to read this thread ;) afaict there are two (main) issues: a) whether to oom-kill when __GFP_FS is not set. The kernel hasn't been doing this for ages and nothing has changed recently. b) whether to keep looping when __GFP_NOFAIL is not set and __GFP_FS is not set and we can't oom-kill anything (which goes without saying, because __GFP_FS isn't set!). And 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") somewhat inadvertently changed this policy - the allocation attempt will now promptly return ENOMEM if !__GFP_NOFAIL and !__GFP_FS. Correct enough? Question a) seems a bit of red herring and we can park it for now. What I'm not really understanding is why the pre-3.19 implementation actually worked. We've exhausted the free pages, we're not succeeding at reclaiming anything, we aren't able to oom-kill anyone. Yet it *does* work - we eventually find that memory and everything proceeds. How come? Where did that memory come from? Short term, we need to fix 3.19.x and 3.20 and that appears to be by applying Johannes's akpm-doesnt-know-why-it-works patch: --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, if (high_zoneidx < ZONE_NORMAL) goto out; /* The OOM killer does not compensate for light reclaim */ - if (!(gfp_mask & __GFP_FS)) + if (!(gfp_mask & __GFP_FS)) { + /* + * XXX: Page reclaim didn't yield anything, + * and the OOM killer can't be invoked, but + * keep looping as per should_alloc_retry(). + */ + *did_some_progress = 1; goto out; + } /* * GFP_THISNODE contains __GFP_NORETRY and we never hit this. * Sanity check for bare calls of __GFP_THISNODE, not real OOM. Have people adequately confirmed that this gets us out of trouble? And yes, I agree that sites such as xfs's kmem_alloc() should be passing __GFP_NOFAIL to tell the page allocator what's going on. I don't think it matters a lot whether kmem_alloc() retains its retry loop. If __GFP_NOFAIL is working correctly then it will never loop anyway... Also, this: On Wed, 18 Feb 2015 09:54:30 +1100 Dave Chinner wrote: > Right now, the oom killer is a liability. Over the past 6 months > I've slowly had to exclude filesystem regression tests from running > on small memory machines because the OOM killer is now so unreliable > that it kills the test harness regularly rather than the process > generating memory pressure. David, I did not know this! If you've been telling us about this then perhaps it wasn't loud enough. From penguin-kernel@i-love.sakura.ne.jp Sat Feb 21 05:12:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E32567F51 for ; Sat, 21 Feb 2015 05:12:32 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B45CF304062 for ; Sat, 21 Feb 2015 03:12:29 -0800 (PST) X-ASG-Debug-ID: 1424517145-04bdf05c010ac50001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id 3GWSipQXrmeOOGZ0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 03:12:26 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav201.sakura.ne.jp (fsav201.sakura.ne.jp [210.224.168.163]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LBCDrm082115; Sat, 21 Feb 2015 20:12:13 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav201.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav201.sakura.ne.jp); Sat, 21 Feb 2015 20:12:13 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav201.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LBCDVa082111; Sat, 21 Feb 2015 20:12:13 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: david@fromorbit.com Cc: hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> In-Reply-To: <20150220231511.GH12722@dastard> Message-Id: <201502212012.BJJ39083.LQFOtJFSHMVOFO@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Sat, 21 Feb 2015 20:12:08 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424517145 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15622 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header My main issue is c) whether to oom-kill more processes when the OOM victim cannot be terminated presumably due to the OOM killer deadlock. Dave Chinner wrote: > On Fri, Feb 20, 2015 at 07:36:33PM +0900, Tetsuo Handa wrote: > > Dave Chinner wrote: > > > I really don't care about the OOM Killer corner cases - it's > > > completely the wrong way line of development to be spending time on > > > and you aren't going to convince me otherwise. The OOM killer a > > > crutch used to justify having a memory allocation subsystem that > > > can't provide forward progress guarantee mechanisms to callers that > > > need it. > > > > I really care about the OOM Killer corner cases, for I'm > > > > (1) seeing trouble cases which occurred in enterprise systems > > under OOM conditions > > You reach OOM, then your SLAs are dead and buried. Reboot the > box - its a much more reliable way of returning to a working system > than playing Russian Roulette with the OOM killer. What Service Level Agreements? Such troubles are occurring on RHEL systems where users are not sitting in front of the console. Unless somebody is sitting in front of the console in order to do SysRq-b when troubles occur, the down time of system will become significantly longer. What mechanisms are available for minimizing the down time of system when troubles under OOM condition occur? Software/hardware watchdog? Indeed they may help, but they may be triggered prematurely when the system has not entered into the OOM condition. Only the OOM killer knows. > > > (2) trying to downgrade OOM "Deadlock or Genocide" attacks (which > > an unprivileged user with a login shell can trivially trigger > > since Linux 2.0) to OOM "Genocide" attacks in order to allow > > OOM-unkillable daemons to restart OOM-killed processes > > > > (3) waiting for a bandaid for (2) in order to propose changes for > > mitigating OOM "Genocide" attacks (as bad guys will find how to > > trigger OOM "Deadlock or Genocide" attacks from changes for > > mitigating OOM "Genocide" attacks) > > Which is yet another indication that the OOM killer is the wrong > solution to the "lack of forward progress" problem. Any one can > generate enough memory pressure to trigger the OOM killer; we can't > prevent that from occurring when the OOM killer can be invoked by > user processes. > We have memory cgroups to reduce the possibility of triggering the OOM killer, though there will be several bugs remaining in RHEL kernels which make administrators hesitate to use memory cgroups. > > I started posting to linux-mm ML in order to make forward progress > > about (1) and (2). I don't want the memory allocation subsystem to > > lock up an entire system by indefinitely disabling memory releasing > > mechanism provided by the OOM killer. > > > > > I've proposed a method of providing this forward progress guarantee > > > for subsystems of arbitrary complexity, and this removes the > > > dependency on the OOM killer for fowards allocation progress in such > > > contexts (e.g. filesystems). We should be discussing how to > > > implement that, not what bandaids we need to apply to the OOM > > > killer. I want to fix the underlying problems, not push them under > > > the OOM-killer bus... > > > > I'm fine with that direction for new kernels provided that a simple > > bandaid which can be backported to distributor kernels for making > > OOM "Deadlock" attacks impossible is implemented. Therefore, I'm > > discussing what bandaids we need to apply to the OOM killer. > > The band-aids being proposed are worse than the problem they are > intended to cover up. In which case, the band-aids should not be > applied. > The problem is simple. /proc/sys/vm/panic_on_oom == 0 setting does not help if the OOM killer failed to determine correct task to kill + allow access to memory reserves. The OOM killer is waiting forever under the OOM deadlock condition than triggering kernel panic. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_MRG/2/html/Realtime_Tuning_Guide/sect-Realtime_Tuning_Guide-General_System_Tuning-Swapping_and_Out_Of_Memory_Tips.html says that "Usually, oom_killer can kill rogue processes and the system will survive." but says nothing about what to do when we hit the OOM killer deadlock condition. My band-aids allows the OOM killer to trigger kernel panic (followed by optionally kdump and automatic reboot) for people who want to reboot the box when default /proc/sys/vm/panic_on_oom == 0 setting failed to kill rogue processes, and allows people who want the system to survive when the OOM killer failed to determine correct task to kill + allow access to memory reserves. Not only we cannot expect that the OOM killer messages being saved to /var/log/messages under the OOM killer deadlock condition, but also we do not emit the OOM killer messages if we hit void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, unsigned int points, unsigned long totalpages, struct mem_cgroup *memcg, nodemask_t *nodemask, const char *message) { struct task_struct *victim = p; struct task_struct *child; struct task_struct *t; struct mm_struct *mm; unsigned int victim_points = 0; static DEFINE_RATELIMIT_STATE(oom_rs, DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); /* * If the task is already exiting, don't alarm the sysadmin or kill * its children or threads, just set TIF_MEMDIE so it can die quickly */ if (task_will_free_mem(p)) { /***** _THIS_ _CONDITION_ *****/ set_tsk_thread_flag(p, TIF_MEMDIE); put_task_struct(p); return; } if (__ratelimit(&oom_rs)) dump_header(p, gfp_mask, order, memcg, nodemask); task_lock(p); pr_err("%s: Kill process %d (%s) score %d or sacrifice child\n", message, task_pid_nr(p), p->comm, points); task_unlock(p); followed by entering into the OOM killer deadlock condition. This is annoying for me because neither serial console nor netconsole helps finding out that the system entered into the OOM condition. If you want to stop people from playing Russian Roulette with the OOM killer, please remove the OOM killer code entirely from RHEL kernels so that people must use their systems with hardcoded /proc/sys/vm/panic_on_oom == 1 setting. Can you do it? > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > From penguin-kernel@i-love.sakura.ne.jp Sat Feb 21 06:00:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB38C7F47 for ; Sat, 21 Feb 2015 06:00:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A759D304062 for ; Sat, 21 Feb 2015 04:00:25 -0800 (PST) X-ASG-Debug-ID: 1424520022-04cbb0610e0d100001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id ix7uyPeMZD5E5Dkg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 04:00:23 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav401.sakura.ne.jp (fsav401.sakura.ne.jp [133.242.250.100]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LC0AjT090591; Sat, 21 Feb 2015 21:00:10 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav401.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav401.sakura.ne.jp); Sat, 21 Feb 2015 21:00:10 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav401.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LC0AmK090588; Sat, 21 Feb 2015 21:00:10 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: tytso@mit.edu Cc: david@fromorbit.com, hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> In-Reply-To: <20150221032000.GC7922@thunk.org> Message-Id: <201502212100.IBG78151.QLHSOMJFVOtFFO@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Sat, 21 Feb 2015 21:00:05 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424520023 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Theodore Ts'o wrote: > So at this point, it seems we have two choices. We can either revert > 9879de7373fc, or I can add a whole lot more GFP_FAIL flags to ext4's > memory allocations and submit them as stable bug fixes. Can you absorb this side effect by simply adding GFP_NOFAIL to only ext4's memory allocations? Don't you also depend on lower layers which use GFP_NOIO? BTW, while you are using open-coded GFP_NOFAIL retry loop for GFP_NOFS allocation in jbd2, you are already using GFP_NOFAIL for GFP_NOFS allocation in jbd. Failure check being there for GFP_NOFAIL seems redundant. ---------- linux-3.19/fs/jbd2/transaction.c ---------- 257 static int start_this_handle(journal_t *journal, handle_t *handle, 258 gfp_t gfp_mask) 259 { 260 transaction_t *transaction, *new_transaction = NULL; 261 int blocks = handle->h_buffer_credits; 262 int rsv_blocks = 0; 263 unsigned long ts = jiffies; 264 265 /* 266 * 1/2 of transaction can be reserved so we can practically handle 267 * only 1/2 of maximum transaction size per operation 268 */ 269 if (WARN_ON(blocks > journal->j_max_transaction_buffers / 2)) { 270 printk(KERN_ERR "JBD2: %s wants too many credits (%d > %d)\n", 271 current->comm, blocks, 272 journal->j_max_transaction_buffers / 2); 273 return -ENOSPC; 274 } 275 276 if (handle->h_rsv_handle) 277 rsv_blocks = handle->h_rsv_handle->h_buffer_credits; 278 279 alloc_transaction: 280 if (!journal->j_running_transaction) { 281 new_transaction = kmem_cache_zalloc(transaction_cache, 282 gfp_mask); 283 if (!new_transaction) { 284 /* 285 * If __GFP_FS is not present, then we may be 286 * being called from inside the fs writeback 287 * layer, so we MUST NOT fail. Since 288 * __GFP_NOFAIL is going away, we will arrange 289 * to retry the allocation ourselves. 290 */ 291 if ((gfp_mask & __GFP_FS) == 0) { 292 congestion_wait(BLK_RW_ASYNC, HZ/50); 293 goto alloc_transaction; 294 } 295 return -ENOMEM; 296 } 297 } 298 299 jbd_debug(3, "New handle %p going live.\n", handle); ---------- linux-3.19/fs/jbd2/transaction.c ---------- ---------- linux-3.19/fs/jbd/transaction.c ---------- 84 static int start_this_handle(journal_t *journal, handle_t *handle) 85 { 86 transaction_t *transaction; 87 int needed; 88 int nblocks = handle->h_buffer_credits; 89 transaction_t *new_transaction = NULL; 90 int ret = 0; 91 92 if (nblocks > journal->j_max_transaction_buffers) { 93 printk(KERN_ERR "JBD: %s wants too many credits (%d > %d)\n", 94 current->comm, nblocks, 95 journal->j_max_transaction_buffers); 96 ret = -ENOSPC; 97 goto out; 98 } 99 100 alloc_transaction: 101 if (!journal->j_running_transaction) { 102 new_transaction = kzalloc(sizeof(*new_transaction), 103 GFP_NOFS|__GFP_NOFAIL); 104 if (!new_transaction) { 105 ret = -ENOMEM; 106 goto out; 107 } 108 } 109 110 jbd_debug(3, "New handle %p going live.\n", handle); ---------- linux-3.19/fs/jbd/transaction.c ---------- From penguin-kernel@i-love.sakura.ne.jp Sat Feb 21 07:49:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7CF6A7F51 for ; Sat, 21 Feb 2015 07:49:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F8D6304039 for ; Sat, 21 Feb 2015 05:49:07 -0800 (PST) X-ASG-Debug-ID: 1424526544-04bdf05c000dad0001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id qCuIMKfO65C2N12c (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 05:49:05 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav402.sakura.ne.jp (fsav402.sakura.ne.jp [133.242.250.101]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LDmpCo009755; Sat, 21 Feb 2015 22:48:51 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav402.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav402.sakura.ne.jp); Sat, 21 Feb 2015 22:48:51 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav402.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1LDmo2S009752; Sat, 21 Feb 2015 22:48:50 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: akpm@linux-foundation.org Cc: tytso@mit.edu, david@fromorbit.com, hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> In-Reply-To: <20150221011907.2d26c979.akpm@linux-foundation.org> Message-Id: <201502212248.DCJ69753.MOJFOtQLFSOVFH@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Sat, 21 Feb 2015 22:48:49 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424526545 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15627 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Andrew Morton wrote: > On Fri, 20 Feb 2015 22:20:00 -0500 "Theodore Ts'o" wrote: > > > +akpm > > I was hoping not to have to read this thread ;) Sorry for getting so complicated. > What I'm not really understanding is why the pre-3.19 implementation > actually worked. We've exhausted the free pages, we're not succeeding > at reclaiming anything, we aren't able to oom-kill anyone. Yet it > *does* work - we eventually find that memory and everything proceeds. > > How come? Where did that memory come from? > Even without __GFP_NOFAIL, GFP_NOFS / GFP_NOIO allocations retried forever (without invoking the OOM killer) if order <= PAGE_ALLOC_COSTLY_ORDER and TIF_MEMDIE is not set. Somebody else volunteered that memory while retrying. This implies silent hang-up forever if nobody volunteers memory. > And yes, I agree that sites such as xfs's kmem_alloc() should be > passing __GFP_NOFAIL to tell the page allocator what's going on. I > don't think it matters a lot whether kmem_alloc() retains its retry > loop. If __GFP_NOFAIL is working correctly then it will never loop > anyway... Commit 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") inadvertently changed GFP_NOFS / GFP_NOIO allocations not to retry unless __GFP_NOFAIL is specified. Therefore, either applying Johannes's akpm-doesnt-know-why-it-works patch or passing __GFP_NOFAIL will restore the pre-3.19 behavior (with possibility of silent hang-up). From linkinjeon@gmail.com Sat Feb 21 09:48:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=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 08EBC7F56 for ; Sat, 21 Feb 2015 09:48:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D90378F8033 for ; Sat, 21 Feb 2015 07:48:42 -0800 (PST) X-ASG-Debug-ID: 1424533720-04cbb0610f11730001-NocioJ Received: from mail-pd0-f174.google.com (mail-pd0-f174.google.com [209.85.192.174]) by cuda.sgi.com with ESMTP id yiseOpgYWOy0A6zI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:48:41 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfl12 with SMTP id fl12so14658440pdb.4 for ; Sat, 21 Feb 2015 07:48:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=MqcrjWBqMiszn6LMQz71fC6Io4pC1UoHKru14CZ6Ahw=; b=tl/rfbeAl35dYlu1xW34aMlqTkNoU/8D3XQr4KIjdAdavQeDegJQ5U4MG2567Thx34 u/IHgSw9kwy1teDwA3pBzVsHbO4ghAf6lfZcffmZlCjYUfcCy7RrAgWmAxW+KvdiQjwt wKNavAFarJKz5V5+YTGcdK9kfuRDfB357o5g6X6iXgXnZIPCeZs1+SKTD/LfWEjDEisG 8yhHiF/9d31Q67gNE1a0phOCORzfg5LQkRioZBMElLYnLgFiNfZ7WUbJOYKQALlR9EtT 5nfMCWLvGtwr927LurfIaNc5wt7Te1eOmok/ms/MTbIbEiRjIX0vYca6trukLMfFpLBD WhGA== X-Received: by 10.70.91.8 with SMTP id ca8mr5131462pdb.156.1424533720449; Sat, 21 Feb 2015 07:48:40 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.48.35 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:48:38 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 0/12] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Sun, 22 Feb 2015 00:45:42 +0900 X-ASG-Orig-Subj: [PATCH v10 0/12] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f174.google.com[209.85.192.174] X-Barracuda-Start-Time: 1424533721 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 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 From: Namjae Jeon In continuation of the work of making the process of non linear editing of media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE for fallocate. This flag will work opposite to the FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will create new space inside file by inserting a hole within the range specified by offset and len. User can write new data in this space. e.g. ads. Like collapse range, currently we have the limitation that offset and len should be block size aligned for both XFS and Ext4. The semantics of the flag are : 1) It creates space within file by inserting a hole of len bytes starting at offset byte without overwriting any existing data. All the data blocks from offset to EOF are shifted towards right to make hole space. 2) It should be used exclusively. No other fallocate flag in combination. 3) Offset and length supplied to fallocate should be fs block size aligned in case of xfs and ext4. 4) Insert range does not work for the case when offset is overlapping/beyond i_size. If the user wants to insert space at the end of file they are advised to use either ftruncate(2) or fallocate(2) with mode 0. 5) It increses the size of file by len bytes. Namjae Jeon (12): fs: Add support FALLOC_FL_INSERT_RANGE for fallocate xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE xfstests: generic/042: Standard insert range tests xfstests: generic/043: Delayed allocation insert range xfstests: generic/044: Multi insert range tests xfstests: generic/045: Delayed allocation multi insert xfstests: generic/046: Test multiple fallocate insert/collapse range calls xfstests: fsstress: Add fallocate insert range operation xfstests: fsx: Add fallocate insert range operation manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:48:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B96137F56 for ; Sat, 21 Feb 2015 09:48:54 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A57E8F8039 for ; Sat, 21 Feb 2015 07:48:54 -0800 (PST) X-ASG-Debug-ID: 1424533732-04cb6c4bd1114f0001-NocioJ Received: from mail-pd0-f170.google.com (mail-pd0-f170.google.com [209.85.192.170]) by cuda.sgi.com with ESMTP id jZ7CfKg6Aj5IIHV9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:48:53 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjz10 with SMTP id z10so14708474pdj.0 for ; Sat, 21 Feb 2015 07:48:52 -0800 (PST) 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=yNhegc8hizi66FckFryzUI+5qPijeXWnd/QayLCpsso=; b=UvrdS5SOuEO7NYvSFdkkHoT61Mnw7x19/6xkAU8v92x8LJG5aXGgLrhSqwcMBuECsb PhuQB71WJZ2d+zbLaxeuouL5jDN+pr1k3ZzW4tWMFAgn3YGlODufABgsPjRRn5Gvacv5 VSK+blHGV2AwDIQPkI8GrGTm2E+QaMY2xhc00ucp0E7dJUYHU/vlA0FsKq2i3w1Qgl0H STQ5kcHpJBI7CKYZvJU9YOb2rhw9FD6LDUaKJfdsWmWoI/d8kAU4NJgz3DKfSUJL1uSe k7qn+VFs+6t5uGYwfPl5vxUBa4xo1oFSBlean9AMc8Yo13HBvF4tGkc8/2a9f1rt/ngg +yTA== X-Received: by 10.68.189.41 with SMTP id gf9mr5061703pbc.21.1424533732348; Sat, 21 Feb 2015 07:48:52 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.48.43 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:48:51 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Sun, 22 Feb 2015 00:45:43 +0900 X-ASG-Orig-Subj: [PATCH v10 1/12] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424533554-28024-2-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f170.google.com[209.85.192.170] X-Barracuda-Start-Time: 1424533732 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 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 From: Namjae Jeon FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 8 ++++++-- include/linux/falloc.h | 6 ++++++ include/uapi/linux/falloc.h | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/fs/open.c b/fs/open.c index 33f9cbf..b724cc0 100644 --- a/fs/open.c +++ b/fs/open.c @@ -231,8 +231,7 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) return -EINVAL; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + if (mode & ~FALLOC_FL_SUPPORTED_MASK) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +249,11 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; diff --git a/include/linux/falloc.h b/include/linux/falloc.h index 3159168..9961110 100644 --- a/include/linux/falloc.h +++ b/include/linux/falloc.h @@ -21,4 +21,10 @@ struct space_resv { #define FS_IOC_RESVSP _IOW('X', 40, struct space_resv) #define FS_IOC_RESVSP64 _IOW('X', 42, struct space_resv) +#define FALLOC_FL_SUPPORTED_MASK (FALLOC_FL_KEEP_SIZE | \ + FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_COLLAPSE_RANGE | \ + FALLOC_FL_ZERO_RANGE | \ + FALLOC_FL_INSERT_RANGE) + #endif /* _FALLOC_H_ */ diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..3e445a7 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,21 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to insert space within the file size without + * overwriting any existing data. The contents of the file beyond offset are + * shifted towards right by len bytes to create a hole. As such, this + * operation will increase the size of the file by len bytes. + * + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * + * Attempting to insert space using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8D7517F56 for ; Sat, 21 Feb 2015 09:49:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E47EAC003 for ; Sat, 21 Feb 2015 07:49:04 -0800 (PST) X-ASG-Debug-ID: 1424533741-04cbb0610e11750001-NocioJ Received: from mail-pd0-f170.google.com (mail-pd0-f170.google.com [209.85.192.170]) by cuda.sgi.com with ESMTP id mO6ynZBpMWr0xNgD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:02 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfp1 with SMTP id fp1so14640667pdb.5 for ; Sat, 21 Feb 2015 07:49:01 -0800 (PST) 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=tgFonYrfcwxN0C9fl2l1MJoJoi1KEuW7WZdSzL+McR8=; b=cNESlzWcWRkMYX6dLrciZCc3C31sPdrkOOw7/1iDQZ3TkBWj3eoXwHKh1gCIaO67M0 xnMonXOdlccI0Ld26GdRAWewMaFuYIK2VSc3/aE2g0Rlj3QS259OTyfvHwGUcExv9J5R slv/RriVoQ9epEoylRGhcJYjzzBuRnyAVxMoreT4t1MQ1BzCtiQGqPgBSnjT89rdmplG XUg4qlDMMBAD5HGNjmrVybUCChFJgmMQcuGkgpjAa/QGjUNhG2wIJVj7/Rh9OdEgsUyv a13myndPA+keP3gKOyN+Z1HI4kvard3fykkWVretk550aq0RHjVTnP2KHz0yP+VJRlql OAgw== X-Received: by 10.70.42.206 with SMTP id q14mr4872589pdl.141.1424533741513; Sat, 21 Feb 2015 07:49:01 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.48.54 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:00 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Sun, 22 Feb 2015 00:45:44 +0900 X-ASG-Orig-Subj: [PATCH v10 2/12] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424533554-28024-3-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f170.google.com[209.85.192.170] X-Barracuda-Start-Time: 1424533742 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 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 From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 356 ++++++++++++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_bmap.h | 13 +- fs/xfs/xfs_bmap_util.c | 131 ++++++++++++----- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 41 +++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 461 insertions(+), 83 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 61ec015..9944e4d 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5518,50 +5518,90 @@ xfs_bmse_shift_one( int *current_ext, struct xfs_bmbt_rec_host *gotp, struct xfs_btree_cur *cur, - int *logflags) + int *logflags, + enum shift_direction direction) { struct xfs_ifork *ifp; xfs_fileoff_t startoff; - struct xfs_bmbt_rec_host *leftp; + struct xfs_bmbt_rec_host *adj_irecp; struct xfs_bmbt_irec got; - struct xfs_bmbt_irec left; + struct xfs_bmbt_irec adj_irec; int error; int i; + int total_extents; ifp = XFS_IFORK_PTR(ip, whichfork); + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); xfs_bmbt_get_all(gotp, &got); - startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); - /* - * Check for merge if we've got an extent to the left, otherwise make - * sure there's enough room at the start of the file for the shift. - */ - if (*current_ext) { - /* grab the left extent and check for a large enough hole */ - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); - xfs_bmbt_get_all(leftp, &left); + if (direction == SHIFT_LEFT) { + startoff = got.br_startoff - offset_shift_fsb; + + /* + * Check for merge if we've got an extent to the left, + * otherwise make sure there's enough room at the start + * of the file for the shift. + */ + if (!*current_ext) { + if (got.br_startoff < offset_shift_fsb) + return -EINVAL; + goto update_current_ext; + } + /* + * grab the left extent and check for a large + * enough hole. + */ + adj_irecp = xfs_iext_get_ext(ifp, *current_ext - 1); + xfs_bmbt_get_all(adj_irecp, &adj_irec); - if (startoff < left.br_startoff + left.br_blockcount) + if (startoff < + adj_irec.br_startoff + adj_irec.br_blockcount) return -EINVAL; /* check whether to merge the extent or shift it down */ - if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { + if (xfs_bmse_can_merge(&adj_irec, &got, + offset_shift_fsb)) { return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, - *current_ext, gotp, leftp, cur, - logflags); + *current_ext, gotp, adj_irecp, + cur, logflags); } - } else if (got.br_startoff < offset_shift_fsb) - return -EINVAL; - + } else { + startoff = got.br_startoff + offset_shift_fsb; + /* nothing to move if this is the last extent */ + if (*current_ext >= (total_extents - 1)) + goto update_current_ext; + /* + * If this is not the last extent in the file, make sure there + * is enough room between current extent and next extent for + * accommodating the shift. + */ + adj_irecp = xfs_iext_get_ext(ifp, *current_ext + 1); + xfs_bmbt_get_all(adj_irecp, &adj_irec); + if (startoff + got.br_blockcount > adj_irec.br_startoff) + return -EINVAL; + /* + * Unlike a left shift (which involves a hole punch), + * a right shift does not modify extent neighbors + * in any way. We should never find mergeable extents + * in this scenario. Check anyways and warn if we + * encounter two extents that could be one. + */ + if (xfs_bmse_can_merge(&got, &adj_irec, offset_shift_fsb)) + WARN_ON_ONCE(1); + } /* * Increment the extent index for the next iteration, update the start * offset of the in-core extent and update the btree if applicable. */ - (*current_ext)++; +update_current_ext: + if (direction == SHIFT_LEFT) + (*current_ext)++; + else + (*current_ext)--; xfs_bmbt_set_startoff(gotp, startoff); *logflags |= XFS_ILOG_CORE; if (!cur) { @@ -5577,14 +5617,14 @@ xfs_bmse_shift_one( got.br_startoff = startoff; return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, - got.br_blockcount, got.br_state); + got.br_blockcount, got.br_state); } /* - * Shift extent records to the left to cover a hole. + * Shift extent records to the left/right to cover/create a hole. * * The maximum number of extents to be shifted in a single operation is - * @num_exts. @start_fsb specifies the file offset to start the shift and the + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb * is the length by which each extent is shifted. If there is no hole to shift * the extents into, this will be considered invalid operation and we abort @@ -5594,12 +5634,13 @@ int xfs_bmap_shift_extents( struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, int *done, - xfs_fileoff_t *next_fsb, + xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + enum shift_direction direction, int num_exts) { struct xfs_btree_cur *cur = NULL; @@ -5609,10 +5650,11 @@ xfs_bmap_shift_extents( struct xfs_ifork *ifp; xfs_extnum_t nexts = 0; xfs_extnum_t current_ext; + xfs_extnum_t total_extents; + xfs_extnum_t stop_extent; int error = 0; int whichfork = XFS_DATA_FORK; int logflags = 0; - int total_extents; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5628,6 +5670,8 @@ xfs_bmap_shift_extents( ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT); + ASSERT(*next_fsb != NULLFSBLOCK || direction == SHIFT_RIGHT); ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS)) { @@ -5645,43 +5689,83 @@ xfs_bmap_shift_extents( } /* + * There may be delalloc extents in the data fork before the range we + * are collapsing out, so we cannot use the count of real extents here. + * Instead we have to calculate it from the incore fork. + */ + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (total_extents == 0) { + *done = 1; + goto del_cursor; + } + + /* + * In case of first right shift, we need to initialize next_fsb + */ + if (*next_fsb == NULLFSBLOCK) { + gotp = xfs_iext_get_ext(ifp, total_extents - 1); + xfs_bmbt_get_all(gotp, &got); + *next_fsb = got.br_startoff; + if (stop_fsb > *next_fsb) { + *done = 1; + goto del_cursor; + } + } + + /* Lookup the extent index at which we have to stop */ + if (direction == SHIFT_RIGHT) { + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); + /* Make stop_extent exclusive of shift range */ + stop_extent--; + } else + stop_extent = total_extents; + + /* * Look up the extent index for the fsb where we start shifting. We can * henceforth iterate with current_ext as extent list changes are locked * out via ilock. * * gotp can be null in 2 cases: 1) if there are no extents or 2) - * start_fsb lies in a hole beyond which there are no extents. Either + * *next_fsb lies in a hole beyond which there are no extents. Either * way, we are done. */ - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); if (!gotp) { *done = 1; goto del_cursor; } - /* - * There may be delalloc extents in the data fork before the range we - * are collapsing out, so we cannot use the count of real extents here. - * Instead we have to calculate it from the incore fork. - */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - while (nexts++ < num_exts && current_ext < total_extents) { + /* some sanity checking before we finally start shifting extents */ + if ((direction == SHIFT_LEFT && current_ext >= stop_extent) || + (direction == SHIFT_RIGHT && current_ext <= stop_extent)) { + error = -EIO; + goto del_cursor; + } + + while (nexts++ < num_exts) { error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, - ¤t_ext, gotp, cur, &logflags); + ¤t_ext, gotp, cur, &logflags, + direction); if (error) goto del_cursor; + /* + * If there was an extent merge during the shift, the extent + * count can change. Update the total and grade the next record. + */ + if (direction == SHIFT_LEFT) { + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + stop_extent = total_extents; + } - /* update total extent count and grab the next record */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - if (current_ext >= total_extents) + if (current_ext == stop_extent) { + *done = 1; + *next_fsb = NULLFSBLOCK; break; + } gotp = xfs_iext_get_ext(ifp, current_ext); } - /* Check if we are done */ - if (current_ext == total_extents) { - *done = 1; - } else if (next_fsb) { + if (!*done) { xfs_bmbt_get_all(gotp, &got); *next_fsb = got.br_startoff; } @@ -5696,3 +5780,189 @@ del_cursor: return error; } + +/* + * Splits an extent into two extents at split_fsb block such that it is + * the first block of the current_ext. @current_ext is a target extent + * to be split. @split_fsb is a block where the extents is split. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur = NULL; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* split extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + xfs_extnum_t current_ext; + int error = 0; + int logflags = 0; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + + logflags = XFS_ILOG_CORE; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } else + logflags |= XFS_ILOG_DEXT; + + /* Add new extent */ + current_ext++; + xfs_iext_insert(ip, current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) { + cur->bc_private.b.allocated = 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + } + + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, + &firstfsb, &free_list); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return error; +} diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index b9d8a49..6aaa0c1 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -166,6 +166,11 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) */ #define XFS_BMAP_MAX_SHIFT_EXTENTS 1 +enum shift_direction { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + #ifdef DEBUG void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int whichfork, unsigned long caller_ip); @@ -211,8 +216,10 @@ int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, - int *done, xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, - struct xfs_bmap_free *flist, int num_exts); + xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, + int *done, xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, enum shift_direction direction, + int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 22a5dcb..fe1f11b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1376,22 +1376,19 @@ out: } /* - * xfs_collapse_file_space() - * This routine frees disk space and shift extent for the given file. - * The first thing we do is to free data blocks in the specified range - * by calling xfs_free_file_space(). It would also sync dirty data - * and invalidate page cache over the region on which collapse range - * is working. And Shift extent records to the left to cover a hole. - * RETURNS: - * 0 on success - * errno on error - * + * @next_fsb will keep track of the extent currently undergoing shift. + * @stop_fsb will keep track of the extent at which we have to stop. + * If we are shifting left, we will start with block (offset + len) and + * shift each extent till last extent. + * If we are shifting right, we will start with last extent inside file space + * and continue until we reach the block corresponding to offset. */ int -xfs_collapse_file_space( - struct xfs_inode *ip, - xfs_off_t offset, - xfs_off_t len) +xfs_shift_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len, + enum shift_direction direction) { int done = 0; struct xfs_mount *mp = ip->i_mount; @@ -1400,21 +1397,26 @@ xfs_collapse_file_space( struct xfs_bmap_free free_list; xfs_fsblock_t first_block; int committed; - xfs_fileoff_t start_fsb; + xfs_fileoff_t stop_fsb; xfs_fileoff_t next_fsb; xfs_fileoff_t shift_fsb; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(direction == SHIFT_LEFT || direction == SHIFT_RIGHT); - trace_xfs_collapse_file_space(ip); + if (direction == SHIFT_LEFT) { + next_fsb = XFS_B_TO_FSB(mp, offset + len); + stop_fsb = XFS_B_TO_FSB(mp, VFS_I(ip)->i_size); + } else { + /* + * If right shift, delegate the work of initialization of + * next_fsb to xfs_bmap_shift_extent as it has ilock held. + */ + next_fsb = NULLFSBLOCK; + stop_fsb = XFS_B_TO_FSB(mp, offset); + } - next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); - error = xfs_free_file_space(ip, offset, len); - if (error) - return error; - /* * Trim eofblocks to avoid shifting uninitialized post-eof preallocation * into the accessible region of the file. @@ -1427,20 +1429,28 @@ xfs_collapse_file_space( /* * Writeback and invalidate cache for the remainder of the file as we're - * about to shift down every extent from the collapse range to EOF. The - * free of the collapse range above might have already done some of - * this, but we shouldn't rely on it to do anything outside of the range - * that was freed. + * about to shift down every extent from offset to EOF. */ error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - offset + len, -1); + offset, -1); if (error) return error; error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - (offset + len) >> PAGE_CACHE_SHIFT, -1); + offset >> PAGE_CACHE_SHIFT, -1); if (error) return error; + /* + * The extent shiting code works on extent granularity. So, if + * stop_fsb is not the starting block of extent, we need to split + * the extent at stop_fsb. + */ + if (direction == SHIFT_RIGHT) { + error = xfs_bmap_split_extent(ip, stop_fsb); + if (error) + return error; + } + while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); /* @@ -1464,7 +1474,7 @@ xfs_collapse_file_space( if (error) goto out; - xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_bmap_init(&free_list, &first_block); @@ -1472,10 +1482,9 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - start_fsb = next_fsb; - error = xfs_bmap_shift_extents(tp, ip, start_fsb, shift_fsb, - &done, &next_fsb, &first_block, &free_list, - XFS_BMAP_MAX_SHIFT_EXTENTS); + error = xfs_bmap_shift_extents(tp, ip, &next_fsb, shift_fsb, + &done, stop_fsb, &first_block, &free_list, + direction, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; @@ -1484,18 +1493,70 @@ xfs_collapse_file_space( goto out; error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_iunlock(ip, XFS_ILOCK_EXCL); } return error; out: xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } /* + * xfs_collapse_file_space() + * This routine frees disk space and shift extent for the given file. + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. And Shift extent records to the left to cover a hole. + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + int error; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_collapse_file_space(ip); + + error = xfs_free_file_space(ip, offset, len); + if (error) + return error; + + return xfs_shift_file_space(ip, offset, len, SHIFT_LEFT); +} + +/* + * xfs_insert_file_space() + * This routine create hole space by shifting extents for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. + * RETURNS: + * 0 on success + * errno on error + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + return xfs_shift_file_space(ip, offset, len, SHIFT_RIGHT); +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 736429a..af97d9a 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -63,6 +63,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ce615d1..edeaccc 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -816,6 +816,11 @@ xfs_file_write_iter( return ret; } +#define XFS_FALLOC_FL_SUPPORTED \ + (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | \ + FALLOC_FL_INSERT_RANGE) + STATIC long xfs_file_fallocate( struct file *file, @@ -829,11 +834,11 @@ xfs_file_fallocate( enum xfs_prealloc_flags flags = 0; uint iolock = XFS_IOLOCK_EXCL; loff_t new_size = 0; + bool do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + if (mode & ~XFS_FALLOC_FL_SUPPORTED) return -EOPNOTSUPP; xfs_ilock(ip, iolock); @@ -867,6 +872,27 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + new_size = i_size_read(inode) + len; + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* check the new inode size does not wrap through zero */ + if (new_size > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + do_file_insert = 1; } else { flags |= XFS_PREALLOC_SET; @@ -901,8 +927,19 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Perform hole insertion now that the file size has been + * updated so that if we crash during the operation we don't + * leave shifted extents past EOF and hence losing access to + * the data that is contained within them. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, iolock); return error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..7e45fa1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -664,6 +664,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E342229DF7 for ; Sat, 21 Feb 2015 09:49:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81E78AC004 for ; Sat, 21 Feb 2015 07:49:09 -0800 (PST) X-ASG-Debug-ID: 1424533747-04bdf05c0210440001-NocioJ Received: from mail-pd0-f169.google.com (mail-pd0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id nT9qgCbgdsrmwhMy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:07 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjp10 with SMTP id p10so14685533pdj.3 for ; Sat, 21 Feb 2015 07:49:07 -0800 (PST) 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=U8kliYZh0yOUoZisDZeUtC1nLQ32iKsoKvY5Rt3z1po=; b=P6WwL7Nhc8jf+h69pAbTPRfvPel0TA3vE/JKc/JSQ8r22jNNFoe8b+fQTr8rhLnDk2 NX5Z4v5xSvVrRg8dHyycX8z+oMYP4tEy2Ydak6nBvRgYDwNHXawOIGK6ZOpjjtmKZSJ4 Ey9hYxVPH6DnMudvtI0EisNLNhsQBubMkZP9K0vG2N6tsGalgrAxfKn6j+1lkvvs9VC6 pMXaZz7N2qsZRShNdhLBTltbX4dAMUWnHc/jVE+5r6r25V1TEndQ/2zdsyyghEup0fNh djF5FaFhfonD+DcAs6uzKIoKOSw239PVQoCxsLIfcZtjlM32lB5QZeZgSc5t84Si1BTi LUOg== X-Received: by 10.68.68.171 with SMTP id x11mr5236457pbt.60.1424533747052; Sat, 21 Feb 2015 07:49:07 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.03 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:06 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Sun, 22 Feb 2015 00:45:45 +0900 X-ASG-Orig-Subj: [PATCH v10 3/12] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1424533554-28024-4-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1424533747 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 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 From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 6 + fs/ext4/extents.c | 302 +++++++++++++++++++++++++++++++++++-------- include/trace/events/ext4.h | 25 ++++ 3 files changed, 282 insertions(+), 51 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f63c3d5..0c98a2d 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -90,6 +90,11 @@ typedef __u32 ext4_lblk_t; /* data type for block group number */ typedef unsigned int ext4_group_t; +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + /* * Flags used in mballoc's allocation_context flags field. * @@ -2767,6 +2772,7 @@ extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); +extern int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len); extern int ext4_swap_extents(handle_t *handle, struct inode *inode1, struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2, ext4_lblk_t count, diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index bed4308..a07b109 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4924,7 +4924,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) @@ -4944,6 +4945,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (mode & FALLOC_FL_COLLAPSE_RANGE) return ext4_collapse_range(inode, offset, len); + if (mode & FALLOC_FL_INSERT_RANGE) + return ext4_insert_range(inode, offset, len); + if (mode & FALLOC_FL_ZERO_RANGE) return ext4_zero_range(file, offset, len, mode); @@ -5230,13 +5234,13 @@ ext4_access_path(handle_t *handle, struct inode *inode, /* * ext4_ext_shift_path_extents: * Shift the extents of a path structure lying between path[depth].p_ext - * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift - * from starting block for each extent. + * and EXT_LAST_EXTENT(path[depth].p_hdr), by @shift blocks. @SHIFT tells + * if it is right shift or left shift operation. */ static int ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, struct inode *inode, handle_t *handle, - ext4_lblk_t *start) + enum SHIFT_DIRECTION SHIFT) { int depth, err = 0; struct ext4_extent *ex_start, *ex_last; @@ -5258,19 +5262,25 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) update = 1; - *start = le32_to_cpu(ex_last->ee_block) + - ext4_ext_get_actual_len(ex_last); - while (ex_start <= ex_last) { - le32_add_cpu(&ex_start->ee_block, -shift); - /* Try to merge to the left. */ - if ((ex_start > - EXT_FIRST_EXTENT(path[depth].p_hdr)) && - ext4_ext_try_to_merge_right(inode, - path, ex_start - 1)) + if (SHIFT == SHIFT_LEFT) { + le32_add_cpu(&ex_start->ee_block, + -shift); + /* Try to merge to the left. */ + if ((ex_start > + EXT_FIRST_EXTENT(path[depth].p_hdr)) + && + ext4_ext_try_to_merge_right(inode, + path, ex_start - 1)) + ex_last--; + else + ex_start++; + } else { + le32_add_cpu(&ex_last->ee_block, shift); + ext4_ext_try_to_merge_right(inode, path, + ex_last); ex_last--; - else - ex_start++; + } } err = ext4_ext_dirty(handle, inode, path + depth); if (err) @@ -5285,7 +5295,10 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (err) goto out; - le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + if (SHIFT == SHIFT_LEFT) + le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + else + le32_add_cpu(&path[depth].p_idx->ei_block, shift); err = ext4_ext_dirty(handle, inode, path + depth); if (err) goto out; @@ -5303,19 +5316,20 @@ out: /* * ext4_ext_shift_extents: - * All the extents which lies in the range from start to the last allocated - * block for the file are shifted downwards by shift blocks. + * All the extents which lies in the range from @start to the last allocated + * block for the @inode are shifted either towards left or right (depending + * upon @SHIFT) by @shift blocks. * On success, 0 is returned, error otherwise. */ static int ext4_ext_shift_extents(struct inode *inode, handle_t *handle, - ext4_lblk_t start, ext4_lblk_t shift) + ext4_lblk_t start, ext4_lblk_t shift, + enum SHIFT_DIRECTION SHIFT) { struct ext4_ext_path *path; int ret = 0, depth; struct ext4_extent *extent; - ext4_lblk_t stop_block; - ext4_lblk_t ex_start, ex_end; + ext4_lblk_t stop, *iterator, ex_start, ex_end; /* Let path point to the last extent */ path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); @@ -5327,58 +5341,84 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, if (!extent) goto out; - stop_block = le32_to_cpu(extent->ee_block) + + stop = le32_to_cpu(extent->ee_block) + ext4_ext_get_actual_len(extent); - /* Nothing to shift, if hole is at the end of file */ - if (start >= stop_block) - goto out; + /* + * In case of left shift, Don't start shifting extents until we make + * sure the hole is big enough to accommodate the shift. + */ + if (SHIFT == SHIFT_LEFT) { + path = ext4_find_extent(inode, start - 1, &path, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + if (extent) { + ex_start = le32_to_cpu(extent->ee_block); + ex_end = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + ex_start = 0; + ex_end = 0; + } - /* - * Don't start shifting extents until we make sure the hole is big - * enough to accomodate the shift. - */ - path = ext4_find_extent(inode, start - 1, &path, 0); - if (IS_ERR(path)) - return PTR_ERR(path); - depth = path->p_depth; - extent = path[depth].p_ext; - if (extent) { - ex_start = le32_to_cpu(extent->ee_block); - ex_end = le32_to_cpu(extent->ee_block) + - ext4_ext_get_actual_len(extent); - } else { - ex_start = 0; - ex_end = 0; + if ((start == ex_start && shift > ex_start) || + (shift > start - ex_end)) { + ext4_ext_drop_refs(path); + kfree(path); + return -EINVAL; + } } - if ((start == ex_start && shift > ex_start) || - (shift > start - ex_end)) - return -EINVAL; + /* + * In case of left shift, iterator points to start and it is increased + * till we reach stop. In case of right shift, iterator points to stop + * and it is decreased till we reach start. + */ + if (SHIFT == SHIFT_LEFT) + iterator = &start; + else + iterator = &stop; /* Its safe to start updating extents */ - while (start < stop_block) { - path = ext4_find_extent(inode, start, &path, 0); + while (start < stop) { + path = ext4_find_extent(inode, *iterator, &path, 0); if (IS_ERR(path)) return PTR_ERR(path); depth = path->p_depth; extent = path[depth].p_ext; if (!extent) { EXT4_ERROR_INODE(inode, "unexpected hole at %lu", - (unsigned long) start); + (unsigned long) *iterator); return -EIO; } - if (start > le32_to_cpu(extent->ee_block)) { + if (SHIFT == SHIFT_LEFT && *iterator > + le32_to_cpu(extent->ee_block)) { /* Hole, move to the next extent */ if (extent < EXT_LAST_EXTENT(path[depth].p_hdr)) { path[depth].p_ext++; } else { - start = ext4_ext_next_allocated_block(path); + *iterator = ext4_ext_next_allocated_block(path); continue; } } + + if (SHIFT == SHIFT_LEFT) { + extent = EXT_LAST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + extent = EXT_FIRST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) > 0 ? + le32_to_cpu(extent->ee_block) - 1 : 0; + /* Update path extent in case we need to stop */ + while (le32_to_cpu(extent->ee_block) < start) + extent++; + path[depth].p_ext = extent; + } ret = ext4_ext_shift_path_extents(path, shift, inode, - handle, &start); + handle, SHIFT); if (ret) break; } @@ -5483,7 +5523,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) ext4_discard_preallocations(inode); ret = ext4_ext_shift_extents(inode, handle, punch_stop, - punch_stop - punch_start); + punch_stop - punch_start, SHIFT_LEFT); if (ret) { up_write(&EXT4_I(inode)->i_data_sem); goto out_stop; @@ -5508,6 +5548,166 @@ out_mutex: return ret; } +/* + * ext4_insert_range: + * This function implements the FALLOC_FL_INSERT_RANGE flag of fallocate. + * The data blocks starting from @offset to the EOF are shifted by @len + * towards right to create a hole in the @inode. Inode size is increased + * by len bytes. + * Returns 0 on success, error otherwise. + */ +int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + handle_t *handle; + struct ext4_ext_path *path; + struct ext4_extent *extent; + ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk = 0; + unsigned int credits, ee_len; + int ret = 0, depth, split_flag = 0; + loff_t ioffset; + + /* Insert range works only on fs block size aligned offsets. */ + if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) || + len & (EXT4_CLUSTER_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + trace_ext4_insert_range(inode, offset, len); + + offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb); + len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb); + + /* Call ext4_force_commit to flush all data in case of data=journal */ + if (ext4_should_journal_data(inode)) { + ret = ext4_force_commit(inode->i_sb); + if (ret) + return ret; + } + + /* + * Need to round down to align start offset to page size boundary + * for page size > block size. + */ + ioffset = round_down(offset, PAGE_SIZE); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, + LLONG_MAX); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { + ret = -EOPNOTSUPP; + goto out_mutex; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + ret = -EFBIG; + goto out_mutex; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + + truncate_pagecache(inode, ioffset); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + /* Expand file to avoid data loss if there is error while shifting */ + inode->i_size += len; + EXT4_I(inode)->i_disksize += len; + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_stop; + + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + path = ext4_find_extent(inode, offset_lblk, NULL, 0); + if (IS_ERR(path)) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + depth = ext_depth(inode); + extent = path[depth].p_ext; + if (extent) { + ee_start_lblk = le32_to_cpu(extent->ee_block); + ee_len = ext4_ext_get_actual_len(extent); + + /* + * If offset_lblk is not the starting block of extent, split + * the extent @offset_lblk + */ + if ((offset_lblk > ee_start_lblk) && + (offset_lblk < (ee_start_lblk + ee_len))) { + if (ext4_ext_is_unwritten(extent)) + split_flag = EXT4_EXT_MARK_UNWRIT1 | + EXT4_EXT_MARK_UNWRIT2; + ret = ext4_split_extent_at(handle, inode, &path, + offset_lblk, split_flag, + EXT4_EX_NOCACHE | + EXT4_GET_BLOCKS_PRE_IO | + EXT4_GET_BLOCKS_METADATA_NOFAIL); + } + + ext4_ext_drop_refs(path); + kfree(path); + if (ret < 0) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + } + + ret = ext4_es_remove_extent(inode, offset_lblk, + EXT_MAX_BLOCKS - offset_lblk); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + /* + * if offset_lblk lies in a hole which is at start of file, use + * ee_start_lblk to shift extents + */ + ret = ext4_ext_shift_extents(inode, handle, + ee_start_lblk > offset_lblk ? ee_start_lblk : offset_lblk, + len_lblk, SHIFT_RIGHT); + + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + +out_stop: + ext4_journal_stop(handle); +out_dio: + ext4_inode_resume_unlocked_dio(inode); +out_mutex: + mutex_unlock(&inode->i_mutex); + return ret; +} + /** * ext4_swap_extents - Swap extents between two inodes * diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 6e5abd6..2a89d66 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2478,6 +2478,31 @@ TRACE_EVENT(ext4_collapse_range, __entry->offset, __entry->len) ); +TRACE_EVENT(ext4_insert_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + TRACE_EVENT(ext4_es_shrink, TP_PROTO(struct super_block *sb, int nr_shrunk, u64 scan_time, int nr_skipped, int retried), -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1725A29DFD for ; Sat, 21 Feb 2015 09:49:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EAE97304059 for ; Sat, 21 Feb 2015 07:49:13 -0800 (PST) X-ASG-Debug-ID: 1424533752-04cbb0610f11760001-NocioJ Received: from mail-pd0-f178.google.com (mail-pd0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id lT5b3Csb3KJjpzd9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:12 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfl12 with SMTP id fl12so14674683pdb.2 for ; Sat, 21 Feb 2015 07:49:12 -0800 (PST) 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=VVJUfiKt63uTyf/eAoBM/Vk+x7Q9HRz3uPA8vu1vWGI=; b=NmSGKjk/+xzp7crXNNlaEUywPDtual8DuEWJcqChBdbsr+ZuxTjvPZwq33AjcMbLiy 9EzDoRwivk2cPoXffxfULmIZ6VIZQcbeBDMmjZh8Zni6adbMTa3nxWDQ6mICYyxjAn/5 9vjlsdBrw47QvbS4Z/Wpgg8AzOZpUBippdnl43Q9FNUz5zqIr6lytjjY2hzS6pskg3Df pZpB1MtEAqYP/5N5rVFBwaXmhZNbs2yhi1YBDVe3eXp+MeHnMndXxabO+IVExyIcHpoi zV1KrlIqeXn5uragTmsoKbGW5J08sTAdNbmmkbRiLEGot7crGbM89E+BwDqPvX+hh6Ck dNEA== X-Received: by 10.66.62.201 with SMTP id a9mr5019234pas.101.1424533752295; Sat, 21 Feb 2015 07:49:12 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.08 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:11 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Date: Sun, 22 Feb 2015 00:45:46 +0900 X-ASG-Orig-Subj: [PATCH v10 4/12] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_RANGE Message-Id: <1424533554-28024-5-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1424533752 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 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 From: Namjae Jeon Update xfs_io manpage for FALLOC_FL_INSERT_RANGE. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Dave Chinner --- man/man8/xfs_io.8 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index cf27b99..416206f 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -404,6 +404,11 @@ Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the manual page to de-allocates blocks and eliminates the hole created in this process by shifting data blocks into the hole. .TP +.BI finsert " offset length" +Call fallocate with FALLOC_FL_INSERT_RANGE flag as described in the +.BR fallocate (2) +manual page to create the hole by shifting data blocks. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:19 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FE6529E01 for ; Sat, 21 Feb 2015 09:49:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 303808F8033 for ; Sat, 21 Feb 2015 07:49:19 -0800 (PST) X-ASG-Debug-ID: 1424533757-04cbb0611011780001-NocioJ Received: from mail-pd0-f171.google.com (mail-pd0-f171.google.com [209.85.192.171]) by cuda.sgi.com with ESMTP id KDjGjydOg7eLvftx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:17 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdno5 with SMTP id o5so14643600pdn.8 for ; Sat, 21 Feb 2015 07:49:17 -0800 (PST) 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=/FbKRhG/CzSfZ7dNc19iOJHcQwXsGFGFosX97FlacgM=; b=CEXAkyw6pybf/4f8ZtZSEosyuurY5QsCmyc85nKAT4QixoijN5QHazqQm7CETFNlqd JSV9MZF9SSHA8MFv++xY9n3hI0DGOvcf54A1CgToY4NP8WjJ+tQ6ijPIutZ9TSKBcf89 GMY3uce0BrBlELmTwfQsdzq5TROTUBoUAOeeDcyxRRGFmesBlmoB/9+h5Zo/sjGQtU7A CiomJA5fms48nMTT4qN3aphGZWft/6/DBedexA/9cQ0Q2CJOHG4lqW4hIyZfo9f7vuew mLCNiS4xafRYG3HNXu/sFij+QJKvCNK2TIwYyRMgIB4ObqSOb8h4Sj2pnAusOPpmEys3 xQsg== X-Received: by 10.66.66.75 with SMTP id d11mr4850242pat.147.1424533757030; Sat, 21 Feb 2015 07:49:17 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.13 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:16 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 5/12] xfstests: generic/058: Standard insert range tests Date: Sun, 22 Feb 2015 00:45:47 +0900 X-ASG-Orig-Subj: [PATCH v10 5/12] xfstests: generic/058: Standard insert range tests Message-Id: <1424533554-28024-6-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f171.google.com[209.85.192.171] X-Barracuda-Start-Time: 1424533757 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(058) tries to test various corner cases for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/punch | 5 ++++ common/rc | 2 +- tests/generic/058 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/058.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tests/generic/058 create mode 100644 tests/generic/058.out diff --git a/common/punch b/common/punch index 237b4d8..a75f4cf 100644 --- a/common/punch +++ b/common/punch @@ -527,6 +527,11 @@ _test_generic_punch() return fi + # If zero_cmd is finsert, don't check unaligned offsets + if [ "$zero_cmd" == "finsert" ]; then + return + fi + echo " 16. data -> cache cold ->hole" if [ "$remove_testfile" ]; then rm -f $testfile diff --git a/common/rc b/common/rc index 7449a1d..f173eab 100644 --- a/common/rc +++ b/common/rc @@ -1520,7 +1520,7 @@ _require_xfs_io_command() "falloc" ) testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` ;; - "fpunch" | "fcollapse" | "zero" | "fzero" ) + "fpunch" | "fcollapse" | "zero" | "fzero" | "finsert" ) testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "$command 4k 8k" $testfile 2>&1` ;; diff --git a/tests/generic/058 b/tests/generic/058 new file mode 100644 index 0000000..4a39a05 --- /dev/null +++ b/tests/generic/058 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/058 +# +# Standard insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/058.out b/tests/generic/058.out new file mode 100644 index 0000000..b15308d --- /dev/null +++ b/tests/generic/058.out @@ -0,0 +1,78 @@ +QA output created by 058 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index f2eb87a..e0d8bc1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -60,6 +60,7 @@ 055 log v2log auto quota stress 056 metadata auto quick 057 metadata auto quick +058 auto quick prealloc 059 metadata auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:25 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26D2829DF7 for ; Sat, 21 Feb 2015 09:49:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAD6FAC003 for ; Sat, 21 Feb 2015 07:49:24 -0800 (PST) X-ASG-Debug-ID: 1424533762-04cb6c4bd311520001-NocioJ Received: from mail-pd0-f175.google.com (mail-pd0-f175.google.com [209.85.192.175]) by cuda.sgi.com with ESMTP id YobpsVplH9EzC7do (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:22 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdbfp1 with SMTP id fp1so14642039pdb.5 for ; Sat, 21 Feb 2015 07:49:22 -0800 (PST) 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=y7SnWdv2I8BPsGIs3udZgu0BYjhFh3AO7GLWU8K5vUU=; b=GM0jdUCB8LZHSdhy/PhT3tnBV+Y0PMC7RET0yWKFzK3OjsHdM7IhrAHzhVaUsblpuD yKWyeM3vCQSTojJAnRtL5Jvc0ZAm0b91VYkcL+T3b7fEaBM+JOZJ7vEdmKXl47rRjTH7 xXPz0gTYc/JIACU7m2GoSxnEgFG2q5aTMMIHElxJf3soSSZYQAFQzUuFa95Po+NeFHrC UsAPSMin4RNwVSngEYXGTIkqtAj9weIYtXgiurSiozHRs5aAV73B6jJpu87ZQ8OdTGiE xA7S7Gvxbq9bbMrYhg/wT94XeQeDvCmUk7/SWTHeYGCNfc10UFZADZ6lRdwL8UxSFIgZ oftw== X-Received: by 10.70.37.41 with SMTP id v9mr5370619pdj.6.1424533761960; Sat, 21 Feb 2015 07:49:21 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.18 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:21 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 6/12] xfstests: generic/060: Delayed allocation insert range Date: Sun, 22 Feb 2015 00:45:48 +0900 X-ASG-Orig-Subj: [PATCH v10 6/12] xfstests: generic/060: Delayed allocation insert range Message-Id: <1424533554-28024-7-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f175.google.com[209.85.192.175] X-Barracuda-Start-Time: 1424533762 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(060) tries to test various corner cases with delayed extents for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/060 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/060.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 144 insertions(+) create mode 100644 tests/generic/060 create mode 100644 tests/generic/060.out diff --git a/tests/generic/060 b/tests/generic/060 new file mode 100644 index 0000000..4493ba2 --- /dev/null +++ b/tests/generic/060 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/060 +# +# Delayed allocation insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/060.out b/tests/generic/060.out new file mode 100644 index 0000000..909b578 --- /dev/null +++ b/tests/generic/060.out @@ -0,0 +1,78 @@ +QA output created by 060 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index e0d8bc1..4bf4e86 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -62,6 +62,7 @@ 057 metadata auto quick 058 auto quick prealloc 059 metadata auto quick +060 auto quick prealloc 062 attr udf auto quick 068 other auto freeze dangerous stress 069 rw udf auto quick -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0AD8D29E07 for ; Sat, 21 Feb 2015 09:49:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0BE98F8039 for ; Sat, 21 Feb 2015 07:49:28 -0800 (PST) X-ASG-Debug-ID: 1424533766-04bdf05bff10460001-NocioJ Received: from mail-pd0-f172.google.com (mail-pd0-f172.google.com [209.85.192.172]) by cuda.sgi.com with ESMTP id NXPe47MYvijrNkYa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:26 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdev10 with SMTP id v10so14649074pde.7 for ; Sat, 21 Feb 2015 07:49:26 -0800 (PST) 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=rXWeXEYsn9Z9FPHsgKGVUD/AIhdzJR2t569GKyKt8Tw=; b=WU3mLkRcrUcL64kh00f0g01s8/gL1IH7JXC5zg0lC895JJgQkNUJ+ER841LdIMpY/D krVWNx/6xJUjipQaSYJoyaemdfr+/WSUkTNHDxzMRRnHDENu98AcO/Wodb6wbenKNxA3 aYDu29toH7IBNpQSTKGAfuoeqDGJjLXBQMyISQvFy8VISeDz+6z/b2t1xsMRjb4/2cNx BgKTybCarfS9PqIbsNGlk4Ou2UuMBWPRX9rDaN6y0ABhUfrjk/Z/HOnv+Jh9Ebylmn90 HIZ2sqnZ6l5hU3wzhw8BhQX/dA1XBXZYhT7+vZmyFTUYpFjZ70c2PJL8YHQ7x5H8AzKJ hOSw== X-Received: by 10.68.200.201 with SMTP id ju9mr4974714pbc.157.1424533766689; Sat, 21 Feb 2015 07:49:26 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.22 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:26 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 7/12] xfstests: generic/061: Multi insert range tests Date: Sun, 22 Feb 2015 00:45:49 +0900 X-ASG-Orig-Subj: [PATCH v10 7/12] xfstests: generic/061: Multi insert range tests Message-Id: <1424533554-28024-8-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f172.google.com[209.85.192.172] X-Barracuda-Start-Time: 1424533766 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(061) tries to test various corner cases with pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/061 | 65 ++++++++++++++++++++++++++++++++++++++++ tests/generic/061.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/061 create mode 100644 tests/generic/061.out diff --git a/tests/generic/061 b/tests/generic/061 new file mode 100644 index 0000000..f5e5076 --- /dev/null +++ b/tests/generic/061 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/061 +# +# Multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/061.out b/tests/generic/061.out new file mode 100644 index 0000000..78d6c6d --- /dev/null +++ b/tests/generic/061.out @@ -0,0 +1,80 @@ +QA output created by 061 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 4bf4e86..9c6f7e7 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -63,6 +63,7 @@ 058 auto quick prealloc 059 metadata auto quick 060 auto quick prealloc +061 auto quick prealloc 062 attr udf auto quick 068 other auto freeze dangerous stress 069 rw udf auto quick -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:34 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 24E2F29E0B for ; Sat, 21 Feb 2015 09:49:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14354304059 for ; Sat, 21 Feb 2015 07:49:34 -0800 (PST) X-ASG-Debug-ID: 1424533771-04cbb0610e11790001-NocioJ Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by cuda.sgi.com with ESMTP id CweCseJJ4Wdi3bQU (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:32 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pabrd3 with SMTP id rd3so15769624pab.4 for ; Sat, 21 Feb 2015 07:49:31 -0800 (PST) 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=ZhsKMA6/eomyxS+E+XtfV8I8cm0EP53lO24MbYvnBWg=; b=YNX1v72A9HLGyjYr0m9+yIiS37Iyb90U7YPuKFv1kmmVHrOOAm2QOBlQ2cO16rFrJu w+VZbLSdbeYyvZanGRpvoOavvjj2KBCsrLCLA8UqNKGoh7FcsxOwwzYQXuvlVoGbghzd KNZ8kvhjy2xSk4oh3fvFt/ED0nVSR2+p8dgVkD7WpKeGa19LVIsu7HjM9QPM8Qo2CwbC yy28rbaGZQXRMFmsIdJFpovuHMdBQFIIl2o9nFAgNTh15h+T8Lt60m8gAMxQtMFMQkZ3 pA9xkkSNMwBQHOYXNfAUqpTV/QQPv6zUpkB01iCmJqvtrenMYPS09qtdYwUyz6bXUjCp g+PQ== X-Received: by 10.66.129.139 with SMTP id nw11mr5189029pab.69.1424533771359; Sat, 21 Feb 2015 07:49:31 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.27 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:30 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 8/12] xfstests: generic/063: Delayed allocation multi insert Date: Sun, 22 Feb 2015 00:45:50 +0900 X-ASG-Orig-Subj: [PATCH v10 8/12] xfstests: generic/063: Delayed allocation multi insert Message-Id: <1424533554-28024-9-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pa0-f48.google.com[209.85.220.48] X-Barracuda-Start-Time: 1424533771 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(063) tries to test various corner cases with delayed extents and pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/063 | 65 ++++++++++++++++++++++++++++++++++++++++ tests/generic/063.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/063 create mode 100644 tests/generic/063.out diff --git a/tests/generic/063 b/tests/generic/063 new file mode 100644 index 0000000..9b72f69 --- /dev/null +++ b/tests/generic/063 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/063 +# +# Delayed allocation multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/063.out b/tests/generic/063.out new file mode 100644 index 0000000..d828ff6 --- /dev/null +++ b/tests/generic/063.out @@ -0,0 +1,80 @@ +QA output created by 063 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 9c6f7e7..f7f7978 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -65,6 +65,7 @@ 060 auto quick prealloc 061 auto quick prealloc 062 attr udf auto quick +063 auto quick prealloc 068 other auto freeze dangerous stress 069 rw udf auto quick 070 attr udf auto quick stress -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7A8D29DF7 for ; Sat, 21 Feb 2015 09:49:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6B8430405F for ; Sat, 21 Feb 2015 07:49:43 -0800 (PST) X-ASG-Debug-ID: 1424533781-04cb6c4bd111540001-NocioJ Received: from mail-pa0-f47.google.com (mail-pa0-f47.google.com [209.85.220.47]) by cuda.sgi.com with ESMTP id tq2QFmztPI1DQ72h (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:42 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pabrd3 with SMTP id rd3so15770378pab.4 for ; Sat, 21 Feb 2015 07:49:41 -0800 (PST) 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=F/Mz2ptynSNpSFgrVrtc0b6NP86IrGJoDQcmg+2xbEM=; b=a9ZbVBvP7joTi+y3z/YodVABgKgX66qApg13F8kEgnplrk3xRrtqnWSxG69aGikUEs Gsw/cd5JiTrb87KwfLemnMlQzL1rA+KS0WetrwdO2rbBmgiIxd1CkWzrHjsINqPq0Uzk D17Gdi5o6ILea2CXZFfUrgqmQqUp/+Fq1lXx5JdrpOtgabZtZnRfygCbBOtBjo+TXmyT kQXn5X7IaGnvu1bJ89NlzArTMW3hoENudUV7fDqLFg11m08Gt7K9y2DADdwMMkRACyAA pnTpb+AjVnN3XReSEG1AhQ8Qazh6nJTGgdf9jpoDTZ1z2NElQQS22CgBfFmoQCGIiRyM 3uaA== X-Received: by 10.66.163.168 with SMTP id yj8mr5174709pab.132.1424533781366; Sat, 21 Feb 2015 07:49:41 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.37 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:40 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation Date: Sun, 22 Feb 2015 00:45:52 +0900 X-ASG-Orig-Subj: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation Message-Id: <1424533554-28024-11-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pa0-f47.google.com[209.85.220.47] X-Barracuda-Start-Time: 1424533781 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 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 From: Namjae Jeon This commit adds insert operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- ltp/fsstress.c | 19 ++++++++++++++++--- src/global.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index b56fe5c..aa3e0c3 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -72,6 +72,7 @@ typedef enum { OP_PUNCH, OP_ZERO, OP_COLLAPSE, + OP_INSERT, OP_READ, OP_READLINK, OP_RENAME, @@ -170,6 +171,7 @@ void mknod_f(int, long); void punch_f(int, long); void zero_f(int, long); void collapse_f(int, long); +void insert_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -209,6 +211,7 @@ opdesc_t ops[] = { { OP_PUNCH, "punch", punch_f, 1, 1 }, { OP_ZERO, "zero", zero_f, 1, 1 }, { OP_COLLAPSE, "collapse", collapse_f, 1, 1 }, + { OP_INSERT, "insert", insert_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -2176,6 +2179,7 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"}, { -1, NULL} }; @@ -2227,10 +2231,11 @@ do_fallocate(int opno, long r, int mode) off %= maxfsize; len = (off64_t)(random() % (1024 * 1024)); /* - * Collapse range requires off and len to be block aligned, make it - * more likely to be the case. + * Collapse/insert range requires off and len to be block aligned, + * make it more likely to be the case. */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { + if ((mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)) && + (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } @@ -2656,6 +2661,14 @@ collapse_f(int opno, long r) } void +insert_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_INSERT_RANGE); +#endif +} + +void read_f(int opno, long r) { char *buf; diff --git a/src/global.h b/src/global.h index 8180f66..f63246b 100644 --- a/src/global.h +++ b/src/global.h @@ -172,6 +172,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + #endif /* HAVE_LINUX_FALLOC_H */ #endif /* GLOBAL_H */ -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 166DF29E0B for ; Sat, 21 Feb 2015 09:49:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99A69AC002 for ; Sat, 21 Feb 2015 07:49:50 -0800 (PST) X-ASG-Debug-ID: 1424533788-04cb6c4bd211550001-NocioJ Received: from mail-pd0-f170.google.com (mail-pd0-f170.google.com [209.85.192.170]) by cuda.sgi.com with ESMTP id j8FrGPf00ox7zH5w (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:48 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pdjp10 with SMTP id p10so14687779pdj.3 for ; Sat, 21 Feb 2015 07:49:48 -0800 (PST) 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=GLgKUo+/MJ/xSc+5uOdIptbfrT4cYMwK3+7U5BiC8II=; b=aoWqltRB8K5pooR82sRibDxqStRQzAAM9ezidzV/UqjfxsONFDI7xItvv8IVY5dkPz a76xPYeS1CHpfOvQFtPfRtTr1cY0fIHd5Y2tn00RKUS3Xa/4ruS8cQ4aCW5SfLNvLP// bxqCJhVhk+s3LxxuRNrPjKFs/Bx9C+5cMuTXfGHqFLKLpD8IMgihyR/i+wG6uhP/9fXw W02mRDPgRwbf4kz+VRAPO5dQTh9m9pPrecff3TU4FooOnSCRppRO2+CiuMMTZIP3rzFp nTJlnnEZJishruaYY3e3TSVIo1AKuFR2cnhcWNSC7eNYgrQfhoB0gWxqrK7P9GKiUIY5 ak4Q== X-Received: by 10.68.233.232 with SMTP id tz8mr5102108pbc.166.1424533788103; Sat, 21 Feb 2015 07:49:48 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.42 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:47 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 11/12] xfstests: fsx: Add fallocate insert range operation Date: Sun, 22 Feb 2015 00:45:53 +0900 X-ASG-Orig-Subj: [PATCH v10 11/12] xfstests: fsx: Add fallocate insert range operation Message-Id: <1424533554-28024-12-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pd0-f170.google.com[209.85.192.170] X-Barracuda-Start-Time: 1424533788 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15631 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 From: Namjae Jeon This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- ltp/fsx.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 114 insertions(+), 10 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 0bb8ae8..6da51e9 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -95,7 +95,8 @@ int logcount = 0; /* total ops */ #define OP_PUNCH_HOLE 6 #define OP_ZERO_RANGE 7 #define OP_COLLAPSE_RANGE 8 -#define OP_MAX_FULL 9 +#define OP_INSERT_RANGE 9 +#define OP_MAX_FULL 10 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -146,6 +147,7 @@ int keep_size_calls = 1; /* -K flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ int collapse_range_calls = 1; /* -C flag disables */ +int insert_range_calls = 1; /* -I flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -340,6 +342,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******CCCC"); break; + case OP_INSERT_RANGE: + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******IIII"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -1014,6 +1024,59 @@ do_collapse_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_INSERT_RANGE +void +do_insert_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_INSERT_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length insert range\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + if ((loff_t)offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping insert range behind EOF\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + log4(OP_INSERT_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + end_offset = offset + length; + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("insert range: %x to %x\n", offset, length); + prterr("do_insert_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + end_offset, good_buf + offset, + file_size - offset); + memset(good_buf + offset, '\0', length); + file_size += length; +} + +#else +void +do_insert_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1120,14 +1183,25 @@ docloseopen(void) } } -#define TRIM_OFF_LEN(off, len, size) \ -do { \ - if (size) \ - (off) %= (size); \ - else \ - (off) = 0; \ - if ((off) + (len) > (size)) \ - (len) = (size) - (off); \ + +#define TRIM_OFF(off, size) \ +do { \ + if (size) \ + (off) %= (size); \ + else \ + (off) = 0; \ +} while (0) + +#define TRIM_LEN(off, len, size) \ +do { \ + if ((off) + (len) > (size)) \ + (len) = (size) - (off); \ +} while (0) + +#define TRIM_OFF_LEN(off, len, size) \ +do { \ + TRIM_OFF(off, size); \ + TRIM_LEN(off, len, size); \ } while (0) void @@ -1195,6 +1269,12 @@ test(void) goto out; } break; + case OP_INSERT_RANGE: + if (!insert_range_calls) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1247,6 +1327,22 @@ test(void) } do_collapse_range(offset, size); break; + case OP_INSERT_RANGE: + TRIM_OFF(offset, file_size); + TRIM_LEN(file_size, size, maxfilelen); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + if (file_size + size > maxfilelen) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + + do_insert_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1310,6 +1406,9 @@ usage(void) #ifdef FALLOC_FL_COLLAPSE_RANGE " -C: Do not use collapse range calls\n" #endif +#ifdef FALLOC_FL_INSERT_RANGE +" -I: Do not use insert range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1496,7 +1595,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FKHzCLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FKHzCILN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1605,6 +1704,9 @@ main(int argc, char **argv) case 'C': collapse_range_calls = 0; break; + case 'I': + insert_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1766,6 +1868,8 @@ main(int argc, char **argv) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); if (collapse_range_calls) collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); + if (insert_range_calls) + insert_range_calls = test_fallocate(FALLOC_FL_INSERT_RANGE); while (numops == -1 || numops--) test(); -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:55 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1B70129E13 for ; Sat, 21 Feb 2015 09:49:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB796AC003 for ; Sat, 21 Feb 2015 07:49:54 -0800 (PST) X-ASG-Debug-ID: 1424533776-04bdf05bff10470001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id HIEp9gaLaMscIf3M (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:36 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] Received: by pabrd3 with SMTP id rd3so15769984pab.4 for ; Sat, 21 Feb 2015 07:49:36 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] 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=gzaf8T3elWtoV/O7c8Mv5KQkSh1RyTYeT9lyjbGKnUM=; b=PPzJOkrEEc+f3DTn3fvj1LzSoeeFavtv+swpjxHYRF8/TxQmfEXN7SQz+yNWs489iD jrdLxf2wq6pXg0mJqn0/sypLUBEthiKXMRvqztQhkXopCb3wer/XEUQb5RRND4yfGPe6 9+QVQ5V3R3Exg25+KOxAs4JWIqGCcocZ4K6ki3iR6VSxRyAoNH+zNwIQzn7o0nNDSLno dJKiz5XE5oB87qSG7j7EWfKu5lk5S4XSeub0fagLv3Dm3e61Myikh8EumF0Na+0MrAAL Zz1VetNScQCrs9cUndnT6xw7FbCMt/IR4n/x7nPhD47hruvGPBPU/occjdQyaivE6D/s wZKQ== X-Received: by 10.68.190.164 with SMTP id gr4mr4964436pbc.123.1424533776405; Sat, 21 Feb 2015 07:49:36 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.32 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:35 -0800 (PST) From: Namjae Jeon To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 9/12] xfstests: generic/064: Test multiple fallocate insert/collapse range calls Date: Sun, 22 Feb 2015 00:45:51 +0900 X-ASG-Orig-Subj: [PATCH v10 9/12] xfstests: generic/064: Test multiple fallocate insert/collapse range calls Message-Id: <1424533554-28024-10-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1424533776 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This testcase(064) tries to test finsert range a single alternate block multiple times and test merge code of collase range. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- tests/generic/064 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/064.out | 2 ++ tests/generic/group | 1 + 3 files changed, 98 insertions(+) create mode 100644 tests/generic/064 create mode 100644 tests/generic/064.out diff --git a/tests/generic/064 b/tests/generic/064 new file mode 100644 index 0000000..760539a --- /dev/null +++ b/tests/generic/064 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. generic/064 +# +# Test multiple fallocate insert/collapse range calls on same file. +# Call insert range a single alternate block multiple times until the file +# is left with 100 extents and as much number of extents. And Call collapse +# range about the previously inserted ranges to test merge code of collapse +# range. Also check for data integrity and file system consistency. +#----------------------------------------------------------------------- +# Copyright (c) 2015 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +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 +_supported_fs generic +_supported_os Linux + +_require_scratch +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" +_require_xfs_io_command "fcollapse" +src=$SCRATCH_MNT/testfile +dest=$SCRATCH_MNT/testfile.dest +BLOCKS=100 +BSIZE=`get_block_size $SCRATCH_MNT` +rm -f $seqres.full + +_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" +_scratch_mount || _fail "mount failed" +length=$(($BLOCKS * $BSIZE)) + +# Write file +_do "$XFS_IO_PROG -f -c \"pwrite 0 $length\" -c fsync $src" +cp $src $dest +extent_before=`$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l` + +# Insert alternate blocks +for (( j=0; j < $(($BLOCKS/2)); j++ )); do + offset=$((($j*$BSIZE)*2)) + _do "$XFS_IO_PROG -c \"finsert $offset $BSIZE\" $dest" +done + +# Check if 100 extents are present +$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l + +_check_scratch_fs +if [ $? -ne 0 ]; then + status=1 + exit +fi + +# Collapse alternate blocks +for (( j=0; j < $(($BLOCKS/2)); j++ )); do + offset=$((($j*$BSIZE))) + _do "$XFS_IO_PROG -c \"fcollapse $offset $BSIZE\" $dest" +done + +extent_after=`$XFS_IO_PROG -c "fiemap -v" $dest | grep "^ *[0-9]*:" |wc -l` +if [ $extent_before -ne $extent_after ]; then + echo "extents mismatched before = $extent_before after = $extent_after" +fi + +# compare original file and test file. +cmp $src $dest || _fail "file bytes check failed" + +# success, all done +status=0 +exit diff --git a/tests/generic/064.out b/tests/generic/064.out new file mode 100644 index 0000000..b217df5 --- /dev/null +++ b/tests/generic/064.out @@ -0,0 +1,2 @@ +QA output created by 064 +100 diff --git a/tests/generic/group b/tests/generic/group index f7f7978..1bd4c33 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -66,6 +66,7 @@ 061 auto quick prealloc 062 attr udf auto quick 063 auto quick prealloc +064 auto quick prealloc 068 other auto freeze dangerous stress 069 rw udf auto quick 070 attr udf auto quick stress -- 1.7.9.5 From linkinjeon@gmail.com Sat Feb 21 09:49:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7249529E13 for ; Sat, 21 Feb 2015 09:49:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35E3A304043 for ; Sat, 21 Feb 2015 07:49:56 -0800 (PST) X-ASG-Debug-ID: 1424533794-04bdf05c0110490001-NocioJ Received: from mail-pa0-f51.google.com (mail-pa0-f51.google.com [209.85.220.51]) by cuda.sgi.com with ESMTP id 19lVExagBTDeCxgF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Feb 2015 07:49:54 -0800 (PST) X-Barracuda-Envelope-From: linkinjeon@gmail.com Received: by pablf10 with SMTP id lf10so15759558pab.6 for ; Sat, 21 Feb 2015 07:49:54 -0800 (PST) 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=OMNQ7IbrorUfFUbMS0RQuNyrOCVf3LCMnQSqQa6rqtk=; b=LophbiziLKPiY8w12GwpwYgrSv7a733eMib81Zb4Tofl1+wwfK0fyrE4S3BlLcEdRB IEbYt1P5oHdYUBKMLfEUwuvFYinKyGzOkTMFyxDozxsOA03Sp8XXw9A04bYVkfshj2t5 dQ68QM3S1p/ZT/VfZc9MSLqLPOKQlxis1IQy1k8WHOwJeVfQ1R0r3ycyXqNqWmUSvsQh bTMITmhaFJVbmEv/kIfD7HGoHu5/xmIDYmAaz0CSKy+/v2cICAC5QqmdCOzYN3zIrU4G ewQKE70+RjV7A/0TR0fOm0E6JGkCHJsQrcUf+KWN2L/JuqyEXyog3tHNNtzLXKesWE9f E4Pg== X-Received: by 10.70.123.132 with SMTP id ma4mr5376979pdb.12.1424533794124; Sat, 21 Feb 2015 07:49:54 -0800 (PST) Received: from linkinjeon-Aspire-One-522.kornet ([125.129.25.112]) by mx.google.com with ESMTPSA id fc6sm187055pab.6.2015.02.21.07.49.50 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 21 Feb 2015 07:49:53 -0800 (PST) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 125.129.25.112 To: david@fromorbit.com, tytso@mit.edu Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH v10 12/12] manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate Date: Sun, 22 Feb 2015 00:45:54 +0900 X-ASG-Orig-Subj: [PATCH v10 12/12] manpage: update FALLOC_FL_INSERT_RANGE flag in fallocate Message-Id: <1424533554-28024-13-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> X-Barracuda-Connect: mail-pa0-f51.google.com[209.85.220.51] X-Barracuda-Start-Time: 1424533794 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15632 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 From: Namjae Jeon Update FALLOC_FL_INSERT_RANGE flag in fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man2/fallocate.2 | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git a/man2/fallocate.2 b/man2/fallocate.2 index adf42db..9b3c460 100644 --- a/man2/fallocate.2 +++ b/man2/fallocate.2 @@ -8,7 +8,7 @@ .\" 2011-09-19: Added FALLOC_FL_PUNCH_HOLE .\" 2011-09-19: Substantial restructuring of the page .\" -.TH FALLOCATE 2 2015-01-22 "Linux" "Linux Programmer's Manual" +.TH FALLOCATE 2 2015-02-14 "Linux" "Linux Programmer's Manual" .SH NAME fallocate \- manipulate file space .SH SYNOPSIS @@ -225,6 +225,56 @@ XFS (since Linux 3.14) .IP * ext4, for extent-based files (since Linux 3.14) .\" commit b8a8684502a0fc852afa0056c6bb2a9273f6fcc0 +.SS Increasing file space +.\" TODO: Mention commit id and supporting Linux version +Specifying the +.BR FALLOC_FL_INSERT_RANGE +flag in +.I mode +will increase the file space by inserting a hole within the file size without +overwriting any existing data. The hole will start at +.I offset +and continue for +.I len +bytes. For inserting hole inside file, the contents of the file starting at +.I offset +will be shifted towards right by +.I len +bytes. Inserting a hole inside the file will increase the file size by +.I len +bytes. + +This mode has the same limitation as +.BR FALLOC_FL_COLLAPSE_RANGE +regarding the +granularity of the operation. +If the granulrity requirements are not met, +.BR fallocate () +will fail with the error +.BR EINVAL. +If the +.I offset +overlaps with end of file OR if it is greater than end of file, an error is +returned. For such type of operations, i.e. inserting a hole at the end of +file, +.BR ftruncate(2) +should be used. +In case +.IR offset + len +exceeds the maximum file size, errno will be set to +.B EFBIG. + +No other flags may be specified in +.IR mode +in conjunction with +.BR FALLOC_FL_INSERT_RANGE . + +As of Linux XXXX, +.\" TODO: Mention commit id and supporting Linux version +.B FALLOC_FL_INSERT_RANGE +is supported by +ext4 (only for extent-based files) and XFS. + .SH RETURN VALUE On success, .BR fallocate () @@ -242,6 +292,12 @@ is not a valid file descriptor, or is not opened for writing. .IR offset + len exceeds the maximum file size. .TP +.B EFBIG +.I mode +is +.BR FALLOC_FL_INSERT_RANGE , +the current file size+len excceds the maximum file size. +.TP .B EINTR A signal was caught during execution. .TP @@ -270,7 +326,17 @@ reaches or passes the end of the file. .B EINVAL .I mode is -.BR FALLOC_FL_COLLAPSE_RANGE , +.BR FALLOC_FL_INSERT_RANGE +and the range specified by +.I offset +reaches or passes the end of the file. +.TP +.B EINVAL +.I mode +is +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but either .I offset or @@ -279,18 +345,24 @@ is not a multiple of the filesystem block size. .TP .B EINVAL .I mode -contains both +contains either of .B FALLOC_FL_COLLAPSE_RANGE +or +.B FALLOC_FL_INSERT_RANGE and other flags; no other flags are permitted with -.BR FALLOC_FL_COLLAPSE_RANGE . +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE . .TP .B EINVAL .I mode is .BR FALLOC_FL_COLLAPSE_RANGE or -.BR FALLOC_FL_ZERO_RANGE , +.BR FALLOC_FL_ZERO_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but the file referred to by .I fd is not a regular file. @@ -342,6 +414,8 @@ specifies .BR FALLOC_FL_PUNCH_HOLE or .BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE and the file referred to by .I fd @@ -360,7 +434,9 @@ refers to a pipe or FIFO. .B ETXTBSY .I mode specifies -.BR FALLOC_FL_COLLAPSE_RANGE , +.BR FALLOC_FL_COLLAPSE_RANGE +or +.BR FALLOC_FL_INSERT_RANGE , but the file referred to by .IR fd is currently being executed. -- 1.7.9.5 From 412371810@iol.cz Sat Feb 21 10:29:13 2015 Return-Path: <412371810@iol.cz> X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6E6ED7F4E for ; Sat, 21 Feb 2015 10:29:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97B888F8049 for ; Sat, 21 Feb 2015 08:29:09 -0800 (PST) X-ASG-Debug-ID: 1424536131-04bdf05bff111c0001-NocioJ Received: from smtp-out3.iol.cz (smtp-out3.iol.cz [194.228.2.91]) by cuda.sgi.com with ESMTP id qxffR89CDCLOwU0G; Sat, 21 Feb 2015 08:28:52 -0800 (PST) X-Barracuda-Envelope-From: 412371810@iol.cz X-Barracuda-Apparent-Source-IP: 194.228.2.91 Received: from antivir5.iol.cz (unknown [192.168.30.212]) by smtp-out3.iol.cz (Postfix) with ESMTP id 042D1C4006F; Sat, 21 Feb 2015 17:28:39 +0100 (CET) Received: from localhost (antivir5.iol.cz [127.0.0.1]) by antivir5.iol.cz (Postfix) with ESMTP id 775B258801A; Sat, 21 Feb 2015 17:28:38 +0100 (CET) X-Virus-Scanned: amavisd-new at iol.cz X-Amavis-Alert: BAD HEADER, Non-encoded 8-bit data (char AE hex): From: "MICROSOFT\256"<412371810@iol.cz>\n Received: from antivir5.iol.cz ([127.0.0.1]) by localhost (antivir5.iol.cz [127.0.0.1]) (amavisd-new, port 10224) with LMTP id dOJwx8Na3Fym; Sat, 21 Feb 2015 17:28:37 +0100 (CET) Received: from port5.iol.cz (unknown [192.168.30.95]) by antivir5.iol.cz (Postfix) with ESMTP id 8659C588004; Sat, 21 Feb 2015 17:28:35 +0100 (CET) Message-Id: <67a6d3$khkrb3@smtp.iol.cz> X-SBRS: None X-SBRS-none: None X-RECVLIST: MTA-OUT-IOL X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2COCgDzsehU/0CEiLrON4EzAgIB X-IPAS-Result: A2COCgDzsehU/0CEiLrON4EzAgIB X-IronPort-AV: E=Sophos;i="5.09,620,1418079600"; d="pdf'?jpg'145?scan'145,208,217,145";a="689597795" Received: from 64-132-136-186.fibertel.com.ar (HELO User) ([186.136.132.64]) by smtp.iol.cz with ESMTP; 21 Feb 2015 17:22:40 +0100 Reply-To: From: "MICROSOFT" <412371810@iol.cz> Subject: Date: Sat, 21 Feb 2015 13:27:35 -0300 X-ASG-Orig-Subj: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_009D_01C2A9A6.76D683FC" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 To: undisclosed-recipients:; X-Barracuda-Connect: smtp-out3.iol.cz[194.228.2.91] X-Barracuda-Start-Time: 1424536131 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 This is a multi-part message in MIME format. ------=_NextPart_000_009D_01C2A9A6.76D683FC Content-Type: multipart/related; boundary="----=_NextPart_001_009E_01C2A9A6.76D683FC" ------=_NextPart_001_009E_01C2A9A6.76D683FC Content-Type: text/html; charset="Windows-1251" Content-Transfer-Encoding: 7bit
MICROSOFT CORPORATIONS
Cardinal Place
80-100 Victoria Street
London, SW1E 5JL
United Kingdom
 
MICROSOFT NEW YEAR AWARD.
 
It is obvious that this notification will come to you as a surprise but please find time to read it carefully as we congratulate you over your success in the following official publication of results of the E-mail electronic online Sweepstakes 2014/2015 organized by Microsoft, in conjunction with the foundation for the promotion of software products, (F.S.P) held this 2015,in the Microsoft Head Quarters London United Kingdom, where your email address emerged as one of the online Winning emails in the 3rd category and therefore attracted a cash award of 450,000.00 (Four Hundred and Fifty Thousand Great British Pounds Sterling) Our winners are arranged into four categories with different winning prizes accordingly in each category. They are arranged in this format below:
 
CATEGORY OF MICROSOFT WINNERS;
 
1st. 950,000.00 GBP
2nd. 620,000.00 GBP
3rd. 450,000.00 GBP
4th. 370,000.00 GBP
We write to officially notify you of this award and to advise you to contact the processing office immediately upon receipt of this message for more information concerning the verification, processing and eventual payment of the above prize to you. It is important to note that your award information was released with the following particulars attached to it.
 
(1). Award Numbers: UK/56/2015
(2). Email Bonus Numbers: MSLP-134632
(3). Batch Numbers: MSOFT/884/8PDH
(4). Reference Numbers: GB/54/044/07/MSOFT
(5). Serial Numbers: MSOFT/2015/NLP4473
 
Microsoft Verification Requirements
(1). Full Name:
(2). Address:
(3). Nationality/Gender:
(4). Age:
(5). Occupation:
(6). Phone:
(7). Country:
(8). How do you feel as a Microsoft Winner:
(9). Ever Won an Online Award or Bonus:
(10). Winning Email Address:
 
To file for your claim, Please contact your Microsoft GB Manager for claim of your winning within Twenty-nine working days of this winning notification. Winnings that are not validated within Twenty-nine working days of winning notification are termed void as unclaimed funds will be liquidated by the Microsoft Promotion Company. You are required to mention the above particulars of your award in every correspondence to enable the Manager validate your winnings.
 
NOTE:
(1). To fill the claims processing form if you are not used to pdf files, you print it out and fill it or simply copy the entire notification letter to either Microsoft Word or Notepad for easy access.
 
(2). Do not tell people about your Price Award until your money is successfully handed over to you to avoid disqualification that may arise from double claim. You may also receive similar e-mails from people portraying to be other Organizations or Microsoft Corporation. This is solely to collect your personal information from you and lay claim over your notification letter that was sent to you by us, Microsoft shall not be held responsible for any loss of fund arising from the above mentioned.
 
Owen Sagness
General Manager, Online Division, UK
E-mail: microsoftteam02@163.com
 
The Microsoft Internet E-mail lottery Awards is sponsored by our CEO/Chairman, Satya Nadella and a consortium of software promotion companies like Intel Group,Acer,H P,Toshiba,Pisem,Aol, Dell Computers and other International Companies.
 
As Satya Nadella becomes the third CEO of Microsoft, he brings a relentless drive for innovation and a spirit of collaboration to his new role. He joined Microsoft 22 years ago because he saw how clearly Microsoft empowers people to do magical things and ultimately make the world a better place. Many companies, he says, aspire to change the world. But very few have all the elements required: talent, resources and perseverance. Microsoft has proven that it has all three in abundance.
 
The Microsoft internet E-mail draw is held periodically and is organized to encourage the use of the Internet and promote computer literacy worldwide, Once again on behalf of Staffs & Members of Microsoft GB Board Commission Congratulations.
 
Sincerely,
 
Michel Van Der Bel
Managing Director,
Microsoft UK and Vice President, Microsoft International
CORPORATIONS
------=_NextPart_001_009E_01C2A9A6.76D683FC Content-Type: image/jpeg; name="img1.jpg" Content-Transfer-Encoding: base64 Content-ID: <00C627CEAF5D$03AAA9EF$0100007f@mbrmikuzkovybqz> /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQE BQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/ 2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAfAD8DASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9NtV1Oz0T T7i+1C5isrOBDJLPOwVEUZySTXz74h/a+sdcBj+HNhFr1tnB1/U3a205uSD5 OAZJ/wDeVQh7PXzt/wAFJv2go0+JfhT4ST3sdj4ZaxbXdaWWTy11JhM8UFo5 JGYw0TuyHh/lB6YrxvQvilda9e2mnaUxuJ52EcMVvtI/ADAwAPYYHbtUU5Oy 3E2oq7eh9yaV41+IXjON5F8RTugbDDQtPgtIgfTdMJX/ABDj8KfqFn4hRGN7 f+IJiDyP7dmU/lHIo/SsnQPE994M8J2lvb+HLpYEjAE11eW8byH+Jyqs3JJz zXnXjj9oFtMgfzNMvY7uVhHbQ7klE0h+6g2MTyfYd68uTzJNy+rtQ7tfn2PZ w1PLasvZzxK5vJ/l/Wp1t5q6WUzquv8AiXTJ0O3Ka3ckqe3EjMP0p9t8VfHH h9t2leOV1eJTn7H4ls45t/X5RPEI2Tp12v8ASs34deLdAm00W9xrmk6lcEmS 63XMTF5jyxKE5HPABAwAM10OreL/AIe6BBLPeXHhu3KKXJaSDd07DOc1yTzW EZ8nI2z52eJjGbjFOx0vgv8AbG0aXWbPQvHmnf8ACHardyCC1vVl8/TbyQ/w xzYBVj2RwrHsDivouxmjuDFNC6yxONySIcqwOec96/If4rfHPSfH1xq0GpxW kegXKmAWcu1IxECcemG75HIPTpX0/wD8EuPjPq/xD8Ca94e1HUJNbt/DeoSW Ntqcj72ni2honZu7FSyk99gPVia9qPNZNnUndXZxH/BTz9inW/i7Bb/EDwba NfaxpsTR3Nin35YSxYqPcOWYdsu4P8Nfm/8AAP4oaN+z94s1DVPEPhrUtS8Q QH7PHZmQWotxn5w24FgxIA+7wB71/Rn9mk5+X17j3rw743fsSfCf4/75vFHh O3XUiMLqent9nuR6ZZcZ+h4roo1p4eaqQ3RjWowrwdOpsz8sfE//AAUjfxU+ w+ErrSoBwpg1MSlR9DGoP50/4H/Hfwt4s+J02ueJvF6aHDYxiLSrPVWMa+ZI P307NgoCB+7UFujMeOK+gvHP/BEfT7mWSTwf8RbixQklYNZsxNj0G6Mr/I15 jd/8EUfiikpW28a+F5o+zy+en6BDVZjicVmWBngZ1HGMt2kk/TbbuTgsNh8D iViqcLtd22vzPrGx+M/wbbS45dV8e+Cb1EXIa61G0lP4ZJNfHX7eX7W3hvW/ Clt4F+GerWV1a37ebq19o6eXGI1b5IFZQM7iNzY4wAO9dXon/BEPxxcOP7X+ JWgWCdzZWM9yfyYx/wA69o8A/wDBFj4b6DLFN4q8Xa94rkTloLdI7C3f2IBd /wAnFflmWcC4XAYuni6ledRwbkk7W5uja626eZ9NiM2qVoSgopX0v5H5I+Bv AHib4q+J7bQ/DOk3mvaxcsAsNuhYgZxuduiqO7MQB3Nfvr+wt+zFD+yz8FNP 8OXEq3fiLUJm1PWLpAdhuHRV8tM87EVFUZxkhmwN2B6X8KfgV4K+COgDR/BP hew0CzODIbaJfNmIBAaSQ/M7e7E13UMDpKpK4A9x71+mngn/2Q== ------=_NextPart_001_009E_01C2A9A6.76D683FC-- ------=_NextPart_000_009D_01C2A9A6.76D683FC Content-Type: application/octet-stream; name="MSC.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MSC.pdf" JVBERi0xLjUNJeLjz9MNCjI0IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDM0 NjAyNi9PIDI2L0UgMjY3NjYzL04gMy9UIDM0NTY4MS9IIFsgNTAxIDIxMF0+ Pg1lbmRvYmoNICAgICAgICAgICAgICAgDQo0MiAwIG9iag08PC9EZWNvZGVQ YXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVE ZWNvZGUvSURbPDVBNTYyQTg3MDkzNzg1NEM5QjE3MDUzRTI0RTY0MTVBPjxD N0Y3MkY1ODNGMzJFQTQ2QThGOUNFNzQxMkI4NzczMz5dL0luZGV4WzI0IDM3 XS9JbmZvIDIzIDAgUi9MZW5ndGggOTcvUHJldiAzNDU2ODIvUm9vdCAyNSAw IFIvU2l6ZSA2MS9UeXBlL1hSZWYvV1sxIDMgMV0+PnN0cmVhbQ0KaN5iYmRg EGBgYmBg2g4iGb3BZDeIZH4DIllWgdmzwOwpYHYPmPwHJpnA5EcwOQdIMhof BJGb2UAiy4+C2NXvQexdW4DkX9nTDExAG5eDRID20JD8z8B46wNAgAEAiI0T Qg0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNCjANCiUlRU9GDQogICAg ICAgIA0KNjAgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0kgMTM5L0xl bmd0aCAxMjkvUyA3NT4+c3RyZWFtDQpo3mJgYGBmYGByYGBhYLBVYxBiQAAh oAwrUJzjgsPX0AMMTPOu3AaLa0VLPTjondzA0dEBRKwdHVBZoBQ3A6v5BCAt AMSCYMUXgXQsQ9uBaAWdCWISXG9YopgMGQUYip7ZcSuH6i98U1l4zFAUbiUf A6vrZCDNCMT7AQIMAKCnHm8NCmVuZHN0cmVhbQ1lbmRvYmoNMjUgMCBvYmoN PDwvTGFuZyhlbi1VUykvTWV0YWRhdGEgMTIgMCBSL1BhZ2VzIDIyIDAgUi9U eXBlL0NhdGFsb2c+Pg1lbmRvYmoNMjYgMCBvYmoNPDwvQ29udGVudHNbMjgg MCBSIDI5IDAgUiAzMCAwIFIgMzEgMCBSIDMyIDAgUiAzMyAwIFIgMzQgMCBS IDM1IDAgUl0vQ3JvcEJveFswIDAgNjEyIDc5Ml0vR3JvdXA8PC9DUy9EZXZp Y2VSR0IvUy9UcmFuc3BhcmVuY3kvVHlwZS9Hcm91cD4+L01lZGlhQm94WzAg MCA2MTIgNzkyXS9QYXJlbnQgMjIgMCBSL1Jlc291cmNlczw8L0V4dEdTdGF0 ZTw8L0dTNCA0MyAwIFIvR1M4IDQ0IDAgUj4+L0ZvbnQ8PC9GMSA0NyAwIFIv RjIgNTAgMCBSL0YzIDUzIDAgUi9GNCA1NiAwIFIvRjUgNTkgMCBSPj4vUHJv Y1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL1hPYmplY3Q8 PC9JbWFnZTE3IDQxIDAgUj4+Pj4vUm90YXRlIDAvVGFicy9TL1R5cGUvUGFn ZT4+DWVuZG9iag0yNyAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmly c3QgMTI1L0xlbmd0aCA2NTEvTiAxNy9UeXBlL09ialN0bT4+c3RyZWFtDQpo 3rRWXW/aMBT9K/d9Y/62Y6lCAgrbpLUPoyqTqj6kEEGkkKAknbp/v5sPChmQ ZCFVREh8r+1zj89xLAVQkBIk3hUYfNDALQdp8M+AdDCoQVrQWoKiwKg2oBgw zhxQHJiUDJQA5giMS2DWUlAKOGeYh2MJrUHhYIoLUA5wg0nKgmDaws0NGd+R +yjeugF5+LPzyPQt/TpP3dQjSxfoF0WZ1cNhQx7LM0bJ0gtTMIqS0e/1wl+l GwTIyMTdffP89aYI3XpF2oDjyyxw1wkITmZRmI7H0dvTQFGRx7BApAR7POfB mR94HIRGsn7mDffu1iOj8eR2Ov00cQP/Jfbz9kUxlaSUfE+xfTkK14EHlNy5 bwUmZqQg89TbPiK8opqsYwYs9ndpFJNfJV6EMRw+ca6fMwLcxMvy/p10Gi6j lR+uycIPR2Hiv7/P/DhJJxs33hd4mCFb6qyQH+4hIy9oxsj89SXNMD3Er14O 7h0hyfEnmUKwc4VzrOjAORJ7xDmGjjg35ziXgucx0MZkHSqUm/OUR2ESBW7S lnNG7Z5z1YJzrAEOV/GW3fft++euv+rYzdnd5qjO1Afudij7vnDMsw7Ya6Cb BZyqBZgWpQd4Gw/Yvj1gdOEBQ+mJB5xaD3weR8Hq2AimzghGdzfCJSnVi+Gc GK+X/P8Lv9mSTW0fJ/Er5F8sfycP4He86gEjSw+IFh7Ar3+/HsiOCqUH5IkH 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 deYL4kTCMhEK3ja3QGnnIdbdb4lyzyLZ0SQXF4x4FHrLqviOS9+phbL3YTy0 MnprTlNbgc59Zg4M8Tb10UBETs0PYp/9Uq5vQWmxaoKRVtGbDcOUoKKaFLMD wNEifUWNaTwemWx9jAiFsw/4TSmst272Yj2MzI8Am1/STdL6RPEhBXypOJvY vYR2h+hHVsyzN7tORrnaOjTxEMAjPBzw+wQUXLPtI03Om6wYPxpoZpGy678A AwCX3mtZDQplbmRzdHJlYW0NZW5kb2JqDTMxIDAgb2JqDTw8L0ZpbHRlci9G bGF0ZURlY29kZS9MZW5ndGggODM4Pj5zdHJlYW0NCkiJhFRba5NBEH0P5D/s owpO9jJ7e9RiSgVNSYIv4kOobS1Uhdjf5W/0nNmvaqKhFPJ1Zudy5szZnaWW JVen1UvMLrUmPTktRVp3qUehkSQndzWfpR5EEVuiVBx6KRlGkNaQ2KVFs3y2 2BYlBDia1OJSVUkdXYooglG+NKdNJXQLhqNWc0QeV0nD6uiDCorUVgjQgrtk OqrkiMpeFCABXINZvZnViwXXLEmd9iSJwV1qMitiPPbPFtzqwJylWGGWQsPM 0yyVxFTxGKclEmOxaA87ik92aog9+WFm4bBdYnjkjagqojBexwelgKwgx0f2 rKhrHKsPUuiIbKTeS2UsCigyu9FUreoXThcHpOi+0lLJxBjGrANxxXTBJgdb XMBYJaDGYVcy4aXlARCZKKDBLGx22uWYJ3G6ZNMhpapZ+BgPOmITKxJVGsc+ 2yqpAhYeq0y/UYSxykLEjW2wjtAMfjHDj1BDzkiqDZO2ZpbnbMkIxaZ0YIDD F3OwamRxQgDdfzE2KLx5Qc6baZUDKplUX2xguNHTZ1MrAHQEeRUtY3tDCL1Q ICyqdg08BRYkDCLBp/Y2LZd0ZHUZO47V9AdZZCiAFwgFE4zE8haL7hUO8MZy Bf9WMUupfxywliFoJJ8OLhzFE4+VNBJuYaoneOqLE+Fe886HSf+ZsjwkYdIX law2AEBRYsikNPp4AQwh18k3A8i7mvpCHUpG6yFHfsBiSiYUXGMSHAZpvozg anoHJQOK3Wlejzr01fnYTIFUFBDEblXxYmjP4pvdJfYYfEy7ga5JKp8K5IRm zJjKG4PJjNZHwn03RxxXOrMW7k1zh0T8Uc7r7Xy2WAYXAjtub+az4Dz+goPq fFRX1cSzBXeL801ztz/mM+9u+XM+n3185p5/ctu389mb7Sh2lJ66fZj+b+xi GR1U9nfXnLFnVzRS4MyCG1R2/FZMs7899qz/i2KxTMeVJ0Al4AlqE6B3F2fr 1Wa13P50Z6v15Wr9anuxer85MVKMics4qPDE+IWLe4w92+0/333b3bvL+93V 9YnEUHA942HiE01ys2d5xDZ/IphvyXHwyxOxuK7tODZ47z7cXT1839/t3OZh f339gGz3S4ABAO+JcAMNCmVuZHN0cmVhbQ1lbmRvYmoNMzIgMCBvYmoNPDwv RmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA2OTY+PnN0cmVhbQ0KSImMVF1P 2zAUfUfiP9zHRAI3tuN8PLKtSDAYEnRCE9pDmg/wlsYocai6Xz/b+Rju6nWq enPrnHt9fc6pV9enJ8vV6ckH9cUQqA8GgmNEGLAkRjSB1eb05MkD/zusDmBj ggISAosxoiP0RjSFaBx4jDGKiIU/g4dHvHThGUbExrtGwSxGiQ1l1zcucBzv z3HsiIwhPEK/NlyWBXzmzXMhNnt1i0sCmMCqerdbFKKQWC2O7UYTlMQO7OKS AglQEFqbTJWYIcrGyturj/d3D37s3V2unExgVWeXOSlO1B6Rjf3iM2/5CN+W F2qbe7jwqfd44Yfe/SdHE0ojFMR2E3ScQxpGKE3/b86RijBlKE6dJBJIURod 4jBMMGKDUqB5VpPkT96VBN6BWPuYeG9c9J1OQL5kEnQmX7h+dNAIySuT55nk QicNbHldG3xuFjYlSAE7k/eQdaZD5joPTSPEmD2WGanzz6nX69Dq8OonQ8J1 6NSvUiegw3qGynntVYd6gmVDkQpjVeJVc7NGh2JY/zfpUaLl3eNO8uHE+pht mRUm4RLyrNVZWfX6Udc7zcXWLCmmGp08t5nsDXeZLA2FO9GDeDN5q38MSdfn uSnsBmF4o7QpzUaVqGtD9Vb9Y4/Nz8KJ5CdPVBXPeTYo99qvTcLfyWoeFbRl 19dykF9Uox1KcN1qJCUI0/dbjXqeOwtixKg922bWjCul6lnUchB1yvJZ8lbB xKwln1+CtV7bkpfqpWn7oMN28ko526eb+5tZfk5F3TwQ0SHQATuOxwLlb/t0 oQuKtUw2dbPLFiRwbkFDdff+zThz4tP9kY4ZJ8QHjC/a56zhv4xZC1jvjDdu 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 7mrIWIb9pueFqWDGusL6n2p2YE/3tDrjSroJJpGYtBh8fKvVvUB/R2T57JlM aMW0bS6wl1K2bpKoItgQtFsWJ0byneArnsVENEFKEPu8Eprx7HSB47SSC+2r Swzj+sJg1zxW9uDxiS2SbLlbOlvmC+isiax2m6NBZR2HNvSGD4MrQzXXcP1v fAVKMm2aBeNIkF0Jgards/WZvJK2Zo9rJiTqgtuTKEETPJWZYoL/U/mu31nG 0tOlxlGHdOQEW1RVEHklcMnpE+zw+pLIM4EvZD2CIZ49EukSjOqQIdgjqHeD t39WF62wg9tPPmEyxS2R/IcTB9OlYIk6N11R8p7KKeWrrMpV4QjmDjelu7Sh QxvuO7FWMXGuVMyJGK84zATlqrmkW27vHMLeOls755s94daF62+j6zq5Ydm5 TE0yh6V7v87zBfSJoMajvh4dho/dkVeU5CwVJ/3rtwQJ4AQC5XhfGPutdqwe 13FxsXsgGGC1OubG1NvQ08ymTGUnzZqu/A6DG9TuPsIaSBPOjIRUSLAZkxaq Mgx+fIBVGCjjti21NQY9NmASpiHFaVMNBbaOPy/zWSkM3K7hG4r+I8AArkla SA0KZW5kc3RyZWFtDWVuZG9iag0zNiAwIG9iag08PC9GaWx0ZXIvRmxhdGVE ZWNvZGUvTGVuZ3RoIDc4NDQyL0xlbmd0aDEgMTczNDcyPj5zdHJlYW0NCnic 7H0HfFRV2v45904vmZkkkzZJ5oZJQiCkkFASQBhIo7cwmIBCelFKTKEJiqKg ARTXrqjo2rFMBtTYG/ZeVnftrK6rq9hWXUUg/+fed04IrPrf/b7dz/X75pw8 93nOe8o95z1lDj8zkXHGmBsPHZtdWjmlYvu5W8qZ1L2HsaS3yiaVzssb6riZ sR3zGOOPl02aXnJZS7mdsSvTGZPyK0rLyv/86NeQG19lTP6sYvasymlDx0iM XZPM+PbuisrApHPGTH2ESeNvZGzysFmVeQXfv/U7F9r6Pd5aU7+0tm1MSC1f YEIje+pXdCrBy/e8zFjtd4zpk5vampd+++0MG2MjnmXMnNRc29HGkpkP749F fWfzktVNpVFd7zPWjLR1VEtjbcPnLulqtH8c8ke1wGC/1SYjfQHS6S1LO1eN /tz4Bt5VxFjeiyc2ti/jg/hGxrZtR37CkuX1tUm3JDzMWPt0xlJnLq1d1ZZW mP4c6vciX1lWu7Qx5ZaTTkP53YzZx7ct7+js8zDUv+JrNb+tvbHtxNulQ4wd 8xFe52Sqb/VvDWkbnJuy2DHuG5aIYSLc+8naZ1V+3r5o3w/7D242f2oahaSZ SYwC6hnYIcb3WHb8sH//DvOnWksDgukR1eLIZLOYno2DlpiT5bFGxlzbtPdy Juuy+TbkmvSX6gvRZCqx/CLbKDETkxx6SZJ0sqR7j0l9fnZLH72XsRmVisL8 jKUUUx+MV0qZCuNXqXnyXfoodaRoPepwb/gL7P98MLzObvml+/C/Jega2dW/ dB/+mWAw/Hv6K+/7dfnh3xF0I1jNL92HSPjvB+lpdukv3YdfQ5D+xCb/V+rx b9mSf3VfIiESIiESIuG/HqTLueUn82rYvv/JvvxagjySbf6l+xAJkRAJkRAJ v66gW8rO+aX7EAmREAmREAmREAmREAmREAmREAn/e0Lk35mREAmREAmREAmR EAmREAmR8CsOchjJ4W8brEEKSmpiOrYI6WjmhEX9joKdDWIzWANrZztSivv6 tNJ2phxh433fMNb3N3YnT+qr/2RTuM2oI98oT5UvZgb+qZb68uhvOWjfa6Dv REjs5wMf0N6/I5T+M4V50s/kbfnvduV/OMj/0tb+rSvJX9GweNHxxy1cUF0V mFc5d87sWTNnTJ82dcrkivKy0pJJE/0Txh8zbuyY4qLRo0bm5eYMy8rMSPcN 8ibEupwOu9ViNhkNep0scTaszFdeowQza4K6TN/kyTlq2lcLQ+0AQ01Qgan8 yDJBpUYrphxZ0o+STUeV9FNJf39J7lTGsXE5w5QynxJ8rtSn9PIFc6qgt5b6 qpXgPk3P0LQuU0vYkUhLQw2lLKGlVAnyGqUsWL6ipbusphTt9VgtJb6SRkvO MNZjsUJaoYJZvrYenjWea0LKKhvTIzGTXX1tUM4oq20Izp5TVVbqSUur1mys RGsraCgJGrW2lFa1z2yz0jPsoe4tvU5WV5Nta/A11B5XFZRrUalbLuvu3hR0 ZQeH+EqDQ9Z8kIAhNwaH+UrLgtk+NDZtbv8LeFCf4fQp3d8wdN6379MjLbVh iyHD+Q1TpTrEfjchX2iGvqGHGF9amtqXzb1+VodEcP2cKkorrM4TYv687Oqg VKPmPCRy3AE1Z73I6a9e40tTp6qsJvyzoiUhuL5OyRkG72s/GfhBvhKUM2vq 6ltUrm3s9pWWkt/mVQX9pRD+2vBYy3ry81C+tgaDaFXdMKcqmOdrC8b6JlEB GBR1Dlorq7Qq4WrB2JIgq6kP1wrmlZWq/VLKumtKqYNqW745VXezwr73ekYo nl2FbASrVvsRjCvBpGSWdVc1NAW9NZ4GrM8mpcqTFvRXw33VvqrGanWWfM7g kPfwujTtjVotjO2o0qKwOnJjhkmpkjxytTpbMCjlePgmjUOGE9OlJdUZnTRO qeIeJorhLeESqjqiHSTkjJLJapasVi2Z7EmrTqPwM13yhPukzwiaBrTlhKG/ T/Sen+walVY7NEQpaywd0MEjGtWHOxhu7cf7Kam+CL8YNUzqdE4WWXIGdi5s EprRTOosJihBNlup8jX6qn1YQ/7ZVerYVF9r8zut0jdtzoIqbbbDq2TeESnK L6JUkKUhWySkEqzB8myPmFYtXaGl+5OTj8qeIrKVbpNvWmW32rgv3CBTsIMw aEPmlNrNRdEjsDXLcbr5ymt9ilMp767t7Vtf193j93e3ldW0jFHb8E1p6PZV Vo3zaH2dW7XOs0Z9VTSbxqfNm5QzDGfPpB4fP2tOj5+fVbmg6m4nY8pZ86pC EpdKaiZV96Qjr+puhTG/ZpVUq2pUE4qaUFuai4RJK++528/Yei1Xpxm0dH0v Z5rNJGyc1fdKZHMKmwSbjmx+zaYGTFJCC1yM47ZMaVCnZ211S3dNtbq5WBym Ej88yH3jWVDyje/hksEWtPgaJwWtvkmqfYJqn0B2g2o3YmHwOA7nqGdSd40P 5xQWVBXzcFqKstqk0tvXN68q7TnPvuo0LLXjgAVVQXM2zn59xlSUq1BRA3NF cH19rdoPFqhS6xozptRXY9mKBlFkStCMFszhFlCiXKujLkdUqsfcYAK1+uuR CK6vDlZnqy+taq3WlrMzyCb7xmDaqU19pvqivOruaF+BtjexFSwZm1Qyo2+s soosHiTxsmpyktGGntf7kFVfo8DbOlZfiaVOZ6nFQ5ZGHIm6zEYNFk84k6nD kjOsdkvQnIsG8aNqa666JfUZxupq6ryW2hQugHc7g1b0KHOAK8MV4B1kTVH7 gp9N6Kpa9GG1mTm9bK5vFU4WtdNaS0ZkB+0ZU2px+FN9Kyy+IlHZpJ4R1nAb e8hqVEdug9/ljHm9fTf4VqcNCDnDfOqHg7owmeduLGxW3X20IbgwO2eY6Wir XTN3d5vsP16B/GWy97NqVMrwqcFYyCwrvdIZu80JfCrEBiFOF+I0IdYLcaoQ pwixToi1QpwsxBohVguxSoiVQqwQokuITiE6hDhJiDYhlguxTIilQiwR4kQh ThCiVYgWIZqFaBKiUYgGIeqFqBOiVogaIRYLsUiI44U4ToiFQiwQolqIKiGO FWK+EAEh5glRKcRcIeYIMVuIWULMFGKGENOFmCbEVCGmCDFZiAohyoUoE6JU iBIhJgkxUQi/EBOEGC/EMUKME2KsEGOEKBaiSIjRQowSYqQQI4QoFKJAiOFC 5AuRJ0SuEDlCDBMiW4ihQgwRIkuIwUJkCpEhRLoQPiEGCZEmhCKEV4hUIVKE SBbCI0SSEIlCJAgRL0ScEG4hYoWIESJaCJcQTiEcQkQJYRfCJoRVCIsQZiFM QhiFMAihF0InhCyEJAQXgoUF7xPikBAHhTggxA9C7BfieyG+E+JvQnwrxDdC fC3EX4X4SogvhfhCiM+F+EyIfUJ8KsQnQvxFiI+F+EiIPwvxoRB/EuIDId4X 4o9C7BXiPSHeFeIdId4W4i0h3hTiDSH+IMTvhXhdiNeE+J0QrwrxihAvC/GS EC8K8YIQzwvxnBDPCvGMEE8L8ZQQTwrxhBCPC/GYEHuEeFSIR4R4WIiHhHhQ iAeEuF+I+4S4V4h7hLhbiF4h7hLiTiHuEGK3ELuECAnRI0RQiNuFuE2IW4W4 RYidQtwsxE1C3CjEDUJcL8R1QlwrxG+FuEaIq4XYIcRVQlwpxBVCbBficiEu E+JSIS4R4mIhLhLiQiEuEOJ8IX4jxHlCbBPiXCHOEWKrEFuE2CxEtxBnC3GW EJuE2CjEmUKIaw8X1x4urj1cXHu4uPZwce3h4trDxbWHi2sPF9ceLq49XFx7 uLj2cHHt4eLaw8W1h4trDxfXHt4uhLj/cHH/4eL+w8X9h4v7Dxf3Hy7uP1zc f7i4/3Bx/+Hi/sPF/YeL+w8X9x8u7j9c3H+4uP9wcf/h4v7Dxf2Hi/sPF/cf Lu4/XNx/uLj/cHH/4eL+w8X9h4v7Dxf3Hy7uP1zcf7i49nBx7eHi2sPFbYeL 2w4Xtx0ubjtc3Ha4uO1wcdvh4rbDxW2Hl+xSBW7NodTxXtyZQ6lu0OmUOi2U Oga0nlKnEp0SSrWB1lFqLdHJRGuIVodSJoJWhVJKQCuJVhB1UV4npTqI2sl4 UihlEqiNaDnRMiqylGgJ0Ymh5DLQCUStRC1EzURNoeRSUCOlGojqieqIaolq iBYTLaJ6x1PqOKKFRAuIqomqiI4lmk8UIJpHVEk0l2gO0WyiWUQziWYQTSea RjQ15JkCmkI0OeSZCqogKg95poHKQp7poFKiEqJJlDeR6vmJJlC98UTHEI2j kmOJxlD1YqIiotFEo4hGUmMjiAqplQKi4UT51FgeUS7VyyEaRpRNNJRoCFEW 0WBqOpMog9pMJ/IRDaKm04gUquclSiVKIUom8hAlhZJmghKJEkJJs0DxRHFk dBPFkjGGKJrIRXlOIgcZo4jsRDbKsxJZiMyUZyIyEhlCibNB+lDiHJCOSCaj RClOxDTifUSHtCL8IKUOEP1AtJ/yvqfUd0R/I/qW6JtQwjzQ16GEStBfKfUV 0ZdEX1De55T6jGgf0aeU9wnRX8j4MdFHRH8m+pCK/IlSH1DqfUr9kWgv0XuU 9y7RO2R8m+gtojeJ3qAif6DU74leD8UfC3otFD8f9DuiV8n4CtHLRC8RvUhF XiB6nozPET1L9AzR01TkKaInyfgE0eNEjxHtIXqUSj5CqYeJHiJ6kPIeILqf jPcR3Ut0D9HdRL1U8i5K3Ul0B9Fuol2huAmgUChuIaiHKEh0O9FtRLcS3UK0 k+jmUBzOa34TtXIj0Q2Udz3RdUTXEv2W6Bqiq4l2EF1FjV1JrVxBtJ3yLie6 jOhSokuowsWUuojoQqILKO98auU3ROdR3jaic4nOIdpKtIVKbqZUN9HZRGcR bSLaGHLXgs4MuetAZxBtCLmbQKcTnRZyB0DrQ24cxvzUkHsU6BSidVR9LdU7 mWhNyN0AWk3VVxGtJFpB1EXUSdRBTbdT9ZOI2kLuetByamwZlVxKtIToRKIT iFqpXgtRM/Wsiao3EjVQyXqiOqJaohqixUSLaNDHU8+OI1pIg15ATVfTi6qI jqXuzqcXBaiVeUSVRHOJ5oRi/aDZoVj1DbNCserynhmK3QCaEYrNAU2nItOI poZicS/gUyg1maiCjOWh2FNAZaHYTaDSUOypoJJQ7HrQpFB0OWgikZ9oAtH4 UDQ+3/kxlBoXclWDxhKNCbnUpVFMVBRyVYBGh1xVoFEh1wLQSMobQVQYcg0D FVDJ4SGXOrD8kEvdm3lEuVQ9h94wjCibGhtKNIQayyIaTJRJlBFyqV5KJ/JR m4OozTRqTKFWvESpVC+FKJnIQ5RElBhyHg9KCDkXgeJDzsWgOCI3USxRDFE0 VXBRBScZHURRRHYiG5W0UkkLGc1EJiIjkYFK6qmkjowykUTEiZi/z1HnVXHI Ue896GjwHoD+AdgPfA/bd7D9DfgW+Ab4Gva/Al8h70ukvwA+Bz4D9sH+KfAJ 8v6C9MfAR8CfgQ+jmr1/imrxfgC8D/wR2Avbe+B3gXeAt5F+C/wm8AbwB+D3 9hO9r9uHe18D/86+xPuqPdP7CvAy9Ev2bO+LwAvA88h/DrZn7Uu9z0A/Df0U 9JP2E7xP2Fu9j9tbvI/Zm717UPdRtPcI8DDg73sIzweBB4D7bSd577O1e++1 dXjvsXV67wZ6gbtgvxO4A3m7kbcLthDQAwSB262rvbdZ13hvta713mJd591p PcV7M3ATcCNwA3A9cJ01x3st+LfANahzNXiH9UTvVdBXQl8BbIe+HG1dhrYu RVuXwHYxcBFwIXABcD7wG9Q7D+1ts8z0nmuZ5T3H0uzdarnOu8Vyg/dMOcN7 hlzk3cCLvKcH1gdO27k+cGpgXeCUnesC1nXcus6zbtq6k9ftXPfmOn+0wbI2 sCZw8s41gdWBlYFVO1cG7pE2sibpTP+4wIqdXQFdV2xXZ5f8dRff2cVLu3h+ F5dYl7NL6ZJtnYH2QMfO9gBrn92+vj3YrhsbbH+vXWLt3NLb99Cudk9qOdi/ tt3uLD8psDzQtnN5YFnT0sAJ6GBrUXOgZWdzoKmoIdC4syFQX1QXqC2qCSwu Oj6waOfxgeOKFgQW7lwQqC6qChyL8vOL5gUCO+cFKovmBObunBOYVTQzMBP2 GUXTAtN3TgtMLZocmLJzcqCiqDxQhsGzZGeykiw71Q7MTEZPmIdPyvf4Pe95 vvDomCfoecgjRzuSvEnSEEciL5mVyJcnnpp4bqLsSHghQfInDBlW7oh/If7d +M/jdTH++CG55SzOGafEyW51bHEz5pVrPKGUePhIbawz4nyZ5Q43d7i9bqnM 6+bM9Z7rC5fsftD5glNyOLjD0eeQ/A4Ud0R5oyT10Rcl+6OGjy532L12SX30 2eU4vx0WtcXBttnzyh1Wr1UKTLDOskp+64SScr81J7+cyVzhnHEnSDapveBu bzn29a44ruf4PO+ZV5mdPa3XxOZOC5pmLwzys4IZlerTP2dB0HBWkAUWLKzq 4fyc6h4ulcwLxqr/xVZLn7l1K5uUMi2YUlkV3JFSPS24HsKvij4IltITxyZV Zy/q6OrIzu5chMeijs5s7Qcp3qWmslWj+tPRibQau7Q0y/7ZQMVAizsQOoWx 8+dr/acH/kt34Ncfepj6SwYT+6QzWIO0ATgdOA1YD5wKnAKsA9YCJwNrgNXA KmAlsALoAjqBDuAkoA1YDiwDlgJLgBOBE4BWoAVoBpqARqABqAfqgFqgBlgM LAKOB44DFgILgGqgCjgWmA8EgHlAJTAXmAPMBmYBM4EZwHRgGjAVmAJMBiqA cqAMKAVKgEnARMAPTADGA8cA44CxwBigGCgCRgOjgJHACKAQKACGA/lAHpAL 5ADDgGxgKDAEyAIGA5lABpAO+IBBQBqgAF4gFUgBkgEPkAQkAglAPBAHuIFY IAaIBlyAE3AAUYAdsAFWwAKYARNgBAyAHtBN7MNTBiSAA4w1cNj4IeAgcAD4 AdgPfA98B/wN+Bb4Bvga+CvwFfAl8AXwOfAZsA/4FPgE+AvwMfAR8GfgQ+BP wAfA+8Afgb3Ae8C7wDvA28BbwJvAG8AfgN8DrwOvAb8DXgVeAV4GXgJeBF4A ngeeA54FngGeBp4CngSeAB4HHgP2AI8CjwAPAw8BDwIPAPcD9wH3AvcAdwO9 wF3AncAdwG5gFxACeoAgcDtwG3ArcAuwE7gZuAm4EbgBuB64DrgW+C1wDXA1 sAO4CrgSuALYDlwOXAZcClwCXAxcBFwIXACcD/wGOA/YBpwLnANsBbYAm4Fu 4GzgLGATsBE4kzVMXM+x/zn2P8f+59j/HPufY/9z7H+O/c+x/zn2P8f+59j/ HPufY/9z7H+O/c+x/zn2P28HcAZwnAEcZwDHGcBxBnCcARxnAMcZwHEGcJwB HGcAxxnAcQZwnAEcZwDHGcBxBnCcARxnAMcZwHEGcJwBHGcAxxnAcQZwnAEc ZwDHGcBxBnCcARxnAMcZwLH/OfY/x/7n2Psce59j73PsfY69z7H3OfY+x97n 2Psce/+XPod/5aH6l+7ArzwkLF7EmPFKxg6df8RvUc9mJ7AOth5xI9vKzmcP sjdZHdsAdSnbwa5nN7Ege5g9xV7/V/5K+KHV+qXMJt/FDCyGsb79ffsOXQ/0 6qMGWM5HKkanHLb0Ofs+O8r22aHz+5yHeg3RzKLVtUsvw/pXfrBvPz5fke4b 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 f5u8QXvKWukoLaVqiUXJOib+qn26HB3WugFl9CxBHhXWhgF2I1shzwxrExuq /a1xVZuZIu8Ja4u0o7+8lc2XPwhrGxuqGxPWdukSnSgTxZYYDvT/hfsCY0tY c2Y0XhbWEjOa/iL+lj2LNom/iK8bUEbPbGY5rA0D7EY21uwIaxNzG5eHtZk5 zVPD2sJn95e3smzzgrC2Mbf5zLC28+nmy/r/xvooy4fq/wVAZw77mTT5mTT5 mTT5mbRuQBnyM2nDADv5mTT5mTT5mTT5mTT5mTT5mTT5mTT5+SamsAKWz4az Qu2vyau/Zd7OlrMOoIl1wlai/XY+/Y5+LSytUMtYLnImsiWICpsLWzNrQV6H lmoEN6L0CjwbULIE9ZagTB1srSjRqpWrBZairQat7DKkOmBbpuVR/Vb0QAFq Ua4VLaxGaiVUJ96laN8JqINegrKK1ucu1G7QvnPQrLWyPNxqJ0osDb9TLaFg jMu1dzZq3y1QxzJFG2sTLLXa77y3a6NQNK7VRqm+l8ZRj5xhWstLNcsSrcVa +Ijs4i1L0c4SzWNt4V4ug2Wp9lZqUx1n54AeqG9s08YivhNB3qa+q29aDg8o 2rcBmjUvtGq//69+r6JTS6kj7uyfD/IZvUXR+r4sPK7lmm/rtJKHezxwRKrX Vmn1aNQnIp2rrYeBszlYa22p1sJqzQ9d4Zkf6G91xmj8jVr/1fHTvLRrq0Fl eqM61wraaOsfDfWxOVymA6k14dY7MQqaoRX9s1SrrZFaWJceMS6xmuvRk1rt /fXh9+dqK7ZZmys15+/3wJi/G/X88MppDa+xkWiliI36mZXeqb2zQVuJ6ltO 7J8D4Zsf23vN4XXd1l9aXbk048tQvlFbO9NRop5laT4dgjINWnsVWt3lWvud iG0YRx7iSi3manvqyPflhlvPg16trcBmrddtaGE1rKrHmrQRqyv1yFaFvUn7 JlC7tl5Ee9XaGGiVrNZmt0PrYae2jju0fUe1FW0M6h5o1GawVXtHozaHdVpd 4a0yFsC4J4brtg/Iof3ToPnk8J5YGf4GTctPvJfSatl6zGCX5sOG/jXWoOW3 aStk9YB11aaNdFl4ZVFbjdpT3SlHj1vNpx2ZhVrqTKmroa7/TT/Wq2V/1/I/ 7qPDrYtTUQmfa51av+uPOF/+fuziNDm6X2MHeEAdCY2FTlnxOdHef2I3aGfW Mu3sqv3JkZKfa4/wKe345eEnjYp0l7byurSaDdr+V0fT2N+OWnKJtmt+bob+ Vfvi8J7I03qj7gE6+XO1uWpjq25SCvKHFyozWuvbl3csb+pUSpa3ty1vr+1s Xb4sV5m4ZIkyt7W5pbNDmdvY0di+orEht6R2SWtde6vS2qHUKkuXNzS2L1M6 apd1KMhvbVKa/h9zZwPeVHn//fskaZImaaHlrQWUBBB5syCgIMiLCgoFSwVx iJumtAUCbSltCi0IVIqIyhQVEV+myBwydejo5uZ0WQWGUF5EbGuljEIhtMbT 0rImzZB5ns85SUtBdv3Z/7qe53p6X5+T83Lfd+7f93u/nThnSqYro8C+zOVe YM/Nm+vOSLfnLM7LSnNlzc+1LyarOz2Tkllp9tTFOVnpObkJ9ilu+7z0FHde TnquPSc9JcPucvMdqbmD7bmZKbQgNSWbc7VIZl6G25VNlVl5mek55MxNd2sV 5NqzcxbTbrXZ1J6RsXiZfQENt7sys1NS3XZXlt2txkHLKGLPcGXxXYvn2ee6 5msVh77InZ7vprBrUXqCPRzmzbn2zJSsAntqHsGH2u1ewPenL7PnpBBLjouw KZiSac/LVr+GGudzJ9e1nOzuxQS0VA0pxb4sJScz9F2qzKkLUnJoWHpOwoz0 +XkZKTltDoxu/eqHEIdw7LcljLr9CtHdOSlp6ZkpOYvUCNTWXHZvPlpnq7dT FxN4lis9N2FaXmr/lNwB9rR0+305ixe7F7jd2aOHDFm2bFlCZmu5BLIPcRdk L56fk5K9oGBIqnve4ix3bjirej4vha9fpOZ7eHEekhTY83LT+XIapD62p+BA ek6my+1OT7PPLdCaNWnWtLt4mqNd4E9aXsiJZQtcqQvaleXTlZWakZdGURRL c+VmZ/AFqlbZOS4ypJIrPcudYG/97sVZGNnfNcCenjlXLXS5qqzWzNdskZZd 7YrYkuvOcaWG+kvbt6vdpLWuMVoD+rv4FrqsOiZy1I6dtnhZVsbilPZfSptT Qi3FeMJFY/Ukz52d50b2pa7UdDXPgvSM7KsCuh4vNCeGpKXPS6HzJ6TkZue3 vTcJJU6sE9f6k8jBzlt0EiZFER3C//Ut3sCk/nwOFqLtPebafxP1r9hsEnmk B683f1SUlr/wevN36KDl/+B683fsqOWvvN78MTFqfp3hevN36kT+idp/fczM u4+aXy0bof6Xw6TuvFVtEN31ieImcgzj/uir8o5rl7cLefuQN4Ecd6q1X5V3 Tbu83cjbj7zDyHEX9xOvynuoXd548g4g723kmMT9pCvzav/Vsta8Pcg7mLx3 kCOR+zOvypvZLu8N5B1C3rHkmM79h9X+YjZLZsuePb/h79VXzRGS2WQ256/n L9+ol4yGU4Xqn1mSzAbtrFAU6vWSOWLr1q3mSMls/bzw88JtpE2k9aTICCmS GlqrMEjGiI9K1HKRkhQZriJUR6RaR6RFirSV8Pf2hLcnvKilDSSLUbKYDQaD e8PatWs3uE0GyRSuptAi6SwRbfUUGgySxbiRP4tVskSVOEuc1Lr1BfsL9mdI a0lWo6T+WzLXrMwq6aytlYVrs2q1WaMka4eSuJK4rf239t84eeNkNZwnzU+a 15htJskWqeNv9L1r+Lt3tNkgmY3hCgttks5mLLyySptJrdIWLdk6nup5qmfj nUcHV2ZUZuyfdujQ3g1fbNhj22OLMktRFj1/Y+bvUf/mj9GErDxVEvqL0umi jCVtf6KkJMIoRZkPqX/hXm8RH+s+EPrUgpwM0Xl+TvoikZSR4lb//fcbhe7u 6TPtouPMGXfb1VHCXKH2eRMzRrfwlUSP6Sjiwlc6ZpUYEa/lCt3RU3+s6C66 Cv2U5OTJou+M6ffbxdAHZ0y1q2NCy2Pgvb+T6KFd6Xnv7yx6hp9EiCjRRdwQ vlJ/WehKq3qlZudmi8+0427tuF87HtGOZdrxuHY8tYjthzinHWXteEE7BrXj j+pRMmhHi3bsqC6bUlftOFA7jtOOM7TjPO24XDs+px23ZS7KXCR9rB092nGf djyiHSu040nteE47NrTNNNd3lP6roxn99ZpOJs7VX1P+/7qnw9uo//VnNM6r 77zqW9oa8aLYJnaJ3eKYqBEXJLXfCa0vhpSQhfp7U2tfUv8rk0IaHfpcvy70 +atguzL014ZtV1xLtktXXkdPvPI6ZuiV153+fOV1v55XXve/6vnAUVdej0gS kbp217fFtntuFNJ9c668nraDTwsjpL9IVn+jowzrhm6oLlms1r2j+0Zs1f9K /ytRZnAb3hblEV8b10t6y0xLivSJ5SmrJO23dbRN0t1je8T2pq4gKi1qoe6v UaujNuj2Ruuizbpj0S3RLbpvWa4DqjbGiqiPr5mOko5HnW2XfOF09BqpObp3 W+pPGk2aSFqopS1Xp6ij0dui/9BxczhtbZfeU1OMuGayxCS3pWdiNrWlQCjF 9rxGSiCN6Pxau/ROKGlPrkqdd3Xe35aOdDlFOqemroZrpdiErrFd+3d7pl3a pKXd10xHu11sTXGd47q3pYnhlHjNlKylh8KfV6bC8FHNt09LZW0pVPpkXGP8 wPi0+Dfjd6jp6trjd14rhWqP/3N8TTg1X07qt8Rf1L6rUOWGaX1Gt6VpfWa0 pbRwWkgq7LOw7zDShJsSbprYZyHHhJt299t/c4WWmvvPIWUP6EcaPKBmQBBq Bvw4cP+gN9U0oGbQZ4N8g3yDDYOjB3ce/BdSWcI4UnLCnCFvhJPn1sLh/YbX jXjx9hGkcSPjRs4ZmT9qVzh9NmrfqLLRA0mjRq8bc2KsUUsbx+7W0qVxt4/7 IJw+HnuJ6w/GNWpXjeN143XjPhg/eMJzEz67K2HSbNLJ+xaM3RjKzWdjKNeU cWq+KdMSeycOTRyXuGNqPy0lT12opfyp66a+wTF/ainp1LTl0wqnnbw/m7Q5 yUmu5KQjSUemlnI8oZ6RapLkpIvTC7W0ffohLZ2cLsPJ6YFkw/QAz+XkOckn kmsecJNenGEn3/bpgdCTGcunB2acndEwK/mhfbNn/yL2Fz1/0W++Yf6c+ZXz L7Z+LhhM2pXVMat3dn72muyS7JpsOTuwxLBk2JKJS+YtyV6yfMn6JZuXfLDk 4yV7lxzLyc55MWdHzoVckRubOzl3bu5nuRXuEe657jfyHspbn+fJa15qXDp4 6b1LP1h6btnEZRfze+bfm+/Mz8l/I39nfmVB74KfF3xcUFlwcbltedflo5bf vTxt+fbllSsGrpi44tEVW1a8t+LEisDjEx5f/vhnK40rJ6zMWfnRyn0rL63q vmrBqu2r5NWjV+ev3lmY/B/mqo+vno+unG0Kl15O6jxSuPVyCs0g/2HsJV49 4q4cJ6Gefs1Zp3XmaZeunDsK911O6uxQWHY5heYFdQ7t+F7cvm6bmIePj2tk 1tTmYO2T+TYmmfl1S/S2jpujjrbNmeSNCfRJU8tGfRy95fLcGVKJ2XmiNv+G cvWO3taqnnpXnYu1vMfV51r+sILU+3HUWWbybZQ4rtV2lNZt5vO4li6vDr6r VoWJ7daByyvBNrXdP5n93/vJ7G8Jz/nPaPO9Nstr9VA6eiLnW1pnQvzYEfaL uSk0/4Tmt7CPzInMgKpraW2zY6ujzHFxiYU1aonLHveZUVhTWENtaq5mniXH 1/SZ8dM+wTxY1m5GvcY8235e/emcGp6592m9KTSLTmudP9V5nTt8a6Ecv4M7 M+KSbx+RdKSrIbSOaZ+sWd0udjlFr4ptXX1aV5XYnl0Nl1egUK9U1zYtt0HN QdndXWPVJ+odNZd6P7Zn1NHWnhrXPbYnK2CsWl49D929vI62X0nVtmirZnjd bLdyxlLD1evkpitWx6PhlbFza+t5fjH07er3T03ucipuIu25Qn1VNVVjnGo3 Yls1Do1EVc1QT+mTht6JqpuqEnHJnV/T/N6hetNuVI+O30msrStsWajWQjmu sFAOJfUb1M8+M1RX1LNQT1M/C+WbEvoOCxFa4foO01aldkld4UKrm7Y+/i+T tqa2Sz/Noa207VJ4xW1LPy2hrrT/XdLW4utObSv2f0hXK6WmtnX8PyRtZb/u pO02rjNdrY62R2mXfqqftndpl9R+H3L6v0s/rfl/bt31pZDO6t4lettYY2Lv sZeijqu7Hi1t1O4Y1Z2OdrUxsbe6Bwo/I7GDGqXumkJ31blfPVOTtjuare2s 1D1U47hGbX/E7oiz3WM3aruTwrZdjJq2Ty9MOjG9UN3BaFfbw/uc0Pl2dkE1 6h11R6OWSwonbcfj1vZG5NWebleP8TvJvV3dTTFb9Es6oe278sMpWbvTT911 aVfJSSfUeSn8jMTObSh7NXWHppZbp52RtH1atrafI6+2U2vbr01NHq/TFLmk avGAO6TEWKMWDy0OtXRqqVa3+k3rtLq0eq8ciT91tH0/uLkidCWMUolyXH+/ 8pl+luigny1s+hylSe8RI4WOJ0e58mpnsn6WclZIHFuEjuMB/WzlKG/q7yuX xF7lkuQUnaQUMUOaK+KlVOGQ0kSMtEjEkHMEOcfrM5S/CYl6zggDeW3kjSGv jbwWrT4vuRpEpPSo6MnzPjyfxfMbeN6Hum6iLgelX6c9J4WVs120N0b/OO1Y qfyJ9o7Wn1Fe0Z8VQ/VeMUxfKwbpv1O+0vt421VrP0rtNcLAmU4/+8cfaM0m atoj8kUHkSg6wmgxQIyBNOUrkQ7zIFepFW6lWeTBUlgG+VAgbGK5ckysgMdh JayCIsqvhSdhHTwF6+FpeAaehQ3wibhb/AWCnP8IihggCZAgWYyRHoAZMBMe BJeYLu0TvYjYpX9I3Kl/RJj1j0GGWK9fLW7UPyHs+iJxo+Et5ZhhK7wNx8QA w9dQBuVQAd9AJXwLx6EKTsA/xICIjspXEaeUYxHfC1uEzHk9NCrHjBEi0TiA z+FigPF2PjOUr4yZkAWLIU+pNS4FtDGijRFtjMsBbYwfijHGj+BP0CLGmAaK XqZB8JgYYHLCXFgCOVAAhfAEoJFpI7wAb8Hb4m7T+3zWQwM0QhNcgBZAQ3Mq pEE65IlekUKMiewseml99xz92qKdfYfrLaILvbaYXltMb+tHb7uL3raG3jaT 3jaX3jaF3jaB3O/QXxL0DynP6X+mLKcH3Ua/eZkanHqPsl1/hn7mFXr9Ofrg d+IRrZ+dJdcJtpmto+JRMaRd/ZOpfyn1T6L+keSeQ92bqPtPlBpO3Zup+3Xq +4z6HhLR1HKeWs5TS0dquZlasqhlCLUMoZZB1HIzrTxJTf2pKY1ahlHDDi3S A5x9KOKo42/U8Tfq6C89pvyFeoZQz2PUM4J6ZlLPeMmlfEldQ6Qtyp8p+Sn1 GahvKS2bR52daFkRtT2rr1GaaV2pvo7R+p24Re8Lj9gYah1IrS5qHUmtk6i1 LzX2p7avKfk1I+9+opwlrOEZ5t/MJOrM8qooUmSxFp6EdfAUrIen4Rl4FjZA qRIUB+EQHIYj8CUcha/gGHwNZVAOlfAPRREnoRpOwWmogTPKQXEWvHBBqRL/ ZJw3gx8C0AJBZrd/8fwi/ACX4N/wI21RFFkSIGmz4hn9HHrYz5Xz+kf5dCrn DccU2fA1lEE5VMA3UAnfwnGoghPwD6hTgobvwAffgwz10ADnoRGa4AL8E5qB thh+BEU5GBGrHDRNUIKmSZAIUyFJqTU9yOcsmMPzR+BReEyRTU6YC4t4toTP HHBzvgzyoYDrx/ks5PMJWMf5U4APpuf53MjnC/AS55vgZdgMr1D/W9zfxvk7 nL/P+Yecfwp4ZMIjEx6Z8MhUpSimE4BHJjwy4ZHpFGVOQw3gkek7pcrkg++J RYZ65aipAc7zrJG6m+ACNHONd6YAny1c45E5FdIgHb904jnRWVu59OI5+u4s +rC6ekVw9TuuErmaQi/fq/9SDFL/v5mUgJhIz6yiZ1bRM6vomVX0zCp6ZhU9 s4qeWUXPrKJnVpG7lp4WpKcF6WlBelqQnhakpwXpRTI9JkCPCdBjAvSYAN9X wvdV6X8hIvQpMJcelKqcoddU0Wuq6DVV9Joqek0VvaaKXlNFr6mi11TRa6ro NVX0miqcDOBkACcDuFiFi1U4F8C1Klyrwq0ATgVwqgpXqnCjCtWDqB5E9SCq B1E9iKoyqsooGkDRAIoGULEKFQOoWIWKVahYpY3Y48KElncxks2svX9l7f2j /ihr7VesQqw2mr4+IvyKCE9r+j7OVRxXPdF3DTV8I2azTjpYJx2skw7WSQfr pIN10sE66WCddLBOOlgnHXzT7ayVfVkr+zJmyxizZYzZMsbsacasnzHrZ8z6 GbN+xqyf9TSWMetlzHoZs17GrJcxi99iKuvmCMbpacZpNeP0NOO0Wj9X9NOn QoZYyzrai3W0F+toD9ZOB2ung7XTwdrpYO10sHY6WDsdrJ0O1k4Ha6eDtdPB 2ulgLHoZi17GopexWMbY8zPmyhhzZYw5L2ucgzXOwfrmYH1zsK45GCte1jYH a1tfxoqX9c1B/y+j/5fR/8vo/2X0/9P0/9P0fz/938/6F8v6F0v/99Lny+jz fvq8lzXQwfrnYP1zsP451P6uXEDrC+zPnlOexIHJzOenmc/zcGIyTvyGpxvo 7ZP0x9hJlSk/6svFXM29KnIfJ1clK+Zzyiqu5lL2GGW/5u4Eyj5H2S8om0jZ Mso9LIzhcfQzcpaTs4ycidr+Su0z72o1pfN8PM+P8LyC52Oo6WmefkRNd1NT KTUN1fJ/q+0TT2rHgLBIHUQvaQ5kQCYshmxYAjnghmdY6WOkEhHFt6yh9nzq OaDtjbaKbvpPxW36z/G/RvRh1Z7JLjGWlbs7u8Q++jpmhu9ogY9734vbWM9z lM8p0ZU9ZW91Tad8hpjCCjaHPv+ImKJ/VNt9TRHRtKwHLetBy3rQsh60rAct 60HLetCyHrSsBy3rQcnOlMyiZGdKZmkloygZRckoSkZRMoqSUZSMomQUJaMo GUXJfpS8lZL9KHmrVtJGSRslbZS0UdJGSRslbZS0UdJGSVu45IhwyRFE8ogY yNlATeNibY/QglpV6v8OHB6AGTATHhQW9m4W9m4W9m4W9m6WSPWf/RpQuBNl ksM7jb2aR6dFmdRfqZEGwEAYBIPhFkiAITAUboVhMBxGwG1wO4yEUXAHjIYx cCeMhXEwHibAXXA33AMTYRLcC/fBZJgCiTAVpsH9kATT4TV4Hd6AN+Et2Apv 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 1EhCjSTUSEINJ2o4UcOJGk7UcKKGEzWcqOFEDSdqOFHDiRpO1HCihhM1nKjh RA0najhRw4kaTtRwooYTNZyo4UQNJ2o4UcOJGk7UcKKGEzWSUCMJNZJQIwk1 klAjCTWSUCMJNZzCRF9oJmIbEb9AxEuJOJYIVxHhMhGPRnvRZy/aVKBNBTrE okEsT18i/r3Ev5f49xL/XuKvIP4K4q8g/griryD+CtpRQTsqaEcF7aigHRW0 o4J2VNCOCsaKS3n3qvmuWdyie4A5bja4mOcWMsctggygblp8qm2uW8mcsVo5 aF2h+KyPw0pYBauhEJ6ANVAEa+FJWAfMjVbmRitzo5W50crcaGVutDI3Wpkb rcyNVuZGK/OilXnRyrxoZV60Mi9amRetzItW5sXoSLCAlTlPndl9Wtv9jHEv Y9zLGPeim/qe3o+nxxi7Xsaul7HrZex6Gbte2u6n7X7a7qftftrup+1+2u6n 7X7a7qftftrup+1+2u6n7X7a7qftftrup+1+2u6n7X7a7qftftrup+1+2u6n 7X7a7qftftrup+1+2u6n7X7ars5Zs5VvUfsQCn/eNmepEVWLYURUzPManrfg xiXcuIQbl8hbTV4zea2MFAuRJjBSLESbEP4NaB8OXcKhS0RZTJTFRFlMlMVE WUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFlMlMVE WUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFksbiOSIrzZjzf7dS7RE3/2E0Eq I+BfjIAAkawlkm7hX2a6qb/MEMkr6q9ZeLcf7/bj3X682493+4mqiKiKiKqI qIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqI qIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqIcTxbG8ejiOLL8D9zupdW v0Srdwkr8R4m3sPEepi4uhBTF568TDyHiecw8RwmnsPEc1gYdXn4ulT5l26Z ck63ln7xS6VB97L6Szt3L+rWKgEhcfyXGECOgC6fHlEAa5Vy3Tph1j1F6Q1K nW6z+u/qKz/oXlV+sLK/tbK/td4AN0IvsIMDekMaedJhHsyHBeCChbAIMiAT smAxZMMSyIFccEMeLIVlkA8FsFz5QYvnIi09o1up1BLLWd0m5byONz0xR5dD b8+FPO7mE2UBrFaO6grhCVgDa0UX3TrlQ93z5NuonNK9AC/CS7BF+YT4PrHq lENWPRggAoxgAjNEggWsYIMoiIYO0BFiIBY6QWfoAl2hG8RBPHSHHkoDGjag YQMaNqBhAxo2oGEDGjZYRytHrWPgThgL42A8TIC74G64BybCJLgX7oPJMAXS iCMd5sF8WAAuWAiLIAMyIQsWQzYsgRzIBTfkwVJYBvlQAMuVT4SBnnMSFb9G xdO6zUoTfWmtcoF+0iKScSGIC0EcuIgDag87zYoTYMUJkCOAykFUDrLCBFhh AqwwAVaYACtMgBUmgPpB1A+ifhD1g6gfRP0g6gdRP4j6QdQPon4Q9YOoH0T9 IOoHUT+I+kHUD6J+EPWDqB9E/SDqB1E/iPpB1L+I+hdR/yLqX0T9i6h/EfUv ov5FVrkAq1yAVS7AKhdglQuwygVY5QKscgHUDaJuEHWDqBtE3SDqBlE3iLpB 1A2ibhB1g6gbRN0g6gZRN4i6QdQNom4QdYOoG0TdIOoGUTfImFtK71bH4ko0 XUXvXiuiUfsMateg9nmRjcYeNPbQ0+vIuR+tz6D1Gd1yrlcq31HqAj1fpufL 9HyZni/jw7/xwYMPHnxo0j2nfMEI+IYR8A0j4BtGwDeMpUPMDfvwqByPyvHI g0cePPLgkQePPHjkwSMPHnnwyINHHjzy4JEHjzx45MEjDx558MiDRx488uCR B488eOTBIw8eefDIg0cePPLgkQePPHjkwSMPHp3BozN4dAaPzuDRGTw6g0dn 8OgMI0RmhMiMEJkRIjNCZEaIzAiRGSEyI0RmhMiMEJkRIjNCZEaIzAiRGSEy Hnvw2IPHHjz24LEHjz147MFjDx6X43E5HpfjcTkel+NxOR6X43E5HpfjcTke l+NxOR6X43E5HpfjcTkel+NxOR6X43E5HpfjcTkelwsXDnpx0IuD/8Tv3bh4 HueO49z3ONeAcw0414BzDfhvw/9duCfjnqx7lnu/xOnnld/hYB0O1uFgHQ7W 4WA9DjbRT/6Ki9W4WI2LMi7KuCjjooyLMi7KuOjFRS8uenHRi4teXPTiohcX vbjoxUUvLnpx0YuLXlz04qIXF7246MVFLy56cdGLi15c9OKiFxe9uOjFpQZc asClBlxqwKUGXGrApQZcasClBlxqwKUGXGrApQZcasClBlxqwCUZl2RcknFJ xiUZl2RcknFJxqVqXKrGpWpcqsalalyqxqVqXKrGpWpcqsalalyqxqVqXKrG pWpcqsalalyqxqVqXKrGpWpcqsalajEUlwK4FNBGY8iFZlxowoUmHAjggPre 1IS6TajbhLpNqNuEuk2oG0DdAOoGUDeAugHUDaBuAHUDqBtA3QDqBlA3gLoB 1A2gbgB1A6gbQN0A6gZQN4C6AdQNoG4AdQOoG0CdJtRpQp0m1GlCnSbUaUKd JtRpEgOZGS4xM1xi9Mus5xbds0SxgSi01nO+Gbaw3r/Kut2DXV1PuAFuhF5g Bwf0hjTypMM8mA8LgB0kWregdQtat6B1C1q3oHULWregdQtat6B1C1q3oHUL WregdQtat6B1C1q3iAVoXYfWdbRYpsUyo8DHKPAxCnyMAp+mf+sIQPef9Hx2 8Dr1l43/3Nvr8KMOP+rwow4/6vCjDj/q8KMOP+rwow4/6vCjDj/q8KMOP+rw ow4/6vCjDj/q8KMOP+rwow4/6vCjDj/qUFBGQRkFZRSUUVBGQRkFZRSUGQ0+ RoOP0eBjNPgYDT5Gg4/R4GM0+BgNPkaDj9HgYzT4GA0+RoOP0eBjNPiuYzT4 cMiHQz4c8uGQD4d8OOTDIR8O+XDIh0M+HPLhkA+HfDjkwyEfDvlwyIdDPhzy 4ZAPh3w45NPW+Ebtn0LejlcyXsnMNjKzjRftZbRXNZbRWEZjGY1lNJbRWEZj GY1lNJbRWEZjGY1lNJbRWEZjGY1lNJbRWEZjGY1lNJbRWEZjGY1lNFZjlIlR JkaZGGVilIlRJkaZGGVilIlRJkaZGGVilIlRJkaZGGWr2hfyYCksA/obMcrE KIuOzMX+K8cMPe1ZbaQHmFMD/9MYYe++lD0qb6aMNhujzchoO81I68JIs4ik thklj9V4JazivXwt3/W00kjPbiR3kLHZyOrcTKkEFA6gcHO7XVMjvbuR3t1I 726kdzfSuxv/H802jfS+RnpfI72vkd7XSO9rpPc10vsa/6/uitS3lSBKfdH2 3tIs9OF7QVz6QcxC21K0LcW/evyrR1v1zeY4TkSgby361mrz3/Ncb+Id4WV2 Slu496pSi6616FqLrrXoWouutehai66l6FqKrqXoWoqupehaiq6l6FqKrqXo Woqupehaiq6l6FqKrqXoWoqupehaiq6l6FqKrqXoWoqupehaiq6l9Kl6+lQ9 faqePlVPn6qnT9XTp+rpU/XoXovutehei+616F6L7rXo/n+Iu/Pwqspz7+Mr eyV7Jzs7oog41GqtU6undajaVtty2nqsPW3taGu12vbU1gOVVhRUQKYO2tYB Z1DEoVKKWoGaoiLgiAVrAwnZwGYn0MhgSEgWJCSQAPKcz86hfe15z3W9f75/ fK+118pa63me+7mH350rbFrZvZXdW9m9ld1b2b2V3VvZvZXdW9m9ld1b2b2V 3VvZvZXdW9m9ld1b2b21urTOMbgeN+BGjMW40Dpg4/4DkdAXHZpaEA1NvUJx vsovXwuTU8vCnNROOqM3TE31h/pY5ow/pHs9LcyLzwpb/vHXyt+MDo6/FeUO /E3h1lxTWGHHZnnvXLwqAl4L+dRSnv46lhlzueOboSm1QqebN9pqxzXYGlWl 2kRqL427ixLajT2hK45CS5xBJY7U/Z8WNsVnhJ3xmfgIzg674vPCxtz3Qkfu h6Eu92PIEbmfOl4TmnKjICfkxjtOcJwIGjr3c6iYudshKnNT/fwe1+S+3DTn 0/GQd8wK/bknvH8e5oeduT/iGddqnS90tKZcvWsNWIW1zgto8rkZLe7rDC25 ndgdWmqGhKTmMAyF7rBGd1hzgusjQl0NTV9jXjW3hJ6a28POmvvwAB4PSfTv B6xatE99rLqWVTtZtZNV97HqZlYtsOpaVt3JqmtZdS1r7mLNbtbsZsluluxm yW5W7GfFXlbsZcVeFuxkwSILrmXBtSxYZMG1LFhgwQILFlmw8D8sWGTBThbs ZMFOFiywYJEFiyzYyYKdLLiW9TpZr5P1elmvl+U6WayXxXpZrJelelmql6U6 WaqbpbpZqpululmqm6W6WaqbpbpZqpul1h6wVJGlOlmql6V6WaqXpbqj96ee DONTC8J8lnqRD+5lodmssi21IVzFz8ak2sIjvPubqR5Kuz98ip/9OY7D0jgd 7ohz4Se8fXU8JBwXHxv9KD4xjOb5748/HD7Dao/z/gv43Iz4U2Fi/Olw2YG/ zvpb/K3waHxJGBEPD0tKf79kVS/ISa+oEq9hWVhvxLftxwYjbjFCm7fu8MaN 3rhdLJ0nlj6pI3zSjr0SGjxVipe/DsTI1ugYT6/y5Bue3GxuW8yt2hvyA/Fw Vsh78pXwhqfe9tSznjjUE28Z728D8aurHojhY8Xph5yfFjZ4qsUsl0bv5Vk7 B55cyrNex3Ie86anV/CqPBW52nFN2Mw7NvOOzTxjM894i2e8xSve4hU7ecVO XrGTR/TxiD4e0ccj3uIJfTyhjydstnOb7dxOu1bK/Fujg8wnbeazjPekcZ+3 1oVYHvawazN7bsndGHZ5f7f3d3t/d+4B5w+HXd7THZV7qsfMr/XExpLfU8JP yiULrOW1UO9qU6pBHinZcENoZ7cG713rvWujS4w61d2TxdSmAW95Pkww+gRP drHEHpbY4w2bWCKwRM+BuOphiZ5UIcz1xlqeVJ/q4D1ZDAk/jIfajcNxBI4P 18Un4MSwLf6Aff4gPmT32D0e5uefHvjb5TPM5gyxt4l1e1i3R+xtYuEeFg4s HMTeJlaYwNKBJaayxFSWmCr+NrH2Htbew9p7WDuIv03ibxOr72H1Paw1geV7 WGxC7mmZaC4WhetySx3/ijqswDoUsd7P/ub4lndsDNfVROHPNRVhbk0aGRzn /CSMkKGmhKlicJPd3FNzf9hYMw3T8SBmhrlRNY/s5o0b7fRHZJ93ZJ93ZJ93 7PpHRfo7Iv0dkf6OqH4nOtp+lPZyF9vvYPsdnkrLUV1yVJcc1WXtPdbeY+09 1r3DundY9w5r3WGtO+SXLvmlS27pklu65JYu/t0lt3SZa4957pAruuSKLrmi qyxrxCk84H67/7Ldv9vu351aYkdfxCthWWqpqvg6loXHecHe1CrX83yrEMak 1oXFqSKa0Iz12BBuSf3NcSM2eedmxy1oxdZoCm+pTbX7vA0dPK/TMcH2cF1q B7p87sbOMFxuqpe5CzJ3QQR/U45akdrrZ/vwTliS2u8YVOEypFDKX+W8rcLn tDyVDZPjap9zYeRAPhvkeDAOwWAMCefx1gt564W89UK19eb4qHBD/B4/OxrH Rt+Oj3N8P46X807AieE78UnOT8YHnH8Qp/j8L/hQ+Kwc+X2Z5Wm7NsWuTbFr U3j7l+TL2+Nz3PNRfCz8LP6447k4L0yKP+H4SXwqXC4qLoz/1edPh2tFxjcP /MXs0yLkhvjS6Ij4CgwPK+XXP+SGh/rcCFwT9oqSvSLkbhGyl5dM4SVTeMmU 3BQ//xl+hV/jN7gtGpq7HXdgqvvvc+1+THM+HQ94zwznDzs+EkbmHsPjmBVu zv0u3KCaTco96fwp/AFPhwtE1QUq3CQeOIUHTqEPblblJuX+FH6WW4Bn3bfQ tUXuW+zzErzo+lLny1xf7r1/ce1N/NW1OqxAvXc1YBUa3b/WvQWs87MiZG/e PUXUXpDbEBaL3AtU0Umi90LRe0Fuk2t8MMcHc2+DH+a2oi28nOOHOX6Y6wAf zG3HDnTJAN3Y5XNfWJLrxx6f3wGfy/E5WWFyDb+r4Xc1cVhSU+5YEcbIEmNk iTE1lc6rZI8s+GBNLrxcU4ODfB6Eg10/BINxqOtDQkGlL6j0hZrDve8I9xyJ o/AeHI33uvdYP38fjjP++12TYWWjyTWTQr0In1JzSzS0xl7X2Osae11zK27D 7X52T7hB5E+RqS6QqS6QqS6QBabIVhfUzPCemeb9iHc+7v2znP8Os/H7cF10 nCxxrSzxx4HK/OpAPX9dJmgV8VNF9uUie4GonSdq31Bze0XsSyJ2k6hsEI1/ EYVLRGGjqPs3kXWFSJonYm4XMa+LmFZRcp8oaRQFL/L+3/H+L/P+l3l/6V8q nMPjV0b/IV89YSZ/ULFWpeapUgvkhOddW4hX1bnX/GxpWCN7rlG5XpazOlWu BWpgp9m2qV4LVK8F8tcsM39dnmoz8xVy0VKzLsg3G+WbjWbeKl/nzXy7nJ2X s/PyyVKzf1oueFoueNos95rl10qaR/Valfu+TPvDsEAFW6CCrVLBFojNTrHZ qYKtEp9PiM9O8fmE+HxCfD6hgq3K/cJzv8StuC2skdXXyOprxGanarZKNVsl w6+R4deIzSdUswVi8wmx9DS/f5qfP82n29STvHqS57dtakqer7bx06X8cha/ nMUvZ/HFNr62ka9t5Gsb+VYb32rjVxv51UZ+tVQtyvOppSrcAj71hAq3SuVY wz9m8Y82/rGRglzCD17EKxTasvA8S29WHRr4wmdk82bZvJk/vMmqLaxaz6r1 fOI5mXsDyy6XqZtZdjnLLucb2/jG27Jxo2zcKBs38pF/4SO7ZdmiLFvkK+v4 yRaZtU5mrZNZ6/jMatl0nSxakDkbZcQGGbGB1Tez+mbW3iwDNsiADTJggwzY IAM2sOxmWa9B1muQ6RpktIIsVpTFirJYQRark8XqZLCCDLZOBlsnW62TrYqy U1F2KspORdmpTnaqk53qZKd1slJRVioeyEp1slFRNirIRo12Z7nM0iyzNNul 5XZoueyyQXbZIINskC2aZYtmmaFZZmiWGZrtVL2dqrdT9bLCBhmg2U7V26l6 kd9sp5aL/AYR3yDiG0R8g4hvEPENIr5OtNeJ9qJoL4r2omivE+1F0d5sF+tF ebMobxblzaK8WU+8lTou6eqzwr7obFFW6rN+LKKmi6jpIupV+zxZ1PTb19n2 tda+1oqWdvu6yb7Otadz7elcEdEnCvrsxWR7MVkE9NmPyTy+j5dP5+XTefl0 ezGZl/fx8j5ePp2XT+fN/ew1l53m8uZ+tprLVpvYahOv7mevTTy5n31q2aeW fWrZZxNv7ufN/WxUy0a17DOX9/bx3uk8t9+aa63xtXA7j91tBUuc7TT33vAk 39wQHWVlO51tsbI2K2uzsh1WVScPtFtZnZXVmd1Os6szuzqz22l2dWa104x2 mlGbGbWZUZvZ7DSbnWbTZjZtZlNnFqVeti061ki9RlpnpC1G2mKkrWxY6lHr jdZjtHqj1Rut12j1Rqs3Wq/R6tmimy26jdrLFt1G7jXyFiNvMfIWtug2eq/R e42+xehbjF5v9FJ/uEWPsEG+3BlWWvVKI/cYsVkuWyjjrpVxS/3BcwMZN+2u ngM9VPuBf8N0WnxJdOaA5Vr8pNlPWgbOSr3d3gE7Vhx4qttZh/ev8f4uarhA 03aw8B7rzLJEhAqaNI0MjnN+EmaGHd6xYWBnGtzdpIqU5tgTneQdr/vJ8+zX 7V0vuOPtv/f3A/Umkl8yqEQ2vGBVX7WaH7BjNztuYMcN7FjqrzewX7c5vGAO r5vD6+bwOlv+c9/9Hhz9rv77OPefIBZPcpzp/kdcK/XcZdacRIebX5c5dZnT NnPaduA3ONvNvs28tpvXdvPYbh7bzWG7sbuM3WXsLuNuM+42424z3jbjbTPW duN0GWNbdIK3L7L6P1v58ndl2Tw7P22kXQNZNTvwlyK/PLCX66x+eOkvev6e fax4uVEXGXWRURf9r5mnlGmOc18py5zkWMoYM937PzNG1UAV3UkH9Out0/b1 4nDNgb/uWGnkbw/8xeiZ5r3Bnc/ZtTp9wRrzf4mV5r0rg5QqQ4GlZtrrUt19 m7VmstZM63nJW2/1trl2sY52W8OCM1lwpp2sY8WZIqIgIgp2tM76XhIVBWvc YI0brHGDXa2jwdbQYGvorTX/I3MU7HKdXa77R+Y4zjtOCDOt/SXr3mCX6way x3tYvYnVmwZ+G9Eri/SH18y6k+WbzLjTjEu/w+lk7SbWbjLLTjPsZOUmVm5i 5SZWbmLlJlZuYuEmI3WycBPrNrFuE+s2sW6TqOqVdfeofryHh/WGl6KUKriH UuqPYmpkmbMuZ63Rcc4SPUwffZLQJ4lKuVul3K1S7j7wO8J2mmUHHd+n4rWr dO0q3W6Vbje93qfatdPofXRFQpP3qW67VbfdqttuuruP7u5T2XarbLvpjkRl a6c9EpVmt0qzW3XZHVWp5f1m8pDanajZJV33tlETO/i4HXx8IKtUqfY98RCZ 5EOhwwra3NURnx0NkmH0PNEZxilE5d6z2XtKv3PtK63AinMDv0FoL93PEkPE 09mhz/XSb2Xd4bmN0WHOSqvvsfoeq+8ZWPmltMIVYfW7Vt5j5T0Dq653bMAq NKEZVmdlPVbWY2U90fuMtoJ9e9l3LfuufXdnbuwOo2xh214jbDHCln90488M /MZvC9v2su1atu39pw59rfPCwG8BBzp1tl1r9C1su/bd3XpUZuW90QlxjU9D wiPUUkItJdRSYk7PmtOzrNVLMbVRTKXfrnWy0zbKKLED++zAU3bgKX3kYH1k 6a8jS6qnjeppM69nqZs26qaNummjbtqomTZqps18nqVk2qiYxJyepSjaKIo2 iqKNmmiLMmbzRyPvNGKfEXcard9obxrtzeh4P32L3VrNcZ05rnPnrgO/w/4/ O3Q2ZXcev/40O8wKrWy4hw33/GOXnnGt1vlCx0WU1jLHd+/aWucF/H331run xf0bw7p/2sWhrNbCai2s1sJSLSzVYt5/O/A7qRYWaWGRFtZoYY0W1mhhjRbW aGGNFpZoYYkWVmhhhRZWaGGFlugo61xvjeutcb01brfGvDU2WmOjNTZSqiWv a7SeRqqynapst5b1lGXJAxutpdFaGinJdutotI5G61hvDeutodEaGq2hceBf UR4ffzc6PpoeXRkeiH6IH+G68Gg0LtwVjcdNmICJ2BSmR5uxBd3u6Q93Rnuw F/vwTriz7AOhvuyDOAWn4l/wIXwYp+F0nIEz8RGchbNxDj6Kj+HjOBfn4RP4 JD6FYfhXfBqfwWdxPv4NF+BzuBCfx7/jC/givoSL8GUMjw4vezm8VPZKeK7s VbyGpXgdy8KSsuV4A3/Bm2FJ+SPhrvJH8RjqnK/ASlhr+X6EcGfFweGBisFh egWVXUFlV1DZFYfjCByJlnBXRYd7OrEj3JX+IM7B1eGB9Ej8BD/FmPBo+nqw e3pqqE/XhyVpHU/mpLAkczI+EJ7LfBBn4iPOP4FLw/TMZbgi3JmZhllocf4W NsKeZdrCo5l2bPezHue7wp2VqVBfGaMcFUiDUqykFCurkEU1cqjBQRiEg3EI BuNQfDwsqTwX3/X5R46THX/vOCc8V9kb6qu8q+pQ+vjyaHBYER0K2S86DENx OE7GB/BBnIJT8QV8EV/CRfgyvoKv4mv4Or6Jb+PK8BDPfYjnPsRzJ0ajw8xo DK7HDbgR48Ic3jyHN8/hzXN485zy34QV5bfiNtyOOzAVd+Iu3I17cC/uw/14 xHOP4rEwx64/VLE2rKhoxnr8DS2uv+3Yig4/78QO194JK9JpZFCFLI7AkTgR J4Ed0uzAO+akz3I8x/E8x8/hclyB7+J7uDo8xHMe4jkP8ZyHeM5EnjMxbb1p 6+VBcyp/WrJNdFeoj+7GPbgX9+F+zMbvMQdP4En8BW/ir6jDCqxEPRqwCo3I YzUK2BSekROekROekRPeiHaiB73Yhd3oD/PkiXnyxDx5Yp48Ma98a6gvb0M7 tqEDupPyBNuxA13oho6lvAel5/YjhHni7ZmMXJAR+xmxnhHrGXGeuSi8kfmG 48W41D2X4YowL/Nj56MxBjfgRtyEm3ELxFuGjTJslGGjDBuJp3mZ3zrOcpzn uAjskGGHDDtk2EGsPSPWnhFrz4i1Z8TaG2Ltjcw2dGC7Z3tcZw9xN6/sw1F5 dEhUgTQyqETpu8OzqEau9BWTOAjnRkOj83BlGM/Hx/Px8Xx8DB8fwcdH8PER fHwEHx8RjfWGcWEkPx/Jz0fy85H8fGT082hQ9Av8EjfjFvwKv8ZvcCtuw8Lo mOgFbArj7Og4OzrOjt5rR+fY0Tl2dI4dnWNH50Slb5DuDxPs6gS7OsGuTrCr E8oeDKvLZuAhPIxH8Cgew2/xOGbhd5iN32MOnsCTeAp/wNOYi3mYjz/iGdTi T2F16vRoUOqMaGjqLMdhuDCMT30+XJf6Ar7qfHiYkhoRrk79GFeHq2m2L8SX hdF02xfi7zqODn+Jx4SGuD6qiBuiIXEj1btaV74mysabwpx4My2yJfpA/LZj a+m7gRy3RYPLR0eHlI/B9bgBN2IsxmE8bsIETMQkPBJGyhcj5YuR5auiQeWN yGM11mAtCliHIprQjPVgT94+gbdPkGvGVxwSVvP6cXLMyIptUVZ+GS+/jJdf RlbsjQ5Jx+Bb6cE4FMfjg2Fk+hTHM/CRaKicMjL9UZ+vDuPlj/Hyx3j5Y7z8 MUb+GCN/jJA/RqT5Unoc+FL6gbA6/eDAv6BfnXkvjsGxeB/OwEVhjkgbJ9LG ibQJmVHRoMy1mIwpuAvTXH/E8bHoGNE0IfOUzy3ufwsbwedEzr0i516RM0fk zMl0RlWZBNvd3+Pn/E8ETcjsjgZVDgmrKw/DUByOI3AkjsJ7cDTMtdJcK821 0lwrj8P7cTxOwIn4gXddiR9igvOJmBRWV5WF1dlLwnXZSzEhXJ2dBHGTFTdZ cZMVN1lxkxU32dtxB6biTlhv9m7cg3txH+7HNEzHA3gQM/AQZuJhsE/2UTyG 3+JxzIoGVY/HTZiAiZgEtq1m2+qfQXxXi+9q8V0tvqvNs9o8q82z2jyrzbPa PKvNs9o8q82z2jyrzbHaHKvNsdocq82x2hyrzbHaHHOnRoMOqkIW1aX/KSVe KVI2yUalT6XvHjk8dYNsliv9v42yWU42y8lmuaj0PxhmUY3cwDfY52SzHAVQ pACKFECRAihSAEUKoEgBFCmAIgVQpACKFEBR5jtU5juUEminBNopgXZKoJ0S aKcE2imBdkqgnRJopwTaKYF2WfIqWfIqWfKq6D9DEg3HCPwYV2MkfoKf4hqM wrW4LgyXUa+RUa+RUa+RUa+RUa+RTc+XTc+XTc+XTc+XTc+XTbOyaVY2zcqm Wdk0K5tmZdOsbJqVTbOyaVbdbVZ3m9XdZnW3Wd1tVneb1d3mqPT7jjl4Ak9i YXSkzHuk+puov4n6m6i/ifqbqL+J+puov4n6m6i/ifqbqL+J+pvI1qNk61Gy 9aioVS+7FW1oxzZ0oBMJtmMHutAdpsnss2X22TL7bJl9tsw+W1YfK6uPldXH yupjZfWxNH2Bpi/Q9AWavkDTF2j6Ak1foOkLNH2Bpi/Q9AWavkDTF2j6Ak1f oOkLNH2Bpi/Q9AWavkDTF2j6Ak1foOkLNH2Bpi/Q9AWavkDTF2j6Ak1foOkL NH2Bpi/Q9AWavkDTF2j6Ak1foOkLZV+JhpZ9FV/D1/ENPBjyKlFeJcqrRHmV KK8S5VWivEqUV4nyKlFeJcqrRHmVKK8S5VWivEqUV4nyKlFeJcqrRHmVKK8S 5VWivEqUV4nyKlFeL1Grl1isl1isl1isl1isl1isl6jVS9TqJWr1ErV6idqy v0bZsjqswMooq4rlVLGcKpZLnVv6N6qOn3W8MExSzS5SzS4aqGaXhY7UlRiu ur2rqqVGhg6V7ZMq2wiV7ZMq2wi9+NT4uvB0vCi8Gr8YHRS/ovqt1M836NMb o8NVuXZVLo7X6u//u9JVqHQnDHzHZLvr21Se0VFOlcupcjlVLqfK5VS5nCqX U+VyqlxOlcupcjlVLkdJt1PS7ZR0OyXdTkm3U9LtlHQ7Jd1OSbdT0u2UdDsl 3U5Jt5dPC0n5dDyABzEDD2EmHsYj4XyV83yV83x9V62+q1bfVauKZlXRrCqa VUWzqmhWFc2qollVNKuKZlXRrCqaVUWzdGZCZyZ0ZkJnJnRmQmcmdGZCZyZ0 ZkJnJnRmQmcmdGZS3hs6yndhN/rQjz3Yi30QEyrzWJV5rMp8lcqcV5lH6f8K +r+C/q+g/yvo/wr6v4IuoahLKOoS2nUJRRX8/IrNIdEpFHUKRZX8KpX8qgpz qjAnFf18FT2nayhW7HceQpKOUIYU4iin0ud0FEUdRVFHUdRRFFX+nMqf01kU dRbF9NHufS+Od+1E5ydBrtVlFCmD8ymDXPp0P+eD1MGhuo4ihXA+hZDTeRR1 HkWdR1HnUdR5FHUeRcrhKsrhKsrhKsrhqrQ8mpZH0/Jo+jqMxpgwnJoYTk1c Q01cQ0Wcr58tUBJ5SiKffnjgG5mGpufjTwPfyjQ0/bpjfailMvJpe6nvLaR3 R0MpjjzFkac48hRHXi9cqxeu1Qsv1gsvpkDy+uHF+uHazHlRVk9cqy9I9AWJ viDRFyT6gmYqZba+INEXJNTKKGplVOY7oSNzOa4IY/UHSeZqn8VU5if4Ka7B KO+8Ftald2jWOyR6h0TvkFA4WQonq4dI9BBJ5jfuv3XgWwUTqiern0j0E4l+ ItFPJFTQWCooSwUdqa9IKKGxlFBWb5HoLRK9RaK3SPQWid4ioZBGUUijKKRR FNKozGbv3oK3Iddn5HqqaRrVNI1qmk01zaaWxlJLo6il2dTSWGopq9cv6PUL ev2CXr+g1y/o9Qt6/YJev6DXL+j1C3r9gl6/oNcv6PULev2CXr+g1y/o9QtU V57qylNdeaorT3Xlqa481ZWnuvJUV57qylNdeaorT3Xlqa481ZWnuvJUV57q yleeaU4fwcdDbeW5+K53/8D5lfghfuTaVY7/ieEYgZ+GdgotT6HlKbR85WTP THX99+6dExZXPuHzk+gNhaooGkrB5ausrerQUFt1WJTNfj1syn4D38Ql4SLK 7qLsd3y+MXRkx2I8/q70pvj8S9wS5Si+HMWXo/hyFF+O4stRfDmKL0fx5Si+ HMWXo/hyFF+O4stRfDmKL0fx5Si+HMWXo/hyFF+O4stRfDmKL0fx5Si+HMWX o/hyFF+O4sv9f1R8uX9SfIdFd4RPlF0Rfanse9HXy74f3Vj2H9G/lf0g+kTZ ldG3UhdGl6SGR9+MLw6fiS8Jn45fCLPjF8OX4o3hDdpwSCzDxW+Hu+KtYVnc Fr0nbtdvbQu7omOjO/a/Fj0VVkVLwypv/9SBb4M9x9tP9fZTvf1fy4aHXWrr FqPo5nRlF4dzjfJJo4yJF4dF8RK8uL8jfjksUOPWxq+G1+PXwh1G/4WR++It odXo5xp9qtFjoz9s9NeiynhFmBXXm5NOPl4VfhA3hoVx3lNrQpOquJ5OfSr8 2dz+7M5vq50r3D3N3ePjVfv3u/sxd39eHV3giRs88eDAdzueZrYTVPP3qt6f T31JJR8ehqd+EsWpJ+nk18J/pJaF6akN0dmpXhV5SDQoPi38Ll4c5VTp06zg j0Zaph+N41V6zdXhT6p0hbfvt6K8Sj3+QKWOD/SksZW1xm1W1e76ttBZ9q2o PCyMKpBGBpWoQhbVyKEGB2FQWBQdjHNDU3Qefh7mR7/AL3EzbsGv8Gv8Brfi NtzBhgtDQ/RCaChLhaayGOWoQBoZVKIKWVSjBgfjEAzGoRiCwzAUh+MIHIlj cCzeh+PwfhyPE3AiTsLJ+EpYX/ZVfA1fxzcwARMxCZMxBT/Dz/EL/BI34xb8 CneGdWV34W7cg3txH+7HtLAudXqYnzoLw/DV8Hzq16GY+k0o8vKL7UoHP9vH x+bbiQ4+9mU+ti/etX9rvFtE9IVM3L9/d7xnf1O8N6Tjfftb43fCsHi/6yEc WV6xf2t5OnymPBMy5ZX7d5dX7W8qz4Z0efX+1vJcGFZe4/pB7hsdFpaPwfW4 ATdiLMZhPG7CBEzEJPw2NJU/jln4HWbj95iDJ/AknsIf8DTmYh7m4494BrX4 Exbg+bC+fCFewCIsxhK8iJfwMl7Bq3gNS7EqzC9vRB6rsQZrUcA6FNGEZqwP 8yv2hoXpGPw3XREWpQc7HorjcQrOwEdCU/qjjreF9en7Md25daZ/57P1pK0n bT1p60nPc20+nkEtnsNC11/AIiyGuafNPf0Xn9/EX32uwwqsxBqsDevSRT9r xTZ0oRs70YNe7A7rMwdhEA7GITgirMsciaPwHhyNs0JT5qMYFeZnrsVkTMFd eASPhYbMU467w/zKk8P6ylNDU+WHHU93vAhf9vnbYV3lD/z8SvwQv3Z9uusP 4EHMwFPYG9ZVRWF91SGO4qtKXFUdhaNDU/YHoZgdgavxE1yD0RDvWfGeFe9Z 8Z4V71nxnr0dd2Aq7oT5Zu/GPbgX9+F+TMN0PIAHMQMPYSYehjVmH8Vj+C0e x6wwv/rfQ7H6C/givoSL8GV8BV/F+PB89U2YgImYhMmYgp/h5/gFfombcQt+ hV/jN7gVt+F23IGpuBN34x7ci/twP6ZhOh4Iz+dODfMPqgrPH5RFdXg+Klcr 5sv87fHq6MPy8r7ovmhcmBGNx02YgInoD0X9c1H/XNQ/F/XPRf1zon9O9M+J /jnRPyf650T/nOifE/1zon9O9M+J/jnRPyf650T/nOifE/1zon9O9M+J/jnR Pyf650T/nOifE/1zon9O9M+J/jnRPyf650T/nOifE/1zon9O9M+J/jnRPyf6 50T/nOifk9K3cJX92TyXhQ49a4eetUPP2qFn7dCHTteHTtd3Nuo7G/WdjalZ YevA30f+918dvZXaHd5SzQqq2Ix4ZXSsetmigt2mh5uhh5uhh5uhh+vQw3Xo 4Ur9U1H/VNQ/FfVMiZ4p0TMleqZEz5TomRI90gx90Ax9ygw9yQw9xAw9RKJH 6NAbJPqADn1AR+aUUMycOvB9nB20f0nLF+nsIm1dpIWLNHCR/k3o34T+Tejf hP5N6N+E/k3o34T+TejfhP5N6N+E/k3o34T+TejfhP5N6N+EXu2gVzvo1YRG 7agc492Tff596VvTQkJvJvRmR9UQ8XRJmE5jTqcpG2nKxtyEsDU3EZPC1poh 4a2awzAUx+J9mOL64+GtKKWq/EFdp+PiF6KPx4uiy+OXorPil6Mj2Pe5+FVK 6rXo5HhFdBFbX6Svr6AYPqW3HxznozPZ/W+UwzF0zkZXN0Wn0AsX0QsnxVuj C7z31QO/yz7VSK+Ep9x/z8CY8/1sBFWxKDrItTecrSx9L+X//V26ZcOjYf/7 9+mazxmi4xNG/aJ6+Hlz+O8rZ6iWu139jGq5SLVsH/iO4m2l/43S1aOdfWrg d4qHu/dEcyj9XwRvRx9yx4edrYyGWeEQPzvGWkvf+nZJqItHR+ea/6vln6TX Uq4sd/amu9UmmnC7s/XOro5qnO1xtjw6OSqPhkUVSCODSlQhi2rkUIODjHhx dFh8KY13Ba62pkV04Mt05iuhoXx0NKx8DK7HDbgRYzEO43ETJmAiJkXD9PLD 9OzD9OzD9OjD9OjD9OTD9N/D9N7D9NvDBv7/ixrqtsdI663i7fglO1n630xe Cc9St9usfTSbvGBeS9xltdZeEw0uq4+OL2uITmeZK9jhs/Gl7rosuiy+YuA7 5i6Lrw6vlL6VKL4+bIzvj86Jp0UfNU5ip0+kZOaWfzw6s/zc6HTWuiw6xhPH GOcsuzk6ep+ROkvjD4xUc+D/NVkWf8fTl7v/e47fdxzNw+rDOhq5gz7uH/Cf NVGlp+IoXfqfUNw91J1D3VnlzsQd26Oh0SZZlIaKttBN1xqptKfXh0a6u8Ou D5JxGwbel7eDqz3lnSVFXDE47NPD79PD79Mj79Mj79Mj79Mj79P77jPmxWFr 6V88eeMpIiUz8LbVoSc6/J/G/I6c9T2MtLbRlPjK0GV2260j4XGHGbvXU68b t9q4ff/PcauNu7H0f7N422DjVnhjrzd2eGOPN1Z5W9eBVewTZxe7Wvq+wO9Q 8t/DtX4yOjrSk1VmnPbkLk/u82SNuewvWc2Te0XFpuhz0WZsQT/P3oO92Id3 ZIeLdS6XhNPj78gWl0ffjb/n+H3HkXqfa83n+vB4fBO/uD/6WOl/4mbxeiOe O7A3q8LMgdHyYY2YG6LL2XPAR84s9+7y/QjRyRWDo89lLsVluCI6OTMNs9Di /C1shHlmtrvW47jL3Erf/7jdzPqtud/MTrHufjM7xbqPsu5Sxqi03qy1tsZr o4MHvG6xJ171xGZPHOWJzZ44yhMfc/fB5vz2gOetCnvNu8+Tmweeyg/8vwSX Gu8ynnyF43cdx8iKG6P3y3j/Rd13wFdVZP+fKXfmvvfuS0IIIQktdBBUQIQV RMHFiiy6dhRFQbGAuoKISLGsiohSLOCKFEFdxcUOCgi6iooFRKRI76H3Hsj8 vzPvJSYkEBJY/f3v/cy8uVPOnDv3zHfmzNx73nZgTBjImA5kLAO8m+b+Ucc+ v8XIJRCzHc/hGoSud33DWsNLFd0hVQ9hvFsPvjegxo1mm5O3lSi3FuXCoO6D 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 7IW9MP/RC7yA/+Qlecl8tjfP+43P9ZZ6K/kib423hi/z1nvr+XJvg7eRr/A2 ezv4Km+Xt4tneXu9/XyDd9A7yDd72V423+IdUR7fqrRK4PtUkkriOSpZleNG panKQqiq6iwRVmers0Ul1VRdLCqrduoacabqoB4XTdQ/1VPiJvWMelbcogar weI2NVQNE53US+olcbsarkaKO9QYNUZ0VePUONFNvaHeEPeqCeojcZ+apKaJ XmqG+q/or75R34on1Cw1XzypFqpFYpharBaLF9VytUK8pLLUJjFc7VSHxaua NBdvaa0zxTu6lm4svtbn6BZinm6pW4pF+q/6YvGbvkz/TSzXV+orxRp9tb5a rNXX6mvFOt1e3yLW6066s9ii79J3iW36Ht1LbNe9dT9xRD+qH5NcP6WfllIP 1M9KpQfrEdLX/9L/ksl6pB4py+pRerRM0eP1eJmqJ+ipsrz+Ss+SdfRcvUCe qZfoXfJsvUcfkm31YW3k1X4tv5a83q/jnyZv8M/wz5Q3+Y39xvJm/xy/mbzF P9dvIW/1W/otZSf/Ev8y2dm/3L9cdvH/5reTd/pX+dfIu/0b/BtkN7+T30Xe 69/n/0N293v7vWVPv6/fVz7kP+o/Lnv5T/vPyEf8Z/1Bsp8/2B8sH/WH+cPk Y/7L/qvycf8t/99ygD/BnyAH+hP9ifJZf5e/Ww7y9/p75fP+Af+AHBwC8Mkh IRmSclhIh8LyhVAQKi+Hh9JD6XJcqEKoshwfygxlyn+Hrwq3l2+HO4Y7yg/C ncOd5YfhO8N3yY/C94TvkZ+Eu4XvlZPC94fvl5+Ge4Z7ys/CvcO95ZRwn3B/ OTX8dPhdOSP8Rfg7uS48P7xUbgsvD6+T+8IHIxkyJ1I9MsTLjAyLjPWej0yK TPdGReZEdnlvBTpI834I6gUXesuC64M7vQPBPcH9KhQ8EPRQiUHPoJdKDnoH vVW5oE/wpEoNBgTPq8xgSDBE1Q6GBS+qOsHLwRhVL3g9eF01CcYH76qmwXvB x6plMDmYqi4KPg8+V22CGcEMdXnwZfCdahv8GPyirgl+DX5VNwULgkWqQ7A4 WKE6BquCHeqOYHdwQPUMDgWHVZ8gJ0qqf5RHuXo8KqNKPRH1o1H1VDQpmqoG RdOiaeqFaEa0onoxWjlaQw2P1orWUqOi/aP91ejoY9En1ZjogOhz6o3o0OgL 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 mhIcjiQ7HEkBgiQjbBGkbLR8tDzyWOxIiVaKVkJ8lTh2VAUFix3JDjuSHHaU cdiRDOx4DTRHR0ej1LjoOOQfD9RIdqjBiTfaYVdem67/axO6jK4/1jz//4/D bDAbrYtfrSxK77LrPG6tr6S019oVLqd5f+Gul+TW6fyf49rnFqt/Ol10sVlt sgqu6BRfb+4Knbm/5Bye2sO0geZpf4+pexcqsQGa9relX5fJo7Pl6Cuz0/nx eOiKe9Cyq802uLyVvXyaaEq+0ouRaxHZdY/yCMVXGHO16z/oCOdxk7/egG5w cZuLWl0wmwqvzZldZpX5DSmFdiFKe+Sukhe8sv0nLtX51gvAu8gLbznWUzYr Cq9qnqqj6B2cYkuNN2Pd72G3Gv6ddXZ9yLyN0Kx4nlzJsj14r5mTG1+ietY6 GV39+7VdBTPL8uV4zq0H2bXyFS60FtzkR6h4+57o83Wr1quLz1fyA5KWj67Z Zw7DHbJrXeZIgXzH25f6P3b8wX3+BA4z8iQKX1EEvdVUBzJY+SSoHv+oQw5b LZ46TC3yADac8B7iyY8VR9ErwFX+vneC5T8008378f2BFDPaTHexa+zonn/0 LtX8YRGwcaWbP2S5uYlDMzsmmZX4nRDPtc3tt30PNxNnVsGVa4dk6ZS7Nvs1 xoJZZi7cSMReZuaZH1z8r7FZhNvRvqHknBbifGOBKzeGmg/yxdxtxplu5hm7 ym8eyIttjrhPbb8rvOtIds+18F7oJvMF7mXxqeupufJgxzEgWO68cBbF92fz 8wBcztsbsXssxVD+6VTxWNoDrRR1v0PtfnOh1B7m6wJ5Y7/LMLqtsRJSivrm W6l38y3XTjaE8W1lvNXgm7vMbPe895MoYgyLUoNCNLehH2yN7y4JIEfurtP+ WOrJj2+/70MX3K/MnaXYuZcbt9fi3FZo7rnCzT2L6O3ozacYu4o6jsKzeYXS Dx8dE4//R9HxVJJ99BIf5o4SFoi9YzHAPOl+tzsE+Mg6hP5tJsVCLi13fub2 O/GkPisFdx+aT4GYn8SvvjbvkH0/aLINwwE5gWJfAyVyZ8Hbgb4/xHEitn+W UIjmt+YTMyNOM8VexeMLoIMxJefWlUMvNb/lXeXqLqtsKFevjM3EHaLNsvIR e0ck3n92OUTuYK5wVzPI7ubdD/cQQkPMCIx1D8Wp5Hu3BS0w1fQuBbe3mr7m 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 eGPDrY03NtraeGNjrI03Nt7aeGMTrI03Nt3aeGMzrI039rPqoJ5iC611N86s dTcurXU37lnrblxb627cV2PUOJ5g7brxZGvXjZe1dt14RWvXjVe3dt14bTVL LeJ1rUU3fo616MabqSy1mZ9rLbrxVtaiG29rLbrxK6xFN363tejGH7bfx/F+ Pvc57+8rX/NH/Ygf4Y/7iX4Sf8JP8VP4k36an86f8iv5lfgAv6pfjT9jLa7x Z63FNT7IWlzjg/2GfkM+1Npd48Os3TX+grW7xl/yW/qt+HBrd42/Yu2u8ZHW 7hp/zdpd46Ot3TX+un+H34WPs3bX+Bt+D78H/7e1vsbfttbX+DvW+hqf4D/j P8Mn+oP8Qfw9f7A/hL9vra/xD631Nf6Rtb7GP7PW1/hU/yN/Op/mf+HP49/5 C/yFfKn/m7+EL/eX+Vl8lb/R3823WKtsfL+1ysYP+CbE+EFrlY0ftlbZ+BFr lU2wUHqosohae2yibKhaqI5ICdULnSEqhBqFGokqobNDZ4vMUNNQc1E11CJ0 gagVah1qLeqHLgpdIk4PXRZqIxqE2obaiUah60LXi7ND94YeEE3DmeEa4lxr 3U20stbdxKXWWpu4zFprE/dba23iYWutTTxmrbWJZyJXRzqJCfarPTHVWmsT XwU6SBQ/WjttYn5wY3Cn2GHttIkca6dNSmunTWprp02GrZ02GbF22mQ5a6dN VrR22mQla6dNZlo7bbJeMD6YIOtbO22ysbXTJptZO23yfGunTba0dtpkK2un TV5q7bTJK6ydNnmltdMmrw5WBatle2tlTd5krazJDtbKmrzNWlmTd1ora/Ie a2VNdkvgCb68NyFISJAPJiQnpMhe1rKafCRhf8J+2S+REpnsT5ytBuolQONL pCRiVAanoGSMw5LSMHZ7GNVrIr4WTk21MQr6VB8oGQIeNqcAeGj/5+E89w8Y FjETHGImAjGvRanrcJYBbnYAxZupE7WkzsDQVsDQBzBz6I7zAupBvagcPYwz lXpTP9TcHwibBoQNKJ1FWQJluC+EK7AkYO7pwNzaiKnD6lADVpedhvh6rB7C 9YHF6Q6LGwKL28G/Aoh8obMXms46AJcbOVxu5HD5LOByH8T3ZU9TYzaADQDN Z4DUFYDUg6kJG8JeoqbsZaB2Q4faDR1qN3So3QCo/TbC7wC7GwC7Z2I8+IZ9 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 Un4E3a38DStV9ih7sPZvlb1Y+3fKflai/EQ5gJ6/V/4ePeBdKHgX+jPlCHtG +UflKMb8XDnGipR/Uv4JI48rx3GUk8ov0XNaOYN9goax/3PKOei/KOcx5oLy r1h7UbmI/fxauYT2b5TfsEpQ8m+xtyvKFfYsZ2WWD1aOsLyMaEaMFWTEM3CW wM2jrDTj6xk4VxljGWPsyYxvZHwDPe9lrGXPZ/xVxl+xes7T6AFPs1LO02wW 52kmcp6Ggqeh4Gk2i/M0qwDZLSSebiCeFomkk9z8GTFzPjYQHxvYV7AYiIwb iYwXERlnERk3ERlnExk/TmScQ2Q8+5H8Hh3l98iU36Oj/B4d5fekU36PjvJ7 dJTfk0H5PTrK79FRfo+O8nsyKb9HR/k9mZTfo6P8njcpv+ctyu+ZSfk9X6T8 nmbK73mb8ntaKL8nF6Q+DdycIWQQo89mLwm5Qi4YmpN6NUj9bVZDLP6O8GXh K+jnLP6KYBbMIGyP4IF6BT+4OQAifxlEPsrmg8W/jvZqYTXGcyJ/GUT+PlsI Ft/IXgOF74X+WPgxqxP2CT/FWk7h7xKFv04UXk8U/gYovJxpiMI1j/C3Bvz9 OvH3m+Dvt4jCecKQlhKGZlDC0AxKGHqMEoZmEKN/iRj98+LXxVVsAU/2Z4tT pM65/HnxR+KP2HPifnD500TkzxCRPyv+QvwF+Juz+FPiGfEM+v8Z/P0UpRY9 If5K/DWI/Dfib6A8waiUUt1KxKviv6Hn9+LvoTzbLZ+SjQrF/yPeQpvnGxWJ /yHeQZunHBWLn4gP0OZZR0+KU+KnLJ8Sjwo0gkZEm+ceFWl0Gh3aPP2ogNKP CjXTNNPQkwn6LyPuryDuryTub9XM0eShn9N/meZp0P/nNEWg/zKi/3JNiaYE 7VJNKfRFzTw2D07gZbSrNdXsBc3n4QfKyA+8qKmFHyjTvKp5FfvnfqCMnMCX yQksISfwZXICS8gDNID+J5gB3L+JZRHx5xDxzyHir9buA/G/AuI/yuZrf649 yeqI++sfyWTSUSZTJmUyzaRMphZyAovICbxG+UxvkR+ogR/4mEnkAfS6X8ED SOQB9OQBDET/eqL/HN1V3VVQ/jXd79HDuV8i4n+ciH8REX8WEX8OEf9s3V3d XShn+gZiej0xfRYxfQMxvShJYHo90byeaH42UXsD8bqeSD2LSH020XkDcbme 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 XOdDazofuC6F1plE19XQBpPsuhHabDK4bquSaZbrnqqYcl0PQts6HwyIGDN3 QA7tNBUNGEJ7TKUDs0L7TRUDuaFDpuqBueAr70CRajctGCgNHTXVD1SETrRF BqpVn2nRwILQ6bbWgfrQubalA4vURlPLQEvwjmnJwJLQRdPygeWhK0neMHUM dISum6wDVrxrIIrQLZNjwBG6a3IPuPm7MOD/bGY3+QdCpAloCM9t0pQYGAsz 09jA2rBkWjuwPqyY1g9sCmeZNg1sDeeYtg7sCOcnmba9dGA3KC7JUUQpph0D +zB3EDeadg8chO4bOAKKw7URLmwfG4CaDg6cCpeYjgycDZebjg9cCFeZTvGR bWUDl9V809mBa+HaJLkZjw3cHJk0XRi4g2MRo5ouD9wHqdYPTKmFpmtuLY6+ 1p2O83DTPR16x52tNpvuu/PAYGfdBXg+U+5i1dyldZeF9rfPdVeq+V3p7ppw Xdd098LQJD8D4caubHdD8toON3fluZvUxq4Cd6tq7Cp2Lw0v7ipzrwgvSxJm V6XbFDZ21bh7wmb+uQjbuxa6naB0sHrYldSuBrc3SeBh3yOqksboKKtIx7ua 3AE1q6vVHVFzupa6R9V8TtThia4V7jWp9kbSLfzzFd6eOpPg4fAu0r38WYUP dJnc68IHkm3Sw1097g1qbZfTvRk8DCoOH+vyurclGTh88hE9A1LdpDZ3Bdw7 oRGunFrD55PaNerekyTV8KWuNe796rKude5DUPSjZ4P7aJJaQz1/1vBV/qkP 3yC9ndSuze4TYFEQafhe1zb3aZAnuDT8oGun+5zq69rjvgjd4L4C5rzvvg62 xPsSEZPatd99KyJ3NLnv4tPN78zVXYfck5g9mzwM7aMeKWIwNnoUPiN4siKz uk54ckJ5Xac9+ZHcrnOewsjcrouekkhR1xVPeaQ0dW+nu7cx5qmKVHRd99Ti brzFUxepTt4Ju255GiMLuu56miP1XZP9zsgiM/MsjrSkGGCdZxlmLpplzBK/ byfnaLPiMUaWmLM85shycw6fbc35HjtmPdy1Ih0dkx5XpMNc6JyKWDsOeXzB enOJR43Up+bl055YsNpc7lnFWcIzHjSYqzwTfE73bMSeaz1bggvMdZ7tmIMk zy4+f3lwDzQ3eg6gv9lzGP3LPMc+mynMiz0nIw7zMs8ZPDewRLjWbPScD03y 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 eolbOaXEHfyvKHF38hPHGSO4L/WXir/8dFxP/q0g+ZeBuL/75NBYtJXP7/EQ 9+DxBL8a42PJvw7x+0OooPuM9wj2TyTWfX5obXDK0jK0PjiV+usN/V2l+5Jj Q3ytNW9oU3x90vV3Xx3aGt9ErjPARPa4cFv4D8aEPwn3mChMCp8wrfCpKDBJ 1IkSSxOniQqbJk4XZ7AM8TExm2WKueIcNkMsEJ9mM8Vi8Tn2mPhd8bvscU2j 5k2Wo2vQfYHl6ly6AZan+5nuZyzfgIU9aZhr+CKba2gxLGfNhjZDnH3V8J7h pyxiOG64yf7GcMtwj53Ds/kS09K/fmBgmSyNzWCL2TS2hHWwt5mJrWbL2TfY GhZj4+xjlmD/zH7LTrDfCensXwRFyGCfCpnCY4Ig8N84yfx7k8LjwjLBIuQJ 3UJCKBFGhXVCo7Be+K7wZeHHwi+Fr2o+0nwkeLVurUcY1Ia0EWFIO6pdLQS0 72nfE0La97XfFsLaD7TfF2LaXdrdwte1+7Q/Eca0P9X+VBjX/lz7T8J79HvM ddoz2o+F97WXtJeFb2uvaf9d2Kj9g/YPwmbtn7T/KXyPf4tO2KqbqZsp/FD3 sW5K2C7ppELhrPSs9KxwV3pOKhP+JL0s1Qif8F94CJ9Kr0v1olZqkL4oStLb 0nLRILVLJjFPglkQ50oeSRVfkL4urRFflsaljeJ86QNpm7iI/3JCbJV2Sb8Q 35FOSafEfum0dF50SReli+KwdFm6LAak30s3xBH+fSwxLP1RuismpHvSlDiq Z/oM8T19lv4x8QP94/qnxe/ri/Qvibv1r+nt4mH9gH6teFP/Lf23NIr+ff1G TYb+Q/0uzUz+76pqHtf/nX6/Jk9/QP8zTT7/PpCmSP/P+vOaSv0F/TVNtf7f 9f+peUMukvdoFst/THtK81vDJ4ZPtPz3cj62DaqwEv6b7bpTqSpK1aKH7aLV R9/MXn2i3vzm3frm1adXn1t9sXFq9ZXV1+tXtewayxnLHyusPz9WMlY+VjVW O1Y31thU3LRw9a2mdavvvmF9I7F6coyNSWPKWFbTwjc6cIXpcb3fpuv9T0zA 9T6Jq/5T4VOmwTU+nWkNnzd8nukM8w3zmYTRT9D3VJn4ofghE8SPxI+YKO4W /waj/0H8B6aj76lK4i/FXzKZfieWJn4snmXp9A1Vhb6bmiH+VvwtM9C3UjPF P4h/wGeHf+80SyNohIf/prBOI7Fs+l1ZjiZbk81ma3I0OSyXvkc6R1OsKWZP 0G/G8jW1mlo2l34h9pRmoeY1VkC/mSmkb3Q8g1ekCFl0XrkyWwML2BpsTbZW 21LbCpvJ1mNz2ry2gC0CHbWtsa2zbaDabNtm24l1e2z7bYdsR20nbKdt52wX bVds1223bHdtk3Zml+yKPcueY8+3F1KV2MvtVfZae5290d5sX2xf9hfLebvR brbb7a6Hi8+u2mP2VY8s4/YJ+0Y7CNa+/S+WSyjVvsu+134Aj58th+3H7Ceh fDljv4o93sC422jdsz/oFXvlXgP2ub13Vm9u79zeIrx+Ic2euqfwX7TPoHOS g0XD8rBoWRF7lulYKRY9+xwWmdVgSWO1WNLZAizTWD17g757/hbuSfxXmZns K2wZm85WYMnCXcnEZjIrlllsgLnp95h++iVmkL5vHmW5uFu9x+aw97E8wb6D JZ/9ANf+k+xDLE+xXVgK2E+wPM3+Hksh+wcsz7B/ZEfx/E5gKaZ/K/s5dp79 Cp+WX2MpZb/D8gL7PZYydof9Ec/9Pvsv9iKbwjJPEAU9qxTScWesoW+Xv4I7 43RWS98uXyDkC0+xV4WnhafZ6/Rr0HrcK1vo957LWIPwNcHIviB0CB3sLfqm eRP99vOLgl2ws2ahT+hjbwsewctahBEhwlpxZ02wpbi3fp19RVgtjLGvCuPC OPsa/fbz/7L3NdBRHFe6PTM9wxiLsawoWMaYKArGWGCMBVEwUTAhGMRMzxhj GbMKQcp09/z0jEbzb8wSDCwmCkuIIJgQgjGPJYQoCiEEK0IWGLNYJkRPwUTG mCUsD7OYYK3MwzyZ5WGy937dIwkhx+TsvnPeOcmp831dqq66XT/33rpVgJhH frZRqDA1mZoE2bTf9JqgmFpMbwg+029MvxECpt+aWoUg9DdEPmKkELYX2guF avzdvaj9YXuREMPf10vYJ9onCkn7JPskIYV/Z5TG3857xl5p/6bwrF22y8Lf 09qeE7qg+8X8eye0YkIJYQqhlOAxUGagnFApPK2VaFO0Us2jlWnlWqXm08Ja XJtPvEhbpq2gVKut0zZqW7Tt2g5tt9ak7ddatFbtqHZcO6Wd1S5oF7Uu7VrI HLKHHKHc0JBQfmgEpdGhotCE0KTQ1JAzNDM0OzQ35A0FQpFQMrQgtDg8MLQ8 tDK0JrQ+tCm0NVQX2hlqCDWHDlA6FGoLtYdOUDodOhfqCF0KXQldD4uUssOD w0P5/xe1eq1B2iK/4ZiH377w2H+bfrsp3QEtz4aW3wkt/wy0PBda/llo+WBo eR60fAi0/B5o+VBo+TBo+eeg5fnQ8gJo+Reg5cOh5fdBy0dAy++Hlj8gtFIq hK6Pgq6Phq6Pga4/BF0fC11/GLo+Drr+RdJ1s1AM/f4S9PsR072mYaT3rNkl 0OyvQLMn4V9PPAptngxt/iq0eQq0+Wukzd8iG3jO9BzZAP8biunQ5lJos9P0 fdP3yR5YpyX86wk3tNkDbZ5paiU9nmVqM7UJT9qfsj8llNnL7eXCU/agPcj/ mjt7cfYKWqcsmvvb8beGhOBuQhNhP6HFKGslHCUcJ5ziMvHOYEO0MVT254E6 5fHZwebovuCB6MFQ5Y3gsuCh6OGQjxCOz2UE26JHQvE/D64TbI8eC56IngzN 7wH/HDwdPRNaRFgW9wbPRc+HVvx5oE5tPBDsiHaG1kU7g5eil4Er0auhjYQt sYvIb49HQjviyeD1mKCJMVtodw/wc1N8gTYwlhXa/yloiS8OtcaXa9mxHGBw LE8bGhsWOqqD8zy20PEe8M9aQWx46FRsOD+BkbHC0NlPB9fTxsTGauNjxaEL N0KbGCvJyO0NbXJsSuhiD7RpsdJbQfXp9FBNinm0WbGyfjEnVs6oPpcuYGjz YpW3BCXm07RY+CZEY3FGdUciW0vH5t8Kqi+lR2oLY4uApbFlQE1sBaP6SnoM PyMXU6O1M7Gz2qpYrbY2tq4vqq+nx2sbYhs/DVExPREyNse2ANti27X62I4b sCu2+yY0xppuwL7Y/lvGwViLdjjWehOOxI5qx2LHb8LJ2KkbwOO+BYS64iu1 87ELWmfsYr+gd6Fr8TVhc3w96l2Odd0SrsauhYS4uS9YRthOcMQ3hWxx+60g nBvfGsqKO7qRE8/tBr8fQsiP1yE/Ir4zPDreEMqLD0F/+yBcFG/GmIbF8z8N 4QnxA+FJ8UO924eGx0fcgML46JvAbafG20Jj40VhZ7wdz5nxE/3155MQKo5P CJXEJ92EKfGpodK48yZ44jN7Izw7fjrj22/wxYavzPi48Nz4uYwPCnvjHb39 SLee9FrX7nXJzFEgfql7biPxK737xL4kOpB8Ctl+NFv3AdHBhg2zXQ2NbeR9 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 +YK/iPSRNbLSP8E/ib55ljS0i8cXjMvFwfn+czQrU4KLyNtW0nhaVJE8y7Lg CvIChcFa8hSlvjx/JLjOu0Eu8Uq+o8GNwS1s16QzNFvB7cEdwd2+wmBTcD9p KHkO0sdizE5hsCRYoteQcwKzgi0ki/0dNBg14WVYg0lWWbBVzgseJR0/Tm+W Ub0S6k88eIpyxb5TwbPyFKXZt9vfHLwQvBjsghc0PFnwWhCe1dcULAuWaWbN Tn7Op/s6zaHl8tf4S9oQOazlszcjjmv52ghttFbkX6+RR/ed0j0XfNeKYFib pDnkU9pU7ol/Kq0T684pv9M/k/VHT2o29bvUP5t9kn+ur9LvlY96j/gDpFc7 6Cs7/BHyGCP8SXm/f4F/Mb1Z7me/4/Ov8a/3Sl7Jv4n8zQjSnLj3qn+rv86/ 09/gb/YfkM+SnrGlF8tN/kP+Njnub/ef8Pn8p9WFcpb/nL+D1jNPrvQ2KgH/ AbLgWvJZZ+nNJf8V/3V5Y0AMDAxkBwaTjawIDA0UBEbKZYExgfGBiXJtYDJJ rQ1MC0hyOUmuDMyiPtV6pcCcwLyAEtAC0UCa+ughbVhBvr42sDCwNFAjZwVW yaWBtWTHR+QdgQ3UZgetT1Ngs7zRHwlsozmq80f8ETWb5qDSVxaoD+wKbKN5 WBZoDOwLHPR5AocDRwLHAicDZwLnA4flVnp2+uYHLgeu+sqCQiDbPzNoC2bJ XcGcYF5wWHB4IDtYqJxDNPXg306Yf0UnzIAQxd9qGMz/10xloWCqXCbkVo6g NJpSEaUJlCZVTiqnVDm1cmpFeUV5pZPSzMqZKJtNaS4lLvNSClCidnOic6KV EUrJyiR9x+zwOB6nb2TjRCPgRGPGWcaCmFfEWcaKU4wNMe8AnGLsOMXchpPL 7Ti5ZCHmdSDmvQMxbzbOLHfitPIZwZStZEcwpmF8IqhoEEwVbfRspme7eGfp yIpDt4IZrfQcQxj/CZioY8YpHaWTbxHTCFI/mKVjRhc959wanGZ6zjOgGNB0 zKjUn84hhHzKRwnpm+EcTc+Fnw7nBMIkyi81UENY1QfT+sHaPtjwF2AzYVs/ qO9HLmNXHzTeGjw89/sIBz8Bh3V45ugoPXKLOEY42Q/O6PDwup2/NXh4bTsN XDZwVYdH059uL617GUEg2G6Gh3RgRtanw5M2ZOQYyCMM64Ph/aCwD8b+BSgm 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 4eua188Xf28pKJCi4iSSfCnnpWpSS+pJI2kh7UVfletvdI6Ru6S/DJYHZEJi f7JkydlSXorJRfJnqS9XyfW+ft3hr32LPCpjpafcLUPkQZmY2BeWbCklFeQ0 qS615TK5Wm6QjtJVjLSRx/y9sZcMkHtluEzi3ymM+5wiOXKOnCfF5WKpIw38 3eVG6STdxMpfZJQ8Jb3lHhkqI2SyH4Vt1LRpQ7mq+bXX5Eu7Fs2vzpdxeDlN ishJUlrOlPP9HaaGXC7XSDNpKbdJd3+lSnKrjPaWfWSg3Ccj5Rn6ZEsZuUBK yCVyhTSRm6SyTEFfXE6VXCnrK3FFOUNq+kheKdf6St1KOsudkvL39rbyuDwt feWvMkwekmeTEeRJITlX/iQXSkm5VBpKU7lObpbbfezTUlXayRMyXvrJILlf Hpap8lz7Kr3a25VwPdwMd8AD8KgyDNu37do7zIXFYD6sAKvB2rBh+7a9OobN YUvYBnaAXWAP2Ld9+249woFwJBwHp8M5cCFcDjd06Hr7beE2uAce6tD9zm7h UWXKwCzoYB4sAfNh2U4927ZPnQ+rw7rwKtgCtoGdYU9/kbapgXAoHA4f7dq9 T7fUGDgeToHT4Sz4OpwL53e9s33X1CL4OVwB18KN3qRnagvcAffBwzCjTIcw Bxa+0x/SxWBJWAqWgxVhNVgT1r2zZ4fu6StgY9i8h+pbwjawA+wCe8C+cCAc 2suvbHo4HAWfhJPhNDgTvt7r9u6d0nPhfLgILoHL4Sq4vle39j3Sm+AOeEgZ CcyBefCsXr0qVY7KwUqwBqwLG8KmsKVnlehW2Bn2gP3hEDgcjvKsGo2DU+AM +CqcCxfATzyrRcvhKrgeboJb4S54oFefdr2iI8osgWmYC4vA4vCsXn169Moq DSvASrA6rAXrw4a9ffyzmsAWsBW8FXaCXWFP2F/0l5BP9XXgjx+tr0NnSMl/ Uwr48dR/hilfFVO+LkWS9f/pLOQslgNfFU9koT9E6+8RJ/EL0/8ZKfDV/R+z yB+i8f9ZzsxxZ0Fyf1bm/EGe8gd55v9h4T9EHXM+Z/n/5+zvOjlO5/5JWn93 LybF/2XpNCTjX4GU+peO50jpf+lYRsr+C8fA3/3/Wf6zEQz8q5l/lif/AVb2 r+J6+1cvY2SazJFFslI2y4EgDPKC0kG1oEHQIugQ9A6GBWOCacGcYFGwMtgc HDChOcs0NgPMSDPezDTvmCVmrdlmjtgcW8JWsDXtVbaV7WIH2JF2vJ3p975e KyveDbbJCeftTjh/+ITzR393Hp7QnvblZY1Ewe/Oc6odf5479fj+7tDx/vNa HX9eVI73XzTvhPOyJ9g3POG89QnnJ8yn6Nrjz4uVO+G86Qnn/Y8ff8kpx7ef +d7x52XOP+G84u/O/f4tU+mE9qGcG19zisQzPLdpfCwXzzz0+VfM18SyiXZ5 clybHDcnxz3/yLpCteRYOzk2TI4tjh9FhZHHz/K86sefV8wcb39hy+PPK5+w ClWqnHBe7YTz5SecrzjhfMcJ57uOP69a5HdZ5oXqeSecVz/evnqNE85PbL/q hPPGJ5w3OX4VL7nK0/nItA/GSqdgItW6nf9P/E4dI0GqcOoU7kJFJJ3byC3O begWuQVuodekg53BTm+3J9ij7yaDfWKCg8FBsa6eqyehu8xd5u/Xmg/GXm51 vYwpYop6jX4ry+l4bCHfs6I/L+bfUfX07/kWy0Y5EuT5MWT5UeXlNhOT2zC3 uWej3Os8dXaFfQ3Xd5yV/DvCWm6rWFPYj+lnjovdNn8s6s+3c1zsVonxZ2s8 F7u1np/4uWqGlpBSbqMf6wLf+j3HxW6TPy705z9wXPw7y82J5Y+J5ZbE8qfE 8u/jvZrxNma81zDev7c0oeVaWpr+vsUtYYSfM8KljPDvLctpWUHLSlqMRMb/ 57fZSUbfyRc2hX1Ui/qo2twrcq/0UV/gFkjaj2mhj5QVfU0RWJ4f+v/L+f5D /ayG+tOTg5NlcFAiOFOG8O+FDgtaBa3l/qBr0E2G82+EjgzuCnrLQ8HIYKQ8 FowLnpZRwd5grzweHAoOyRPBb8FvMkZTQ8aatEnLkybX5MpT5hRziowzxUwx edqcYc6Q8eYcc45MMOVNeZloKpmmMsn0Nn1kvuln+skCX/0HyAfmr2aQLDTD zDBZZB40D8pHZowZI4vNU+Yp+dhMM6vlE1vIZ81RW81Wk4ytbxtIgW1kGwXG TrKTAhv2Dp8NwlT7VPugSqpjqmNQNXVb6ragWur21O3BRaleqV5B9VSfVJ/g 4lS/VL+gRuqr9PDgkpzrctoGu3MePCkIMrmFcy83d+fenDvZvFKoQ6EuZn+h wYUeNkeccVk2y53tzrYnu3PcObawK+PK2FPcue5cW8SVd+Xtqe48d57Ncxe4 C2xRd6G70BZzlV1le5qr5qrZ4q66q25PdzVcDVvC1XQ17RmulqtlS7rarrY9 09V1de1Zrr6rb//kGrgGNt81dA3t2a6Na2NLuQ6ugz3HdXKdbGnX2XW2ZVw3 182WdXe6O+257i53ly3n+rg+trzr5/rZCu5ud7c9zw12g+357l53r73A3e/u txXdcDfcXuhGupG2knvEPWIru8fcY7aKe9w9bqu6MW6MreaedE/ai9w4N85W d+PdeHuxm+gm2hpusptsL3FT3BRb0011U+2lbpqbZmu56W66/bOb4WbY2m6m m2nruFlulq3rXnYv23ruNfeare/ecG/Yy9yb7k3bwL3l3rKXu7fd2/YK9657 117p5rv5tqH7wH1gG7kP3Yf2KveR+8he7T52H9vG7lP3qb3GfeY+s03cF+4L e61b5pbZpu5L96Vt5r5yX9nm7mv3tb3OrXarbQv3jfvGXu/WuXX2Bved+87e 6Ha6nbal2+P22JvcPrfPtnIH3AF7szvkfrGtffK2pX4JlSsIjgRHfBUrCAp8 9UgZ//6DfZZin6XZZ5EpYUpIlillSkm2KWfKSY5t6KvbSal2qXaSm+qQ6iCF Up1SncSlOqc6y8mpnqmeUjjVO9VbTkn1TfWVIi7f5cuprpQr5fd4aVdairqy rqwUc+VcOTnNVXAVpLg7350vp7uKrqKUcJVcJf4dgKpS0l3kLpIz3cXuYjnL XeIukT+5S92lku/+7P4sZ7s6ro6vVlp/z6H+lnZXuiuljLvF3SJlXXvXXs51 HV1HKeduc7dJedfVdZUKrrvrLue5Hq6HnO96u95ygevr+kpF19/1lwvdIDdI KrkhbohUdsPcMKniHnQPSlU3wo2Qau5h97Bc5B51j0p1N9qNlovdE+4JqeHG urFyiXvKPSU13dPuabnUTXATfL2e5CbJn90z7hmp7Z51z0od95x7Tuq6593z Us+94F6Q+u5F96Jc5l5yL0kDN9vNlsvdq+5VucK97l6XK90cN0caur+5v0kj N9fNlavcO+4dudrNc/OkMfXvGupfE187F8m1vnYulqbuE189m7klvto2d5/7 anudW+qrbQu33FfZ690KX2VvcCt9lb3RrfL3jJZujb9n3OTW+ntGK7fBbZCb +Q3+1m632y23uL1ur7Rx+91++Ys76A7Krcm7NH3lU41aW97nViq4JbjFqzsG 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 01qvlTXCavKkZP/tJnPWvV/6ZcY7PsMv5/0x1vLuqnvYrUOlU0rMBNn7lY2v z++eVdHxgpBS4jFb58u9S6MSpkbcCTtYz9FuTZZRXcF8y/61NpuELrtums4L 8VmetHlLyenyuNEN8aRtdrbFe1fS9J3bmkM7VxaFWE+0fXrkkO/RRw0mnR97 uC2Xhuj1/pFDD30Fpn7QIiE/GqiyWmjVc+jyYJfO19KZ8VWTzPf8XB7v3PqN 2FU6rC0HvFjmJbb7vX+gh0ibtK6di7pxk8aNXKNCo8Qwd7VDaISLu4NraKiL Q6gbbLq7hYWLjZ1dXF1DI74DwBPaj46f22TQAx9zd3QxMNjeKYOtKwZVA6C/ CBCYAxA4pf2/BIDQl6EnQyfuKwLXqR2cRbVIIDC4FgT6iQCCtSCw5V+DwD85 d8KP8E59eYidTneXCRezDj8tb3qhXWdl9os+t2J6bU0qphbvShyQPSd3MXdg XN7M1513pDWpUN2+k/mut42mSepU/abJJUWnNx4btKOJffsxNtqB9UWVqqrD ExlzvzSqt/3oLLOVWp9M1yW88Y8emL3SZtK15wtybg1b9jLGuLBjWPbr5F/1 xnmf6ryhXfmr5vMGt7nyKPmBYU7mgAEaDcuphS+1ZTv6dyva93jjsOXnwk/5 3m1Z+tavsir39k5Kt1lvi5s/eS5dM6eV2mN4wz7ylV6DH7wfldRqd91Tj9pf XHO3d8v3w488iArvd/JixqSfU23Ejy9dz4SbrW/T31fouLep8HJLWtMVHqX1 5iqXT40C2UbvArxbVo13bKhLfWOi1tS/h7m+BD1Yjbn1p817Yx+B6xjIoOHV dUTD73ZqfPOL2kFsVI0LNr/hQrfYWAAHcFR0VHR4aEKkRevhCQNi46MTkgiY gQBzUTs7q5u4OAOYOddsOkub/02c/WcItiG+Z0gdMWKvWUY/C4s2ixIDBrU0 uRR78sTrJwO/LDTQun2racJE461OOc7Pqm7ub+NnfTEelTTuzk47vsbC592r AYWdO6bm707qODSzA3Otst6trOFTi1cNazfu8oSSt7vfuC07FtL++tqiFrcb DlhovCI/fljQa8P5pZWN58fnXErsaz6i/cTJHgZnhvWiocuk5m+IdrpWh/sy N8H2bqJT4A09sWfZudSwyhPH+nqpu2xvoFvaSiyOt9VqaHXE3a9FjnOLOady PRSTQ/yCUhra0c5bO172D394ziHsdfsWDwuV6INXbvbZXjPrBzwatcr3jVex e3OP7E0jQvINs1NPaM8Oar6vUKOv7PxXBOsDLRIsakrIoCs93JgWZVDUQq8f IokEVmaacjn0wCmijkKjJjTRx3KanBjk77d9lHSWyrNqv/P1p6fdSe/XrEAd u7z5risOYp1vH9Kj5Lw5iwLQcAhn2qLW32GZUJjSr1VQg4X36+l+trvDBqT1 LF0mdqnGMh+xg9g+p21O6ymefx3Lvh2Oh64tQRBBscBaKOYtAijXQjGPf0XI SQOmbfVZ/4hfFEY9m7QcV99r7dPYVuudN8c8FZyGFPh8fNp3+PNOzRwuty3i vpx47KBean0yuUv6eMvehS2cOu3IKwhafC9u57ZNZUmbfeI/tnzSetzxO7xh 9In8xRYOn7guB4NOOdzzPbcr7mGBKk+WH3R72/SO3d+ktVn8+u3LF/em1HVt vi0o41WA9WS7ZSmm8+7OZ8ze3PUrm5l7/JFu/i9+R03OzY5Psxs6ONO4zPRV wKX+J62qQsxO5c3c3WBDUnhQu7yup8ofL+0RdCOTat/Oqe+7a2supDgP+bws Tbf0afTDlXn2e4420hIiZy0qeZ/3Sae+RqTH/Nej6vruPHsn6NGZkQuMQo41 Nuh7Y56ZzyyHPUWu7UxfaOkbo943GveyPJ1+ROPFZGGm/2BB169Fsq334viz bwcd3/csbmn3ud3HzE/NMfGWBX8sXtqfTch3e+7gZHj0Qby7zrvY9c37p5R3 25DqYhBpLky/oXUz4l3saa8L5w0fJx2UbzpfYX+r7vTsQrZCt0GrotLyOyvH ee1k+nWI7NfKb12bZ37PNyYmXWFdNQabjlfXvSsE3rifW3G/g1ZRRHpVFwPH 5L205ai7aa0bRB+YNzvtWOqVTMs1qpDFr/LWTBkwkY9x2Jk4EJktKHpjMPqD wUSb7VOLYwo6qJ0yrt8b2uIyGhvW4ezpqce2GX0S4lP3LW2xlmoVUxWdueCu VoHWJvcuyksHWogpCgbw++VX/DYY4Erw2/S/gd+iu+gqAmI3dhElMeqsJpsQ asPmfy/c/2fovSR30PpbJd5z7ZIHOta5s/vuvUOLulp3KTp9w8jPRvPF2RVn OxUliBbaT5mLgWn6PvNN2sxdkx4i1r+GBj4avfvZNEbzoyBPfzXtZN0TLjY/ Z71519/U/vPoh1PNnjz0W5q7zzrgeOqn9sUaZ/qsPbOujTyvfPmgef0vN7zu FbBuypn7Db0cGxRO8f+pG18qs6+ImTNHHPLz255i1qexlxZufGS5cGzZOd23 yq0Bg7ttaj9niTfy7RCl3cA2qmBh6XnFBN+88kkrtDvoaaQsmfT8p5FfcIZZ F+VkpCV6Pd9609pr50GHwCVrzUe2Vo84mXmr2cR5uaHUZjPV+s8fMzfg01Yd A6vK6QP7Lbiv6L0aWmTFP0LvHwbC36G3Vm30ll5cLk5IrwbfCXPECak/ht/c 8GWhf3v3TNFKKjLI9c3JL+o0rMc7Rtcx8v8Z1P9LoTu0tdbC6QdCZO3cbjze VDSi5HRS1854vWPC0F6Ded3Vp/eMnr3N8YJO3szBYdu6Uyf8LHS7LLoxqtXd 7jvX9sgwvWOGpxTuHPlmxplnzfCLu3tms/TRVO+7rwL0b/ivnlv6MDXm4vh9 D+a/UThNlj3+xc7GKq7iw+fSkYscVR+Zu3G7jPyyZg1k49O25TZZ3N/hUFfh SViIp0H6DAvPu4yxc/lJtW+iukWjeO7ok7gWVZNZ3Vv72dBZry5vM3zqN2Pc ocaN+izd+3TXGK7N6AsB8ZYvxOM7R0aG9MKGrJ5w7ppe+vvm26N6bHRwelg+ ecrJrkGPsuLmDyps0unCh6S9q4xGhdm+zMu0dVWMMA471sJ8cN2UV9wR+53F bTfeL382ZvO9ZQUJjbf5HRpqrVM/kWvebebQYK+2ers2blzXuf/RJW2qxidZ js/WF6MetdHpY3w028ryTNvHjR7vfOd90v7CFefxnerbedv0DX4S9HL5zUVZ x5vG7p7QIEGh/SLRcm9myr4GgVvWx7SYlpsYumlIru7yvas6vNKJrZzuPGjD l1tdj860Pha1O8vsZ50IqoXD2p6zt5Va3t+87nj4ppGB9IXWjl0K56/LH7l6 Y86C4cZX5/6sO9zKyblAOSSn18x6e3NeTjpueempuf+xjBc+tz/iyNhp3Jij 0UcfDHmyYuFptW2VcKhXyJXOJrlXPjllezr+ZDDwmO7SSnWKHIawfAWFsQjD 7b+nl388bfLbJHLOhIOSXKvpvxoyNV97hhou4LctTi2ItY/qS2Lw6z/K1QBK CxanzZquGDvbq4V1M8OxvInhzc1xYkStf+HVQWJgjt34hqgzikbhKB7Fkknu KJSALFAgSkJxsNUf9odCbQBKyq0/3uZPB2tCUlxs//jQuAFJFr8jFXkKRqG7 ZL79/IrcM1d/LnHv9qLgl5lb3095UvzI3/PMJePk9+NLLsbMHn+8cwfPVy7F JZX+8/o77o5zS6mKP9ypZMHD7LvN6aFZOnNOqdqc3NgrOH3nle3KTvMOzl74 ZuO5foqDq08XbR+ZP+Gq7r2zTaYcPKrjWfy88/TCGU4bVOleO5U60XxMRZZw cIRG6SCX0LxJB6fW6WnQ4OHrlSfsNZrovO88L+oFvleOg4yTFqwvXctaFZYP HFVquGigd1bvoz5NRtXT7GRq9O5Twiq3AxsNuu27v/rkfZ+24rCpe5943rNM 0/HZHBNWdOT+1YeeCZd+KYy4vv/NzTt67KJc3mNBx87n57YMf/ko4Lyr0+bc FKqhmELZ/OYjhTqF0odd2qRXzvqvqYD/NewzEkhpMtZAAjlJciNmVhiBlsNl WA35wYNu5oYWhmbGRiaGURgp0s7J8ennsH5nU9Ftfq8uvl3nP1MiBq28BqWV hfEnVj2OuejbeX+avqY665wMZsdVi9lMHDac+Ne+r/cDt81CXze983uc1Doe 8E0sKlNqzV/X/Tz3sJPjc7enktp+qfP++3AZFR6XWLrwXewhZqVbFksjOfRc GmMWGCWGLJKp4e+QreP8djAsSODdyshd2b95lnWz1P1Zece2d+cqubYIrjM2 Ukwb/2WHZG6qXRMyi9vs9AIbjYWnoq9MLf0pdrFM2HBtudpWlTPmlWxyXdkv /lz6oy1kyth4YW6VrMv/CpcFE0w/B0r6TLSVuiZnWB57ZGeG8nor4ZZN+nEH JO9Xb7jCeOHSB8a45ZpJGueOrz2mn7nkQuyaFu0Xi92P5avofr1e8JrzpAMD AJgMvw8NCmVuZHN0cmVhbQ1lbmRvYmoNMzcgMCBvYmoNPDwvRmlsdGVyL0Zs YXRlRGVjb2RlL0xlbmd0aCA0NTc0My9MZW5ndGgxIDEwMTIyMD4+c3RyZWFt DQp4nOycCXwURd7+f9U9d67JnRBCJowJRxJCEgJEjkxOwp2DwAQCJJDEICBZ wyEggosIRBERRUAUZBFRUSbDYQIeqOCNxwKiu+tKRLxRcBURyMz/qa4pRPZ+ 39133/fzp8i3n6equ6vr6qru0ECMiEKx0VHP/LLBg4oNBQ8Sa7iNqMPxQfkF hb/xbH+K6IMjROrsQcUjy9wRe/cQfTiMqP6tQWXlucdqd3xKrLAjUfexwwtK B1EEMZx/E3L1H1mWmj7YeeRFItaCeNXk6dUN37310xtECQeI9J0nz55p+7jg VeQ1rBjxkLqG66aztYFvIa/PicyR11U3NlAs2XF9HE/W66bNravf0PkCUUkN UfXd9bXVNV8WdGlD/v2xv3c9EsxFxrcRn4n4NfXTZ97U+9dN7xMpUUT2x6fN mFz9fsaZaiL390ThVdOrb2qIzI7ujOPX4njbDdXTa48+U7OU6NVRRMEjG2Y0 zvT8RKtw/S18f8ONtQ3Prnt4OlEvRKNGEG87/aj5fX586+jEoP4/kNlEPOw7 EdOd66Eh01dfvKP9Pv1UUySiJlJIBJynP9N+hk3Q1V28w1Oin6rldFkwJvIU yw6qRr/kkIozrZRKtWjUEO26jFRdHbub9GTSr9dnIMs4oeq7VKeQyaz4GcyK olMVXRspXgdd9CJbM897eJnNRg6iC4oog7FSUaqIbfzoGM7+Wh/Da8pzJyfQ AldgAQ+BSjAdvAYOgVwwA2z3HbsBfAHSwByQ5TuP6+O+Y0f78tCBFHmNq+F/ Z0DfLAGbfP3I+22Wb0xM8KVvB4vBHp8f60uv9KkcL3x/ti+Nj5sEX/79wJb/ UN3+W2PvsnG/+F9Vpv8rAXUu9rH8Hzh2+T9xXBFHxFnmXzvur6RPuCL+2hXx SVfE+byU9ffK9e8IuO434DzquB4sEWnM5GP7v+F6jf/YcSwZ6KT+q8txNVwN /z8E3DvK3z/qynOo8m/sc17GUrCar5sgCbjBfN/azJ+7av4Lx/PnuRPgLMoe Aj0MTRDzFOPXv8if7a6oo9M3j/3bzwVh/2x7Xg1Xw98LGGPB/+kyXA2/DLjX f0S/lAM76AOm+fADPfk+cRybCO4CASAdWH3nWX37UkBXkOp71vLz5X/uP1vD q+FquBquhqvhargaroar4Wq4GnjAM3rYFfFuIJBzRXqMTx3ydwvw6p+fSweh nX5Oo6/+faX/vxHQHl2uiBv/B6+d8hfSIn3ag7+7/XIfbQVH/4eKdzVcDVfD 1XA1XA3/V4Lqo6P4kohtQQxOXU86tgwJI8hBeuJPTwHUmRKpG/WjwTSGKmgO zaNN9Bt6knZSK0tT+iguZafSEpsXOzh2eGxxbGmsM3Zc7IbYTbH7bFZbvq3B Nte23HbXBcXr1a4cQDbk15WSKYeGIr9qmuvLz30pP7fyNPIbhPxGIr/RV+Q3 07bAtuICQ37M+wPKHsbGEHlf4n9Q1s7eyWwfNbND7KB3nec+3TT+54vKP//T NuLj6o8DPg4g+thf3+r7omrIZdv/WughW5hVKSWsgk1glWyWUqvUK1OU65Wp yjRlunKDMkNpYOPYWKVJuUPtp9yprFDuUlYqdyurlHuU1cq9yn1kYGe1fM5e +a0X4orvy7C/97eF7OeS+BKuBQvZIs3/nbJdlo8OY8FARjKRmSzkR/5IC6Qg slIwhVAohVE4RVAkRVE0dSA+qn4ZFtNttIRup6W0jJZTE91Bd9IKuotW0t20 iu6h1XQv3Udr6H5aS+tw/AO04R9v8H8sKBP+/jH/RFD/9m7lEZ/ZS/v+iVxf v3r30f+Ou48cg2omThhfOW5shbN8VFlpSfHIEcOHDR0yuGhQYUF+Xm6OI3vg gP79rs3q26d3ZmqPlOSuiQnX2DvHRYUFW4MC/Cxmk9Gg16kKo+QCe2GVzZVY 5dIl2ouKUnjcXo2E6ssSqlw2JBX+8hiXrUo7zPbLIx04su6KIx3iSMelI5nV 1p/6pyTbCuw216F8u62FjS1xwq/It1fYXKc0P1zzukQtEoBIfDzOsBVE1efb XKzKVuAqnF3fVFCVj/ya/Sx59rxaS0oyNVv8YP3gXF3tDc2s60CmGaVrwbXN CpkC+GVdakJBdY2ruMRZkB8TH1+hpVGelpfLkOcyannZpvAy0x225uT9TXe2 WGlSVZJ/jb2mutLpUqtxUpNa0NS01BWc5Opmz3d1m/dJFKpc60q25xe4kuzI bGjppQswlz7Barc1/UAovP3U179MqfalGBKsPxC3vIqXmgn7pSeUDSVE/eLj eVnuaHHQJERci0qcIm6jSTFucqQmVbiUKr5nv9wTXs73LJJ7Lp1eZY/nXVVQ 5fuZXR/lWjTJlpKM1td+EvCD/TaXmlg1aXI91+raJnt+vmi3UU6XIx/GUe2r a0Fzz1QcX12FSkzhzVDidKXaG1xh9lxxABJsvA+mlDm1U3ynucLyXFQ12XeW K7Ugn5fLVtBUlS8KyPOylzhbKcN7vLmXLWZnBvWiCl4OV0QeOiWxoMlZU+eK q4qpwfisszlj4l2OCjRfhd1ZW8F7yW51dTuOy8VrV9TOQt2uOFoezGtuTDDZ nEqMWsF7Cwm2Qmzsuf2xw4ru0qK8R3P725wshuRhuIrvCO5+kQ8iakJeEd+l 8lPzimLiK+JF+BtFivGVSZ/gMl2WlxUJl8okrvNXiyaO5gXqZiuozb+sgL/I VO8roC+3v1xOhbeF78I4w8S7s0juUhNw5yJNQTZaEu/FKJuLim1Oe629wo4x 5Ch28rrxttb6d2iZfWjJWKfW275RMuoXMbG/76V9PudS8jAAC5NiZJ9q8UFa /FK06Irdg+VuW5PJPrSsieds92VINtw+qLEhcXD1HX1DeuG+LMTUZi+stmOV KWyqbvEumtTU7HA0NRRU1V/L87APrmmylzn7x2hFK3UuiJnHLxVCQ9nQUbkp yZh4cpvtbFlJs4MtKxvrbLUS2ZaNcroVpuRV5VY0X4N9zlYbZnYtVeGpPJFH bDzCcypFxKQdH9PqIFqk7dVpCVp8cgsjLc0k0xhNblFEmlWmKUjTiTSHlsYD eiiqHu2LubbAVsP75uaK+qaqCn5nUQT6ET/MxewDyaXYBzYzxeDvsthrc11+ 9lyens3Ts0W6gacbMSpYBEPj8AmpqcqOSQqjyUkxTIxDlWdpa/F6RznjD8Wc qojHOKsEY50ucxImfn3CEBw3iFOF5EGuRZOreTmo3MnPNSYMnlyBMSszxCGD XWbkYPblgCMKtXP4WMRJk9E36EDt/EWIuBZVuCqS+EWdUyq0sWx1UZH9WnS7 yFOfyC+UWtEUYk/XbkzcB5aEpVzMKBuVOUVKDKK4WIVoJKM/Sj7Zjl2Tq2xo bR1NLsM4FxOpJUak1GI+1CXWalhifDuJV0tN8AuwuMw9kCF+uPfrwe9HfYKx okIUXost9R2Aa1tdfihR4mVN6TsBrYNdg3lZ8LMUReWHvsCzKWmhUvtNmFZ4 obWcjNjtCkgYXI2ZX5zvhxR7X3myiU8Qfr48DohUI6+5P9pdTRjV4n3UPjf+ spCSbOcrAx+YFNOKgU0VTVcmuMYlpSSbrkwN0JKbmkwBf/kE0V6mgEvKE20F WDKolWyKusscxYbYWhRFGiYN+QzzSuORpl2aC9Kcl+Ynac5J86M0Z6X5QZrv pfmTNN9Jc0aa09J8K8030pyS5mtpvpLmS2m+kOZzaT6T5lNpTkrziTQnpPlY mjZpjkvzkTR/lOZDaf4gze+l+Z00H0jzvjTHpHlPmqPSHJHmsDS/leZdad6R 5m1p3pLmkDRvSvOGNK9L85o0r0rzijQvS3NQmgPSvCTNi9K8IM1+aZ6X5jlp npXmGWn2SbNXmlZpWqR5Wpo90uyWZpc0O6VxS9MsjUuaHdI8Kc12aZ6Q5nFp HpNmmzSPSrNVmkek2SLNZmkelmaTNBuleVCaDdI8IM16adZJs1aa+6VZI819 0twrzWpp7pFmlTR3S7NSmrukWSFNkzTLpVkmzVJpbpdmiTS3SbNYmlulWSjN LdIskOZmaeZLM1eam6SZI81saWZK0yjNjdLMkOYGaaZLM02aqdJcL80Uaeql uU6aOmlqpamRZrI0k6SplqZKmonSTJBmvDSV0oyTpkIapzRjpBktTbk0o6Qp laZEmmJpRkozQprh0gyRZrA0hdLkSpMjjUOabGkGSNNPmixp+krTR5re0mRK 00uaDGnSpUmTpqc0qdL02MlNTh/ldqpRllA5EbZMWYzYbYi9gy2jVGxngB1A xRG/RtppbZuK7Q6gYHsr4g18qyzC2QtxdjG2i4BCVmwdoAGoygJ3TU55i3KL O8cb16rMV25218QF5SQrN1M2mAFU5HczfQT4uTcj54nKPMTnIT5RmQs3F+5b 5SbsuVvbztC2Vr5VZuP6c3B9K7Y2ZY5jlnIjy4mboebE3aDkxE1JqS+/LqWu vDalpnxyyqTy6vSq8tSq7CplYvqE8rixz49VGsYeH6uMTikvzy5no1LKyrPL 2P4ytlH7KU0pKS9OGVneMJKljmQbi1hDEdtfxGYUMUcRK0wpKM9PySvPTckp d7QoN7jNQYWtyjRlqjs9DvGpWty7X6nbafYvfGef0ogiO5Rf7UzrU4jdv3J3 jC9sUVR3p85xeGoQwtyxXSGkCfMK8QhpF3JRyAV3xyTIeSE/CTkn5EchZ4X8 IOR7d0wq5E9CvhNyRshpId8K+UbIKSFfC/lKyJdCvhDyuZDPhHwq5KSQT4Sc EPKxu0NfSJuQ40I+EvJHIR8K+YOQ3wv5nZAPhLwv5JiQ94QcFXJEyGF3dD/I b4W8K+QdIW8LeUvIISFvCnlDyOtCXhPyqpBXhLws5KCQA0JeEvKikBeE7Bfy vJDnhDwr5Bkh+4TsFdIqpMUdlQN5WsgeIbuF7BKyU4hbSLMQl5AdQp4S8qSQ 7UKeEPK4kMeEbBPyqJCtQh4RskXIb4RsFvKwkE1CNgp5SMiDQjYIeUDIeiHr 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 nqUx2v82pSMnNoGYV1QyUhylUWUr2dk6d0pQAP99uNVq6mB8DsuZQqFYAE3E WIbDqlMC1lqtXaPXdTDcr+YE2fCavKurbg3Lo+z2P7a/hc2pkKzUUyz1w7b3 2qxnXg7OSm07eKQtrScLjg/WCAtU7EZ7l4z0zF49FLs9MyO9k8LSI8J5euce SmavgYou8OIQ1dmuU6bacq8r0tUYbry7+7CpDnu3Ketq0zwtCWkBkbaQkLjI wMDIOH3M+ZP6mAs5ukkXHlI+TynP6fLQxcUpRRkxNRkl17V/lZHgOy4kxBYV yL9mtaDWlai1Ea7GEWJRdWad3qQwMyOb0WC2mPBC7uioqKq5q9mwUtmoIOiM hhy9Xsf4fzulQ1UzUoO1n+wMVHZ8SFbfjFTrqXQWnZqR0SHqUPqCpQcOMJ+m 9Yy3q/GqnWWEqqqu8sVx7ccrW5n7+8oPP2SxnhP6mIsPK/vaC/jXnpjB1XMo WTB1om6U1xyduA/PbwYKYVt2BxgsFgO1sC2O4DhD94DotoQEQ9QJY07iCQPK cypba/UsZn3vSBuaPCQLbX8Qjc4bNT443hYcZjB2UlWtxYMz0gcqodL2Vs8N Xvr8LM/jbDbbXXtj5sSi7p9H9a8b0eIeMHlQl6TuxY1Fe55Zt4YtnbCqppc+ xvPi9WsTLD2H1bP2roMyOnmu69C7pP379OI+nTwDbyRGld7T6gl9EnWkfjsD O3aK4L/s1cdiQEXuGhnIAoP5rzksubSPheKQaBbYrORj5Lx3Cow/heK3Wd9D kyUY7DYKxkjISI+IDE9MtHcOVMLDQlDaPuqJB7d7vvIcK137/u3jNhQNWju2 8r76vm+9Mmr9oLQcNpTlP+hproqz7ejSrWDxs3M9Hk8XO+/16ei4WLStP0VQ 11YidnCXNYAFhPEWtZgiQ0+Yc8I+M4mm5MU4Mr5Naz6d1nwkW86mi4111N17 YIHnc1bC0lnKvl7Xb5q2bgl7TtkwYfu9c0enookOenbcsX925sVwtMdr6FMX rutHac0GC79aGGYmHTF/wwmzmelPKDmWk+znLsS1PzwQkqX1XjwuHe5DdbVH K5+1v6HEtbcpmfqYNZ6pazwD+dfXh3CFp3AFM3XfpZqNiqGFbXMEGC3Kx3q9 kZ005RiR+6XMzxy0HshCzUS2dmT8VPtRJbD9uz1Km26xx3lf+17kxSjX+436 vT4F4zB/Z1g8RezDW0QomdgBhzm+e/jx0NDEjt1aWNSukfx//WxhQbsTcwO+ 7JjP68F7Mth3ubYjZ14O4deTfdhJ4aOvT3B8ZnxwoCpveN7N6jeD14+r3zyj X8+6jTNCk5O7WT0/sH3dxk2ckHz7sftLxv7mZJNz42Bdvy5JQ5Y+13jTc7cV 6owWA9u0ur0mtFOYZdQjZzc/7G0eH9eZ/3WW707yo4xmk47/7l1vZrzxraT3 98sxfaaqetzRecSbJpuXNZtZX04987JodzQLmiYD2wz1nLv99263kuBWnO3b 9DHtx5RuvNW34wp7tSt03c3MfjoTmn2rw8/P4HfSnKcndCuaIh0/LPXM0QPW Dw/wNs/0dWdmPPvAc1gN9BxmKRe/Yym6JWvWXAxduxb5bsA4jUS+FircaTEq aNote3R+Zsy+lhbvabfFbGzxHkf3Kjq93mTOwaSszUfBGdkZGbjts/oGZ/Vl qRmpGbyrD6bzyjCtLlgBdZHHPZFuN/vocPtF5db2hajNw8rE9tW8Pl+gPh/g unr+jY6OPeowEzMoOTrf2ERXHmrTRiRaRf2g3bpb6YdZdwHOTEOJM7Wn0wZH bIC/yeRnCQoJVlWcrw8KCg3T66KMUYrD7Ahq8b7viA4yK0adajL6Gwx+IcEB /jkWix9j5Mdr4ZtTM/isGhKZ1ZeHjOAQljUAE2vUgfQsPsFGWX1Gm1lVo2pX u6iqPTQjNLJPaIYu86kOfgNemN8yQBe5zXHYldWn9QM1lWXtaT/Hvn/d03rx I9ygYVu3sq95reeg1qdR9gDK2sVMeosfn3CxsmKkBBkCclSLajEZcwx5jA+U 9OzsjKysBak3p0Zls9S21Lb04KwsrYHVYN7ELDQY4+X0557FN2w9yaYu3orr GtqneyZgjr/oOao8g9dczERZeIZPxZ0VSl3ommcoTLtiJz4NWbpGfxGUa/9c n39pGkrVZiHFYBB3Skjv3ny5NPLZ6LLbSZdatuLZKbfsm9+/dMUz0JsHtNpH zB8zau6IxGuGzxs9at7IRGWNy0uPlozb/uMDTzGYyifOPtr4fNOwkjv2TZn5 /HLoXpRNrkCBFEk9+Cz50s4gU5iR3zkBpqiwkwaDKbTNnGO6YkY50uZbaux8 RtEKmCgXl/63HFi22c0aqt1Li1sfuXfP1oeeUO8ofvDm4Z4kfUxS1dpZt9ze /mkTbxfPWl0d2qUz9aYhrWiXm3YS2VNa2Eu79SxUHxME5/C36/vEPNIh8tNO YfldsZbstuSmf0KivbJTsY7wFZBPOVlWvg6iXPoe6qV2488YxogIvoxEiiZl V7QkO1y/vi5dtmL+7E2VQTfU9Bzfc2TunUOKb5/cnz14ZcP6B9U9eqLJzXSP lYx74k9rN53ZVhXknGpLnN+7R/KYxcoXvHGLlz993ZwXmoYWN7XyEfA47pgY tHI0XUNDHWYlmlF0hJmwNh7Y2cESZ9ZWCUtChPGALdoWbel0wi/Hksd8kxVv 96xUsdbzptcqi7tS3A491Et94KtspOrrCwyTmNdeiuiRmd1llJtNuHHLlLRr Bk3J7zO864jFc7bdnV07qAvb3DM7wcpXgPSxC4cPmF6RYw2dOFIxTKn3FMdm lfE7ZgbWhZPopUwqbE7EMn4A4zgF5bZ07J24lwVRF+9+h39wRFGX7p+lhOrj c7HkRezyC/xS71vmUdj295J4Nx3A2nDAN27QE10yeccMxCDvYRBLQidFLP0G dI5BPTls2fONva6bOKrz0H1zRs8dbu9XNX/R/Kp+fWe3LoofPnJ4/PD1Revu 9iWySePvHN/D5G81b+9oi8kclpY5tF9arwFlDcPzfl070OAXaNoUEVk3OnNY /7ReA8v5c8to9IlVeyqMbSaFz+Vmvcp0Jw05qjbYMY+/fOZlbeG088VLZ/Us 2OVZoO7VLb6wQLd4LW+b6Wib88gjkt/X/J+7hVOAdl9HReb45YR8LO7rbG1Z bPu55pnoPW349YZTzw+Y/cSMeY9PTXPH5k4ZdtdSN3tl2o75eY5ZW2rVGRc3 Dp85ouuW+9SJ/Hr8YXQSrmeiNEeEolOZiWwGPMEaFJNOzWFKHmERyuYrQ0gW n0WjU/nDaQZ+cHGGJ1IWGsp0kzz5pz0jXmMdiktZjHiavrjS42GK+itcIwXX yNJm92W7AnRY31rYp7uNgTqrFY302R5mxB/CiH1gd4OJmXQhLazRYSGdLjTM 6qezWZ7zvk/+3uMU7H2HgrBwhfgFBftbdIbAQCN/MGGiiNoS7Jvvg30TftSR NisewrTBbm1D+bPEFkXnMz6f9sWMzze6LOdnm1NS13w0dltGUPZD8/cM0PXi VWHv3vewBwvVxaXfv81Otp/bvktt9f2LNcw1fJUtaCUD++BpPZ7JVKZY9rH3 +LsWut+qqn7+Jj3T6VQ9HwM5vieFLNGWqWfwqIpnqeCs93hX8jUW7RnZh+nq PF12ebocY7oqJzPi0i2eFHZMzfd03v8UO427fwlGyQuqh2yUSkN3hYebWRz/ 4CAgvksLe90RZO7p/yazUWfWuXMHW0l4C8PSGRb8U4fi5LO6UvF4xe8i/tYh HrAOoFmyUnH3d5GrRO+MjMxe/MYxZg5UtXkvWP15ksMjdIKu9LHxo+eNTGj7 wzs3zip/xBlfMnZS+rh7anvv+DBnQv/YkK6OHv0fGL20pCh5eP2A+59wVkxN tD/oHxni17X05lHtw9hrHXrmdY/N7BY1eCRqtMn7Pcb9EswEiXjK9Yvbx3Zg TBLb6bCGmbr466Pbg4rNZZ0Pm/SoQMYpbQrT3lSsP08AiV3Q8cZfLm/GYDEl qOcLFu65sWLvuKdMQ5+YNPrXzmR3ZPqI3vH5g0t6ZFzfs//0sjTFtODg8sGd E/RDPPP31pYVLW6dN/K2CZnhaSX9PdFhkYkVq9HrD3m/U7er5ymW+rqDKJJ/ F2LoFNjCzA7zwiAWFPKTXzHesIxPN8Sy2A7n1VLSHmUvvZkc0V5M0MaUeeWb ibakqNvzVw77xuMdcvvehhHLBuYsLcqbM7ZX84ODlgxM6BDNlHNzXmwaGhG9 tXNcRlXTmD27bTb+XsJHA9oujOKpV7O/Hx8Kphh0+05HMHU2BeijzltL/Uos ZXE/6Iu16UNbAGTPp/UM9ZUFzWf3jYA+ojzB2uQ5vfDW3TN6jk/ZscEw+PHJ oxePSXZPnZS7uiSpPuOujaxt0SvLB/kHsK3n5z93fV3R4pb5e3bOnsl+Gxbe wleqWSjdaYxV/j7q2OnvH4722bMzLrwbnqmfdoSHd487tFKHW6T7Ne92KA44 6m88ay0V8zx/OtCa7Qweftu0AcrwDhofpvVon3A5VsVEb+zt63H1tKK0Z2/f nOwsHWobtLPq1r1zsgbMenzalM0zsnartrya3KwJ+d31SlJCesT6R4z+QeaV YdGFS16Yd/2zK0flzn2yNG9GcUpycUOe79+tYp1dpf3b0exmPV7s3Y6YQD8/ fyNF+IcH6s/6BZlMwZbQC6ScDR5lKcEdjqLzV5esDEz41pet772FyAHtTRpt GR7ue2fKjM+0xqdHMl3M8slfsRZPUbPnWZbHNtffcuGk7kTsWdeq9j7Ka6u2 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 IqH8+nBxQfAknDiIKq7ZhKhlwaqA+VbfqYZhU1VwoHdowLVG8nG5tUP7L8w+ eAJpaVsWvbICdcP2s9OgG/JZjOmF3Ly8DPCKF8CPU8ikUEx2I6rpTJLkZu/O KyigtDA3HFQoandnUKivWqKqVJwhBLWR0QqX8bXc1+9BlH799yeutva3zI+p sXR5f528vSlvSV7lQkt5lamt9BwotqZGUOxi3crKTE4pr+uLdN26E7TrurOn 9zZnjbxyiSZjRX52VtVyelvLmi5Qb3996/ouVDODI3YQtEx2IGp7Xl5AhpIS xmsq6Z8mKzdXmcVDUFYU7FYqYYyIYyA2U2MP42O3TNxzKKFzwp5DOGGzg5sD qvyChVm1vjdXrG+fn1HeUlq4KKvWvHLQUdJcns1l/npeYbo8eprZl1vdqS1s rF4gV9RoaVld7a+T87UwNqrAX4vBJnWU4RBVQdccnDcvqaSErC06FeASugJV hqSkjEzTxQUFSSoS6+Ww/BFCPIqKHyGKwzY1wZu/9p3KxF2H8J3K4kXd/mUt odLKjcvXWPMqWwrLejrKCleMGtMWVVWlV7u09m7yMAS5Wu71xXpdtlo5qEld XJNVlJ+tTOErWyuLVyzhWamcW61W6cqzSXYyX9VB4r8W7NCOK7lSmL1wYlRw ZKNJCTg6Gw/JtDAb6sRvAEA8Ztvf2/gekyVdc3WW0ZMYrINVTBNwyqbKDlHZ tG4mK0uFVs1SKtMOg04k4oiuu2FEX7P9UFPxiqGOrsG2/I2ahS0VVtNGLtrY 31HEtzrq6GNRU2lzabrVSB+ANfQVkN0PLcqpss4U8hIMK4dVNQvzupSJR02a RKpajJPCl8Xw3TzW/6e7/zD+UJXuEelzV70QnPT330/P4myeyfZjlLZ1Kslr jklpGvLsTH4DJC0tiQTENLlSKpPJNUolp1bL0uRyRpY4O8YidC3MY2Kcxvca heYhOssEGRoFQfoX3zUwL89xd+3wfPn8fsuGAi6PiHTBbPsdiNW8deMfo390 30nD7ENdBtkCOMst6UySSiRyThE3mZxsE6Qgc5IYookkdcI0mrpUCAF0ZnE9 jRMDG4he2Ri9cvuDlVV/JX0uar/4Kf101N1/lUSgDOYXbKukk5pPaSnTIWo+ 3fqCmtIWzdLtB9KTaO38w8ydVCEs7NWUSqPiVaxKxWn2ZR9htlILmZ0Ux2yL Pf6uudBB3hA/fuHU8ePE2tfuDpT4ZyayOZBUXLIyx5kGf2ujpTZn++4HHmjY uLRialnLsL58x20Ok66mvr+KecteWzm/dsXC1f6iQHZWJCUnp9a8JOqmc9rq iqsWVZE+lDO/ZL3SGnge4KmG5xXzXqbbcD+gtpfS5Kqc/Mx9KUdBXgUzReWD zBJB5g6ILiDvqQuaq9dsCpQpm/uIRhrfEchbaZ8wNO9q2SGpGV4W3Hx3+6qK 1WX84oKyrgaeU3dvdlRmZLPtF8PttT/6icenWxo9rUpOW+wk0iWDhrtAujSq mOp8XqkgP2Qjy4NFdtuLlCovn5VkLVOCWMkglgKUnQRiFqKYW2MvtJNPU0Ct F4icGDPEzXfie++Qd4uFZSSdXGWP6DuW7pjm1tzZZF+a/92mznmLFlXm5q9Y wLfVFrD/q2eLo1JDs18+ErmzsjdkDq1LK6kvoSmlImuxTZR2naQdnk6KKePz Kor8+s78Yu5luh0m8GJmZ2daClvIMgR07Fcsx7Ia/iiImwPiyuCsSfCIb+HS USfoVypbkJWwF0/8jyayBlQ0u45mos3sOk9+R1tjRvXW9v/yNxWWUNcKv0n7 PUmP09Ar44qytcm9LqlCKQ2qU554YNm4q05r8NXa7AMmeOCm8+g32fskbVQj pacc1OOHqGS6ZaaswkC8oQrut3UqLWVVFktVGbugMZv8uFBnSROcXlhQoZST H0UpMJes/GFq0Hyn+Qdm1kweY7el0lSqJpVPtaZy+KJsUl6B3pxqTm2xoc1q qUaIdA1ULXS+Ba7zmW+Tzp/Ch8ylOt2iNd9atEZzYamG/DkJpjLQhvj65AXM /ZrNcLKv3QwHv1of/xNTVnZd4mY4ZWQzHGFCITpkK9IyFi5f01TRlaFOrSnd X9PXUVJiud3tGF9VWKktzC/Nz8krW7V+aXaN+lI0o6+vvqtcs2z53sxctaRo ZfuK9pVtK9u5DzOXLqjpaSpIVmn49Ow8RspkaZtLy42NC3IqmourOnOzm+Zr l8/Pb66u6W4qkLCuqz+qnJ+SW5KxMIuVJ2dnZtPnW5s6l7TWkr1i6U7mLfb7 UrLSa3yJpuRJnAJmGXB8jux/QieRYSkFf2fB72k4OoStUGhwmTrN6doT163V v/930d/ddRed8kT0d8xbtDH6Ijt49RN6XvQfyX6i0NJWiGPlVP/zORnk56Ey +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 CTqd7JbvUux+TpqtU22HJLoT4n75x+t0vsv3V+m0Wqerdfq6Ttfq36YZL/bQ aWcf1hp7FBficwrSvN+swvqPF3bMyTE9PQc9h738vVpDWHKAHEBVwPsrfIoa 8Cnq/gaxwi/FGK5HU2HIoWRxQ/DzUh4xafDZtzd9TqRTXR6d5KaLSpoFjdS6 l/RJiMkQRkzPGCpDrWYSph/N8VLNnqjXFoZXeOn85jW+yfEhJxY5bVrmxJyC 2nqhtlNb1hbTGzl9kNMXOYr0jqfVmubtIkzqb9R7Aqde/qaw6TlMn5M59YoW kila0q8lU7XkiVrSQ/tbJ3hr70untQHeNLJSBuWfxCnJd6W0H33uxqmXv6fM PYlHTxLQE4PmLfvNFS38khox3WN6cA1kW8sX8AWoHZNsm0oWdq9dgto0xCiM gmjhV9aAX1kTfmUV/Mpa8Ctrw6+sB35lvfArGwO/sj74lW0Fv7Kx8CvbGn5l 28CvbFv4lW2HORCHORAPv7Lt4Vc2AX5lO8CvbCL8ynaEX9lO8CvbGX5lu8Cv 7AnwK5sEv7LJ8CubAr+yfviVTYVf2RPhVzYNfmVPgl/ZrvAr2w1+ZbvDr2wP +JXtCb+yJ8OvbDr8yp4Cv7K94Ff2VPiV7Q2/sn3gV7Yv/MpmwK9sP/iVzYRf 2QD8yjrwKxuEX9kQ/MqG4Ve2P/zKZsGv7GnwKzsAfmVPh1/ZbPiVPQN+ZQfC r+yvMH6DMH458CsbgV/ZM+FXdjD8yp4Fv7K58Cs7BH5l8+BXdij8yubDr+zZ 8Cs7DH5lz4Ff2eH4Dua58CtbAL+y58Gv7Aj4lT0f37QdSbOB73/4JDSLws2i jMIMMZvCLbQnz6Ec/l2mW8UysVzcJlaLlylnHYU54h3RIO4Uuyj8Vnwh9op5 +C5xBb5L/Ht8l3g+vkv8B3yX+G58l/gefJe4Et8lvhffJV6A7xLfh+8SL5Tz 5HJxv1wh/yRelE/Lp8Vq+Yx8Rrwsn5N0TZAvyBfEq3K1XC1ek/WyXrwu35Jv iTfkdqO9qDc60B5y2Ohp9BTNRtAIiqgxyBgkjhhnGmfShpNr5Epp5Bl50jBe N16XplFv1EtlrDHWSMtYa6yVtrHOWCc9xnpjvfQaG4wNMsZoMBqkz9hobJSt zOfN52Ws+YL5gmxtvmS+JNuYL5svy7bmK+Yrsp35mvmajDPfMN+Q8eab5puy vfmW+ZZMMN8x35EdzN3mbplofmJ+Ijuan5mfyU7m5+bnsrP5hfmF7GL+3fy7 PMH8yvxKJplfm1/LZPZMLVPYJ7X0m0fMIzJV0Z88UdnKlmk0JbzyJNVatZZd VVvVVnZTcSpOdlcdVUfZQ3VWnWVPlayS5ckqVaXKdJWm0uQpqpvqJnupHqqH PFWlq3TZW/VSvWQf1Vv1ln0VBZmh+ql+sp8KqIDMVEEVlAEVVmHpqCyVJYNq gBogQypbZcuwGqgGyv5qkBoks1REReRparAaLAeoPJUnT1f5Kl9mq2FqmDxD DVfD5UBVoArkr9QINUIOUqPUKJnDHrRlhH1nyzPZa7YczP6y5Vle02vKXK/l teQQr8frkXneGG+MHOpt5W0l872tva3l2d623rZymDfOGyfP8bb3tpfDvR28 HeS53s7ezrLA28PbQ57ns3yWHOHz+DzyfF+ML0aO9LXytZKj9MmVfz8sgB3x RPxOCP8GmRBvUpBmF7OLMKx7rXuFiV9RV8f3zON7Zos989sZ1AUzKA33ReVW 8fF5cnyetJgn0hpPO0s7mWYEzMFqNN2pZYlBdLo9ljufHeJT3PsIactYz9l0 bsz1DPEMQ5rnOQfpUM9wpPmeAkqHEHUe0iGeEUjzPOcjHeoZiTTfM5rSPJK7 AOkQz4VI8zwXIR3qKUSa7xlD6VCSuwTpEM+lSPM8lyEd6ilCmu8ZS2k+yV2B dIhnHNI8z6+RDvVciTTfcy6dX4d4RhHmeS4mHOq5nDD/F1hkPHqe67laW2aC tsw12jITtWUmacsUa4tcqy0yWVukRFvkOm2Rqdoi12uL3KAtUqot8httkWna Ijdpi0zXFpmhLXKLtshMbZFbtUVmaYtcRf3P9UyBRW6ERW7+hRYp0xa5XVtk trbIHdoic7RFyrVF7tJzZa62zG+1ZeZpy/xOW6ZCW+b32iLztUXu1ha5R1uk UlvkXm2RBdoiC7VF7tcWqdIWeUBbZJG2yG2wyJ2YKX+ARe77hRZZrC3ykLZI tbbIH7VFHtYWWaIt8qi2SI22yGPaIku1RZZpizyhLbJcz5UntWVWaMv8SVvm KW2Zp7VlarVFntUWeU5bZKW2yPPaIqu0RR6ERR6BRR7HTHnmF1rkRW2Rl7RF VmuLvKwtUqct8qq2yGvaIq9ri7yhLVKvLbJGW+QtbZG12iJ/1hZZpy2yXlvk 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 /brxbVffytSLD41dLYzKUseM95FqY5h3z1i3jpq9/O1EKvfj4mubqh7rbFr8 4TL3LXnAN8qn2mXdNjfMY2S4nJFJeMmmtiusZI/tXct2yo1UkBBvW/Z8/Pwe sEXDm0zBZCnX5wfu6rnWnOaN27ZHc/5Q/ryGnHuOSzcUBOH7NaT3/t6Zsw80 6o4a19tFnDqpLfmF3rthi+z8Z/T+6UT4O3rL9qc3DMGo5OzP8E1eRyWn/xy/ BSFFQf91eYplE8qVCjzyi8tHz53wjs21CPs/Q/2/NHWHbS27adWpAMYImztP qsvn3WpMGOsJ9lrEzpkcJcXd3Xhs4dqDFs3y29Oigg/64+e9tLnem+8scG71 r9kzYYt6iwZILauZ/2b1xWeO4EXrsbUcojbdrfWVr+KdMbsz2trTZ1xNOvEo 8w3LMoXxZL2pvm5M92+/t83fbCHdyW6NOaLilbtmJkeUdbDAfut03pmxMk+D A4YoZa/WHtLKVhN0NfA94vlOZiLJ2qcxTr0pHO69k5ygNa+uH1Tu8Fq95Iy1 2dTC4x1HFkkOW9jsK9J5QdXXzA8LmAyUOQoyl28qZL8fdCh8QhXPsr0rJbVh rN/j3JjMWWX2o5t/Szi+S2VBsMnL7TkmVqx5asF1TppRWuJXkufMa5qGVz3s erZo/4Oikljrg15n5ujJG8ZLDvJJmzPJdbjCkaqqSs/ptduG9SYl6CTlKVLh j4fJT1WrzdPVuTj8idmTmnduDebNNwRJow1N3fQDJz31e7nj7ubceofoo8lG sSy5F/E6x3PEJ4zG/bJ3htPKgvig6tkF3B3Hd418JR/9aZVg1r6ee2Nr0/Tq wo/maiyXD8WdeHsmrj3YpvNwf2V9SPX8cUTzUAvvsszK4vm7q/I3xqn9I2M5 N07XUlBCzs6fnGZwPP/lsnqdax2aY+q2vHC/3wnColdKLqqNrH00++nOTY18 k16ZM5MDbngOLLjx0TJviMV4pZl13MJPfDGznBIzS3EAKNjd/r7x8s+XTb4t Iucnn6WHa336lWDwpfqvUMMCfPNJ8mWo/lcV6cHglxuZfAglMPWKaIGar8jb 85pj/ctV7qYbd1+kwvvdIsWfQPnlmyeZYp5YJBaCibBotMgdjsVi2nB8GA1D YpAbBEPoHQdmFxgm6f9pd41NiImeLgqKiUjQ/uGxwhTDqcA06SmTBmadMjhU 55M2YH8pudDiU4UoULnbsePcuibrU6HT1YRLZurmeK5JeXLQ1KNCUNa68ln8 zErp8b1b70dpHnHuGHXADWPV3l33cVom1032dWcEGP5wXmeuKYUXWKkvtzp9 0efNDPESroIf5XHd8u72CzqXJX7337fWI299ZkB++J2zvfN5v26LFm1200r5 JaowoCdDOtHu3DT3o0ZPo48kuvvPKXFgPVdUcBzINDPALe1jkxtfJ2sNcXYJ PHEG/M4/PS96RumN4NBt1AXuY4nRJ25NyH7CUF9akLxwolQW+9FjvUH+nqX7 RxYNdZ+iXavBuQu2xZhvfOYyZkdvpfz9XPOw7AIxbkyJcf1vVmLxxbgiDJJD ulzzt40Dfv6dRD9VTqFU+otS8tt3KwBm/vUKwR+Alt0E9D9robXVpD9o0sBS sWf+P06ZrcaMOwtMC188cihT/oHYtFZsY0ifov2zEgN0rM6MvW6jUhgy0x68 sumaXJY9uWjoQ1J9ql+4a4uPUKNCl1t+1He/8mKwSJdzc7GoZOqRqedBu2iY hH3M7Lq3OzpCeTOM4+6u9Pfe6e7slH088bzQbfmutM2FE2R6VJVXvXVoaFop mefQ6X7Fee9Ws7SxS3LvaX7coBZjX7fMvrSy61cFc4V9rusik1e+HzOEO3Zj SXVYW/TJBXd6lxi3tHVUb10U1Bmj+ZG41Tl+jLZw2fjH8l4LW48B9YbAzUse eaY/WB4Q0/xSz99tRo6d6Mn9gJUfn5tuMPmkVl7IbngW0308o7yJ28HOSss9 zW8IGjdfkFH59s2xo5/yltFbDv0P5yVQig0KZW5kc3RyZWFtDWVuZG9iag0z OCAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQyNjA3L0xl bmd0aDEgOTcyMjg+PnN0cmVhbQ0KeJzsnQl4VNXZx99z7+yTZGayzEwyWWYY kpCEkI2sBHInK4QlOyYhwIQAAoJGQRYBQWmEBpFShSJapWrRtqiTsBgEETXi ikpB1LYKiFZtjVpFiphMvvfcdxIW0WL7PW2/78kJ//u7Z73v2c+djBEYAATh RQHJhVVjSkJLdH8G1oiBYa+WFBYVP+jd/hjAi8sAxIUl5WVVR9ruPQDwymmA OQ+UVNXkvzXjcUyfsRkgvn58UWUJmIEBc2M8+JVVJaWW3npMA8A60O9umtfY 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 NHZoflfeuqPXWcQF8kHBMQklodKzT8MLwAyU8MLRdHMBinAVjBAAnfeivSd8 UbeIHXTsoiIGMmkc426MNtR0pRIjLukZRNASwQgfsVjDGNDDhLnyvpc3xvV7 +S6s3zWQWtpVEJlb7mCvXWUO0q3LiCY/YLVEM3S7p6l6asPR/kh47dAdG4bX RiL9+E8qX6dlKq5WuQCUwAwvMAJad1HSY79ILUoE8LGbJR/TJccd8c8EvaEL bpQLgn7MDik7oJMzZ0MCxFz/yCgIHLUIoYi6QPI4HMBbwCfwbmkGLEzWsbIT HXGKGPzgNen4OXbO73t/BpdSonSPcjlwPeUe2BD7sBkePAct58nqQ6+//+3x 82xOyf6d5QCwJueeTwIevHhUq7WYRwnfiBTYoHkUZjICE8EjFdaFEhHboqIn Ptn4GqaMeEbivdfGzrHryoah7/MBVjhYRCYLJVyJQgkMMzyb6h4YmrE0Ktdm VXobtubf0/Huxu79fYWe5nV1ZwnXCPrPu3vavY6ygKks8uOmeYHuwa7G+zZv rjr2MV6puPYFW08WAaeSGlnhn5iUQI4+4NQHAnonKURw8AVjVAijrotO+8XM HP2nCqCz6vw6UkvqdFRmDxoRLkYoZBSOaqH4YnJYJ2aV8XpodIxNaCFeYJUl YlNUypYW6P5vHzoFLuLz1XGMZbfFJNZLEQ9PrI8ouTwzSV6tfvQ/96bW1VYa iw90tN3e6HA23tG2Y1tjb6F+yYrGPS3e1tZ27/Kn+iIrFhQvrnHBh+fvW5FH UjzqdyKJMdQYyKgMGE5ZcqpczW1m3TmJUszN6rizbv1OFx1oWBif5f8CZYgG hKq3Ja2qg0PHVFqVFlvzS0YgE1pVF/R6RJ5h1rB6AVI2/ZhQfGlSzUlIeS8O KOwq4vf6zA0WycVWiNf2s1MsX87c/7uNlsrqclN0V8PuA488dQ0Ql8cvdy08 /kAbfHLpU6vyOFwB9a5Y1r94WS9x4rPY39Jm7cG4sQDhho7VK5isShjSZozC sRG+VMpHmv35qJWf4xmFDkamdYyppQYDJftKusB38Tqsx6Pugzha4ur7xDKM 53t9akI5QoYpSVDFkhZefETwkiQmCUy66k0vLP30sr6w9/HfPvDokeWPzMni ETnbapYdujUU0wabwtbi/JDKGO2I+BvDZvhEz+H+ImiF6ctf/tH2ucHfZLbe VqvVWcNLdi3NaghbhHK1aNEDM13W/BZcy8DWobC7EcKgBmxOrht74VFgB0F4 jKF1QKmzo5eEOg0/AxWgEH7GKCS1FYWFkXQvh/Z/Zu5hPmfoSSVx1cCUsoSJ iGhgZP/4Q9gs02oKkis2caBwYfhILtwg4qeaLC8gRXj3UPWmn/es/Fl/vqt8 Vra3qcAeXvGjvsWHVkRT85rH0oqzjIu7uxanFrRQroqg+bb5mKg4S2cSI4aS jlvLZ90/J8vXeWdd2dLOcpO+qLG7sOqurtyM5r6yooUtJaVKby7jKimvrHQW BDO/VvnzKjLqm+XOfLenLJINklGXsyPBQ6qO27VpGo4SYKNZUdj9jNEiGnJR qxmbZBB/lvS6LlDJ2Hsd90CJFLLJTcLWd7CI+h++tA4Hr/oH8DXOIs6nLq9I sogM+7JSlkWU3//RE53lD3+0//4Pn+gsQ1e1Rw7by0v883euktmksSMF+ejH 6/TBLKKVZRHZSswi0kE2vDBsLgCYRFg/oi/S12hSQs+j+2jSQvvoTTRJ0zrv l/be8JeTzGLu6jVJxf6fcYvpWt8kZH+M0k2LNYI/EEHcwqM7MM0AP1uye0FW 1rwdPUt292Rlde+Y4BYJ3dOmcguaTtd9Kem1f5kkF6yffx928T1End41N0rG Rm8Ol7MFsYvokIA3Cj/HvALGecWf4hxhMcsRhhBFKL4Jp3gt4J9CEg7B5tj7 zfDQm4gkEM8cevX9q53n4/tQyL8j/S2gkGUHx7VS9DKbRonKoyi2mlC4P6En UbS3LMTBfkjRC+JzSSwxQLyAnXnDLTluEvG5EgIH/GBVd55O7a3Iql+bu6nl 9XVd+/qKduzeZCa4I3+LzGlryUwt8hly/Y83d/hm3zdj/Z9XdelwtH/wmom8 imSLgM54nKd9Tp3Pp3OSfDbIWxR8Nsh/6YnHY9itgygYe3r5XwnEX1JLJ9Yo 5q6eDOm/S4R0LLTjhhLw6YF4CnVhI/G+b56N3h00lleWm7p+2OlOa7iz44Wn E5F4Z0nt3u6lT66ImHKbgszS2vR3u59aW8KjfkNSFJFa2B7w1kesp6zhGnfD DIvmnFHn67y9trC7Lk8tCzX0snuWdOSnnA3ABspPAgN84bhGh160AkUsRgDo VM0Fo5Ey4FN4tItROHWMCKWXklpOMnp5skscE1HVTCaiqn0yqn468/AnD6py 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 bqwDSgIefarZijUisUbcXKAAaaBg2JRCn4aLEPwp4eJjwKh5NEVyBgksQgIL iPUjJuujeChvYIdyMasCy8vZvktwFVyr6WLFD8dhORyKsxdIZnXeXqv1a545 QLb25c8qMD/nzVbY01xaTUhvyHHryfGmuzq8FPXXq3vqOryt/Q0L2mm92/oN n6fwVuNM4hqSdTFVD8yILZcPcVBO3HtUJRJhp2akFouKM+hgBOJqh4OX+oge W1zEezRFOooUYOXFMJkRB20cmFnY5vJs8TWZeKXX1C3W7CwEuZggYg381joD U1KoDW0t7Ly7zZ3Zsq66clWj+whRWhEtFXDS1X51QRkK0LxBiSyz7fb60vUz c9x1K1JL88vyUE58Gb5H3k3VoYy4DDSBe4/m5ABEFRYdza6tVWIdCgvN5aPI 4C6Px1ySgkdqWloIu5TZZrYxg7NlsFjWJCMImYvmDVZV+SJgMDu7YdCHVByO DOpGiXvYrBnpxZYOZWd/OG8uew5gkMVX7N1jsvhww9ldwA+v2xyM4kJytzDr c+ye4NwpO4ODkzuDnS70EYUyucKbyiXdKlfFgjx7lZ7Hs7qP965xtNwze8b6 Glu61ah0WPVGd+3CAm0g5WrMUVXtLUgVh3If1Gts4UBuNv7HedOVjSipVSgW SoUyK8Hj1LdkNObZdVlFTneJXhM0OcMmE5OR3ZJnpcj142etKpHKINWLSZ4i Ff42kBXy+NOz0dh/iXiLfBqNTDvoGlLL2XBk5CNTHhUIFHZ0PQaAgvOoBZmM oY1qtY4nk4ke1ZUIkDMriY1AwXr4psTQxNtYsuO7h4rjDoMjbHZ8qjtRZ4vT 4esrgtWaRF01SUrFCq/psEWg0prkT+6A+pbMcJFY2+prryXegr9Wq3IrYtvh Gx6hye+I3U+sm5ERzvG4wl3dsSLs5/+N/HwF0kWCPD0d86LFiBdpkIcc5f8P e18DF9V17bvPmXOGcRhQCRokqBMlBgkBAjJfMX4yBGZg+BpgxvisAwxCMszQ Yfy8PutNud486/Vnvblcm5+1qfVa4zPWJtZa67P+rDXWy02ptdZar8/ntZb6 vMRrqbWo5P33OmcGJNokN/247YP1W/+zzj57r7322muvfc4cGJI6E/isp3bK FNbKh6H5ObF3WoN3RkNvjFozq5aXdW7LrFzu+ocvvbkxw/R4YrE9w/x4opTo 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 r0LOceyomufZ69hdVezZX3ykykUlbs/eElfVAs8hitujqL+Y2oYpPsOkoYl2 ojUo4WgiPEHYRb2oiJrIRY59VWF4Pr1qBenpRKveqjWqbCLsovjviu1lu6iv XXR1r+c0rO0AcjmJ8Bw0rOe7TNWmaH3Iyj3Sfmq7n9ru5zp5X7i6lXC7soeS 5SdoLLvU3bPYcaAKGc9xuGo/1VR0KndTp0nnadJ5mqw957lI2KViX5Vyx3WR Wil3XFdI7qJ5OU06z5F8UZ2XYkJTyaYqnhU3VSErOo5VIf84TlbdwhpRdp/T VciKjnerRc8Vx5lqnWd7yenqxOhe6ThfjayI8tS6PselaiP8fLp6Gu1x2A0d VyssnmsoyeLrvTrPc0PZ+xzXq5EbHfXVszy3HDcR+XeVmI/uhupu0jUkw/Pc u6Ba2VWNfFeqdniY43Z1hbIjIz8sqK7lObN6oVcE1uPqQHWz51ZsF1s8ZJ/t GbIPZg7pcWi/hOouoLt/xynZWh306op7qyPcb9WrvInocS1Zss6bXNJRvU7N hybIG8jyzXwXq97iTYSvtnkTnVKFxZuIkh3kmd11fU599T7PXtpTXFwPdrHt 1Qc8zDmm+jD3W+ldbyruWJS7FBFzx9HkHF+mzEUilSQiQoBeI8ld3AbvNLKk y5lWfayuH5achM4pg3qcGdXvqrKJsIt26i7Kuoje6jN0NY/051EdizfLmV19 3ptFch6hBR7g98kd1VeV+yXEXkf19WieJzQRdqEmz+0d1bcJB5Qdluos5B5z S+reWuyc4UaGd9rcY7hmt4SSOe7xyg6L+hxNhHykhd5Ziv5oLxXKnViQW+JO U+7ESOZ33W53BunM5ruMe4Yyd2TDOtUPJmeR28b3ZfccwiLUvOJGznSWuqt4 zLs9hIsIG2P3mTvduKN2VrnbvIUlm9zLPK6S0+7VVOflKDo97lf4anJvpBLk HOci92t1vWiF+2dno3unJ935ons17ot2uvdgvqrcyLTONvdBzzXnMje/Z97q Pg57TvMeOXquFXe7T/Fyfn/lXF2+3utAHX633O0+OxQ9LufL7gveCly9THou 02qd5U0mH6qI8h5uG7/Xdb7i7q3rcW508/tSl7sfsfpqDXYN52s12BEgG7zJ jjM1Sd5awoXAFN62ht+Fbq1JJ8yk/b3em+x8vSbXW6/izhqTtxnyTG/Quadm njKz3gjqF1Mr7AjOt2rcJC8gxCp2HqxpIjmgztou55GasHdV8c6aFd61hOtK XDVrvBucx2s6vJudp2rWeyY5LtVs8m4pPlLTSW238jmqQTZ2dtfsQq7j/rzs PFuzF+tuaw3uOZ0Xag5hRi5j7vqcPaStt+aod5uzr+aEd4ezv6bLuxt42ruv lNWc8x4o1dZc9B6GfMV7DPI17wFcvYFyQ80t78nSpBpk0dKkWpqvWp33XUL4 uRbrtzSlNtl7xnGmlt9bbq01cu/VTiM5awjmEVoIZ3mzgIUkOwgrCGsJF5KG eh5Xtc11vaWTavEkUppei3xVmlm7iq6upZrIVM6NtchRpbm1mwf7qtmvYg9K tlA5f/r21O4gxN2CU1+7j+LnIF09QIh7QueF2mPo0VR70jMJmt+l8jOE56l+ 9yDWXiLkGaO79jrhTf5cVnubP5fVUmZQsE7iUVqnJ3kM4fjBp606rO7SmXVT vOefN9ZhXZfOq1mMeeysy/YeKNlaN4P3Ujcj+tQG2UYlNmXNIuZ5zkzmz4Pe S7HnwTwqt9CKGLo6lOe+hSRTPNfN8V6FDUVUsopwHUdkbGBdaV1fabF7NZUn e5NLXXVVfL3UIs6VEn6H7L0OWeeN0Fq4SX1hFdR5vLcpGxcrSDn5ochE9ii9 +2L01kt53yWqb7r4Oy6Z3m5p6b1WHL3R0tG7rFH0FktP76/i6c2Vgd5TJWgO ac4yo+anmp+z5zQ3NL9lDno35ZYM0kTmk6ZLHtZOb5a+Qu+UTtJbgh/qn9U/ yy7AGv4p8ROMsSdZBpvCMtmnWDr9zuoC9hLbwRrYTvZV9kX2BvsW+xI7zP6N 7WM/Z//OzrH3BB37P+KnxE+xO+I58afsrnhFvMoGxOvie4Ig/lr8tSCLd8R7 glaj0WiFUZqxmkeEBM0ETZowRjNFM0VI1mRoMoVxmlxNvpCi+ZLmS0Ka5JU6 hInS56TdQon0pvSm0CJ9TdovvCj9L+mo0CYdk04IEen70ilhpdQl/Uj4K+nH 0mXhs9IvpGvC56Xr0m3hH6Q7siRsl0fLycIeebw8QXhLTpPThQPyk3KW8B05 R84VvicXyAXCO7JFni2clOfKxUK37JSdwjnZJVcIP5Xdslu4IHvkxcK/yg1y g3BV9sutwi/ksBwWbsir5FXCf8h/LXcIN+V18nrhlvx38kbhjrxJ3iTck/9e /oIwIG+Vt4qy/Lr8FVEr75R3inr5DfkNMV7eI+8RDfLX5G+ICfIh+bCYLB+V j4qPyiflk2KK3CX/RJwgn5d/KT4h/0Y7WizQJmmTRJd2nPZvxXLtSe0t8Zi+ Q79e/A/6D64vAg1sEv8k334RfAV8DXyDpc7YwMl+RTmqdNh+bUaEk/2GclSo YIr9Fj/y9ziIi2zG9M/on2Gi3owY0aA0WbgkXEKs/lz4OWK1R/glYrVX6GWS 8CvhV4jVO8IdxOo94X0WJ2pFLdOLo8XRLF5MFpMRnxPECSxBTBMnskRxijiF jRGfFJ9kY8UcMYclic+I+ewR0Sba2HhxvjifPcpnhqWM+syoz7AJGN85dpFG mcTfT9gzWL09w55tn2G32efYi+yl9iq7x77I3mh/0d4GeZl9Nfhl+yv2jfZX 7a/ZX7fvRGmbfY/9LftB+xH7cfspezfOztov2C/be+y99j57v72/iBVp7ZeL DKCkopSiScB01IpRUSZaKnQ2Rv2DVJRLbZX2SUUm+1tcY9HMonlFjPddVGw/ W+RCPTdqLChajLEIcVjxLA1zN5Hx//z5ZZaKlbaDWbHSvsps7OvsbfYs+wZo FjvGjrPZ7ARoHjsFms9+xv43K8Q6/DdWgpX4c+ZgfewWc7LbIJegETSsXJAF mVWQNyvl38i/ZVXyHfkOq5Hfl99ntZgmDavTylqZebXx2ni2QDtaO5q9oB2v Hc8Wah/XTmH/TVugNbFPaS1aC3KBgDV/iGbCxN9uFV4G94B7wX3gfswOBmLX qmwgnll4CtRDeKqwl7CvsN/OlHO7FmxQy4nsSVSeYp9kTwdn2nPtJvtM+zx7 sd1ld+M8SgvAi+1NoAAoDFbKA7iywr6Gv8HUXNW8R+/F9aqXPaBU+Hore4x9 DVSA3HcB47kOMgtxQhyzaDO1mcyqzdHmMJt2lnYW5kAwpBmmQYsBsxLPhEKs ssL94EPgo3QUCrHqCk8wlr9bvdbFhDlzxNuFOwqP/VF494fww+rt+JDrD6v/ oPYfx4YdDyh/kO6Po3e4zk8yzo86pofZ8V+VP6mdv4/2fypf/bH6fVj8DR// w2Lzk4xr339i3H8ovzxM74ettQfFycddux+W5x40Tx9lHB9W76P097vG9LB6 H5ZDP+oYPm67Pyb/Iez4pDoftJ4+bp/Dz/d9hDr/2bH+vn34h7BzhEf4L4T5 U4Y0Scqgp4yRz1D+/D5D2cF2D366YE5jxeY08xRzhjm7AA+/5owZfTgySDMg mcw2XOM8x1xUYCqYZy4tKDZXgW2cUAIye8yLzI0Fi80vFgTMbThbZl5dcNT8 svkV84vmjbiy3dxofhUlr5lfLzhUcML8unk1yjm9RqRqipbwTwr0FkRXovoM W0fPsAtAafS3pRPZp0GT6anWyH6G51kbuwiayfrYr9lz7Deg2WKv+B6bgyi6 y+ZpHtOksULEzHRWBO0etmjQA6bdbIpJNO027SPmkkjHfUPoAEp354XVcs6H wcdQHr1+gKy2wupxsFqibyXQ0m8U6+hpXM9/mxQkYVSjmczGovc41E1ho9h8 UAL9zXMixvRZNob9DWgs+1tQEvsfoEfY50DJ7O/YRrTZxD7PHmWvsn9kE9h3 2XH4oxs0GWO/BX8IWkmrHxxfQa94u6C3oK+g38RMWpPBlGRKwXGSKd2Uaco1 mUwzCy6Y5pmKTS6T27TANNO02NRkCphS0OY+Mh0y5Rb0K2Q6Cl2M9N1PJ6Cd Uxf6WPyBq6dxRemX02LTOVP05yL6HU5XYFcxkYvoGuzrIhuH0w3oUiigUgpR 2LTCtMbUAV5v2oRjp2kreu+Exg7TdtMu016ToeAUroahPYwr+4HD6TR4jUq3 THfNIum7j8w6aFeog3oZQuZEcDL65T2nx8rvUk2qbU6FLcMpbDZipgymroJT nMzTzFnmPPTVRdY+yEaF9qtEZ2YLzZvqffMs8yzuV+ACcyEwQHVm0Rg66ep2 s4PKKqAhwPWYa80LzfWgZnPQxMwRU6Z5FTSsNa/DTHKZey3dvAF6TebN5i3m bZgDt3kHzhdgplLMu837CroRT03mA+bD5mPmk2QPv5pLcZJufhe0m9cwJZnP mM+bTENtpjjgEYBZNl+Cvqvm6+abqo4AavbDAreZ4hsjGICNQItk0YPGqLGu Es65rQOW8aA0yxRYkEvxb0KZvuCCEm3Q4YInXIRu0qa3ZFjGWPTkucW0OpqU CEPdFUSYE0u2ZQbmjM9wk8UGnUbzdcscXNlv6uDjw+hPwtZOzG0HbA9TtKRb ikCliI0mip2wGmudVG87RQDKUKPDUmXeZvFAXoTy/ZZGy4uWNssyy2rTGsvL llegYS+PdstG2NRBVr8Ku1+zvK5EPixHrFl2YhxRL+wBvWU5qK4wpY0ea2KX ycBlxNwsijzEx31e4H7hUZMeXS/mAfS5hmIvjBhdYMq0HAEdt5yydKPPs6AL 5rWWy5YeS6+lz9Jv6bcyq9ZqsCaZOqwpNFaeDfhxr3WSqdiabs3ElVx4ejv8 GLSasFruWmda51mL4Y9zpmLLWavL6gYtMO2y9FoXo3aTNQAfXgEFrGHTOUup dYV1jbXDuh49zLRusnZat6LWdmuSeZXFZl2DOG2y7jKh1LrXuh/xu8aUYj2E Mey1HsW4iq0nrF3W0zzy0fd26znMdzFs5Jlru/Wi9Yr1mvWGucK8zXoL2u+a zpk3WHpMM238I30dpHOmsLXJlmjeYEtGmw5bKsq0iJMO03r01cF9HM08NqNt mi0Lcci9sMuWZ7PYZtkKbQ5wha0WXIjShbZ6W7Nljq3Q4rEFbUHrTFvEtsq2 1rbOtsG22bbFts22g69fhZANTtNeZBu5P/uzvD9rxn0A/+R9PP/bpLybTMif wZLzekF9eX05p3JOZe/O3p3Xn9fPZf41D/nafG32uux1+YZ8A5UlgVJAk0Bc Ts9P5+XPHHvmWHZtdi0/53+7o/mJ5hz9zVIHW4cYeYWtxz3KBtxdaNlm9gUW j7urrbjzEHDboieL6K1b3i4m5O3HcS+Oh8TbWfvz9o7wCI/wCI/wCI/wCI/w CI/wXwbzz/vpmxVGPu//c3yeFEX+vbl377w2Qv8/En8f8Xv/revfMiP9pvVi +v6fVvrmn0P0m9bfpt+0vkTf2/NLyhq36W3hEf4+QjzG3mQsLhmcCjaqPA2c Bc4DW8CzwIVgB7gCXAteqNZ92LFe1cGPzcPO+TGocgS8ashxLXidWm+DetwM 3qLqjR63DTnuAO8G7wMfUPXvVq8fVu0+Bj4Jfhd8Zsj18+BLaj9XwdfBN4dc vw0eGDzqJLAePAY8fsgxbdj5FHDGA45pD7meDZ4xeOT26GzgOeAicCm4CuwB LwI3gl8Etw0euc26ZeDVKr/8MfmVYbxR5VdVe15T+dX7mXw3hD+g53XwTvAe 8Fvgg0OOR9Ty4+BTavxgjnTdqj7Mm+6sMi+6C8p13WX25uTuyWe1zdrmyRcm X57co90yuXdy3+T+/8fed4dXVWztz8yeffbOSUJJoYQknENLCAFOCgFjRKSG EFqoIipdqQkhVJVmRKkiohQREVBCEREUFFEBlSYC8iEqerGhWAC52JEk31rv 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 Cq6FWMG1ESu4DmIF10Ws4HqIFZyAWMGJiBVcH7GCkxAruAFiBScjVnBDxApu hFjBjRErOIBYwSmIFZyKWMFpiBWcjljBTRArOAOxgpsiVnAzxAq+BrGCMxEr +FrECs5CrODrECu4OWIFX49YwS0QK/gGjF9LjF8rxApujVjBbRAruC1iBbdD rOBsxApuj1jBOYgV3AGxgnMRK7gjYgV3QqzgzogV3AW/q+2KWMF5iBXcDbGC uyNWcA/8eronWQPvf3glVEzHFDGDjqniPjqmkU+eRTn8rq27xUaxSdwjdopd lHOIjlniLXFMzBaf03G/+EacF/Px+/AF+H34g/h9+EL8Pvwh/D78Yfw+fBF+ H74Yvw9fgt+HL8Xvwx/B78OXyflyk3hUbpZbxMvyOfmc2Cm3yW1il3xB0j1B viRfEq/JnXKneF3uk/vEHvmGfEPslR+pSLFPRZMPuaQSVaIoVRkqQ5Splqql KFdtVBtyONkqW0qVo3KkUnvUHmmpfWqf1OqAOiBtdVAdlB51SB2SjjqijkhX HVVHZYg6po5JrzqujstQ60XrRRlmvWS9JMOtV6xXZAVrl7VLVrRetV6VlazX rddlZWuvtVdGWPut/TLSesN6Q0ZZb1lvyWjrtHVaVrG+tL6UVa2vra9lNeus dVZWt76xvpEx1vfW97KG9aP1o4y1frZ+lnEcbVzGc5xxWdMqt8qlT9Of9GuP 9shaZBKurK3DdbisoyvqirKurqwry3q6qq4qE3R1XV0m6jgdJ+trn/bJJF1L 15INdF1dVybrBJ0gG+oknSQb6WSdLBvrRrqRDGg6ZIpO1akyVafrdJmmM3SG TNfNdDPZRGfqTJmhs3SWbKqb6+aymW6hW8hrdEvdUmbq1rq1vFa31W1lls7R OfI6natzZXPdSXeS1+suuotsofN0nrxBd9fdZUvdS/eSrTgqumzN8dBlG46E LttyDHTZzrVcS2a7tmvL9q7jOjLHDXFDZAc31A2VuW64Gy47uhXdirKTW9mt LDu7kW6k7OJGu9Gyq1vdrS7z3AQ3QXbz2l5bdvc6Xkf28IZ4Q2RPb6g3VPYy K1d+J1w6PKIf737h98oJsZ8OacVYMULZS+wlwsKb8fVfPvMvn3mFz/zNgmJg QbWwL5pjF/xlJ3/ZyRV2Iu1h5FkqyVoq3Wqre9NOLVO0pNXt1ex8PhFfYe8j pEeGOR1p3ZjttHc6Ic1xOiPt4HRBmuvkUdqeqG5I2zvdkeY4PZB2cHoizXV6 U5pDcjcibe/0QZrj3IS0g9MXaa5zC6UdSO5WpO2dfkhznP5IOzgDkOY6gyjN JbnBSNs7Q5DmOLch7eDcjjTX6Urr1/ZOL8Ic52bCDs5Awtz/QCPD0PNsZ7jR zAijmZFGM6OMZvKNZgqMRkYbjRQajRQZjYw1GhlnNDLeaGSC0cgko5E7jEbu NBq5y2hkstHIVKORaUYj041G7jYaKTYaGUr9z3bGQCMToZEp/6FGZhiN3Gs0 cp/RyEyjkVlGI3OMRuYaW5lnNHO/0cx8o5kHjGYWGM08aDSy0GjkYaORRUYj i41GlhiNLDUaWWY08qjRyHKjkceMRlYYjdwDjcyGpTwEjTzyH2pkpdHIKqOR 1UYjTxiNPGk0UmI0stZoZJ3RyHqjkQ1GIxuNRp42GtlkbOUZo5nNRjNbjGae NZp5zmhmq9HI80YjLxiNbDcaedFoZIfRyOPQyBpo5ClYyrb/UCMvG428YjSy 02hkl9HIbqOR14xGXjca2WM0stdoZJ/RyAGjkTeMRg4ajbxpNHLIaOSI0chb RiNHjUb+y9jKMaOZt41mjhvNvGM0867RzEvQyKvQyH5o5DBbCr+bg9uNJ2vJ IlLeKgfIwTJfFsgxskhOkJPkZDlNTpf3yBlyppwlP1DdQo7gPxlv4d+ByP6S /xNmkBwklBwpyXfI0bJQ2HK8HC8cOVFOFK68S94lQuQUOVV45d2yWITJe+V9 VML78n1RSeWpPFE55HDIYVoXKFoXeNVdarKaoqaqaWq6ulsVq3vUDH5yogar wdTM2xU/uaHduah2xe68Nj8LkWO5P3Q9v43QwhO+3yTqXJFHpcmxJC3UI+oJ rEG43kfUMvWoWq4eUyvU42qlWqVW/6FeRfbS3FphPW6ttFZZq60nrCetNVaJ tdZaZ623NlhPWRutp61N1jPWZmuL9az1nLXV2mY9b73gecyzyvOTZ7XnCc8l z1on1on3rPdssK71bPRsdmp6tnie9Wxzajt1nKpqlpr9ZzpQ96r71Ey8R/HX +FezqN1zaJ9Zi3aSC6iHC+lIFA+LJaK+eEQsEw2h9cZqtBotUlSRulOkqvVq g7hWbVKbxHVUVjNRXS1RS9UcNVfNU/er+eoBtUA9qBaqh/6U97BapBbjGQqX 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 5wzlEJ8/yuffsvP0aeKPjjyTQ7mJ2e7Df0eTE7ObvQrv5RXi53nCf/JDz/Dr ex/lBv84uya0l8SG3hLd5+7kTgyX0p9Dto18IGwQ08EDm9jojng8FvcJsgEk XBLmY+FWYuatEfRIbi6CE8SIJWPxmB7gS1CB6DnDLw8VDL+MvQ8R39DpfB/q fvxrVkR9kySJTangz3G65ORkJSFMcFi8Obl5/M7GO5ve+iR57vq7ntvaemeR UnBty8J9axtzo0l+ww/mTPR4//OdtjOnD101J95zKCUtcPF1t+2vCJ1MUejo OnCd1+DsGaFXm7sESW8QDSJnILJRNvJE+gPoSSKv1xPxD1yh4eMAKVbVGyoY YlYdUterT7W0RZudgP2rq9FZ8BKv7OVV4mcNRxKJezd++Jk6Lj52+M0WbrLo 3hu6eG9oJtWU/j+LatRUPzoPgSTccngU0fG8XpK5j3wiCRfjxbkiH86Lokw+ DugKJVldBbRf1utq1NaPs3CeqlH/5aqoMWHaKsQr+IbPzuPCYoY/7HuYyNyb wpWhppuHH0ENCVTgeeRKMRMy4Q5NV5Mr2ul2R0ZjzDQNkt6ASXFaXR+446Kj J8Rl4j3wWDjgcgARL3rHJhRZ/xyIK9HsxdYAegDqHqz56irCAdhUF0EHYPyG LdHhZPHqQoqI46gzybN787w8XWpZ3OhaE9o8heXVmd33bF0wPSa5Zst8e/bE TGtD6JMYcmJ7y+NNPQObitLnb3vgpa1NdxcJ0+zxDmPBxdd9565Zs9fXZQiy QSIHbhzuSk6buja4btlPf3Tf5vL4BDqfZTifLerKm6/ZKEomMuH1RpwCQFct GT/WF4vwhwBXyPTPKaDewIde0XLGcsZKjaAO/0sLqnOVp62uPC/XEnopng+L D730FMmMP/dRHMkUtu/de86+bx+QkWdQl73qSfIhTRenWaczSWJ4uBG9is1g JGC1FYrhgyNvDOgjucGRF1Bbj+DhdYLM6cNlkyQZzaZCg7GYAFs2zOmg955C A6Zw3eHKoy49H/2ZP9LHZu+hv7dd1ZnZ7TJR+BSeujS7Kw/92vMPXu3vCL26 aV5E2bH7SOkz1c5WEv0r3kfyjw1/Sv74dOj4uddFdyji3nvJezgbdrRAP1rA DIs0C7h1PDGDwYQuNSAZeMlcaCrUyYXSmCb0Y8vH9Rh9xp9z2ufP0ZZj+N8o rCprpFq6eT9/1euvTr+y4V4iv/Z8+bVV96Jy0vCK0EL0vudCZ7mTpJf+nsgM 3EtduJfskA7FTLeTYCbtEAEe0hEw8FGfGoqSPg3A6CqnfvanQ1QT/V9kYf/i mBvF96RA6Ovz8x0gkDNPPZVYufLGR3p+jLjipuNktXtqc0HtVUtmZbvc+S0a Z3v7pe6zTw1sr37n37vP/mRg+xx+Y8nKOemzNtx29/5AyYrqCZWUQ+1L0K4u tGsUKLBjdG3F6fSx+lij3oDuFZyRBoiESIN1kPQF7NEGZ9yzkbxOZ4j9Q8BY aChW7VegeaH8/CG090+H1LVvpR4gx0e9wJgvs35Vbfbqw12vUB+mHRpkp9Nl n4Qi6gP44KlVZsU3I6WhbwC9a1379Qszc1qvqPHnO5SXDs7bXrulMZPclV2Q ZKHOLrl8SeGcq5ZVRdiXVnOlt4dqMqq66O4Ow1nLxFnLg2tG52wC6QMXhJF1 D/tdGL2i9xGig4SRUwGT1VmRkPSnsAkQU4Ruy3RU0v95dNLoWxAXzvDL6aPv GXYMcp8A79errs59FpeS53RqByeJHpHoyUl7oaIx4iRqEHL5pGUdjfHe8qOX tu+al5Jd3bWsqzq7/JpnrvLW1FV7vBW3VMzfWpeaPRflc7Or9rxq05ks+oMx nsSZDdlZxVN8OVOruopmX7eiUDKG6Q44Xd6pczMzi3NRPqe7ZN7NKwqojV7B tRFUT05F2sqw4kmNF3hBFonwcUAq5NXpY6egM3TsbIs9fGEuezEp1HsLN4S2 /PqhX4e2xPOPCFd+tkW4ch/ty4t9vap6uAGtL5deJxmNcphZEGwgcxYLCRM8 hoDp5Mi7YEUKH3kj4LIYw60mgyCbzbJefSVypNgGhaOeSPVFo66IUO18p3NU 90ZXJbo4VPbo39ksHRv1bTKOz8/LeaqDswuvhu56qyys5oO3Dt57mbKUwKZq d9qH9PBKXrz5ztA09CE7//g8eXv404MP8cepBQ7gzUBCCxigVbNAjJ4YgCO8 EBB0kqjTAVodDxMiNWyhum/QzdJFF6VusuhIyxn1SM5eul9SVlUV1WQ+WJSG L1v40MLQ88/fPXUTWY4aDYYyySt8SSjh1IPkA+rbFuAuWStuR++QBds1rcKN sqyIAp+UqAiKIkQPkuUBlyP2V5Y6s6zwYKoV64X6pNTHAzzUUIOp7zu1+wJ2 wkRnEHZaPH3aSvyjyjr/a9Wp/vjGRzOH8bKSN3YO4EgE3TJCXh47d3K3V3Rm NDz4mKA32Uz3RJU+2VtxcVlC1Z5XQueKZqXPq6uckWFK83VOqNvYNMVr5j81 mcm95yrsM5ft7/v1+suzmzfP3j386MrhpkWXpJYtWnHptOciXFNaetev0c6j JXwIYqBHs4fBJUdFuUVCYiyD5OKAPTxGlkhUjMUixdQ63gyYaqS52jYoUA82 +TbVRarOEYevjt/6lVVw6PaZfJ5fnolO0CkruZOYR8BV97w2TKWuo6/0u1vT D4e7JydV7Fpda5sd5OLVUb3rby1Jfe6J0rZp7vnXBZtD2/FM8SmOpIo/B9FQ FPCCxeayRLoio6L0Dpvr5zwhFketXi8ZTG9LNZE/h7lQgMezf0NtCujVj+73 Z6nDtmpTSJheLgdTSqZnGr9dyeMmT05tXdwz09+a3NRZft2mhZE+kh47XB37 yvWvxPDvvVu8aJpb0u23BzYfXfe73bu5Z3fT33JAzaaijeNgeiDeJbndJDYO 7Rse5yYyb4qrja21DIWHO36r2qmgYCjfNzS2FZhCqlnPs5fLwc6RaK1nDNZw k3hPVGL7uv45uauzY0uKpjurL+uuzk80VAU5/cTLt2/Neje3tTjZbLxfb9IL GVUdF6+ciCZDze4f+QhtFsL7dmFA4YQkWXDJLlMERl+MHIF7wiVZ4NcTaqJ+ 4anR/8JSR61GLxRMN/VQ7B8zmWooCRdubp6DLeU8ey7aT5LzcnOo11d1R+fv SE7m99TetHG+3RhRNG9ChZLcNnnW2llRtnJH0WyjKyzO6rDMWD4rzhI/f/nG YufE7PTwzMV8+6wrDi2eurzZZLxJb0yce1kraV/eSbg9nHv6opKpCwoTOEHi Dxh1uM9J9cj7fASOyw4pkPIYRJGb8Tgg4jMc4kjCQEQNDJKEwwY2Hu34QkZv 9NoetF+QJu958lKdURlTvd7cFEd0Rv6Amk7HdJ6aJt7ICblxcfnp7sjU3NiE qelR3GuqZErGmAR1Qx/EV6MP4vHl7DuOd+fKIxxnx/voFSjSk2sH7JwwSGKO hNXx9bga6NcTQ3R7qd9FoLPjL9CLr/7tt4N7Y7IS7M6kie5YH2Jyjrj9sz8L 0merHYovOnZiosORkBUdm5PkwP7X8kEhSu1fhuyTaJVavFgLZPuADOQEJjjg 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 KpuwInuxdkPWWmHtQGWkOupur+yqXgJcVr3cfbhyZfUq97HKNdVrwa+H5Fjl RkjaK7cAT1Zuq37ZaapEdXX3VO7m61W5r3oTIeJceZBHuPIITudNlcfJt1M8 epVniO8dhhcJLxNeQyavrLxJ/G3COxx9IqGBW/Dxtcv3JWMW53yp4C/4sCPc fb5JdDWbNPHE6G70oY65r/pmDI1FmcNxA3TspMlrmsdXpuFh13mfj3RW09Va Qjw3unf5mjHiDV+oqgeWoyRfQriccNUwXEvI33Gf81EV8vFq0+fbXm0o7PHt 5Our4R5+pvionvgOER4derflQw1x9/tOV7/iHvTxijEH9vcWMd/56lWwf4lG uRR71wb+CkmuqHsWOX/Odx3Y57tVvT3+fvAOl6Oy5Y7YHer7PoV4ymffQPVO XmdIMoPQTpiqYtXWIr13DudRjXOLEn13+X7xJcckvN4Sf0bbHZbYHkQkt1I1 3laUVCX5t1FNfi/uU5GJ7HH6zIrRp1Xq51Si9gkV/2xKpk+l9PR5VAJ9EmWg z6BG0adPRvrcabTgE3wskT5TGqM7qrvIFN07up+y6boBSWAuSS8lMa+ULD3F AtKzUh3rMBgNOewf6DOlE/QpwXeNs42z2QV4w39K/BRj7Gk2mWWyLPZJNpF+ 77SGLWDbWQN95/7/ZF9iX2N/zw6xH7A97Ifsp6yX/UwwsHfEoBhk74oXxbfZ HfGaeJ3dFW+JvxAE8V3xXUHWCTqdoNeN0iUKo3SP654Qxugm6DKFcbrJuslC si5HN1V4TGfSWYUU3au6V4U0KSCtFZ6UPiftFZzSV6SvCC3SV6VDwovSN6QT Qrt0UjotRKXvSmeExdJZ6U3h09Jb0jXhJeln0i3hb6R+mQl/K+vkRGGb/Lic JuyS0+UMYa88Uc4W9stT5Hzhf8lm2SJ8Q54uTxe+Kc+U5wonZKdcJvTIFXKF 0Cv7ZL/whlwr1woX5Dq5WXhLXiAvEK7IbXKn8CN5ibxEuCmvkFcI/yH/pbxW uCWvk18Wbst/K28U3pU3yZuEX8lfkL8o3JW3y9tFWe6Wvyzq5d3ybtEovya/ Jo6W98n7xET5q/K/iWPko/IxMVk+IZ8QH5d75B4xRT4rvy0+IffJ/yE+Jf9a /7hYoE/Vp4ol+if1fy2W6nv0d8Wjxs8aPyfy/0vZy14EJrJ0/pP8/OUa+RjL u8ZS8yK8OZapvdryjzpW5r/Cm2ON2qutYLJjPe/55zjICxNjRqvRykTj88gR HaTJwiXhEnL1h8IPkatXhR8jV28IN5gk/Fz4OXL1XeFd5OqvhF+zBFEv6plR /Ij4ETZaTBaTkZ9PiE+wMWKa+CQbK2aKmWyc+LT4NHtEnCJOYUnis2Iee1S0 iTY2XpwtzmaP85VhKaM+M+oz7AnMr5ddpFkm8c8n7EdZvf2o/YT9tP2s/Tza JfsV+3X7LfuA/a5Dchgd4xzjQWmOTMdk+xVHjiPfYXPMBM1xFDk8Dr9jnqPR 8aKj3bHQsdSxwrHasc6xAbJ5uL7ZsdWxA22XYy/1B6A3J94OkxZvC+Nt3rB2 jO6JtZOOHtzT7jjnuODoc1x13HD0Q3/QMW8Oc+yYw+boMRchwYnIpmHtnsS+ e4l9kaVip21nVuy0V5mNvcb+hT3HvoI2gx1lx9jz7DjaLHYSbTZ7k73N7NiH P2BO7MQfMhfrZ7eZmw2glQjYcqyUf38MK6NoliOXBObR6/Q6VqlP0Ccwn96o H82q9GP0Y1i1/lH9o6xG/7j+cfZxfbo+ndXqn9FnsU/op+tnsE/qZ+pnohYI 2PMHaSVM/NMt+2rQOtAG0GbQVtAO0C6N9hJNs69D20C4zr6ZcKt9h30XcXvt B0CHNbnajpH8pL3Hfg500n7B3me/ar9h77cPOhhea82hByU6ktQGPkmTJzn0 jhRHOv8EU3dD90v6XNyoRdmPlopYb2EfZf+MVoDadwHzuY5mFhKEBGbR5+pz mVVv1puZTT9HPwdrICSmJU7if5eAVRnNBPt6zMwLqgHVgZog24i+FRTRrnVB tkUcsJfZo38Q8r0PPUiv7H2uP0j/fvd/GB/K7iO/n+0PY3ekzd9mnh90Tg/y 44+Vfls/fxf3/7+K1R9q3Afl38j5Pyg3f5t51f4G8/59xeVBdt9vr90vTz7s 3n2/One/dfog83g/vQ8y3n82pwfpvV8N/aBz+LD3/SHp9+HHb2vzfvvpw445 8nXtB9D5Tef6u47h78PPh/SQ/osQf5chTZKm0ruMhz9D+dP7GQr/nzHjP10w nWaFptOms6bzpkumK2jn81cDr4Nu5a/O32UawDVOd81S/q78c/nnzJLZaJYg Q4MEzTzOPD6/35xmzjRP5rw5x5wPtJlnQjIHNA5XxxdsKSgsqDEXEXogRwOP FrMUk/CfFBhnIrvGau9hq+g9bA1aGv196JPsU2gT6F2twt7E+1kbu4g2jfWz X7Dp7Jdoz4v94i/YTGSRyGbpMnSZzI6cmcLmwLqfzRsWgVqWWbDbVGuq58Q5 EO/rh7VmXKvNLTGF4teioCWQh9D49Wby+gV4/RijX/hmeqan3yg20LtxI/9t UjQJs/oIk9kjGD0BuilsFOP/R9EY+rvlsZjTS2wc+wu0R9hn0JLYX6I9yv4K LZn+T9TH6P8QfZxtYJ9nT7D/zY4hHj1oEzD324iHoJf0xqH5FewQBwp2FOwq 2FtwoOBwwbGCkwU96M8VXCjoK7hacKOgv2DQxEx6U6IpyZRiSi/oM000JUFn x73NtNI0ETaomdbA1gGyd08zrYd1NNNG3N/3nqtbcK86LjXTNoxOzdQNL+5p pt2mffBLTy2R2kHTEdNxUMp72qm4nTNqw+jUTFmmqcCpJpNpmmmWqdBUUnDB 5AXVmOpMTaZWU6RgKWkkmbowzjJTTezOuIVe3DdVa2swh4umy/HXsXYN1tU2 i0YZ3m6CbptK+Mh8bK3dgQdqu4yrdSPabtMss2iKoG0sWMqb2WCaah4LSube 3sfHLq0t0xrZNqfSymnRNyvmSTyy5mxTijkXSFFCz2dQaM4GV2e2kL1tsHCG 7Nw0zzDbzXZTktlVcMBcBps+WKg112ONtyGShwsumJsph3rMIXPUvMS83HTG vArrxzOpx7zW/HLBCuTTRPMm8yvm7ead5A+/OpEy5YJ5D9parlFw0rzffAi2 hvlMmcAzAKtsPgp7J8ynzWc1G2fQ70W8z5jP8/w2TzJfgo9XzJfM1823zAPm u1quaw2vsQLmSxYJzWgZh9y/Svl/A3cMFAyq2Wa+ZEo0X+H5BjxiGc+vWdLM d80DpnTLeMox+KrF7hLyK0vNMUumZbIlh6+wJd9is8y05Jh2W+aYplqKELO1 lnxTN+beg1yow5398BrZUnDB4kHzm0pwfZqae+pqcD00ZACXQaPGMs+8xNII /kXIl1naLQstSy0rLKsxwjrLBljYzLPdshUx6OFeW3YgAgOWXZT5NZbxPB8s e813Lbu0KBxAO2w5wF/x/YD1x0yxJ5pMEcsxy0nk3CTKvEnIuuxhUUiCpAu5 olf3C+68hDhM5bmHiIw1pWB83s5ZLlj6wF9Fu2GutfQjmoNWxudt1VsTrUnW FFONNT2+T7ymy9aJ1izTROtUq8k0yzoN9aHOvNw6y1rId5W1xOq11ljrrE3W VstV83VrBK3Lusy8xDqxoMe60rrGpLeuNzebkqwbecSsW6zbMF63dXdBv3Wf 9aD1CEY7bj1lKrSmWM9YBjFOr7nZesR6EbPXY47LSeOy9Rry+QK0blpv88xH pm223jFlIUqHkaM9pjqbaDPYxtqSbanmJTYF893AKxkqZr9tElo2KlRXQZ8t 12YxL7fNgEc1BRtQX2bBRo/JRLWnCZl5jFceU43NbnPZygquUgyabD5brUWy 1duabSFb1LYEuBzSVba1ePUy5Jtsr6Btt+207bHttx2yHbWstp2A5DTWSOF7 2JxtO2s7S2fRrIfPZ3+Sz2fNeA7gP3kfz/82KS+TCXkelpyXjjYxb+KUw1MO 52XlZeVcQcvOyc6bmjf12dPPns4z5ZlyJqFx2bS8aVN7p/bmLs1dmjcrb1bO 2Jyx/L4p46aMy1mFBh3+tzu6t3WX6G+W+P/YzthqtgbPKGvxdKFnL7O/Y6Px dLUFTx4CHluM5BF96pZ7nAm5Z9CfQt8rDmTX5Z56SA/pIT2kh/SQHtJDekgP 6SH91yD+8376ZoWHP+//U3w/KYr8u2/vvLv5Yfv/sfHPI37Xv3UtCUyh37Su k5KlOtZG3+RzkH7T+l/pN60v0ff2/JiqxgB9h81h/nmEeJT9E2MJyaBUkKLR JK3PBuWCLKAZIDvIBSoD+TSdB/W1oHqtbx7xmvchjaKgJcP65aBVWh97vRb0 smZ3k9a/ovXbQTtBe0D7QYc0+VGtPwE6DTqr9edBl0BXtOvXQbe01wOgu4wZ pKHrBiNo3LB+PCjtPvLMB+iN7DMfcH0yKGdYnw+ygWaC5oCKQB7ttV97PQ/U CHpR7bnPhnbQQo2WfkhaMYJWa7QOtAG0WaOtI2jDCBppZwdol7qehr2gA8P6 w6BjoJND9/M1io/ZAzoHugDqU/PBcJX904QbE/r1zWghUHTCoMIMsxS9kqgk KSlKOtFEJUuZqpiUacosUKFSor32otUodURN+mallfdKROlSlikrQWtA65WN yhboblO6ld3KPuWgckQ5rpxSzsBGr3JRuaxcU24qt5U7GWKGIWOscjMjmVNG aoZC/aSM7IzcDEvGjAw7p/h1V0YZXePkU7KIajPqM5ozQhnRjCXol6NflbE2 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 fry7P8F60C52Np+DPd1yvtpIpO9/+jG6/f5DR/3+M+cfP8aI33+olT//LP7D Z4k6i//us/ofP8aG33/+R9cDDFcT6rksF1N+/MSS/0FKvaBl/h/YS/3ftThF Tsic8JMrt4olpf6bSLVOcB7rbHey6DXdNOGvM3s3i62mhUtemiy4XNLW3sYe 9YQmYFnQ6ADapKtPa5bPBrIBdProQaePHixNfeyhT1QmvUSzSuKLjCl9fti3 9n7QS1s+Odt+U+ySUu9Se6n80F6qrV+iCS6Ep/qfnJq14zI/2How83t0uKbd 9XFvuU79GoJuau2kxVO0axvraa+gvhietme6DezVu//zJQP6x3rY3ZTS6mnN 6VHQb0D/gtgge4DS2Dy9W/XuXjxg4ICeJSGNBxQXDSjuVtKbjgi1B6t8zbPS b/m5vfv1iG5b0q1fUUh244b2IF/X2Dh7bXtCXGxsXHxCR/oaT4pHX+1jtv2v 9MzV7qzynT1lq9bZObHV7dUcX4P6N+5d1KtHcUh62yYhTdpmpTa2ZyREx9tT kqLTm2SkxFazV3GMKOBPR9S2R/Hg3t172Et52JMMc51ppdydkd4mSjlnq3ba 3bQem7I7Tug7/m+ZS4MOvn+rczPr+EtFc0bsebtLfhdL+CdTar9TKWxlrZkb z7WYmOq/ecHYTQc61566N264z4s3k1NS7+Y/6FUqet24/k6DyW+ULY1Kyu9a VLtrvtuD/ZVSBmyZeaaB6+hVri9OSeo7YXK4b6XyLddb7XqnhufVvMzpRRlJ 4WUJiesTvvrp/Lm8714fGftmq+Bnro8485prT5cgtzjftKhPRy89dv2nea+K ix90eZgy+n7tUZ0KDiXn1WnzXKfxXY4FBTxI2NPlm4h2RbkL37oxgrXLeC5i XkT7ll/d3eXkN2dMZqT9wE/xIYXXen+47fSHWcftQcmn5+WcXlulydZNeQ2b td6e32uW0GgdLS/lTsSIbg8kSgPd6NThtbJSfNv6r3Vd2tjn9vT9m0/V3LW4 wwnYUCCdU+w+o72qJNz/LCejyHazwYPBD7bV3PJh4jZ3e64qECxb2VvYmy1p uqTJhMa9SkqKUmNiuhcX1ur3aJ5qdR/QL6aob2+ljSkqHlAwqHvJwJjH06hm EZNIVlmLitg7WAxamLpu5Vy2tDe3Zz76bhcT6poNDBky5M8a6FH839RcYvdU /a0mXey2R1Vqxh8WpKas5KUjW4Z/E7PnWvsdxwdeWJdz0qf2/u1HfzlbFtRj x7XM7xdkTNR79gmf0Lns5Q4X93efnjL6ByNjRM2Bb7i913Dd4Y/XzV6RfKeg 9lf7Pv35mPXY+ivV7vTedDrjclnPuLpn5+6LC/3lln+1JZ1dGkVViE8tHfvw ZuC2PcdeXfFqtRfeXl+8ZfHmK8dZ/qSitW81z556KyasYOWaq636vhYVMPTG 6uWx52d0nbGif9ks4Vo/qqrr/j7hY9qMbe7xzqDu6et6G/u165ePO99sn3rj dvFqm8sP7JOwtzaHFW+79tFC54glow99/dXZ2j3t1zJ8K137pfSXZ52H7V7j WhZQrk3pvrVVRVGldfS28ePqXF7a9Nvj3uTGbpAbO/2EG9tSYbNtyok6f/sc bnjLH93Y0P8VZ1HFHupY9P5P5hf0CGnb+/n+VOtjRxZvj41LiIuLj4+vrRxZ ArmxR1/tY8b+v3BkZnHtnxT/l47p2815y0Jc70eM2K0PH7Xx1vXBGyLa1k+9 0GDktunxV5+pv7KNd0LuyuPbp6ytvyb5q+jsm4k+WbdbDbvgOXjilqg7z+at vf7V2RqDrlQeX33B9/ejFzdMqunc4MGeOrvezhs0yyenxaH4fclbvr/+0pof G3rnGT0CQ5PvRO0Kc/Z4w2PRkLDx40a0frvyjC0/Li+b8oPL/KwlPx60hV5e 9zVPavowprTPGO3HtYkXZz+z6EGL026lF1JeqVj29ZlhJRMLvsr/qFqtyE2L KgW7Be3cu7nqdrfs3V8EzMprtmrojp0Xjv1cNDyCj3srssbx99bq+leX3F9o 9XBjXpWxNa5/vK/5gW+rj/vkpf2NnV9j+hute7yw75Fj6kqM5P3ZQtWe8FbP vrCqY3yr8/Oso8vHBe15+efiuIb37G1UdgVJ/mJFhj39j/NDFqK+6p6R8bGJ tRNrJvTs1tOenxwb3a0gPjk6oVu3+OhuSfQ1OSm/uz2RzoAJ3Qp+5wAPV/j2 0KntPh34weRa8T4+b7ecbwu2t3c4wNZ2coFLyAVOaPJvOUCyZbJkMuIu9pTo +NjoOHusHS6w4xMuMMtOTvAJF5j2dC7wn9Rd8mf+LvZs/8iKz8SP+XTR/us/ p55Ob2UsvtX5yz7PvTn0uFi4e3CvxTOWLnT+cNSyqXdb7Xqt9gPXS18t+KFT VffK0yZ6p464sPHYtoOFu2pHNRlZtUJuuN3Vtbzpd5r1mys9O0UNXxS41uOX gC0l91r37rt4bdVx52/OWfLlwBW3+/hvaJG/+O6I971GZR5ttTX95zt1Z/Vr dO7bEVd9lyzo1csp4mcx93YFbdfzORs/+K9tA1ed6n60+eW0K99nPSxfeukd 4VmnU8gX7eov3zSjQWzKoIjOcm1Gv6s/Dhva4N3go982+XTT5U5pPw76+GrP 7l2PfDp/3MvTqtp/up1wonvgG42eb+7W4r1Ut9s7X0tdnXKl2kxj1cSetG3T d5O/W+Hwd7Zu8eH+2K3F/tHNdYH3sDnNDJ80615UAffz0Yj4WD+77++UTo/n JTbaXtPhF6r+5hdyBgwg50AT1btn7+7dSnqENBxU0mtAce+SoXBmdnsK7cTi YmvHx5EzizO/xqmv/z/97L/yYFuLn83zsxe8Fzi/a0hIo9cHty1Mq3xmwJHD d7/rWzbXx+PSl6klY/3fjFkSd6P8i72Nsqp8WswuJD5jm3RoU0izH+702tCq xbSV7w5t8cKCptbzD6t9uWjQxOPrBqaPOjvmwvfv3ktacTCvycXNG+tdiug1 13/1yuKB7e/6zr7yMHF28ZIzg7sEDWkydnyKz4mBz+lkMtNWbu0dc97PuWxm SY3Lg2NyP/eyP3v/1LT8h4cPdsmIzX67uueVBvbjxTU8IsI+Ts6qtySu3oyj S1Ms4/Oy2pdGROpxb7Y427r7tVPR+Xeb1Lu2wWB/z1i6+ORzU8PbfjtsXfN7 GceT66Ys3j4kb6Xv4mmHK7zSvu4HG5y6aJ888mCdiZGOdnflGTw5L5e6XaPk Ce/1p55EOatAdynJAv9PdeceDlW3x/GZcb+NYdxyH0Rpxuxxq95yr3GJiUiU FDJy1yS5JIxQIsJE7jOIYlyit+lFjlBIbgkpySD3Syi5xBl6K+/7ds55zx/n 6Tn7j/0867f2Wns/a/3WZ39/v/U8e4cD/Kwcv4cmgmBmlo2OGfL3mw2y3svn NgzuuXwkqT/p5J48jOetvRXdKGDLt4sEIMzckpwgc9A5RjijB9L5A8ugBcST 2pYKiUNb4SuK/ZzmJOvBbMD0C8sMAX1gf6Zepk641t9n2bdqAsO11xG0QTGL TRQzABhQ3kSxXf+NkFtfMHpfev0rvyBgkPVuzSB5bNG4p3aJ8j2XcSjaI89w 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 +PGexCavPA6IbHZKru97K2DGzb/VsGB4N9JuyuuHmoqa6tG/+CS6YljqjB02 WoHJv3TIxHzqmfX1kD8Re91XUGMh+G1Rbq91IUcDkgeV2A+MnL1CmdauO8wW raBx117TIvx+bnNWnFUerv+i+tkeYTukaFOumbqqzD+QnTyS9LDh3Yplog8f SI+Hk72x4/ihbVa5EexN7flmMvv9o4+9lB/T3F5nK7Xz8yl8xVXvJ78ZUlfT bC10TyD9D7Jq8lf6YHkc1LIyi1APHgnwLa3F4ysCfQqztXfBsnkLzlHJh9H6 YqVvV4sj1NvnQnd0muFjEUInjMWkjGK627sv1AjM6eIjcIGT56tnEz12aqlw vq0c6zUgKX2y7hW65IvgE5/2HFveso0dHa28fIHkKjJgr2P8XPVXA+Ln0Abp d3yHvT4VdTMm4J+MRU5HDQplbmRzdHJlYW0NZW5kb2JqDTQwIDAgb2JqDTw8 L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDc0NTMvTGVuZ3RoMSAxMDM3 NDg+PnN0cmVhbQ0KeJzsnAlgU1Xa959zb/akSZq26ZKWJA1tKWlJF0opIE26 UgqlK7YF2pRSdqTYKi6D4oJIWRUQQUad0VEHt1BciiCi4i4qg8s4iiiKyyiD jiPjAE3e59wnKQWX0Zn55p33m570f3/3rPcsz1luUwAGABF4kUFGUU1Z6Zad w54GdtklAHEvlxYVl1RvmZIC8L4bQBxWWjmpJlDwzBaAD9sB5q8prakruO7j KUeBVWIhQ+dOLK4uBTMwzD8fA3STalxZ469+0wjAetDvbV3Q0h71+ZsfASSh 5CNaL+605R1Lw6iid9E/dmb7rAW2O5P3AjjjAdTGWS0d7RADDnx+BiYyzpp/ 6cyrdng2AYzH+As+nd3WMuNz/ZDbsfwxGD9iNgZo7zG8if5O9A+evaDzEkXO fAuAEAPgeHn+wtaW49e+fjnAThlA1IULWi5pj9wTfhWmvxnT2y5oWdD23P5T eP8Ktj98U/vCjs6AFZ7G5xt5fPuFbe2LZskDAMOx0kYf8L6T117+/HVXPNVs GPMNqFXA3a4PLcmc+8cvuOH0yd6v5E+ploIIKhCAHOaTf9X7FWuSzTx90l+F 8cC2QD+nHMbTaHpgCo5LEeYVwAgu8GKvrJaey0CUzRR2gxxU8s3ybCxyEFF8 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 PS8rzZVb3lpYubGzWKk1qN7WhIcpY52j7cl5GWmZoya2FbTd2TkWe/KZ4Du1 MnRSdkcw3Dn48UUm4vvyYbfCI4QGPCvLJa3yfduk5vuSSEczRwTujEox5Z3T 7/i3OMXnnbKKU92yiv378ZljcPR8+MwEaA7t1fowo5bFJYTFhcXFa41xWjw9 xnvCPOZDbnloXQgtcTgefWcE3Kh/ODGvh16k81VuRLao6HvbiMiWyWO9a3Z3 zL2l1Rn+2xPbdJFDx2WNaS7NMGz7K9u/5NHFeRmNV1QUTBArTt831pU6dmiU tXjeRLGc254Me+yotF9tC5118ZyhVkeE6UQGBlE0RKiUSlO4Qv9YYC9oA5+6 Y0SbqNXjkUIXpguLCPcoPbiD4pZ95uyTL+0nwV1K2qTCaYPKxtgz+9Mu0P8j RfL5ieu8kp+kRCW2nm9R2eJN/s+d+to3/Ecff3tVUtuxrdmG9FcOsPV33uPH g9Tpx46+zA74Ix54WZzGW70NW31SOsPMCp0dVegR8SyHpw25DBcHmQhKUcCu 8MhlQYPAndIVHLZYFzUjhr+XZNHg6X8wR9CGpN2U2YVfTzk5LQBMWJR5DYtk UexVfybbL1b45z/7MuN/SHceWlS+TAcx4ITLQiuiSa/HcR0a6+gRUtzhYkSV rjI2OT6gwjBQVSbz75Dd+OZy5mjOl738fOlsj1UMGpjxp+YLbVumESP4WT5X 1ItKR65eZKFDvVmyPTZ3w+bqrR+um3hp+gPtCl2YUfOcKrpk2iJ2ka0wuXRe RfYgXe7IYbObSsOie367mYm75kTpk3r328rm3bygx1E2JkWcoNVl18y9YF5q Ze34zjVFfEdIx3d+h3wZRMFQWELt34nhKW6DWWOzhunsOp1dq7EPju1hw9wG vTyiUlejrdFUDQ645aGW5HOTwZbgDM/Owo1Av0/aCl7ny173T8sqbXYCvdOk 4GlPORYXOrOStm6l0myWXpgd1VuPrPNc0NrgZKa/FI+zjK9vydqw2Z870lpY mJ+TrMqwFWFHTMSOEB7Y4vfvmqM2mvXyRv+dB51FGbE9PZW1iaMnNTSlH6d+ mIvWuRjbb5GpwAGXB08jDocpYY+QDiowsXw8p5hZdrehEl8msx8xOFi4yP8F yojuUBP6fldx5ncdu39mRv47Dr7aJH/nZc7M3+XExSl1tRW2Q0cdxXNXb583 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 H8hO/RZJfduomWiCVDmxmkGLyWqEnv0kaxmrMxkfs1rNlPg5VB8aNJm75c9S nL1MKAx9I7y7r1YlcqIgT3NQUV+y/pkV2sJ4odbpHkiUNQSVMmdZ/ivtuM2d GtTpatY1B+tq1jTkEJSAfEYk09o8DGNS0OBnQ9cywTooyV1QU6ZDmq0wbhW/ CLl4YdBu9Kr8iHQ1jJ4qoetxY1YWpf6RqjuUJnhCYYhv/rqcIZQLPaitYGLd RzcxvHNcEL5Q1129Ow/IIaqteuPg5uwtlQsSdjFuqfbctO23tDrb6K9WEVQo nJ1vU84tW9NacMetWf3r1/qqyg4xzohdIJL2bZHoNVK1gMmW5wU1dj+S/w6o FesgLwLMx2pJHIZzDL3AbhWxmcCJNwTdeCcK6R0TYjr/8kzUpdOQmpv6EBxO PeXF14CbRp7FG16FUX0TlE4rtHEnFoVRvfWYVYn2fN931KWAaeF9g4zcjvpI TrCiAlsBAw9XCfqkEJfEwy6S8j6sX5R8JCMzfSLz1jY+EeA3XnBVHPfEEs14 /Eab5aAdTY7invEgTphDC3d3Na2tdaiDdXF/UU7L9q6G5ZW2ea22oEl60Bd1 h83iQNQVNonLwyWeiFWWn9CHPf/N3reARXWdi679mPeDAWZgYHhsGBhewwww PEQQUBBheMwwoAKaxAFGGYUZOgygJrXWmMRDbDA+iDWJtTanTW1iE2LUpLnW WA/JSdWmqScxNvWkqTfNTWOvzcnNyU11cv+19p5h1KSn99zzfef2fLK+/9// rFn7X//6X2vtzd5r9IayOxvzUksacjKq5lWkJLZXFixfXGCw1BgXrbXFZ+Wa qY4Eg1qXpEjPS9JlpCSFvpWalxrPpXNx+gyZLhNfMd4Hmu4CvXCoBFW8gDKo 488bzAjFw+rmhTqNOd70PUNamkj3dPydlqdE7mifOR+5qRLPvyBCsoWauWEa N1UIO9DhaRsP/ij2l8k94C+5xqXrtroeyHigxV3NyZnUxpyv3/euJJ5Lyl8C HrMyo5iLodQLRpeXTd5rWB0czTNCxZNxmTbwGcUA+Ey8Mk4cn6FeqeUKwGN+ G9Ixe5lWFItSZ2IVInD6Y2p1XLzch/zgKuRm0ZXZWfKwJrFNopjYge5dsX1V iePxPzzW8MGV7VtCupzg1A96J34z+1Tj0TWhd175u9la/jkBHf15NPcXeO5+ 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 0a6AM+NSxtVFZq3xCwyQrlzcsr9E4YD3ef8pQQt0ei0fl2PlpixIeNIrfnDe sLmPZ698nzGn8BYJ9cUbTVpPTup7+7J2R5yLlP/57Oh7Mo3pTyTKhOOIaTGP FvT0TDfqc1dXo/WIxiHfW9efz8m/O+BdZf66Ll6P5kx4VEmKPk5PDdJePb5s vXx+Xlne1HDzqTfTthy7tC0+rX3o5OD9G1qiA/o9a+yxbO7tg75Ra4zCAnbr hfyU4qwpDB83yLRGcmzt3UPaT7w/mlxIb068EnWkF2KvR4i9Wj6zl5h787FW sUa06HSPtVcx+9b+nsZS/itkYcDqf670Gp2Pj47SC44ZMxHl+pXIbFmJjZ2N ja2tLSYyO9bu6y47a/b/CyLjTyf/5PR/SUz3asJL9GTfmk7fQ09Lr37yMKnK NLiXc5tbWt1i2zuDepUHqtiFlDfXL6rstd7xumXAY3tV/6d+qW3ipPm1Fs8G h1c+vH6h25RbmnNNCl6+tSx0dzCXdvuwr8euneFTlqgG9Ttue8Sx9uXDGetf u6uEM1Ha+o7PLHZ1lVbYrLAmuevcOdMH7NTMrX1d+mnRK5lV/kWvG0X6Nzbc hA7eH60zxs0iX1faX1k6aM2Hfi1yGW1OOUqfbramJs4ffT3ysJGV2aY1XXTl dLb9XGNYLxew5xetJeF9K1K2bmtrehc/zRTO2WHWrXl/JU1fvyY/ye9jdbjB 7G4Pjx3xbbhnMufcjKO9pZcBevOAqElHvhDTSIRI+I8qKtmJrQZPqhhi63c5 XzizY47OvnnvEmzcX7CB3GFFCvFFmRfb5/f2QR7C7dJiM1uJfXd7c7voiGg2 0lFiGTHa1tHSLiLC1jLCAe06OkSOYu1tbO3sIkZ/R4AnFO8dP1uvGgYbHa1s VVV39l8l0mVDPxPgABZRYBGiwEzPf4sAkS8jT0ZOPIJ1srSVWHLtMabAIZ0o 0J9FJNiJAnv+NQr8k7wTf8R3kgsTzZQG2c46v+bow3fOLX38mMInw9vHDd2e 0kys3pM0tjC3eLX0ofSSrOd+u5Z1/yB77XrBq2GG8prZ81Wcp7dVN9U1TtjV 3cIzzVAxxJiVle3wfkAKb9+KHmYxbY12pcJ7rdrEFwNixhdWGs65/Hh5Ufvk sqfjNKr6RRY+n35AOd3nlN+WPu+euSyJ9bh4b/odtaKCsWOlTN8RK54qkrvG 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 vkkMnqvj8SB0xnx9y9vRphsz38w2vritZhAV8ZP749m6CksCvab9Vuo3btrw +WpFzYeqckUv+qYdPNC9dfuvbedKtSre5WYpd9398HXrOkuok1SWpmDu2g9q 6bf5XRqx0dIxO+b8gnGH+0yQud6m5LfJXOPBQgdxmlfUPueRn3Snn3tIVCST B1J1P02I2xS3fcMFlZXP6vdXExWD91y+5uH7GwX+B58dq8cNCmVuZHN0cmVh bQ1lbmRvYmoNNDEgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9y U3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUvSGVpZ2h0IDIxNC9J bnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCAxMjU5OS9TdWJ0eXBlL0ltYWdlL1R5 cGUvWE9iamVjdC9XaWR0aCA1NDA+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEA YABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgy IRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjL/wAARCADWAhwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMi MoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAop kkscS7pJEQerMBWfP4i0e2z5mowZHZW3H9KiVSEPiaRcKU5/BFv0NOiuZn8d 6NFkRmeb/cjx/PFZs3xDHP2fTmPoZJMfoBXLPMcLDea+Wv5HZDLMXPaD+en5 ncUV5tN451iXIijt4R7KSf1rPm8Qa3c536hMoPZPl/lXLPOaC+FNnVDI8Q/i aR6wzKgyzAD1JqhPrmlW3E2oWyn08wE/kK8nk+0XBzNNJIf9tiaRbX2rmlnU 38EPvZ1QyKC+Op9yPXrfVNPuseRe28meyyAmrYORkV42tr7Vetp722x5FzNH 7K5FXTzh/bh9zM6mSxXwT+9Hq1FcFa+JNWgwHkWZfSRf6itm28WK2BcWrL7x nP6Gu6nmNCe7t6nn1Mtrw219DpKKz4Nb0+fGJwhPZxtq+rBgCpBB7iuyFSM9 Yu5xzpyhpJWFoooqyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACijpVO51bT7NSbm+t4gP78gFVGMpO0VcTaW5cormrrx74dtsj7b5xHaJ C369Kxrn4pWS8WunXEvvIwQf1rqp5fip/DB/l+Zm69Nbs76ivKrn4m6vLkW1 lawD/ay5/mKybjxh4kushtReMHtEir/TNdkMkxL+JpfP/IyeLgtj2osFGWIA 9TUC39m0hRbuAuOqiQZrwiae/uzm5vLiUn+/ITUaWZznHNdMcijb3qn4f8Eh 4x9In0ECGGQQfpWTrV9q9igfTtMW9UjnbIAy/wDATjP515BbteQHMNzPH/uy EVrW+u65BjZqVwQOzNu/nXPWyObVoVP6/E1p4xRleUb/ANfI177xd4mjyJbG azHr9jY/ryKxJfE+oXbbZNYfJ/hEmz9OK27bxlrcf+saGYf7ceP5Yq9/wlFr eLt1HRLeYdzgH9CP614OJ4cxb2qt/P8A4Y9nD53QhvRX3f8ADnHFZJzueRpP ctmnLbe1dcLTwXenLacbRz3jDR4/74NP/wCEQ0i5507XLmI9kaRZB+TDP614 lXIMVT1ep61PPqEtNUckLb2qRbb2ropvB2t2+TBc2V4nYOGhY/8AoQqjLZ6n Z5+2aPdoo6vCBMv/AI6c/pXFLL60N4nVHMaU/hkUFtvapVtvapoLuznbZHMp cdUPysP+Anmpy6pxjB96y9nbcv2zexWW29qkFt7U43AHSo2ufej3UK82SiFR 1xTsRrVNrn3qFrn3pc6Q1TkzRMqDoKYbkDpWY1z71C1z71DqmkcPc02uvenQ 6vdWjZgndPYHj8qxWufeoWufeo9u4u8Wa/VU1aSO4svHM0RC3kKyr/eT5W/w NdNp/iLS9SIWG5VZD/yzk+Vv/r/hXjbXPvUDXRByDg13UM2xENH7y8/8zjr5 Jh6msfdfl/kfQFFeN6T491PSiqSP9qtx1jlPIHs1ekaD4r0vxAmLabZcAfNB Jww+nqPpXvYbH0q+i0fZnz2LyyvhtXrHujcooortPPCiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqOeUwQ tIInk2jO2MZY/QULUCSiuB1P4q6VYXT2q20nnpwUuGEJB+jc1iT/ABP1W7yt jDZRg9Cr+Yf54/SvRpZViqivy2Xm0Yyrwies0ySaKFS0siIo6lmAFeKXXifx Nef63ULhF9Il2D9BWPKLi4bdcTSyse8jFj+td1PIpP45pemv+RjLGLoj2y68 W6DZ5EuqW5I7I28/pWJdfE3RosiCG6uD2IQKD+Zry5bX2qZbX2rshk2Fj8Tb Mniqj20OyufilePxaaZFH7yyFv0GKx7nx34kus7btIAe0MQH6nJrKW19qlW1 9q6oYTCU/hgvnr+Zm6lSW7IbjUdWvf8Aj51C6k9mlOPyqqLUk5PJ9a1ltfap Vtfat1VjFWirEcre5krae1TLae1ay2vtUy2vtWcsQNQMhbT2qZbT2rWW19qm W19qxliC1AyVtPapltPatVbcDrTxGgrJ12ylAzVtPapls/aru5B0FNMuKh1J MfKiJbTHapBAg6mmmb3qNpvel7zHoWNsa0GRR0AqmZveo2n96apti5jVh1S6 tTmC4dPYHj8ulacHjG6jwJ4o5R6j5T/h+lcm09RtP71MsJTn8URqpJbM7w6z 4e1hfL1G1iz/ANN4gw/PtSSeENLuY/M028ntwenlS+bH/wB8tkfliuAM1LBq NxZyeZbzvE3qjYrhr5HSqrT8TopY+pT2Z0t94V1e1BaNIrxB3gOx/wDvhjg/ g34Vzc8jwTeTMrxS/wDPOVSjfkev4V0Wm/ECeAhNRjE6f89EwrD8Oh/Suqhv dC8U2phP2e6UjJhlUbl98HkfUV81juHXDVK3mtUe3hM8ktJq/wCZ5W1x71E1 x7122r/DlGDS6PdtE3UW9wS6H2DfeH6159qNnfaZcm2vbaSCbsr9G91PRh9K +YxOBr0PiWnc+nwmOw2IVoPXs9yVrn3qFrn3rPe496ge4965lSbO7mSNFrn3 qB7n3rPa596ge4962jQIdQ0HufeoHufes9rj3qB7n3raNAzdQ0HufeolvpIJ VlikaORTlWU4IPsaox+fdTLDbxSTSt0SNSxP4Cuu0f4XeJ9WKvPAthCf4rg4 b/vkc/niuqnhpS+FHNWxNOmvfdjpvCfxaMLJZeITvj6LdqOV/wB8d/qK9bt7 iG7t0uLeVJYZBuR0OQw9jXnuj/BzQ7IrJqU02oSDqpPlp+Q5/Wuq/tPw94bg Swhe3t0TpbwLkr7kL0+pr2qLnSh++kreZ8rjqmGnLmoq35G7RVPTtVsdWgM1 hcxzop2sUP3T6EdquV1RkpK62OEKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFe6sbO9Xbd2sE6+ksYb+dY91 4G8K3mfO0DTyT3WEKfzGK6CirjVnD4ZNCaTOLm+FXhOQkxWU1sf+mFy6/wBa pSfCexH/AB7a7rMA7KbgOP1Feg0V0Rx+Jj9t/n+ZLpxfQ8zl+GOrRD/RPEqy egubJT+owaoz+C/F9ouUt9IvgO0crxN/49kV61RW0c1xK3afy/ysS6MH0PFp bXXLIH7b4V1NQOrWxS4H/jpzVYa7pMZ23M01m/TZd2zxkfpj9a9ypksMUyFJ Y0kU9Qygit45s38cPuf+dyHh49DySzls70A2l3b3HtFKrH8gc1dFqVOCuPrX XX/gLwtqRLXGiWm8/wAcaeW35risaX4bG2OdF8Q6lZKOkMzC4i/75b/Gto5h Rnu2vVf5f5Eug1sZwgUdcU7CLTp9A8X2I5tNM1VB/Fbym2kP4NlayLrVTp5x q2nalpnq9xbl4/8AvtMit4SjU+GV/T/Lf8CHBroapcDoBTDNVKC6ivIfOtJ4 rmL+9C4cD646fjSGWtVTIbLZm96jM1VGlphlq1TJ5i2ZqjM1VDLUZlrRUyeY tmb3qNpveqjS+9RtMB3rRUxcxbab3qMze9UmuKge596tUxXNBpveoWuAO9Zz 3XvUD3PvWigBpNde9QPd+9Zj3PvUD3PvVqA7Gk9371Et/JDKJIpGR1OQynBF ZT3PvVd7n3q1AaR6joHxTntGS31hTcQ9PPT76/Ud/wCdekY0jxTpOf3F9Zyj r1wf5g/rXy89171oaD4w1LwzfC5sJ8KT+8hblJB7j+teTjclp1k5UtH26M6a VeUGejeK/h5c6cj3WnGS6tByV6yxD/2cfrXm9wXgI3cqfusOhr3zwd490rxf bYhcQXyDMtq5+Ye6+oqDxH8O9N1uZri3YWk0h/egJlJPcrxg+4r4HG5TKjNq MbPt/l/Vj6jBZzpy13dd/wDM+f2uPeo1eSaQRxI0jtwFUZJ/CvaNM+C+lQTG TUb6e6XPyxJ+7XHuep/Su4sNF0Pw5bE2lpa2caj5pMAH8WPNZU8BLeWh0Vs4 pR0gr/geE6P8NfFGsbXNn9ihP/LS6Oz/AMd6/pXoGjfBnSbUrJqt3NfOP4E/ dp+nJ/Oui1Lx9pNmrC2L3jL1aP5Yx9XPH5Zrg9Z+J95cbo4JxEp/gtBz+Mh/ oKJVcJR0XvPy1/4B5FfNa9TRO3oemRxeHvClrtjSz0+PHRQFZv6muf1j4lWV mpFpFuPaS4OwH6L94/lXj11rd/dyM4cxlurAlnP1Y81RELOxZyWY9SeTWFTM K0tIWivvf+X5nnSnKTuzr9Y+ImpaluRZpGQ/wr+6T8hyfxNctNd3d2CskpCH +BPlX8hTkt/arCW/tXnzqXfNJ3fmQP0XUb/Q7wXWn3DwydwPusPQjvXsXhr4 g2WrKlvqAW0uzxkn5HPse30NeRpB7VYSD2qqWPqUXeO3YOex9EAgjIORRXj2 heKdU0cLGsnn24/5ZSHOPoe1egaV4x0zUQEkc2sx/hl4B+jdK9vDZpQraN2f ZlRqRZ0NFICGAIIIPQilr0TQKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkZVdSrAEHq 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 xOGr0H+8i1+RySjKO4qRe1TpHUqR+1TJHXBKZncjSOp0jqRI6nSOsZTFcYkd TpH7U9I6eSFFYuRIBQopjyU15Peq7vSSAc8lVZJfekklqpJLW0IXGkLLL71X +2zwnMU0iH/ZYiopZfes+7u47eFpZGAUV2UoNP3dy0jSuPGuq6VbtL/aEhAH Cvhs/nXTfDjxdrvilbl9Qs4RaRcJcoCpZvTHQ/hivK9F0e/8e+IFtoNyWkZz LL2Rf8T2r6H0vTLXRtNgsLKMRwQrtUD+Z96+yyujWjHmnJ/edlOLS1LlFFFe yahRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUh IHU0ALRTDIOwphdj3xSuhqLJSQOppPMX1qE80mKnmK5SbzFo81feosUlLmY+ VE3mr70eYvvUOaaWo5w5Cvrek6f4h0qbTdRi8y3lHPqp7EHsa42H4ReG1SGO e4u7mGJtypK4/LIGcV3BamFq3pY6vRjy05NIHQjJ3Y3S9I0rRoBDp1rDAoGM qOT9T1NaJZQCSwwO+a5PxH4iXQbdJJEAV+FkfOwH0OK4TUfEJvovMvb6W5R/ u29uCkZ+p715OLzWNGVpJyl8/wAy1Qvoj0fUfGWmWUhgt2a9uR/yztxuAPu3 QVyGseMdQlDJcXiWEZH+otvnlP1bt+lcZPq9zJGYYAttAeNkQxn6nqapBCTm vFr5hiq+jfIuy3+82jRhHfX8jSk1pkZvsUIhZvvTOd8jfiaznMkzl5HZ3PVm OTT1jqVY64Uox1W5tq9CFYqmWKpljqVY6iUylEhWKpliqZY6lWOspTLUSJY6 mWOpUjqZY6xlMtRIliqZIqlWPFSqlZOVy0iNUxUqpT1SpVSoGMVKuWlzcWjh 4JWQj0PFRqlSqlOM5QfNF2Ymk9Gb9r4nmAAuYg/+0vBq1c/2Br8Qjv7eCQ9v OUBl+jdvwNc2qVKqV69DPMTTXLO0l5nNPCU5baFm48BhP3mkapNCp6RT/vk/ An5h+dZU+j+JLAnzNMivIx/HayjP/fLYNa0E00BzFIy/Q1oR6zdoPmKv/vCt nisrxGtWm4vy/wCB/kcVTLW9tTjf7btbZxHfxXNg/pdQsn6kYrUtrq1uFDQ3 EUgP91wa6Ya3DMpjubXcp64wwP4Gsy60HwhqTbpLKKCQ/wAcQMR/NcCsZZVg a2tCul5P+kcc8vmujKbNgVA71M3gK3OTpXiG8h9FZ1lUf1qpN4S8V2wJgvrC 9HpIpjY/zFYT4exUVeFpLyZzPDTQx3qvJJUVxZeKbX/X6BJIP71vKr/pnNZc +qS25K3em6hbEdfMt2x+eK5XlmKp/FBkeymuhekkqpJJVBte09jg3AU+jKRT DqdpJ924Q/jTjh5x3Qcr7E086xozscKOprk5PtvijWYtM05GdnbAA6Y7k+wp ut6pJdziztctuO3C9WJ7V7T8OPBSeGdJFzdRg6lcDMhPVF7KK+gyzAcz5pHR Sp9WbnhTw1a+FtEisLcAv96WTHLt3NblFFfURioqyOgKKKKYBRRRQAUUUUAF FeE+NPjLrWmeLb/T9F+xmytX8kNLEXLOPvHOR3yPwrA/4Xn4w/6h3/gOf/iq B2PpWisDwVrNx4g8G6Zqt3s+0XEW6TYuF3AkHA/CvM/HfxpudP1s6f4Z+zSx W5Kz3MqF1d/RMEcD17n6cgj2uivmr/hefjD007/wHP8A8VXqOi6/4y1T4ajV 1jsX1m8fdaI4EUaxZA3NlucgE9e4oA9Eoryq11D4tT3kMUkWhpG7qHdWViq5 5OA+TgZOK9UHCjJzgcmgBaKqS6pp8DbZb62jb0eZQf51LDd21yMwXEUo9Y3D fyoAmopCQoJJAA5JNRfa7f8A5+Iv++xQBNRUU1xHAMyukY9XYChnwm9mAXGc kjFK47EhYDvTS/oKzZNd0iJ9kmq2KN0w1ygP86tW9zBdrutp4Zl9Y5Aw/Sld jsiYsT3ptO2t/d/Wq9xeW1mM3NxDCPWSRV/maVmO6JqKzB4k0QvsGsaeW9Bd Jn+dXoriK5TfBKkq+qHcP0pWGS0maYWxVe4vrW1XdcXMMI9ZHC/zqWykiyWp pas1Ne0mZ9keqWTt02rcIT/OrfmBgCCCD3FS2UokpamFqx9c8R6foOj3OpXc ymKBclEILMegUD1J4rxuf40+I76+WHTdPsYhK4SON1aRiScAZyBn8KFFsbai e9FqYWrg4PE+uaB4Xv8AV/FosTLEVFvbWbYLZwME5PJJ/ADNYmm/GZNU1S1s INBk825lWNSbkYGT1Py9B1/CjkY+dI9M1Cyt9TspbS6jEkMgwwNeNavpU3hX UjZXeZLCU5hmx0H+NeziVGUsrqQOpBqhqenWet2L2lyiyxt0I6qfUe9c2Jws a8LPcTvfmW55IYNhHIZSMqw6EU9Y6n1DSr3wleC01FHfTpT+5uNvT/D6VKYd pBBDK3KsOhFfL14Toz5JnRSkpq6IFjqVY6lWOpVjrllM3USNY6lWOpVjqVY6 ylMpRIljqZY6lWOpAlYuZaQxY6lVKeqVIqVFyhipUqpTwlSKlADFSpVSnKlS qtIBipUqpTlWpVWgBqpUqrShaXNJuww4FITQTTSaylIpICaaTSE0mawlIpIM 8571NHe3MP3J5B7bqgop061Sm7wk16MHGL3Roprd6nWQN9RU6+IZv44kasek rvp5xjobVH89fzMZYak94mvJqljccXGmwyD/AGlB/mKxtTvPBdsy/wBo6LbL v6lYFOPy5qtqOoRadatLIRnHArzxje+JdZSCFWeWVsKvoPU17OAzPHYiV5tO Pojkr0KMVotT2DRfDfg65lh1fSLK1dkOUkjJ+U/Qng/UV1dY3hrw/B4d0iO0 iAMh+aV+7NWzX2VJNQV1ZnmtJPQKKKK0EFFFFABRRRQAVz/jbxCvhfwhqGqZ Hmxx7YAe8jcKPzOfoDXQV438bINf1ufT9I0rSL65tIQbiaSGFmVpDlVGQOw3 H/gQoA8Fd2Ys8jFmJJZieSe5NaWt6FeeH7m1t70Ks1xax3WwdUV84B9+Oa67 wR8Nta1HxdYx6vo95a6fG/nTvPCUVgvIXn1OBj0zXQfGXwvreq+OY7rTdIvL qD7DGpkghZ1DBn4yB6EfnQMwG+JM9j8MdP8AC+ltJFckSLd3HQqhckKh9SDy e3T3HIX2hXmm6Rp+oXarEl/ua3jPDsi4+fHZSTx616P8N/hNeajqX9o+JbGW 2sbdvltZkKtO3uD/AAD9enTNUfiNpHijxL40vLm38P6kbGDFtahbVtvlp3HH QnJ+hFAHD+HtFm8ReIbDSIchrqYIWH8K9Wb8FBP4V1/xd1uK78UxaLYHbYaN CLWNFPAfA3flhV/4Ca6P4YeFtW8N2uueJr7R7sX1tbmGxtWhbfI5GSQuM/3R n/erzufwd4vuJpJ59A1SSaRi7sbZ8sxOSenrQB0Xw7vLfwrp+peNL+IzGDFl YQk482dxluewCjr6E1k6n4x8W+ONWis2vpma5kEcNnbMY48k8DA6/Vs165qv wte9+FmmaBayJFqNkRc5Y/LJMwO8E/8AAiAe2BXk1l4c8ZeDfENrqSaDdm4t JN6EQmWNuCCMrkYIJ70Ael6V8BNMFiG1nVLuW9Zfm+ylVRD6DcpJ+vH0rlj8 GfGOn6jJJpl3boiSHyZluTG5XPBOBwcVran8RfiFrVkbTS/DF1YyOMNPFbyO 4/3SRgfXmrXhvw38UdVnR9W8QXemWmctvdWlI9lHT8fyNMQ7xrr3iPw78LBo /iG4hk1i+lNsksL7i9uACzNwOcfL+INeOaJp2qaxq9vZaVFJNeMwaMKfu453 EngAeprv/iZpXibxB4sZLXRtVuLCwjFrbytA7eZj7z5xzk9++BXa/Bbwfc6H p17qup2klve3T+VHHMhV0iX2PTLfyFAzzTxx4T1XwzHZ3uv62l9qN1JuW2Ja XIXlizN2yQMY5zWfBeeKPiJ4ht9Nk1Ca4lnbhGfbFEo6naOAAPavafit4Au/ GFraXmmSJ9uswyiGRsCVGwcA9iCK8j0Gy8Y+AvESalH4eu2kjVo2R7dnR1PU bl+nUGgD0+y+BPhyKxEd5eX09yV+aVHVAD7Lg8fUmvENQFx4X8TXttpmoyq1 ncPGlxC5QttOM8V6hqnxE8f67aNZ6V4YurFpBtaaOCR3H0JAC/WofBnw68Xr NFJfNZ6XbBtzNJaQTXDc5OCVJB9yfwot2Ebtv4n8XeIvg2b/AExZG1hZTDLL CuHeNTy6D+9jGce+O1eGzSTf2mr6ut1KRIDOsrkSMM8jLZIPua9l8UQ/FLRN QmGkXs17pm4mAwQQl1X0Zducj1ArG0vxx4rtBNF4o8L3GtByCn2iz8to/UDE eCPwp2Aw7u6+Gl/pphtrDVtKvCBtuM+eoPfKl+R9MVs+BfC9hNq8Fx4c8d7L uJhIbf7K0bOoOSCpb5h69aw/E8V74svIH0fwLNpmzIf7Pbt+8Jx1woUY+nfr XTfDn4ZaxY6/a63q6/Y47Ul44NwMjsQRzjoOfrQldgxnxB+MGp3Wo3GleHpj aWcLGN7lP9ZMwODtP8K+mOT1zWb4C+HNx46D6vrWozx2O8qrbt0s7DrgtnAH TPNQeLfhVrem6lcT6VbNf2Ejl4/K5kQE52lepx6jNXvC3jLxT4S0dNHfwxc3 EURYxFoZEZcknB455Jo5ddQv2NP4j/CrQPDXhOXWNMurlJYXRTHNIHWTcQMD gEHnP4GuI8D+KtZ0nXLKxtryZrW7mS3eAtuADsF3KD0YZyPpzmtjXB4++IFz Gk+kXENqjZjg8sxRKfUlsZPv+Vdn4A+GcXhq/j1nWWS6vohuhhjyUib+9n+J vTsPyNHI3sNSsedfEfwtpvhDV7bTrK7vLi4eIzXH2l1bbk4XG0Dk4Yn8Kg8A eEF8X61NBPLNDZ28W+WSLAbcThQMgjnk/hU3ifSPFXiXxPqGqvoOpZuZi0am 3bKoOEHTsoFe0/Cjwc2geDke+geHUL2QzTI4wyDoqkH0Az9SahppDTV9TxH4 geH9M8MazDpmn3d1cOIvMnNwynaSflAwB2BP4ir/AMN/h+PGjXs9zJcw2tvt RXgIBZzzjJBGAMfmKd4z8D+MpvFWp3kujXVys1wzJLbp5ilM4XGOmFAHPpXc fCjUPEujrb+Hp/DLWtiGkmnvZkdGJP14J+6PoPajZag2rncaJ4BtdE8PrpVv dTbRIZfMfazMxOfm4AI6DGOwrR0Pw7beHgSLqSViNo3k5I98kknj1/mSbkt+ zcKcD2/xqq0jseuKhz7Et3H61BY6xp8tjeQLJFIMfN1B9R6GvJdQ0q98JSsk yPd6MzfJKB80X1r1ULTZYI54milRXjYYZWGQRXFisNDExtMcZyg+aJ5nGqSR rLC4kiblXWpVjqzrHhO90KaS/wBBXzrVjmaxPPHqtVtPvrTUsi2YrMv37eTh 1/xr5DGYOrhn72q7np0K8amj0ZKsdTKlOCVIErz27nWMVKkVaeqVIFpANVKk VKcq1Iq0gGhKlVacFqQLQA1VqRVpwWpFWgBFWngYpeBSE1Ldh2Ammk0E00ms pSKSAmmk0E02sXIpIDRRRUDCiikoAKjnnjtoWlkOFFPZlRC7HCjqa4LxNrrX Upt4WxGp5xXVhcNKvPlW3UyqVFBXKOuavLql3tXJQHCqO9epfD/wiNFsvt94 g+3TjIB/5Zr6fWud+HPhA3Eq6zfxful/1CMPvH+9XrNff5Zgo04qdtFt/meP WqtuwUUUV7JzhRRRQAUUUUAFFFFABRRRQAUUc0mDQAZozRg0mD7UAJRS7T7U YPpTASjFGD6Uc+hpiEopCfXI/CkznpQAuaQmkJpCadgFJppNITTSapIQpNNJ pC1MLU0gHFqYWppamFqqwhxamFqQmmE1QClqYWqeO1ml6LtHqatxafGvLkuf 0pOaQ7GaqPIcIpY+1W4tNZuZW2j0FaGUiXsoqGS6A+6Me5/wrGVaw0h8dtDC Mqgz6nrQ9wi9Pm+nT86pvOz9cn6/4VEct1Oa55VWy0i59uXOCuR7UpjtrjkY De3BqlilAqed9QsSyae45Rgw9+DVd4Xj+8pHuRVhJ5E6Nkehqwt2D99fyovF +QuUzQtLitIrbS8kLn16GmNZIeUcj9aORvZktMogVga/4QsdbxOM218n+ruY uGB9/WuqNnIOhVv0qMwyL1jb8OaynSclaS0FqeWzz6h4flFv4hi3wE4j1CEZ B/3xWnFsliWWGRZYm5Docg13M8MM8TRXEavGwwyyLwfwNcXqXgJ7eV7vw3eN Zyk5NuTmNvw7V87jMlTfNQ08uh2UcbKOk9V+IgWpAtc+fEF3pU/2bxBp0lq+ ceci5Rq37S7tryISW8ySIehU5rwKtCpRdqisejTrQqfCyYLT1WnBakVayNBo WpFWnBaeBikAgWnE4pCaQmpcirATSE0hNNJrGUikhSaaTQTTaybKsFFFFSAU UUlABR/KisHxDraWUBijb5zxxWtKlKrJRiRKSirsoeJteCKbaBue+Kz/AAZ4 Yl8SasGlB+yRHdKxH3vasrTNNvPEOrJawKWkkOWbso9a9+0PRrbQtMisrZcB R8x7sfWvtsry6KVui38zyq9Zt3LsMMdvCkMShY0G1VHYVJRRX06VjiCiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkKqeoBpaKAIzED0JF MaJx0ww9utT0U02BSJ5x39DTCavOiuMMM1Wlt2UZX5h6d6tSQrEBamE0pHpQ kbyHCrmtBDCaaAzHCgk+1XY7EdZGz7CrSokYwoAFS6iWw7FCOxduZDtHp3q5 HbRRfdXn1NK0yjp8xqu85bv+ArGVUaRZaVE4zk+gqvJcnoOPpyagLE+w9BSY rFybKsDSMTn9e9NxTsUuKgYzFLinYpcUhjMUuKdilxUsBuKXFOxRikMbinAk dCRS4pcUgHCWQd8/Wni4PdRUWKXFUpyXULIm89T1Wmlbd+sa/lTMUYqvayFy oiu9L06/gMNzCksTdVfkfrXF6l8LrZZWufD+oSafP18tjujP9R+td1ilrOoq dRWnFMXJ1R5FdXPirw023VdNNxAP+Xi3+ZSPw/riren+NNLuyFeTynP8L/Kf 8K9RYBhgjIPY1zOseAtA1gl5LMQSk5MkHyk/XtXi18moT1p6HRDEVY9b+pVh u7edQY5VbPvUxNcndfDXW9LYyaJqglQdIpflP+FZ82t+ItBwuq6ZMijjzF5U /wBK8avlNen8OqOmGMh9tWO7zTSa5Kz8eWE+FlBjb/a4rbt9bsLlQUnX8815 dWhVh8UWdcKtOfws0CaaTTEnik+5IrfQ06uSVzZBRRRUgFFFJQAUUVVv72Ox tmkYjPYVUYuTsiW7FfWNUj0+2b5hvIrzi4nn1O8AUF3dsIvvU2ranJqFyxJO zPHvXovw48H+Si6zfx/vW/1KMPuj1r6zLMvcbL7T/A86vWv6HQ+CfCkfh3Tt 8oVryYZdsdPauqoor7CnTjTioxPObbd2FFFFaCCiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGmNCclQT64peFHYClo oAiaYD7vPuageQt1Of5VLJADynB9Kh24OCMH0rOV+o0MOT1NJipNtG2oGR4p cVJto20hkeKMVJto20gGYpcU/bRtpWGMxS4p2KXFKwDMUuKdilxSsO4zFLin YoxSsAmKMU7FGKLAJijFLRSsAlFLSYpWGJRS4oxSsAlNeNJUKOisp6hhkGn4 pcUcoHNah4E8O6kCZdOSNj/FD8h/SuTvvhHsZpNK1R4z1Cyj+or1HFGKmVGE t0S0meJ3fhrxjo2GERu4/wC9H83/ANeqY8S6nYHZdWtxCw65yP0Ne8YqG4sr a7TZcW8Uq+jqDXHUyqhU6FRqVI/DI8Zg8bnA3sf+Bp/hWlB4wgkwCImP+y+P 512eoeAfDl4p/wBBEL5zuhYrXOXnwptHybO+lQ9hIoYVwz4fpy+FGqxlaO+o R+IbKTG4Ovv1FWo9UsZThblAf9riufn+FmuQrvtp4ZfYMVNZVx4W8U2Bw1lc MPVRvFcVTh5ra5qswf2kd1JdQxwtL5iMAOxzXn+v6u97OUU/IKgWXUIHMV1D LGrcElCuK0dA8Lz65q624yIB8zye1GEyz2NT3tX0KlilUjoXvAXhA61eC9u1 Is4TkAj75r2pFVECqMKBgAVBY2UGnWcdrboFjjGAAKsV9hhsOqMLdXucE58z CiiiukgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAprIrjBFOooAhMRHTkU0LmrFIVB6ipcUO5Dto21 LtP1pMVPKFyPbRtqXFGKOUdyLbRtqXFJtpcoXI9tLtqTFGKOULke2jFSYoxS 5QuR4oxUmKTFHKFxmKMU/FGKXKO4zFGKfijFLkC5HijFSYoxS5AuR4pcU/FG KfIFxmKMU/FLinyBcjxS4p+KMU+QVxmKQnHSnkUm2qUBXIdpJqVIgOTTwoFO q0hBRRRTAY8MUgw8aMP9pQabBawWy7YIY4x6IoFS0UrIAooopgFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAGKSiigApcUUUgDFGKKKADFGKKKADFJiiig AxRiiigYUYoooAMUUUUAGKMUUUCFxRiiigAoxRRTATFLRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9kNCmVuZHN0cmVhbQ1lbmRv YmoNMSAwIG9iag08PC9Db250ZW50cyAyIDAgUi9Dcm9wQm94WzAgMCA2MTIg NzkyXS9Hcm91cDw8L0NTL0RldmljZVJHQi9TL1RyYW5zcGFyZW5jeS9UeXBl L0dyb3VwPj4vTWVkaWFCb3hbMCAwIDYxMiA3OTJdL1BhcmVudCAyMiAwIFIv UmVzb3VyY2VzPDwvRXh0R1N0YXRlPDwvR1M0IDQzIDAgUi9HUzggNDQgMCBS Pj4vRm9udDw8L0YxIDQ3IDAgUi9GMiA1MCAwIFIvRjMgNTMgMCBSL0Y0IDU2 IDAgUi9GNSA1OSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1h Z2VDL0ltYWdlSV0vWE9iamVjdDw8L0ltYWdlMjAgMyAwIFI+Pj4+L1JvdGF0 ZSAwL1RhYnMvUy9UeXBlL1BhZ2U+Pg1lbmRvYmoNMiAwIG9iag08PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU1NTM+PnN0cmVhbQ0KeJylW9tyG0eS fWcE/6Ef5QkZ6rp0XeZpfZG1sxtje8aadWzI+wCBIIkYEC0DoBjcr988J6tv uFDwjh0Borqrq/JyMvNkNfTm3S++uttdX9VVPfMuy2dsXLW9u76ytpnFWNkc Zi5UD3LBxFlt5UKa5aaydZpZU7nazJypTM4zH2XkZrlayNy64UQnC5h61ngZ 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 lDb8uID8kphfxJLBUgR0iIPFhkgjQzWqoIclQV8zTYd6LswWaMVxjCFn9pq7 ggJBGg3UFlnUMwxQdsThRg0p9vS5L+QIRV81tRaaxITYgGYzPwnZatALKHIT G6UGNRPLBfnKtIlMIPhvatISSkCy1ejbGwDI4baHGSFuwKN1OYb20EjiGjFv Cv4bwHJqhIKvxOMsKOC148Tph+ECbD5YKBOrRekIgD4TFclM0riAP2JFcBik H+0PjBpNiQiYKvCefOkYGNPasBBfGcmmTASismZf9FLyQG60DWMv79UexTeC axi10fbaJFqGKE+Y3OjpSDF4nXnBakg3WItFfWqIATnfvr++evODqQwPMt7f Xl+Zqpb/TYUTEmFp0RM878V2b979ksqrwDt8vLu++vCq+up/qvf/cX319r0u dvA4SI78wePHc9/8YCv2naf2RV+l+x6/eZxe+fslggRJWlKesV6FSixfFx9e /XW12La79vYrY1/tq/9abvFldbtazPf81m7w59zSeMEo+0+W5rJ//+pr92qJ j9/x8YiPFT62eiO9euhnbPCxx8dOrp/biifUk62+rHHiC7EDjX97ZX77alb9 8LiGZuvqx/kDvizPqeh5bDda68OrP5+1B6hcmm7MTb8kaaxP+Oa3VxaSfnNz AwG3y93u3LZ4nzNd5WtZRmgfljkvLV4NHGx+kbR4qXXCrg7SnnkU51KHj/Kx H+H4uUIgKUbaHhW8vu6uEyPP+HiDj3cdlDj1phttv4DVk8KftZFFb96ckPtL NvKsE0c28vTo3Vm04d1/GD/9kv8shZpsdZFs0u2ZY9EaiPbTYgGwPX6a71f4 IvF/DuoeaXVY6yVBccg/2fYiMQ3boSM5A+T8+b6FeJuzhsR79PESL4mn7+Qm +10koBSlE3aMkO+79pHy7bfPXwjaYZE/ErOjrS8RtUn5pC0TZP339olJ/qat nunzx+p2udTsOMefXTWvUCh4U4oFS0P162qz4axzEef0BxyjvV9QDAet0itM BL1Is8jXyUeaZWj29rMKWP1a6th8U/3Eb+sV/yyrb57m25uKmm2rbxVUj+cS LV6dgWAMe76UOjJfZk0EvEijwF9WHJetGir9yrDcbFabO2r09mG+YiWTOoE/ Ny/UCavndKMNXhLf8YhvIs1F4kvBtBdW6MaxNTtQ9X1b3a7WSzrlVrxSQLmt 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 f7u++j/eY8yzDQplbmRzdHJlYW0NZW5kb2JqDTMgMCBvYmoNPDwvQml0c1Bl ckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1RE ZWNvZGUvSGVpZ2h0IDI5My9JbnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCA5NTE2 L1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2JqZWN0L1dpZHRoIDI3Mj4+c3RyZWFt DQr/2P/gABBKRklGAAEBAQDcANwAAP/hAFpFeGlmAABJSSoACAAAAAUAAQMF AAEAAABKAAAAAwMBAAEAAAAAAwMDEFEBAAEAAAABAwMDEVEEAAEAAADVIQAA ElEEAAEAAADVIQAAAAAAAKCGAQCPsQAA/9sAQwAIBgYHBgUIBwcHCQkICgwU DQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04Mjwu MzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgBJQEQAwEiAAIRAQMR Af/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMC BAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNi coIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp anN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMB AQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5 eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A7gag 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 H+1V+28F29piS4PmOPXpXo9ywGelc3qV0OQDWnLYw9o5GHMkUAKxgACqDku2 asTyZY1mahqEOnWjzysAAOPeiwN9yprusQ6NYmVjmU8Inqa8l1C9mvrp553L Ox/L2rQ1jVJtUvGnlPH8K/3RWQVLt0rrpw5UcU6nM/IiVCzVcjiwKWOLFWFS tLGbYipTXG9wg5C8n+lTnCIWPQU2FDt3N95uaduggC0EEVMBimuncdKbQIfE /qalVzG4devf3qqOKlDetSNo0lKypvT8RTgcVRhlMTZU8VdyJF3L17iuapSt qhJ20Y7dRuqEtTlyTXOWXd+BTWf5Sx6CoS/OKr3ExPyg8Cqo0ueXkZtlaeQy zAHuc06oITvd5O3QVNXoiF60tIKWmAtLjNNpccUAKMCu1+Gd4n/CRy2Ehwt5 AyL/ALw+YfyNcSRV7Qr1tO1uzvVJHkyq34Z5/Sk1cNtT2R7cJgSKCFYAg+x5 qr43t7Ii3a1AyQB8vOEIJH6g1p6/LHbpNKDhCPMB9iM1x/gy1vNXOp6hON9i 2MBjySp4A9OP51lVp88Dsw2I9hWUi1ovhG1tZINUvoN8jsSoeQBUHbj1q3NL tVZDFZMqPgKSzsw/OrN/PFEiRCK1DpJn5nMhA+gqpdW1xOLlY4pyrAP90Qqf 61UYKKsjKpWlVk5M1/C/iiSx1OezvJkNmXCRoicxk9/YV3N1OEzz1ryRLW5a d4Io8Bkw3kjaufdz1rrtI1JrjRxbyzJJc24wdhJ+Uep9amrD3eZCpS96zLuo XmAea5i7uNxODUl9eliRmsyWQBCxPAGa5DtSsVru6SCNpJGCqoySa8113WZN VuDziBD8q+vvV/xLrTXk7WsTEQqfmI/iNc0ea6aVO2rOStUu7IrsN1Oji9ql CZqRFraxgIqcVIq07ApwHFVYCvN8zJEP4jk/QVMBxxUEX7y5lk/hX5R/WrOO BQgYgFOx7UAe1OPFAiF48cjp6U0Hips1GUxyKlotMVc44qeKVkIPaq2T609X x1pCauXyqzDen3u49adGKppIFIIODV6KVZDzw3865q1LrEIu2jIixAJ9BVG5 kKwse54FWpThcetUJB5lyidl+Y1tQjaBJPEmyNV9BzUlJS1sAtFIeKPfNAC0 7pSAd6O1ACMeKbJJ5UXWjq/0qpeSF32DtTQmew6zff2/4c0G1sJlkur+GKJ9 pzswBu3Y6dK7iLSodM8NNZW8fyxw42P8qn1J9zXMfC/QF0/Qorh4/MlkAY8c hm5x+Veg/I8R3yb4f4lkH3+38/5UntYa1dziL25EV7EiSW8Ilj+YWyb2z6VR uLmUsJ3hYso2Mbls47Z2CupvLS3tU1ALFbqI2V0OeVrO1rV4bR9RSI2/mPFH gAckmqUbicrbHMXTziCWJzMyw4dS3yrgnso61rabGbe8d4mfG5EztITcfvDA 9qz7m9urt7qdj5gVEXYgA5HT9a6jQ7RrZbeEyOJY4zPMsoyC5qmrKxMXrc57 WIGtNTkjY5XOVPqK5DxPrX2eE2sLfvHGCQegrvfGdu9j4fi1CfAmBO7n1ORi vEr2d7i4eWQ5ZjXFCj72p2zrXirdSm5yec5oVeelKBlqmVORXUcpEFqRVp7L z0pVGOtADdtNlYRxO56KCalI5qrfH9wEz99gv60mC3EtIyluoPU8n8ascZoQ YX6U4c80CuHSj60uKMcUDIyKSpCp9aj59KQxCgbkdaZwp5qQcU1xuHvSsO4b gO9SxyjvkH1qsGxwRzThg45pA1ctz/eH0qtCMu7HqTiiiin8CJJlpaKKsA7U lFFAD84FDcDNFFAhnRGbvTNHtlvdZtopD8ryqp4zxmiimthM+oNJtUXTYVjJ QkKMrx1GT/hVvcJryO3lQMm5j6fd6UUVL3ZS2PPvFOsst9qVsluihzGhbNc7 cXDfbI22qTK25sjso4FFFdEEYVGbXhyzt9QgtC6bHnuizsp9Ogru4ePPWTEn mzeXkjkKO1FFRP4mi4fCmeSfFDV57rxC9iMpb24AVA2QTjrXnUjZY0UVBaBR xVjotFFJgK4zTelFFAgBzgVRuH8y/gjxgLlvrRRSZUdy4KcoyKKKokMUHiii kMbmm54oooGLSUUUhkTjvUdFFSxn/9kNCmVuZHN0cmVhbQ1lbmRvYmoNNCAw IG9iag08PC9Db250ZW50cyA1IDAgUi9Dcm9wQm94WzAgMCA2MTIgNzkyXS9H cm91cDw8L0NTL0RldmljZVJHQi9TL1RyYW5zcGFyZW5jeS9UeXBlL0dyb3Vw Pj4vTWVkaWFCb3hbMCAwIDYxMiA3OTJdL1BhcmVudCAyMiAwIFIvUmVzb3Vy Y2VzPDwvRXh0R1N0YXRlPDwvR1M0IDQzIDAgUi9HUzggNDQgMCBSPj4vRm9u dDw8L0YxIDQ3IDAgUi9GMiA1MCAwIFIvRjMgNTMgMCBSL0Y1IDU5IDAgUi9G NiAyMSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0lt YWdlSV0vWE9iamVjdDw8L0ltYWdlMjggOCAwIFIvSW1hZ2UyOSA5IDAgUj4+ Pj4vUm90YXRlIDAvVGFicy9TL1R5cGUvUGFnZT4+DWVuZG9iag01IDAgb2Jq DTw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDY3MT4+c3RyZWFtDQp4 nI1aXW8bR5Z9F6D/0E8LZ+C0u76rFosAtuN4MguPs7F39yHYB1qmJO5Iooei I3h/1PzGPefcaoqkR7FmEJFVXXXrfpx769ymn71+F4eL29OTaZjGGBr+lhSG zcXpifdpLGXwLY8hD9eYcGWcPCbq2NLgpzp6N4TJjcENrrUxFozC2IYzrJ2S FgYIcNOYIkZ+rAGjPE6YrGUMWujS6BvGeUyQ7eKIjRUnc2kYC+Zq5HkSir1O knLGkZU7wzSNoWKEUypGdZykASea00T0eOxGHzUqSaNEbds4VVvcxuYxkcfi ZFrg4shV1Jhr/ehNYUd/hKnIKqoUhuBgHJZCFyx1tS+Fb2LVuMFESsBG1+RW eAo+Ch5qZ5M7UQQlFcjFntykAvTyHt6h4WV0WosxRDE0Nemp3JJHzB1EDWsv T0/O/0Txno4JPtArimYcPTT3bixZRoYi5bLX6TgvIOCx2oGTTTROeO818s5G 0UaBCDgz4MB7XFSlnJ2SOYABTUaXNi/lBM7DhIcIBIH+5sBpEMeuARSvcg9t hdSSFUDY4H1jLBi9aEAJcHW1x4MPibANiFuDY0PRTsjNJjhUxjwQbBAVGrGl KEDfOI1ZO6uBFZsnQ5GHj0MwzEcEnTo0ZYOzpTCflmEpQ4TjhITMaBM0iFGA 43yZYw8MB7inNuEeeAnBMRcQA6gAG5yFnqEBbkIcHcMGyzGA34iSifYHGt/F FhnjLWp0JU/NRNYhHvZwkgozJHikQBJOMGFjLOdAoCnK5ZTHVjRKdmCa9DgY MCL8E6Q7Mzzo3BBaT46oXIGy9EhEOIihJG/FShQSbd6MjtJGiWSPJwMNDYnQ JWoUwxxQF+TdQMjZ1jBRltKKo0zvyUVN4A1W2uBBZgFGtRoCqX9lRiqmmHfy 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 k7Pvvg9P1vxzjdGSX275Z+CfLf9c8s9yb67a1Ip/Nvzz0R7WJy/55RX/vN2t l+xzPNToje3s5252C273ls4HP503HWnwAfObnQY3/HOxp3d9stgt3cw2Xe1E 3Ozk38/dYtm91R93qlHR3w8PP98pupF6fxxAgqQeB3B1c7P+fbHLHYMaUnC4 FWhXGz3ZMvXODNpXiw/rzQ6qyq/tWh+Xq9vhZnmn75v11XIUKv68HP5XaF/d LE34m9XZZq1UWJ9vB88v/lvKR11jhtQvy8XmdlhcSMLwYXkmbT7fLodLqwmS vbgbLtd3gx5eYYeU/6LDtXGuJMPy+tP6ThshVVYv15+ulvuWfVwP14uL1VlP zO2l2XNx+y210ae6rjWz/vOVefp6sV12fa4Xf5NbutDlQ3mDewCV817gAxn+ 7Kf8dYX2k35/29Pm36aptR++D/x0/TPaZ33VP7N9TuGHymHYDe3xvLz07VnL Wj6ajofbmt+dsi+1pt02TLv08nCXm/rjWUoftxdHSiVToptUfzo69H67Dn9x pKsp4VI7kvrclpcjU9KBCbMuD0hxuR0p0XWddXtx6LC90/b9OpuG6cdfzdmp UT9K/bPLxc3FctgqdZfDnV22Vx/H4YXdV4L+78vNl+F8qQQZLhe/G1gXuNjm jXbRLa+XN1u73zbLv3+24rH8+K+WRguhHSue4qml/ufNmWTd6j58DIxna8Ct 9mDs6Sv6jS7t3+s894PzcjljTnhonvDS/BQILfrenkmGs2eU1fCw1j7Otr4+ 7/KSjXn+fA7X786eFKTd3t2+Wc6LY7l7unbZ/F5f2X86K/c1z01XnsP/5nNo h53b99Ke0s+hnVnwux/v/AF4Pn8MoNiIg47eh+BxRCPVNgPw22uz/iXUEVjf A2h7pftc4BtW5E3idUubePWA7F4BD2RL7vcPbtAPqXsbfgMpwU272F32V/MV f39H6+HdPL86JDCXDx1V9aL24KjOE+pMZ/Dn00wf7unGescQNDwzFapppj9f dts5f7NHkOZNO6Ky3sm+mGnLzW7V/+2Ix/327bxpOOQzZ/P850O/XNiybxKV xFenx/EHVR54wxtrmC9LEWeVLeMWW9WST4aS67U9U0OggtTBMlyt8G1xZhfw nbGZq493K6OvT4e3gtTZEhxjofv6ZuhM58PycnF1LiHfMCLo37FZNKHwu+3i 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 YDVgFeBeZVPYSsDvAdoQ3BCyMIRrCF4YzCWYM8yFZj7MlGDKMPGbTbtMnMNk CctrMCw0vG04ZRAtDMRbtLjdd6BNG5eYB+yI0IZF5DVo8H4NXhWwOWBXAL8r YH8Atz/grYBPAnhHwLCsPBhEbUFYjOHh0VJSHBtb0C71FRV4ZM5xHrzME1lM jg5XuUeyzINKy8e5WzC+t6wFc9klHh35s6yQX7JyJcoKLfCEFrs9W0LLCjwL QTiI8IFAoS1BKKsstnHmrMZZsbGNjY04tnHWzMbGmSj2f3/Cv7UB/5kErm/0 SwjITIgGiJkzZ8XOBOo+BaLRn2aS3EwhSyo3xrYg8rf6TB/Hw4sFB8AAhGqw D+AFdAEuAy4BLgIuAH4GdAJ+AvwI+AvgB8B5wDnA94DvAGcBZwDfAv4M+Abw NeArwJeALwCfAz4DfAo4DTgF+ATwMeAk4CPAnwB/BHwI+ABwAvA+4DjgPcAx wLuAdwBvA94CvAk4CngD8DrgNcARwKuAVwCHAS8DDgFeArwIOAg4ANgPeAHw POA5wLOAfYAOQDvgGcBewB7AbkAboBXQAvAAdgGeBuwAPAXYDngS8ATgccA2 wGOARwFbAY8AtgA2Ax4GbARsADwEeBCwHvAAYB3gfsB9gLWANYBmwGrAKsC9 gJWAJsBywDLAUgC8AOMlgMUAeP3FiwALAHcB7gTMzyTHeYA5gDsAswHwqoln AhoBtwFmAG4BTAdMA0wFTAFMBtQDbgbUAWoBNYBqQBWgElABmASYCJgAGA8Y BygDuAE3AcYCSgElgCKAC+AEFALGAEYDRgJGAPIAWYBMgAOQAUgHDAGkAQYD BgEGAlIBKQA7IBmQBEgEJAAGoJrfZub+u1LZb23Av5bI9yRIOo0f5L3+q58i VIcaURNah7ah41iG7RD/RrQEbUE70UH0GjqHJTgUj/onvu/4RRJbkB4h33fe Bb7Lvv7iH7xfeMdLTD6J+ITPwJ+h58RLkMpb5+v0LvB+6Osvesk73ockdb7+ vnOcA8nYFUTzkB7KLojrxEvET4jfgX71F3q46Z8wazT4YBKqBT9MAUxDDcDj 0QQEc0j47uZW8MdMdDuag+aieehOdAuaDXwX+h26G92DlkG+Ufg2h5xdgBZB 6VK0HK1Av0crhe+cFkHNJcL3Tyv8JcuBVwl1yTXo11HLhW+jWJtmtBYiQr6I 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 Slg0iidRMGZajiTsAgvpoPGYTeIuaJygt8mfHGH4cIoHjwiVT46l7Itj+RJh SuuMwuZyaWVvjn3iY9x77dNLYOUvo+uHv7l29nTKfgHuv2AGLIV2NUR6XUUk nlfvBvEq9otpLJhUVxfRMfkpye++G/qsyE/8ryc3SBOe+rvrT4klw552N33q +nehB5PAgpMhCown6W+Q0bTqdVUMid8UyayWGrLaWVyPQtb69LdltNnkKV1T N26d0jJgLmrPznpgSnbtNCm1pK4g9/5M7pO4mGe+a1xsy4uOWZo4akxRY0lZ fUHiqATQQA196VOVwRiWvUFE8Dd4Z1Zp2FjqoiIjNZuiRTGC2wTmXKTMWPAy /FST/+b1Dw/InhZ2HIifpTB08n22inU0avi3qw4cyDJ21dTUi2/Ef6ehZ7iF /qBnbuXcqvFs/0pHQ/sNqkj0IXYaOANPA2e8TnWjY4n4Y/DvUdzXSBQ3wPhM gcLQoaCyotwUIpRVJZFvWFo5fczk/NKMpUvF8p7qBX6IBt579ZGp+ROHH+Ur z99fnrewB9qPhfbniPeEziTY/jqCztihGcWJ8YPcI69Fr4sAD/oaNP4w9P4d fEFiqxn678iZBDstUbEdS6xPqF5S5fWLD9HocZNTCzsND4lje6rLFvVPKkqL qqwdfhI86Hlo9cfiWOhTdU20mkZqRIEIKh1HePWPoB0NLPiP7ODZT2awfYHc dBHYvbqoGlwreX9h4f5CWK4K5W0ZfvoFTxvF/3j29o1P/eC+lQWbF72YK469 /hp1Dr/A1Q/H0OXDy+lvoOUP6VH+29ByMimqiaVJ8TxJGDUqIpkk0Xg+gf0S ZtS3Vbsgsshtnq1ma2IR+9wcPxo/NbOPuem3fMzlv33hnqb7vzo7Pi0uJiMx vbwkf/Tw0JrtGdn/BCr8prnPPJHr4XhdWmkOqLL0K/Poo/IP/Dz0GekX/z8k OotuoCe4fG4t9wH3AR/HuzCt4X8j5AlLhUPCITFSXC7uE6+p8lT/AOk3Xyap 71X//R9Ne/6aSROp6dN8cGuKiIwY+FTap6RLI0lbE5bWKOmncoqc/idJPkyb lPThrUlXonvqbvobSnvupr+5dONvPUU13E130910N91Nf8Npm5JuRNujXwtP MamQXEoajLkcW4xpzl89bVTS0S+X4lIwtShpfdzP76a76W66m+6mu+lukhMh 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 ff0RSO/oj+s/1p/Wn9df0l8zcAaNIRpygiHFIOmPGzINuYZCyJyhzFBlMBhM hiaD3TAX6DZDl8FrCBiWGpYbVkFaY1hveNrwjGGr4SXDNsCdht1QZyTtg5py agulVWFpH9SR005ITVDjILTynuGw4ajhhGEIeG0gcZXhDJSYa7gAfaFqmPEk FcZuHMy7R8n3SArMtK1kOsy075Ny8ip5jcwgr0OqIvvIflJNDkCaRd6GpCf/ Sn5JDDAP/4MYYSZ+QkzkIrlEzOQypAbKU540UpGKpAmt2Sz+XvwDsYhXxauk Rbwh3iB2GCaeOFSiSiRzVJGqSNKqilHFkK+oklRJZK5qgiqd3K8qUZWSB1Rl qjKIBRTm/C4ciVJ2uqUPQF4KeTnkVZDXQF4P+WklP4O5Qj8X0lLEufrliKv0 a/TrlfunlTw3lJ5B/lb9S/ptkHfqd+v36Q/q39Mf1h/Vn4D7YBqCfEZ/QUk7 Me/E65D+sn6YnWDyQ/yv8Vxcq1jZCSkFbL2ZjCU/hFQCse8Y9OcMpGlUTdWk TJWjyiHTVfmqfFKuqlJVwRhQXaqOzQ0djEokofp50LNiyOWE5D8M1xrgdcB1 Nsw8LvSMVhdyl/Vp+oq/SM74jHyncmmf8fxO5W9X/4vokHYb/u1kfxG5t8r8 Mv38vH26kx7/U/OX1fNPUf+vZau/VLt38r9b+38n3/wy/cr5b/T7z2WXO8n9 rLl2Oz/5onP3s+Lc7cbp8/Tjs8p9nvb+WJ/uVO6zYujn7cMXrfeXzH8OPb6s zNvNpy/a5q33OZ+jzH+3r39qG/459Lyb7+a/kczeMoQ0IQvfMu5+Q/l/7xvK VvLSyNeFkg2ktmRDyeaSLSUvlLwCaUvJDsBdJa8UPQ3U3qJAyWaWSw4UHS7Z W/JOyTtwfb/ocFGAJeCwdKTkSHF6yfGSj4sul5yGu/Mll4rnlVwr5UqOlGqK 00uj4emR4prShGJnsaW4pthZcqlUgymBpaCkIId9KdCWsd+YV95hHfgO2wop FX93dBz5KqTx+FYrkX+F99lychxSBblIfkcqye8hVXPnuF+TGvCia2QWP5ZP JQbwmWwyG6Q7ybwwC6SR9OJlJWklGSwzCjK7ZoSlHHiWNnWezMdnBZBLgR98 noNaTwetE0FrAf/VARX+RLEG38a17KdJIQnQqxgikjhoXQ1lk0kE0UOKwt9p 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 xENeectyr5+WH3o7qOURj966zqR7TGrqtzblyc1MmmjSiV77NmXe55S5JjVy SKE7IZ5XYKxJF3r0QKVJq0y6yaRvmvQt826aseIQnXYOY6+xR3EhvqIgrUes Suz/BOGL6RKT6Rxzjrv8u1olbNlb9iYW8P4Kn6IKPkW9dxBrvClGeR5NhZID SeJK8PNSXjGp+OybQ5+T6FRXRCe5GWIxacFB6t2l8STG5AoVkxlDbajXPMKs kyUucXYaXJ9QrnDp/OaqUyV+lMSipFnjkpiu4JYNbt0ac4vJQUl3lPRAiaZx J9BuzXDbCIvm2+C25dTlXwpbznH6nMqpKxrVTDM1A6ZmuqnZztR0yL61hrf2 HnRa6+1mkJRyqbw9p1S/A6U96XNHTl3+nTLPJAEzScRMFOkt+80VjfySqphO MZ2ZA8nW9gf9QerHItmmk4S9a5egPpUYjlUQjfzKKviVteBXVsOvrA2/sj74 lXXgV9aFX9kY+JX1w69sE/iVjYVf2abwK9sMfmWbw69sHHQgHjqQAL+yLeBX NhF+ZVvCr2wS/Mq2gl/Z1vArmwy/sm3gV7Yt/MqmwK9sKvzKpsGvbAB+ZdPh V7Yd/MpmwK9se/iV7QC/sh3hV7YT/Mp2hl/ZTPiV7QK/slnwK9sVfmWz4Ve2 G/zK5sCvbHf4le0Bv7K58CvbE35l8+BXNgi/siH4lQ3Dr2wEfmWj8CvbC35l 8+FX9iz4le0Nv7Jnw69sAfzKngO/sn3gV/ZXWL++WL9z4Ve2H/zKnge/sv3h V/Z8+JUthF/ZAfArWwS/sgPhV7YYfmUvgF/ZQfAreyH8yg7GbzCHwK9sCfzK XgS/skPhV/Zi/NJ2GGkD3//wSWg2hdvFHAozxVwKd5BNnkcl/F6m34jVYo24 U2wSm6lkJ4V54h1RJ+4R+yn8VnwtvhEL8FviCvyW+H78lnghfkv8O/yW+AH8 lngRfku8GL8lfhC/JV6C3xI/hN8SPywXyDXiEblWPis2yufl82KTfEG+IDbL lyRdE+Qr8hXxutwkN4k35Da5Tbwpd8gdYqvcq1qIbaol2ZDjKlNlinoVVmHR oPqqvuKEOk+dRwanUBVKqYpUkVTqTfWmtNQ2tU1qVaNqpK3eUm9Jn9qpdkpH 1apa6apdapeMUXWqTvrVbrVbNrFetl6WsdYr1iuyqfWq9apsZm22Nsvm1mvW azLOesN6Q8ZbW62tMsHabm2XLawd1g6ZaL1jvSNbWgesAzLJ+tz6XLayvrS+ lK2tr6yvZLL1tfW1bGP93fq7bGv9w/qHTLG+s76TqeyZWqaxT2oZsE5YJ2S6 pj/ZTvu0T2aQSriyvW6qm8oOurluLjvqeB0vO+lWupXsrJN1sszUqTpVdtHp Ol1m6QydIbvqjrqjzNaddWfZTWfpLJmjs3W27K5zdI7soSnIXN1T95Q9dVAH ZZ4O67AM6qiOypDO1/kyrHvr3jKiC3SBjOo+uo/spfvqvjJf99P95Fm6v+4v e+siXSTP1sW6WBboQXqQPEcP1oNlH12iS+Sv9FA9VPbVw/VweS570Jb92He2 PI+9Zsv+7C9bnu9ariULXdu15QDXcR1Z5Ma4MXKg28RtIovdpm5TeYHb3G0u B7nxbry80G3htpCD3ZZuSznETXaTZYnb2e0sL/LbflsO9Tt+R17sj/HHyGH+ Jv4mcrg5ufL7w4KwiO3wnhB+B5kQ2ylIq43VRij7QftBYeEt6vqMzTxjMxvZ zB80qA00KAP3ReV22Rk9OaMnjfRE2mPJssTJDBW0+usRdKeWL/rS6fZ07nz2 iS9w7yOkT8Y6F9C5sdAZ4AxCWuRciHSgMxhpsVNC6QDKXYR0gDMUaZFzMdKB zjCkxc4ISouo3q+RDnAuQVrkXIp0oFOKtNgZSelAqnc50gHOFUiLnCuRDnRG IS12RlNaTPWuRjrAGYO0yLkG6UDnWqTFzhA6vw5whhMWOZcRDnSuIiz+DyQy FjMvdK43khlnJHODkcx4I5kJRjJlRiI3GolMNBKZbCQyxUhkqpHITUYiNxuJ TDMSudVIZLqRyG1GIjOMRGYaidxhJDLLSOQ3RiKzjUSuo/kXOpMgkVsgkdv/ Q4nMMRK5y0hkrpHI3UYi84xEyo1E7jW6Mt9I5rdGMguMZO4zkqkwkrnfSGSh kcgDRiKLjEQWG4k8aCSyxEjkYSORR4xEKo1EHjUSWWokcickcg805XeQyEP/ oUSWGYksNxKpMhJ53EjkCSORFUYiTxmJVBuJrDQSWWUkstpI5PdGImuMrjxj JLPWSOZZI5nnjGSeN5JZZyTyopHIS0Yi641EXjYS2WAk8hgk8iQk8jQ05YX/ UCIbjUReNRLZZCSy2Uhki5HI60YibxiJvGkkstVIZJuRSI2RyA4jkbeMRP5g JLLTSKTWSOQdI5FdRiJ/NLpSZyTzrpHMbiOZ94xk3jeSeQUSeQ0S2Q6JvM2a wu9x4HHjyVq2aCEvl6Pk1XKCLJOT5GR5s5wmZ8g75Cx5p5wj75bz5Ifqopha /NfbSDmSLuZXyiv5mZEcLZS8QZLtkDfKicKWN8mbhCNvkbcIV94mbxMx8nY5 U/jlb+RsESvvknOJwwfyAxGnSlSJiI95O+Ztgf/7FH51m5qhblcz1R1qlvqN mq3uVHP4yYm6Wl1Nw7xW8ZMbujsXrRvdnbfnZyFyCs+H2vPvGCw84fuhRodG ZcRNTqHaQj2kHscZhPt9SD2sHlGV6lG1VD2mlqnlqupn/SrSlwJrqfWYtcxa blVZj1tPWE9aK6ynrGprpbXKetpabf3eWmM9Y621nrWes5631lkvWC9aL/ke 9S33HfVV+R73Hfc95aQ4ab6VvlXWWb7VvrVOwPes7znfC057p4PTSs1T9/yS DNRdaq66G+/cO+kraR6Nu5zuMzPoTrKCZriQQqZ4QDwouoiHxMOiG6TeXd2o bhS5arKaLnqqlWqVOEutUWvE2cQrKpLVg2qJKlf3qvnqt2qBuk9VqPvVQvW7 X6Q9oBapxXiGwpwFZKNINnR1AP+m4J8E/q3h16mJKqX+J6spaqq6Sd2sblHT 1K1UU1GLS9WlhoeEfNXP1rUj1pV7jJEr5FNEfFquFsod5A4W2i1xhwnHvcod LWLdMe51opk7z71HJLj3ugtEonu/u4h4/ZRjJ3BcThybEsdqcHya9HYN3UFr 8LXB1wXfpuDb3L3evUG0cCe4k0QS+miLPlLdh9xHRDv3UXc5Sd873RZTnIme OqPv2RTzTd+dTZ1M6n2umH+KpsQTgp+3Jp6qp2jfrJArzXw1Rudzc9wcmu8F 7gga3SU0lkR3CvWc4z7urhKXsfTwHEC4mW6YRnUBUXv8E6rEHvqvtOghWp6+ LrOmQE8F9NSFnvqhp82gp82hpy3MHYGL+vxfy4ruKl8mnI9+59KK7RO9xQyS 5jyiLaQ2y8QKsVo8R3U3iTfFW2Szd5PV3iv2i4Nkt49SM1fGyUTZWqbIdNlB Zsps2VNGZYHsJ4vkYDlUXiKvkNeSpWM7N5PsW7mskItlpayS1XKtXC+3yBpZ K3fLD8laxEg/YRPJT1sDlMuQmSSlHOIYpk+xMomwqaT5ymaS9F42l8mEcZLu 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 ZHN0cmVhbQ1lbmRvYmoNOCAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50IDgv Q29sb3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWlnaHQg Mjg5L0ludGVycG9sYXRlIHRydWUvTGVuZ3RoIDE1MDIzL1N1YnR5cGUvSW1h Z2UvVHlwZS9YT2JqZWN0L1dpZHRoIDI1Mz4+c3RyZWFtDQr/2P/gABBKRklG AAEBAQDcANwAAP/hAFpFeGlmAABJSSoACAAAAAUAAQMFAAEAAABKAAAAAwMB AAEAAAAAAAAAEFEBAAEAAAABAAAAEVEEAAEAAADVIQAAElEEAAEAAADVIQAA AAAAAKCGAQCPsQAA/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0a Hx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkM CwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIy/8AAEQgBIQD9AwEiAAIRAQMRAf/EAB8AAAEFAQEB AQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQEC AwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SF hoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV 1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj 5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8AZfyjO0HOPesS4bng/hmt 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 gD+ZrCRLucBFIC9eK0YPC8lyFMhwM88daVmytEb1h8Ro7uRYVtpw3TmPr+Vb s0R1SKO6uImRsHYnpnvWNpmgRWjKEQZzya6pU2xgFRheKajYLrocdf2TxsZb c+XKp6f3qdpviA7jFKSrr94HrW9eosil0HT0HNcjrGmtIRcwNslXkHHX2NDj 1Q0+52kOoK6goe1WY7jd0Y/SuC0rV33+VIoWRfvL/UV1Ntc+atJakzNoTkcj im/aAxK8/lVVcsmMmleMkhu9TYybJJW2oRjOf0qoQXXnoKubxg5x0qLaDkep oEOsbQ3B2upEQHX1NJrGpJo9ldIib544i2PTPQk1sWsRhUDICjnFcR8RdRCC G0jGHn+d2z1Re351cE3KwOXJFyPPizE7jg5yT9e9KV4GWH4UmWLZOMZ5Apsh z1wRmvRPIbu7ikjOP503cB3P4CmgtxhsU0MQo68+ooFY67zy2Bn8M1KpdF4b NU0cHJAoM5B+9ivsHG54ly2ZGI5JH4ZqjPNIsgKswIJ9qVrn5SSc4qmHYlmJ 2/7xrGdJS0excJSi+ZbmxYsxQ75Gcsc/N2/KrrLnmqdmpS2EpHVsde1aQUNE QPx4r5bM6EaNa0FZH0GCrSq07yd2VzwMDrWZqKTIkaqdvnPsyOw6k/pWtHHu kBPrV28sWu9OzCm6aFhIq/3sdR+VebY9KLsc9bi3tYliXagU8sO/1rSivtPj j2qWY+vFVL7SGnhE9rIFDDIJHFcpqFh4qsw0yWsc0Y5/d8nH0zVXb0Hc7gX0 LufKXjGBStJHjewww7A9q8lTxNqzXYt5GS3OecqQa6fT7eW+tpJnvZGK8Ajp mhxM/awbtc6hn8zIUruzjAYVGukGZzIxVTjvWfH4VvJbWFlnfzCwD5xxmtAe Fb5QfK1CdSAcAvxnHTiklboV7SHckbTWgVdrBWHUkVpQXcUKKsk8KvjPLVl2 nhW7ntYHutQk+0sAzqD8o9s02PwhdLNdeZd/u0IEQUYJyO5q+ZroCnTe7Ots 7+ERk+bEevIcHNPk1ZRgAAMPXvXBPo7xJcyTXD7Yi2CDgYFctqGt3FgEW3vS 8nfcufw9ajmbew3KKWjPXZdWgyyFQcjk1mPeW5cq2NpGMADmvOLHUfFeoSKl vY+YP75UoP1rrdO0vWncjU5bdCBkLFkn8zV2aFzJkurWUUlubu0UrND84ZR1 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 ZSB0cnVlL0xlbmd0aCAyOTcwL1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2JqZWN0 L1dpZHRoIDE0NT4+c3RyZWFtDQr/2P/gABBKRklGAAEBAQDcANwAAP/hAFpF eGlmAABJSSoACAAAAAUAAQMFAAEAAABKAAAAAwMBAAEAAAAArTU5EFEBAAEA AAABT619EVEEAAEAAADVIQAAElEEAAEAAADVIQAAAAAAAKCGAQCPsQAA/9sA QwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMc HCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy /8AAEQgARgCRAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgME BQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQci cRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq 8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGx wQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5 +v/aAAwDAQACEQMRAD8A9/oopGYKpZiAB1JoAWkJCjJIA9TWBrXjLRdBtWub +9jhhHRmPLH0UdSfpXn974413xOSNGsxptgel5fDdI49Ui7fUmgD1G41mwtl ZpLhAq9Tngfj0rAm+JPhyOQxxXbXUo42WkTTHP8AwEED8TXAR+HrGWQTapPP qsw5zdvuQH2QfKPyrct3jiQRW0KIoGAka4A/AUAbT+Or+f8A48fDd6VPR7qW OEflkn9KiPiPxPL92y0yD/fuHf8AkoqCOC9l+5byfiMfzqT7FfDrFj6sKnni upSjLsNbU/FMnW70pPpDKf8A2cVC914oPI1LTv8AvxKP/alSPBdp1iJ+hBqu 87xnDqy/UU1JPYHGS3Q03/jCI5S5sJfYPIn8waUeK/F9p/rtJW4UdTBOjfo2 0037Z70fbPemSWI/inDbHbqtjPZnuZoHQf8AfXK/rXSab420XU4w8VyuD/EC GH5iuSN2rDDYI9DWLe+HtGvJDMtuLW5/572jGJ/zXr+NIZ7LDPDcJvhkV19V OakrwlZ/E/hx/OsLr+1rdeTG58ucD2YcN+IrrvC3xTstXY21wSlynEkMg2Sp 9VPX8KL9wsekUVDbXUF5CJYJFdD3HapqYgooooACcCvOvid49tvCWnrGQJ7+ 4GLa0U8t23N7fzruNSvYrK1lnmbbHDG0jn0AGTXyZFq83jDxzfeIL87gjZhQ 9EGflA+g/WgDptK024v7wa34klN3fv8ANHC33IB2AXpmup+3e9cz9v8Aej7f 70AdN9u967Dw/bGK1E8g/eSjPPYdq870OW3uNQVrqeOOCP5m3tjd7V3SeK9I jO1Z2lI7RRlq5MTOXwQVzrw8Ipc8mdV5mxKqTXPvXPzeL7M9La+x6/ZzVF/F enO2GmeI+kkZWuRU6q1cWddOVJv4kdBLde9ZOp6mIYdoOXfgCqb6rBJE0kc6 OijJKtnArK0qZtU1F76QfuITiMHu3b/GuinorvoPFTjTp6bs6KDTo2tkEpYT EZYg9PahtCmbmK5U+zjFTwOWOSeTWgj4AqZYiS2Z4TqO5if2DqGeHiP/AAI/ 4U5dAvf454V/En+lbwlwKikuAASTxS+tTYnUaMW702OwtmmnuyxA4CrjJrhN f0e11kCdGNtqEXMN1HwyntnHUVqeJfEAubwwxt+7j4+prB+3+9d1Pm5byNY3 tqaXgX4g39lq/wDYusOItRQ7UkPCXA9D7/zr3nTdRi1K1E0fDDh07qa+TPGU QntItRiO24tmHzjrjP8AQ17N8LvEsmq6RY37n5pP3FwP9scZ/kfxqrF3PWaK KKYjhfiDJKdC1q2jzvksZAoHf5TXyRp2q3GmOxh2lW+8rDrX2l4n043NqLiN dzRgh1x1Wvkbxx4Yl8N67IqoTZTkvA+OMf3fqKAHReLVP+tgZf8AdOauQeIr a4kWNGcOxwFKnk1xVdr4C0MXF1/aVzhYoziPdwC3c/hWtGk6k1FGVaoqcHI9 b8NaXaJbxb0iklxlmYA812pkjtbcIm0cdBXH2Ot6DpyZuNWsY2A+6065/nVa 98ZaFKSE1izP/bUV6ThC/KtEeenUtdq7OgvL3rzWFd3isCGwR6GsOfVYLnJt 7qKUf9M5A38qwNX1U2VtJM0jDaOBu6n0rpVOKje+hlBylLVF/UTHdajBY2US /aZXA+XjGf8AOa6m20bVrCJYtPvoZo158uePAz3wRXIeANMujFLrl48hnusr AGJ+VO7fj0HsK9NsInOMs3518NmmaKNR8myPqMNgk6a5+pQiufElv/rdBEw/ vQXCnP4HmrSavrHT/hGr/P1WujhUgAZP51ZJ2r1rwo5w5JylBfj/AJjll1K+ jOXN/wCIJeI/Dzp7y3KL/XNc14t8Ratodmv21tPtzN8oRJCz/XsK768uo7W3 knlYKiKSSTXzF408SSeJNemutx8lSUhXPAX1/Gu7KMVVxtVvkSgvX/Mzr4Sl RjfqaUviW0BJM+4+wJqpJ4siX/VxSN9eK5OivqDkNfUPEN1fwtBtWOJuoHJP 417r8CNPlfwXNMynY98xT3wqg/rXgeiaNe+INXt9M0+FpbmdwqgDp6k+gHWv s/wj4bg8MeHbHSYOUtowGbH33PLN+JzQBvYNFOooACMjB6VwnjPwFaa5YzR+ QJYX5MY+8h/vKfWu7opNAmfFvirwDqnhuaSRY3uLIHiVV5X2Ydv5Vy3nShBH 5j7B0XPFfdWo6JZamp86IByMb16/j615P4q+BthqDPcWKeTKed0HGfqh4/Ki 7Q7JnzVuPrSZPrXda18KPEelSN5USXSD+4dr/wDfJ/pmuPvNOvdPk2XlpNA3 pIhWncViuruhyrEH1BqeTULqZEjnmeWNTkK7Eiq1FO7SsFj0zSfilbwJHHe6 UVVFCg278ADgAKf8a7PTviz4V2jzHuoT6PD/AIGvAKK8rEZRhq6tK69GdUcZ VifSy/Fvwgi5+3Sn2ELVRvPjR4ZjB8lbuY+ixgfzNfO9FYLIMJbld2vUf1yp 5HpvjH4q/wDCQaY+n2NpJbRufnd3BJHpgf415mTk5qSC2nupRFbwyTSHosal ifwFddpPwt8WasVI01rWM/8ALS5Oz9Ov6V6eGwtLDQ9nRVkc9SpKo7yOMrb8 O+E9Y8UXYh020d0B+eZhiNPqf6V7h4R+AenW7R3GuPJfOMHyuY4vx7n9K9ls NGsNNtY7a0tYYYYxhY40CqPwroIOD+Gvw5tPCdp5ip5l5IMTXTrgt/sqOwr0 oAKMCl6UUAFFFFABRRRQAUUUUARywRTrtljR19GGayrrwvpN2pWS2AB6gdPy PFFFAHMX/wAIPDF6STZQAnv5QB/8dxXP3PwC8OOSVVk/3JWH880UUAUT+z54 fLf8fd8v+7Ov9UqWL9nnwzn57zUj9J0/+IoooA1Lb4BeC4iDJFeTf9dLk/0A rfsPhL4KsCDHoVs7DvLl/wCZoooGdRaaPp1hF5VnZW9un92GMIP0q2kUafdR R9BRRQIfRRRQAUUUUAFFFFAH/9kNCmVuZHN0cmVhbQ1lbmRvYmoNMTAgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDMyL0xlbmd0aCAzNTUv TiA1L1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjedFJda4NAEPwr+5hSwn3oqYEQ 8CNpfUgLMTQF8cHEqzkwnuilxH/fO21SSlNQ5s7ZYWfHJQ5gIC4wCsQD6syA zMCmGPTDHALzOXptC96KupzEBa+VUP0D2vBSdKrtJ34h9/wBJeemqfhJ04AX C63xu4O5uLaF/M9yJwp1BMYwCvPmmYvyOFIRH8umlLloVeVlBxZFK1mrIJCX dGpbdODAcV0jyAZuJSpOwfjeDPeX/MSRH4TRcvkYyrqTVd4NxG7sZGOMYpVX 4uDXZcUBo3V+GS0RgmcoUfz0pt2hbd/wQWh8taJRskXv33Yp04OlVqqHyIgz gkUMwp1Xc156O9s0vVtje//rGRt6WPYVvREZHdG59c4ynXeQd9w4/5NDGEdJ 3+kJ4/pDAhlT0x+38imO1nmDrj8VRTsgWEf1OwCzG0aSnPfKxKOlpsBERX8C QzuzPbpOZ6T3Rx+yLwEGAClhqpsNCmVuZHN0cmVhbQ1lbmRvYmoNMTEgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUvTGVuZ3RoIDExNS9O IDEvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN4yMlQwULCx0XdKLE51y88r0Xd0 cnZxddV2zs8rzs9JLNZ3SS1OTs1LScwrAUkXKxgZADUE6bvmJeenZOal63um pOaVZJZU6nroB5cmlVQWpOqHAAkD/ZD80LxMoKJUBXOwDpCoPsgMOzuAAAMA ri0meA0KZW5kc3RyZWFtDWVuZG9iag0xMiAwIG9iag08PC9MZW5ndGggMzE1 MS9TdWJ0eXBlL1hNTC9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/eHBhY2tl dCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+ Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9 IkFkb2JlIFhNUCBDb3JlIDUuNC1jMDA1IDc4LjE0NzMyNiwgMjAxMi8wOC8y My0xMzowMzowMyAgICAgICAgIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4K ICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAg ICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgog ICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRm LzEuMy8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRv YmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0 cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8eG1w OkNyZWF0ZURhdGU+MjAxNS0wMS0yNVQyMTozNDoyMDwveG1wOkNyZWF0ZURh dGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+Y29udmVydG9ubGluZWZy ZWUuY29tPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5 RGF0ZT4yMDE1LTAxLTI1VDIxOjM1OjExWjwveG1wOk1vZGlmeURhdGU+CiAg ICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMDEtMjVUMjE6MzU6MTFa PC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8cGRmOlByb2R1Y2VyPmNv bnZlcnRvbmxpbmVmcmVlLmNvbTwvcGRmOlByb2R1Y2VyPgogICAgICAgICA8 eG1wTU06RG9jdW1lbnRJRD51dWlkOjZmYTFmNzY3LWEwZTktNDMwMi04YjI0 LWIzYWM1ZWQyMjUyNTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHht cE1NOkluc3RhbmNlSUQ+dXVpZDoxZTMwNGQzZS1lZjJjLTRhNzAtYWU1NC03 MTAxMWNiOGMwYzg8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDxkYzpm b3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRm OkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0 cmVhbQ1lbmRvYmoNMTMgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0Zp cnN0IDUvTGVuZ3RoIDU2L04gMS9UeXBlL09ialN0bT4+c3RyZWFtDQpo3jIy UjBQsLHRd84vzStRMNb3zkwpjjYyAwoGKRiCSRMQGasfUlmQqh+QmJ5abGcH EGAAaDMOCQ0KZW5kc3RyZWFtDWVuZG9iag0xNCAwIG9iag08PC9GaWx0ZXIv RmxhdGVEZWNvZGUvRmlyc3QgNS9MZW5ndGggOTgvTiAxL1R5cGUvT2JqU3Rt Pj5zdHJlYW0NCmjeMjJWMFCwsdF3LkpNLMnMz3NJLEnVcLEyMjA0NTA0MjUy NDYxMojShMjnF2kk5+eVpRaV5OflZOalphWlpuol5+dq6vvmp2DqNDU0BOoM KMpPKU1OxaXVzg4gwAA3TSmCDQplbmRzdHJlYW0NZW5kb2JqDTE1IDAgb2Jq DTw8L0RlY29kZVBhcm1zPDwvQ29sdW1ucyA1L1ByZWRpY3RvciAxMj4+L0Zp bHRlci9GbGF0ZURlY29kZS9JRFs8NUE1NjJBODcwOTM3ODU0QzlCMTcwNTNF MjRFNjQxNUE+PEM3RjcyRjU4M0YzMkVBNDZBOEY5Q0U3NDEyQjg3NzMzPl0v SW5mbyAyMyAwIFIvTGVuZ3RoIDg5L1Jvb3QgMjUgMCBSL1NpemUgMjQvVHlw ZS9YUmVmL1dbMSAzIDFdPj5zdHJlYW0NCmjeYmIAASZGFtF+BiYGBsYwECn2 HUSq3QSRTCkgUqgVRLYJgEVqgSSjdSyIzeMGFjkE1nsRLDIXzJ4KJvcDTf69 aweIDeRhJxn/gEgmsBpGBoAAAwD/uw1BDQplbmRzdHJlYW0NZW5kb2JqDXN0 YXJ0eHJlZg0KMTE2DQolJUVPRg0K ------=_NextPart_000_009D_01C2A9A6.76D683FC Content-Type: application/octet-stream; name="MSC.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MSC.pdf" JVBERi0xLjUNJeLjz9MNCjI0IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDM0 NjAyNi9PIDI2L0UgMjY3NjYzL04gMy9UIDM0NTY4MS9IIFsgNTAxIDIxMF0+ Pg1lbmRvYmoNICAgICAgICAgICAgICAgDQo0MiAwIG9iag08PC9EZWNvZGVQ YXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVE ZWNvZGUvSURbPDVBNTYyQTg3MDkzNzg1NEM5QjE3MDUzRTI0RTY0MTVBPjxD N0Y3MkY1ODNGMzJFQTQ2QThGOUNFNzQxMkI4NzczMz5dL0luZGV4WzI0IDM3 XS9JbmZvIDIzIDAgUi9MZW5ndGggOTcvUHJldiAzNDU2ODIvUm9vdCAyNSAw IFIvU2l6ZSA2MS9UeXBlL1hSZWYvV1sxIDMgMV0+PnN0cmVhbQ0KaN5iYmRg EGBgYmBg2g4iGb3BZDeIZH4DIllWgdmzwOwpYHYPmPwHJpnA5EcwOQdIMhof BJGb2UAiy4+C2NXvQexdW4DkX9nTDExAG5eDRID20JD8z8B46wNAgAEAiI0T Qg0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNCjANCiUlRU9GDQogICAg ICAgIA0KNjAgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0kgMTM5L0xl bmd0aCAxMjkvUyA3NT4+c3RyZWFtDQpo3mJgYGBmYGByYGBhYLBVYxBiQAAh oAwrUJzjgsPX0AMMTPOu3AaLa0VLPTjondzA0dEBRKwdHVBZoBQ3A6v5BCAt AMSCYMUXgXQsQ9uBaAWdCWISXG9YopgMGQUYip7ZcSuH6i98U1l4zFAUbiUf A6vrZCDNCMT7AQIMAKCnHm8NCmVuZHN0cmVhbQ1lbmRvYmoNMjUgMCBvYmoN PDwvTGFuZyhlbi1VUykvTWV0YWRhdGEgMTIgMCBSL1BhZ2VzIDIyIDAgUi9U eXBlL0NhdGFsb2c+Pg1lbmRvYmoNMjYgMCBvYmoNPDwvQ29udGVudHNbMjgg MCBSIDI5IDAgUiAzMCAwIFIgMzEgMCBSIDMyIDAgUiAzMyAwIFIgMzQgMCBS IDM1IDAgUl0vQ3JvcEJveFswIDAgNjEyIDc5Ml0vR3JvdXA8PC9DUy9EZXZp Y2VSR0IvUy9UcmFuc3BhcmVuY3kvVHlwZS9Hcm91cD4+L01lZGlhQm94WzAg MCA2MTIgNzkyXS9QYXJlbnQgMjIgMCBSL1Jlc291cmNlczw8L0V4dEdTdGF0 ZTw8L0dTNCA0MyAwIFIvR1M4IDQ0IDAgUj4+L0ZvbnQ8PC9GMSA0NyAwIFIv RjIgNTAgMCBSL0YzIDUzIDAgUi9GNCA1NiAwIFIvRjUgNTkgMCBSPj4vUHJv Y1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldL1hPYmplY3Q8 PC9JbWFnZTE3IDQxIDAgUj4+Pj4vUm90YXRlIDAvVGFicy9TL1R5cGUvUGFn ZT4+DWVuZG9iag0yNyAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmly c3QgMTI1L0xlbmd0aCA2NTEvTiAxNy9UeXBlL09ialN0bT4+c3RyZWFtDQpo 3rRWXW/aMBT9K/d9Y/62Y6lCAgrbpLUPoyqTqj6kEEGkkKAknbp/v5sPChmQ ZCFVREh8r+1zj89xLAVQkBIk3hUYfNDALQdp8M+AdDCoQVrQWoKiwKg2oBgw zhxQHJiUDJQA5giMS2DWUlAKOGeYh2MJrUHhYIoLUA5wg0nKgmDaws0NGd+R +yjeugF5+LPzyPQt/TpP3dQjSxfoF0WZ1cNhQx7LM0bJ0gtTMIqS0e/1wl+l GwTIyMTdffP89aYI3XpF2oDjyyxw1wkITmZRmI7H0dvTQFGRx7BApAR7POfB mR94HIRGsn7mDffu1iOj8eR2Ov00cQP/Jfbz9kUxlaSUfE+xfTkK14EHlNy5 bwUmZqQg89TbPiK8opqsYwYs9ndpFJNfJV6EMRw+ca6fMwLcxMvy/p10Gi6j lR+uycIPR2Hiv7/P/DhJJxs33hd4mCFb6qyQH+4hIy9oxsj89SXNMD3Er14O 7h0hyfEnmUKwc4VzrOjAORJ7xDmGjjg35ziXgucx0MZkHSqUm/OUR2ESBW7S lnNG7Z5z1YJzrAEOV/GW3fft++euv+rYzdnd5qjO1Afudij7vnDMsw7Ya6Cb BZyqBZgWpQd4Gw/Yvj1gdOEBQ+mJB5xaD3weR8Hq2AimzghGdzfCJSnVi+Gc GK+X/P8Lv9mSTW0fJ/Er5F8sfycP4He86gEjSw+IFh7Ar3+/HsiOCqUH5IkH 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 deYL4kTCMhEK3ja3QGnnIdbdb4lyzyLZ0SQXF4x4FHrLqviOS9+phbL3YTy0 MnprTlNbgc59Zg4M8Tb10UBETs0PYp/9Uq5vQWmxaoKRVtGbDcOUoKKaFLMD wNEifUWNaTwemWx9jAiFsw/4TSmst272Yj2MzI8Am1/STdL6RPEhBXypOJvY vYR2h+hHVsyzN7tORrnaOjTxEMAjPBzw+wQUXLPtI03Om6wYPxpoZpGy678A AwCX3mtZDQplbmRzdHJlYW0NZW5kb2JqDTMxIDAgb2JqDTw8L0ZpbHRlci9G bGF0ZURlY29kZS9MZW5ndGggODM4Pj5zdHJlYW0NCkiJhFRba5NBEH0P5D/s owpO9jJ7e9RiSgVNSYIv4kOobS1Uhdjf5W/0nNmvaqKhFPJ1Zudy5szZnaWW JVen1UvMLrUmPTktRVp3qUehkSQndzWfpR5EEVuiVBx6KRlGkNaQ2KVFs3y2 2BYlBDia1OJSVUkdXYooglG+NKdNJXQLhqNWc0QeV0nD6uiDCorUVgjQgrtk OqrkiMpeFCABXINZvZnViwXXLEmd9iSJwV1qMitiPPbPFtzqwJylWGGWQsPM 0yyVxFTxGKclEmOxaA87ik92aog9+WFm4bBdYnjkjagqojBexwelgKwgx0f2 rKhrHKsPUuiIbKTeS2UsCigyu9FUreoXThcHpOi+0lLJxBjGrANxxXTBJgdb XMBYJaDGYVcy4aXlARCZKKDBLGx22uWYJ3G6ZNMhpapZ+BgPOmITKxJVGsc+ 2yqpAhYeq0y/UYSxykLEjW2wjtAMfjHDj1BDzkiqDZO2ZpbnbMkIxaZ0YIDD F3OwamRxQgDdfzE2KLx5Qc6baZUDKplUX2xguNHTZ1MrAHQEeRUtY3tDCL1Q ICyqdg08BRYkDCLBp/Y2LZd0ZHUZO47V9AdZZCiAFwgFE4zE8haL7hUO8MZy Bf9WMUupfxywliFoJJ8OLhzFE4+VNBJuYaoneOqLE+Fe886HSf+ZsjwkYdIX law2AEBRYsikNPp4AQwh18k3A8i7mvpCHUpG6yFHfsBiSiYUXGMSHAZpvozg anoHJQOK3Wlejzr01fnYTIFUFBDEblXxYmjP4pvdJfYYfEy7ga5JKp8K5IRm zJjKG4PJjNZHwn03RxxXOrMW7k1zh0T8Uc7r7Xy2WAYXAjtub+az4Dz+goPq fFRX1cSzBXeL801ztz/mM+9u+XM+n3185p5/ctu389mb7Sh2lJ66fZj+b+xi GR1U9nfXnLFnVzRS4MyCG1R2/FZMs7899qz/i2KxTMeVJ0Al4AlqE6B3F2fr 1Wa13P50Z6v15Wr9anuxer85MVKMics4qPDE+IWLe4w92+0/333b3bvL+93V 9YnEUHA942HiE01ys2d5xDZ/IphvyXHwyxOxuK7tODZ47z7cXT1839/t3OZh f339gGz3S4ABAO+JcAMNCmVuZHN0cmVhbQ1lbmRvYmoNMzIgMCBvYmoNPDwv RmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCA2OTY+PnN0cmVhbQ0KSImMVF1P 2zAUfUfiP9zHRAI3tuN8PLKtSDAYEnRCE9pDmg/wlsYocai6Xz/b+Rju6nWq enPrnHt9fc6pV9enJ8vV6ckH9cUQqA8GgmNEGLAkRjSB1eb05MkD/zusDmBj ggISAosxoiP0RjSFaBx4jDGKiIU/g4dHvHThGUbExrtGwSxGiQ1l1zcucBzv z3HsiIwhPEK/NlyWBXzmzXMhNnt1i0sCmMCqerdbFKKQWC2O7UYTlMQO7OKS AglQEFqbTJWYIcrGyturj/d3D37s3V2unExgVWeXOSlO1B6Rjf3iM2/5CN+W F2qbe7jwqfd44Yfe/SdHE0ojFMR2E3ScQxpGKE3/b86RijBlKE6dJBJIURod 4jBMMGKDUqB5VpPkT96VBN6BWPuYeG9c9J1OQL5kEnQmX7h+dNAIySuT55nk QicNbHldG3xuFjYlSAE7k/eQdaZD5joPTSPEmD2WGanzz6nX69Dq8OonQ8J1 6NSvUiegw3qGynntVYd6gmVDkQpjVeJVc7NGh2JY/zfpUaLl3eNO8uHE+pht mRUm4RLyrNVZWfX6Udc7zcXWLCmmGp08t5nsDXeZLA2FO9GDeDN5q38MSdfn uSnsBmF4o7QpzUaVqGtD9Vb9Y4/Nz8KJ5CdPVBXPeTYo99qvTcLfyWoeFbRl 19dykF9Uox1KcN1qJCUI0/dbjXqeOwtixKg922bWjCul6lnUchB1yvJZ8lbB xKwln1+CtV7bkpfqpWn7oMN28ko526eb+5tZfk5F3TwQ0SHQATuOxwLlb/t0 oQuKtUw2dbPLFiRwbkFDdff+zThz4tP9kY4ZJ8QHjC/a56zhv4xZC1jvjDdu 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 7mrIWIb9pueFqWDGusL6n2p2YE/3tDrjSroJJpGYtBh8fKvVvUB/R2T57JlM aMW0bS6wl1K2bpKoItgQtFsWJ0byneArnsVENEFKEPu8Eprx7HSB47SSC+2r Swzj+sJg1zxW9uDxiS2SbLlbOlvmC+isiax2m6NBZR2HNvSGD4MrQzXXcP1v fAVKMm2aBeNIkF0Jgards/WZvJK2Zo9rJiTqgtuTKEETPJWZYoL/U/mu31nG 0tOlxlGHdOQEW1RVEHklcMnpE+zw+pLIM4EvZD2CIZ49EukSjOqQIdgjqHeD t39WF62wg9tPPmEyxS2R/IcTB9OlYIk6N11R8p7KKeWrrMpV4QjmDjelu7Sh QxvuO7FWMXGuVMyJGK84zATlqrmkW27vHMLeOls755s94daF62+j6zq5Ydm5 TE0yh6V7v87zBfSJoMajvh4dho/dkVeU5CwVJ/3rtwQJ4AQC5XhfGPutdqwe 13FxsXsgGGC1OubG1NvQ08ymTGUnzZqu/A6DG9TuPsIaSBPOjIRUSLAZkxaq Mgx+fIBVGCjjti21NQY9NmASpiHFaVMNBbaOPy/zWSkM3K7hG4r+I8AArkla SA0KZW5kc3RyZWFtDWVuZG9iag0zNiAwIG9iag08PC9GaWx0ZXIvRmxhdGVE ZWNvZGUvTGVuZ3RoIDc4NDQyL0xlbmd0aDEgMTczNDcyPj5zdHJlYW0NCnic 7H0HfFRV2v45904vmZkkkzZJ5oZJQiCkkFASQBhIo7cwmIBCelFKTKEJiqKg ARTXrqjo2rFMBtTYG/ZeVnftrK6rq9hWXUUg/+fed04IrPrf/b7dz/X75pw8 93nOe8o95z1lDj8zkXHGmBsPHZtdWjmlYvu5W8qZ1L2HsaS3yiaVzssb6riZ sR3zGOOPl02aXnJZS7mdsSvTGZPyK0rLyv/86NeQG19lTP6sYvasymlDx0iM XZPM+PbuisrApHPGTH2ESeNvZGzysFmVeQXfv/U7F9r6Pd5aU7+0tm1MSC1f YEIje+pXdCrBy/e8zFjtd4zpk5vampd+++0MG2MjnmXMnNRc29HGkpkP749F fWfzktVNpVFd7zPWjLR1VEtjbcPnLulqtH8c8ke1wGC/1SYjfQHS6S1LO1eN /tz4Bt5VxFjeiyc2ti/jg/hGxrZtR37CkuX1tUm3JDzMWPt0xlJnLq1d1ZZW mP4c6vciX1lWu7Qx5ZaTTkP53YzZx7ct7+js8zDUv+JrNb+tvbHtxNulQ4wd 8xFe52Sqb/VvDWkbnJuy2DHuG5aIYSLc+8naZ1V+3r5o3w/7D242f2oahaSZ SYwC6hnYIcb3WHb8sH//DvOnWksDgukR1eLIZLOYno2DlpiT5bFGxlzbtPdy Juuy+TbkmvSX6gvRZCqx/CLbKDETkxx6SZJ0sqR7j0l9fnZLH72XsRmVisL8 jKUUUx+MV0qZCuNXqXnyXfoodaRoPepwb/gL7P98MLzObvml+/C/Jega2dW/ dB/+mWAw/Hv6K+/7dfnh3xF0I1jNL92HSPjvB+lpdukv3YdfQ5D+xCb/V+rx b9mSf3VfIiESIiESIuG/HqTLueUn82rYvv/JvvxagjySbf6l+xAJkRAJkRAJ v66gW8rO+aX7EAmREAmREAmREAmREAmREAmREAn/e0Lk35mREAmREAmREAmR EAmREAmR8CsOchjJ4W8brEEKSmpiOrYI6WjmhEX9joKdDWIzWANrZztSivv6 tNJ2phxh433fMNb3N3YnT+qr/2RTuM2oI98oT5UvZgb+qZb68uhvOWjfa6Dv REjs5wMf0N6/I5T+M4V50s/kbfnvduV/OMj/0tb+rSvJX9GweNHxxy1cUF0V mFc5d87sWTNnTJ82dcrkivKy0pJJE/0Txh8zbuyY4qLRo0bm5eYMy8rMSPcN 8ibEupwOu9ViNhkNep0scTaszFdeowQza4K6TN/kyTlq2lcLQ+0AQ01Qgan8 yDJBpUYrphxZ0o+STUeV9FNJf39J7lTGsXE5w5QynxJ8rtSn9PIFc6qgt5b6 qpXgPk3P0LQuU0vYkUhLQw2lLKGlVAnyGqUsWL6ipbusphTt9VgtJb6SRkvO MNZjsUJaoYJZvrYenjWea0LKKhvTIzGTXX1tUM4oq20Izp5TVVbqSUur1mys RGsraCgJGrW2lFa1z2yz0jPsoe4tvU5WV5Nta/A11B5XFZRrUalbLuvu3hR0 ZQeH+EqDQ9Z8kIAhNwaH+UrLgtk+NDZtbv8LeFCf4fQp3d8wdN6379MjLbVh iyHD+Q1TpTrEfjchX2iGvqGHGF9amtqXzb1+VodEcP2cKkorrM4TYv687Oqg VKPmPCRy3AE1Z73I6a9e40tTp6qsJvyzoiUhuL5OyRkG72s/GfhBvhKUM2vq 6ltUrm3s9pWWkt/mVQX9pRD+2vBYy3ry81C+tgaDaFXdMKcqmOdrC8b6JlEB GBR1Dlorq7Qq4WrB2JIgq6kP1wrmlZWq/VLKumtKqYNqW745VXezwr73ekYo nl2FbASrVvsRjCvBpGSWdVc1NAW9NZ4GrM8mpcqTFvRXw33VvqrGanWWfM7g kPfwujTtjVotjO2o0qKwOnJjhkmpkjxytTpbMCjlePgmjUOGE9OlJdUZnTRO qeIeJorhLeESqjqiHSTkjJLJapasVi2Z7EmrTqPwM13yhPukzwiaBrTlhKG/ T/Sen+walVY7NEQpaywd0MEjGtWHOxhu7cf7Kam+CL8YNUzqdE4WWXIGdi5s EprRTOosJihBNlup8jX6qn1YQ/7ZVerYVF9r8zut0jdtzoIqbbbDq2TeESnK L6JUkKUhWySkEqzB8myPmFYtXaGl+5OTj8qeIrKVbpNvWmW32rgv3CBTsIMw aEPmlNrNRdEjsDXLcbr5ymt9ilMp767t7Vtf193j93e3ldW0jFHb8E1p6PZV Vo3zaH2dW7XOs0Z9VTSbxqfNm5QzDGfPpB4fP2tOj5+fVbmg6m4nY8pZ86pC EpdKaiZV96Qjr+puhTG/ZpVUq2pUE4qaUFuai4RJK++528/Yei1Xpxm0dH0v Z5rNJGyc1fdKZHMKmwSbjmx+zaYGTFJCC1yM47ZMaVCnZ211S3dNtbq5WBym Ej88yH3jWVDyje/hksEWtPgaJwWtvkmqfYJqn0B2g2o3YmHwOA7nqGdSd40P 5xQWVBXzcFqKstqk0tvXN68q7TnPvuo0LLXjgAVVQXM2zn59xlSUq1BRA3NF cH19rdoPFqhS6xozptRXY9mKBlFkStCMFszhFlCiXKujLkdUqsfcYAK1+uuR CK6vDlZnqy+taq3WlrMzyCb7xmDaqU19pvqivOruaF+BtjexFSwZm1Qyo2+s soosHiTxsmpyktGGntf7kFVfo8DbOlZfiaVOZ6nFQ5ZGHIm6zEYNFk84k6nD kjOsdkvQnIsG8aNqa666JfUZxupq6ryW2hQugHc7g1b0KHOAK8MV4B1kTVH7 gp9N6Kpa9GG1mTm9bK5vFU4WtdNaS0ZkB+0ZU2px+FN9Kyy+IlHZpJ4R1nAb e8hqVEdug9/ljHm9fTf4VqcNCDnDfOqHg7owmeduLGxW3X20IbgwO2eY6Wir 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 4fyc6h4ulcwLxqr/xVZLn7l1K5uUMi2YUlkV3JFSPS24HsKvij4IltITxyZV Zy/q6OrIzu5chMeijs5s7Qcp3qWmslWj+tPRibQau7Q0y/7ZQMVAizsQOoWx 8+dr/acH/kt34Ncfepj6SwYT+6QzWIO0ATgdOA1YD5wKnAKsA9YCJwNrgNXA KmAlsALoAjqBDuAkoA1YDiwDlgJLgBOBE4BWoAVoBpqARqABqAfqgFqgBlgM LAKOB44DFgILgGqgCjgWmA8EgHlAJTAXmAPMBmYBM4EZwHRgGjAVmAJMBiqA cqAMKAVKgEnARMAPTADGA8cA44CxwBigGCgCRgOjgJHACKAQKACGA/lAHpAL 5ADDgGxgKDAEyAIGA5lABpAO+IBBQBqgAF4gFUgBkgEPkAQkAglAPBAHuIFY IAaIBlyAE3AAUYAdsAFWwAKYARNgBAyAHtBN7MNTBiSAA4w1cNj4IeAgcAD4 AdgPfA98B/wN+Bb4Bvga+CvwFfAl8AXwOfAZsA/4FPgE+AvwMfAR8GfgQ+BP wAfA+8Afgb3Ae8C7wDvA28BbwJvAG8AfgN8DrwOvAb8DXgVeAV4GXgJeBF4A ngeeA54FngGeBp4CngSeAB4HHgP2AI8CjwAPAw8BDwIPAPcD9wH3AvcAdwO9 wF3AncAdwG5gFxACeoAgcDtwG3ArcAuwE7gZuAm4EbgBuB64DrgW+C1wDXA1 sAO4CrgSuALYDlwOXAZcClwCXAxcBFwIXACcD/wGOA/YBpwLnANsBbYAm4Fu 4GzgLGATsBE4kzVMXM+x/zn2P8f+59j/HPufY/9z7H+O/c+x/zn2P8f+59j/ HPufY/9z7H+O/c+x/zn2P28HcAZwnAEcZwDHGcBxBnCcARxnAMcZwHEGcJwB HGcAxxnAcQZwnAEcZwDHGcBxBnCcARxnAMcZwHEGcJwBHGcAxxnAcQZwnAEc ZwDHGcBxBnCcARxnAMcZwLH/OfY/x/7n2Psce59j73PsfY69z7H3OfY+x97n 2Psce/+XPod/5aH6l+7ArzwkLF7EmPFKxg6df8RvUc9mJ7AOth5xI9vKzmcP sjdZHdsAdSnbwa5nN7Ege5g9xV7/V/5K+KHV+qXMJt/FDCyGsb79ffsOXQ/0 6qMGWM5HKkanHLb0Ofs+O8r22aHz+5yHeg3RzKLVtUsvw/pXfrBvPz5fke4b paalTdAOrcaXxisP3X7ohqN8MIctYAvZcex4VsNqMf4G1sJa4ZkT2RK2lC3T UsuQ14xnE1KLUQpniaYPl1rO2oB21sm62ArENuiOcErNO0lLd7GViKvYaraG nczWsnXh50rNshY5a7T0KuAUdipm5jR2uqYEk2UDO4OdiVnbxM5iZ/9s6ux+ 1c02sy2Y53PYuT+ptx6R2oZ4HvsN1sMF7EJ2EbsE6+Jytv0o68Wa/TJ2JbsK a0bNuxCWqzSl5t7HHmd3sNvY7exOzZf18Bp5RPilSfNhG3ywFiPcMKDH5L+V /d46BWNXx9YdHukq2E8fUGNF2I9qyQ0oSa3QPKitrDvKE9swBtKHR0SpC7Xx H7YO9MrPWYU/tg/wzOVaSlVHW39KX8SuwA68Gk/Vq6q6BprUVZoeaL+yv+wO Lf1bdi27DnNxg6YEk+V66BvYjdjbN7Od7BbEw3qgIr6N3arNXJD1sBDbxXZj Ju9kd7Fezf5zeT9m3xW2h/otd7N72L1YIQ+wh3DSPIIoLPfD9mDYukezUfoR 9ijSailKPc6ewAn1NHuGPcteYI8h9bz2fBKpF9nL7BX2OrdDvcQ+xvMge1H/ AYtiExnT3wM/b2eLEPU4lTrkl3GKyMzIitkMNpMtvI/Z8XEfx8bwO+5wl5aa cowP4KNcYgouAybGeYnfoZPsdyUlTfDdNdKwVXZN6eU5uycYt+KaO+HgOwef zzv4zr7o4rx9PO/tve/sdX75vKs4r3Dvq3uH53NXmktDbJRkNMYafINypZGD M0cVFhaMl0aOyPQNipI024hRo8fLhQWpkhwrLOMlNc3llw8skGcdNEin+CbM L9SnJjli7Qa9lJwQnTMuw1m5MGNcbopRNhpkvcmYNXrSoGlLyga9YXSluONS ok2m6JQ4d4rLePBNfdT+r/RRP5TolvxwgWwYe9yEdPkSi0nSGQy9qQmJQ8em TZnviHHqrDFOV5zJGO2yZZUed3CjO1ltI9ntprYOzmCc3dK335AND45jt/id NePbxkv2/Pz4vDxLbkJCUm/fR7ucfAb4i12OMNs1/naXTeOPdllVllz+1PTh NpslAcUtTof6QEGLBaUsCShiuQf/BmF9D/kTkWDpo+ZYE+LteQnDcw3erDne QHRAH2ATEKLji12FE3jeq9l7tY/AAlehs1+5io/JKyx0FQ7PPz5DONbl41Gy qgZzn6vfOEKdk1QpnhdyTIQq3YZsU6w3MT4txiQdKpSt7pRYd2qsVTpUwU2x SmKCEmMc5mlR8tMTzHylnm+0JnkzE5c6PDG2JJPNqNcbbSZd8w8XGC1GWWe0 GOD4S/vt1w9NtyVleQ4cK1+fOjTRao5JcWPBXc2YfACfe9HMywbdx2Lwj0TG kqRYv9mc8H1Ug+d7fTObsG8C1hktLrXzvkGZWufT0GPjiFwYXOrakg9M6X5y 6w+x6emx3NX98IbSYFZg05LztjVtrB4mebc8u3FiSpp8bVpK2RkPnjJ3S/OY A58Nb7xY/bbd1X379Y3oQxGr2D3MnTM4oZf3+c2D7HmWnJxBIyxqysUGjWzI ibPKKZkNKS3OFn2LmAh1GvYWRMPp0cXFzr0FruLi4fkDHW8w/H8dH+fWNxpj lPhEJdooHdqs82VhEZrlQ5dKxmglMdEbbcxMWOIdlgavD9HxAlti2pDkpsT0 eKPVqNPhIa88cIbNJhvMBnntgbP7rU8MUlSPHxwhPZk6NMmqDFL93bdf3o6x FjI/O+ZuZpHcu4c7s10j1F8QyBzr6oXnHcnZrg/Hjo0v/lZpiA+PVNvrxZiE glf3Ypyv7T08xsGDc2XfkYNTJ8atbv9UOT4+Lk4eMEfbTe6MZE+a2yLPd6Tn TxzRrK2rtFgTJi2p5syF+Skjpw/35GSkOastxk/d+dP8F54zfmZBYowRg5PN UdavhpbmJR2a1T/IZ9JSMsubJ46YX1bgtKbl+7M+TkqU3vGNy048dFtinl/9 tmVN3z55O+5lmTj9Nvu9E8Zyq6dY3XnF6s4rdjrVB3ZjsboHi+/Fv9IZy+t7 T93EeeHNnRfe3BrbwnarypLFb4lJK7cWD/boooaq/5kjYeqIXq7bFTVDPx2u w9qlVUIb9NXwPi0euD1H0hqh8y8u3hU+B91ypnZaumNTJdV5o+XtRldyrHpA VVy6sH7LsVkFdectnrXBb4z1JmDtmK8vWVc6oWp0onvE/Ilpx/jLBydi98FN NtPKGfNnbOip67z3jIqyEslqtKub0m48WFZ57Li6tf7S0xuPiR5aMlzdDZfi hnmD/DRWSP3utpE80xE+xxzhIYO/2O1w8umO8EHn6OXf+aOZPwZnlt+FhwIj S8K+yfCbs6dmOtzKFLfqCiwcdSPvwfg1L6g+4GEfqOM0DlhEYQ+4tU8Ig3SD ZDCbTPEp6e7E/JFjfKZoOowM0cnxcSlOY8bEMcUp9rT0FJtO5nJdXKrLbDab YnOnjz4YNFlNOh0e8hkmqxlLyGraMKp0sEM2WSzmKI+6PiZLj0lrDC6Wzkay gpA5ceS9+CcyYzn8bL/T5V2aaJazgnEnFVxu65Q7wjNarM0oNn6xeiYZ/vFZ HDVaWpOY5opzGPJqx01aWJykTFw8YfjcLKMjKTY2yWk4K6siK32E12FLLchM n5IrfWCz67CvJ+YNz5vVOq68Y1Z2ZibP1Zt0sqwz6Q9V5uYqI0p86eUj07JH qrO3RHqGv6T3sByWuWtQEsPcHOu3JVn2DD5pkMOd2ubuODwPX+6JLg6fqD8y AaPUY4ncr+MvSTqj3mR1uF2OZMUXp3dSZxN9vviEoZm+mKi0OKOO6152JUQZ 9Qa9NSEr5dCN6LZO7buUYEOo8GbFm3QmQ1Q8k7il71v+ln4Rc7MhLOoOfYZn hrMcHXv7+cP9GSlnhv0Xc/T14H6j+vGcHG10cZPbl+zxuU1R5sQsr3dIAj41 hni9WYlm3mWyqfNuM8n32KJteoPNZfuhOC3bY7V6stPSchKt1sQczP2+vn38 dt1irSfKfSxOamAKc0vFd1qdQ9GvVoZOOfcM/PRRjzx5xE/17UKjw+OO8zgN 3GWISU/2DMLBZY5LT0nOjDeb4zOTU9LjzHyk+gEp4yH12ZwWvd7qsB1QUgYn WK0Jg1NSshItlsQs9G2z3CRdpu8SXvJkVjgr4KXnCgZ6Kfxi41GWOLe0weCM j45OcBjiLbFp8ThjzfzQpiNs+ZnyRuEm/oJQh4YfaXM6+/rYOdIL8rv6jySD 6SGmrrNwmo1lRT05ieqvCPjyLSox38he6cw7cuOtcmqWqlI7XB36joEfl/sK nPsGjsElhy8nsi/m7z4jYwpjxOVEftfoTHTHeKKMH3OzI87hjIsy87c4NzoT YHUYU2PK45VEp+Ep+RVjtDsxeqolxmaW3tfjCMQhqJf8B++TcY2UdQYd9KP9 9teS3GjCdfAryR6d5DDobS679q/nq/8zIp/5q4jb/j1RMvwTcf0vHeX4/wNx 239g/Pano25KJEbi/5J4zhHxrf+cqB8UiZEYiT8Rh0ZiJEZiJEZiJEbiPxQv j8RIjMRIjMRIjMRIjMRIjMRI/PVF7b8nq3/rOxZPzgxacgtP6vtA/UUTaRAT f5u8QXvKWukoLaVqiUXJOib+qn26HB3WugFl9CxBHhXWhgF2I1shzwxrExuq /a1xVZuZIu8Ja4u0o7+8lc2XPwhrGxuqGxPWdukSnSgTxZYYDvT/hfsCY0tY c2Y0XhbWEjOa/iL+lj2LNom/iK8bUEbPbGY5rA0D7EY21uwIaxNzG5eHtZk5 zVPD2sJn95e3smzzgrC2Mbf5zLC28+nmy/r/xvooy4fq/wVAZw77mTT5mTT5 mTT5mbRuQBnyM2nDADv5mTT5mTT5mTT5mTT5mTT5mTT5mTT5+SamsAKWz4az Qu2vyau/Zd7OlrMOoIl1wlai/XY+/Y5+LSytUMtYLnImsiWICpsLWzNrQV6H lmoEN6L0CjwbULIE9ZagTB1srSjRqpWrBZairQat7DKkOmBbpuVR/Vb0QAFq Ua4VLaxGaiVUJ96laN8JqINegrKK1ucu1G7QvnPQrLWyPNxqJ0osDb9TLaFg jMu1dzZq3y1QxzJFG2sTLLXa77y3a6NQNK7VRqm+l8ZRj5xhWstLNcsSrcVa +Ijs4i1L0c4SzWNt4V4ug2Wp9lZqUx1n54AeqG9s08YivhNB3qa+q29aDg8o 2rcBmjUvtGq//69+r6JTS6kj7uyfD/IZvUXR+r4sPK7lmm/rtJKHezxwRKrX Vmn1aNQnIp2rrYeBszlYa22p1sJqzQ9d4Zkf6G91xmj8jVr/1fHTvLRrq0Fl eqM61wraaOsfDfWxOVymA6k14dY7MQqaoRX9s1SrrZFaWJceMS6xmuvRk1rt /fXh9+dqK7ZZmys15+/3wJi/G/X88MppDa+xkWiliI36mZXeqb2zQVuJ6ltO 7J8D4Zsf23vN4XXd1l9aXbk048tQvlFbO9NRop5laT4dgjINWnsVWt3lWvud iG0YRx7iSi3manvqyPflhlvPg16trcBmrddtaGE1rKrHmrQRqyv1yFaFvUn7 JlC7tl5Ee9XaGGiVrNZmt0PrYae2jju0fUe1FW0M6h5o1GawVXtHozaHdVpd 4a0yFsC4J4brtg/Iof3ToPnk8J5YGf4GTctPvJfSatl6zGCX5sOG/jXWoOW3 aStk9YB11aaNdFl4ZVFbjdpT3SlHj1vNpx2ZhVrqTKmroa7/TT/Wq2V/1/I/ 7qPDrYtTUQmfa51av+uPOF/+fuziNDm6X2MHeEAdCY2FTlnxOdHef2I3aGfW Mu3sqv3JkZKfa4/wKe345eEnjYp0l7byurSaDdr+V0fT2N+OWnKJtmt+bob+ Vfvi8J7I03qj7gE6+XO1uWpjq25SCvKHFyozWuvbl3csb+pUSpa3ty1vr+1s Xb4sV5m4ZIkyt7W5pbNDmdvY0di+orEht6R2SWtde6vS2qHUKkuXNzS2L1M6 apd1KMhvbVKa/h9zZwPeVHn//fskaZImaaHlrQWUBBB5syCgIMiLCgoFSwVx iJumtAUCbSltCi0IVIqIyhQVEV+myBwydejo5uZ0WQWGUF5EbGuljEIhtMbT 0rImzZB5ns85SUtBdv3Z/7qe53p6X5+T83Lfd+7f93u/nThnSqYro8C+zOVe YM/Nm+vOSLfnLM7LSnNlzc+1LyarOz2Tkllp9tTFOVnpObkJ9ilu+7z0FHde TnquPSc9JcPucvMdqbmD7bmZKbQgNSWbc7VIZl6G25VNlVl5mek55MxNd2sV 5NqzcxbTbrXZ1J6RsXiZfQENt7sys1NS3XZXlt2txkHLKGLPcGXxXYvn2ee6 5msVh77InZ7vprBrUXqCPRzmzbn2zJSsAntqHsGH2u1ewPenL7PnpBBLjouw KZiSac/LVr+GGudzJ9e1nOzuxQS0VA0pxb4sJScz9F2qzKkLUnJoWHpOwoz0 +XkZKTltDoxu/eqHEIdw7LcljLr9CtHdOSlp6ZkpOYvUCNTWXHZvPlpnq7dT FxN4lis9N2FaXmr/lNwB9rR0+305ixe7F7jd2aOHDFm2bFlCZmu5BLIPcRdk L56fk5K9oGBIqnve4ix3bjirej4vha9fpOZ7eHEekhTY83LT+XIapD62p+BA ek6my+1OT7PPLdCaNWnWtLt4mqNd4E9aXsiJZQtcqQvaleXTlZWakZdGURRL c+VmZ/AFqlbZOS4ypJIrPcudYG/97sVZGNnfNcCenjlXLXS5qqzWzNdskZZd 7YrYkuvOcaWG+kvbt6vdpLWuMVoD+rv4FrqsOiZy1I6dtnhZVsbilPZfSptT Qi3FeMJFY/Ukz52d50b2pa7UdDXPgvSM7KsCuh4vNCeGpKXPS6HzJ6TkZue3 vTcJJU6sE9f6k8jBzlt0EiZFER3C//Ut3sCk/nwOFqLtPebafxP1r9hsEnmk B683f1SUlr/wevN36KDl/+B683fsqOWvvN78MTFqfp3hevN36kT+idp/fczM u4+aXy0bof6Xw6TuvFVtEN31ieImcgzj/uir8o5rl7cLefuQN4Ecd6q1X5V3 Tbu83cjbj7zDyHEX9xOvynuoXd548g4g723kmMT9pCvzav/Vsta8Pcg7mLx3 kCOR+zOvypvZLu8N5B1C3rHkmM79h9X+YjZLZsuePb/h79VXzRGS2WQ256/n L9+ol4yGU4Xqn1mSzAbtrFAU6vWSOWLr1q3mSMls/bzw88JtpE2k9aTICCmS GlqrMEjGiI9K1HKRkhQZriJUR6RaR6RFirSV8Pf2hLcnvKilDSSLUbKYDQaD e8PatWs3uE0GyRSuptAi6SwRbfUUGgySxbiRP4tVskSVOEuc1Lr1BfsL9mdI a0lWo6T+WzLXrMwq6aytlYVrs2q1WaMka4eSuJK4rf239t84eeNkNZwnzU+a 15htJskWqeNv9L1r+Lt3tNkgmY3hCgttks5mLLyySptJrdIWLdk6nup5qmfj nUcHV2ZUZuyfdujQ3g1fbNhj22OLMktRFj1/Y+bvUf/mj9GErDxVEvqL0umi jCVtf6KkJMIoRZkPqX/hXm8RH+s+EPrUgpwM0Xl+TvoikZSR4lb//fcbhe7u 6TPtouPMGXfb1VHCXKH2eRMzRrfwlUSP6Sjiwlc6ZpUYEa/lCt3RU3+s6C66 Cv2U5OTJou+M6ffbxdAHZ0y1q2NCy2Pgvb+T6KFd6Xnv7yx6hp9EiCjRRdwQ vlJ/WehKq3qlZudmi8+0427tuF87HtGOZdrxuHY8tYjthzinHWXteEE7BrXj j+pRMmhHi3bsqC6bUlftOFA7jtOOM7TjPO24XDs+px23ZS7KXCR9rB092nGf djyiHSu040nteE47NrTNNNd3lP6roxn99ZpOJs7VX1P+/7qnw9uo//VnNM6r 77zqW9oa8aLYJnaJ3eKYqBEXJLXfCa0vhpSQhfp7U2tfUv8rk0IaHfpcvy70 +atguzL014ZtV1xLtktXXkdPvPI6ZuiV153+fOV1v55XXve/6vnAUVdej0gS kbp217fFtntuFNJ9c668nraDTwsjpL9IVn+jowzrhm6oLlms1r2j+0Zs1f9K /ytRZnAb3hblEV8b10t6y0xLivSJ5SmrJO23dbRN0t1je8T2pq4gKi1qoe6v UaujNuj2Ruuizbpj0S3RLbpvWa4DqjbGiqiPr5mOko5HnW2XfOF09BqpObp3 W+pPGk2aSFqopS1Xp6ij0dui/9BxczhtbZfeU1OMuGayxCS3pWdiNrWlQCjF 9rxGSiCN6Pxau/ROKGlPrkqdd3Xe35aOdDlFOqemroZrpdiErrFd+3d7pl3a pKXd10xHu11sTXGd47q3pYnhlHjNlKylh8KfV6bC8FHNt09LZW0pVPpkXGP8 wPi0+Dfjd6jp6trjd14rhWqP/3N8TTg1X07qt8Rf1L6rUOWGaX1Gt6VpfWa0 pbRwWkgq7LOw7zDShJsSbprYZyHHhJt299t/c4WWmvvPIWUP6EcaPKBmQBBq Bvw4cP+gN9U0oGbQZ4N8g3yDDYOjB3ce/BdSWcI4UnLCnCFvhJPn1sLh/YbX jXjx9hGkcSPjRs4ZmT9qVzh9NmrfqLLRA0mjRq8bc2KsUUsbx+7W0qVxt4/7 IJw+HnuJ6w/GNWpXjeN143XjPhg/eMJzEz67K2HSbNLJ+xaM3RjKzWdjKNeU cWq+KdMSeycOTRyXuGNqPy0lT12opfyp66a+wTF/ainp1LTl0wqnnbw/m7Q5 yUmu5KQjSUemlnI8oZ6RapLkpIvTC7W0ffohLZ2cLsPJ6YFkw/QAz+XkOckn kmsecJNenGEn3/bpgdCTGcunB2acndEwK/mhfbNn/yL2Fz1/0W++Yf6c+ZXz L7Z+LhhM2pXVMat3dn72muyS7JpsOTuwxLBk2JKJS+YtyV6yfMn6JZuXfLDk 4yV7lxzLyc55MWdHzoVckRubOzl3bu5nuRXuEe657jfyHspbn+fJa15qXDp4 6b1LP1h6btnEZRfze+bfm+/Mz8l/I39nfmVB74KfF3xcUFlwcbltedflo5bf vTxt+fbllSsGrpi44tEVW1a8t+LEisDjEx5f/vhnK40rJ6zMWfnRyn0rL63q vmrBqu2r5NWjV+ev3lmY/B/mqo+vno+unG0Kl15O6jxSuPVyCs0g/2HsJV49 4q4cJ6Gefs1Zp3XmaZeunDsK911O6uxQWHY5heYFdQ7t+F7cvm6bmIePj2tk 1tTmYO2T+TYmmfl1S/S2jpujjrbNmeSNCfRJU8tGfRy95fLcGVKJ2XmiNv+G cvWO3taqnnpXnYu1vMfV51r+sILU+3HUWWbybZQ4rtV2lNZt5vO4li6vDr6r VoWJ7daByyvBNrXdP5n93/vJ7G8Jz/nPaPO9Nstr9VA6eiLnW1pnQvzYEfaL uSk0/4Tmt7CPzInMgKpraW2zY6ujzHFxiYU1aonLHveZUVhTWENtaq5mniXH 1/SZ8dM+wTxY1m5GvcY8235e/emcGp6592m9KTSLTmudP9V5nTt8a6Ecv4M7 M+KSbx+RdKSrIbSOaZ+sWd0udjlFr4ptXX1aV5XYnl0Nl1egUK9U1zYtt0HN QdndXWPVJ+odNZd6P7Zn1NHWnhrXPbYnK2CsWl49D929vI62X0nVtmirZnjd bLdyxlLD1evkpitWx6PhlbFza+t5fjH07er3T03ucipuIu25Qn1VNVVjnGo3 Yls1Do1EVc1QT+mTht6JqpuqEnHJnV/T/N6hetNuVI+O30msrStsWajWQjmu sFAOJfUb1M8+M1RX1LNQT1M/C+WbEvoOCxFa4foO01aldkld4UKrm7Y+/i+T tqa2Sz/Noa207VJ4xW1LPy2hrrT/XdLW4utObSv2f0hXK6WmtnX8PyRtZb/u pO02rjNdrY62R2mXfqqftndpl9R+H3L6v0s/rfl/bt31pZDO6t4lettYY2Lv sZeijqu7Hi1t1O4Y1Z2OdrUxsbe6Bwo/I7GDGqXumkJ31blfPVOTtjuare2s 1D1U47hGbX/E7oiz3WM3aruTwrZdjJq2Ty9MOjG9UN3BaFfbw/uc0Pl2dkE1 6h11R6OWSwonbcfj1vZG5NWebleP8TvJvV3dTTFb9Es6oe278sMpWbvTT911 aVfJSSfUeSn8jMTObSh7NXWHppZbp52RtH1atrafI6+2U2vbr01NHq/TFLmk avGAO6TEWKMWDy0OtXRqqVa3+k3rtLq0eq8ciT91tH0/uLkidCWMUolyXH+/ 8pl+luigny1s+hylSe8RI4WOJ0e58mpnsn6WclZIHFuEjuMB/WzlKG/q7yuX xF7lkuQUnaQUMUOaK+KlVOGQ0kSMtEjEkHMEOcfrM5S/CYl6zggDeW3kjSGv jbwWrT4vuRpEpPSo6MnzPjyfxfMbeN6Hum6iLgelX6c9J4WVs120N0b/OO1Y qfyJ9o7Wn1Fe0Z8VQ/VeMUxfKwbpv1O+0vt421VrP0rtNcLAmU4/+8cfaM0m atoj8kUHkSg6wmgxQIyBNOUrkQ7zIFepFW6lWeTBUlgG+VAgbGK5ckysgMdh JayCIsqvhSdhHTwF6+FpeAaehQ3wibhb/AWCnP8IihggCZAgWYyRHoAZMBMe BJeYLu0TvYjYpX9I3Kl/RJj1j0GGWK9fLW7UPyHs+iJxo+Et5ZhhK7wNx8QA w9dQBuVQAd9AJXwLx6EKTsA/xICIjspXEaeUYxHfC1uEzHk9NCrHjBEi0TiA z+FigPF2PjOUr4yZkAWLIU+pNS4FtDGijRFtjMsBbYwfijHGj+BP0CLGmAaK XqZB8JgYYHLCXFgCOVAAhfAEoJFpI7wAb8Hb4m7T+3zWQwM0QhNcgBZAQ3Mq pEE65IlekUKMiewseml99xz92qKdfYfrLaILvbaYXltMb+tHb7uL3raG3jaT 3jaX3jaF3jaB3O/QXxL0DynP6X+mLKcH3Ua/eZkanHqPsl1/hn7mFXr9Ofrg d+IRrZ+dJdcJtpmto+JRMaRd/ZOpfyn1T6L+keSeQ92bqPtPlBpO3Zup+3Xq +4z6HhLR1HKeWs5TS0dquZlasqhlCLUMoZZB1HIzrTxJTf2pKY1ahlHDDi3S A5x9KOKo42/U8Tfq6C89pvyFeoZQz2PUM4J6ZlLPeMmlfEldQ6Qtyp8p+Sn1 GahvKS2bR52daFkRtT2rr1GaaV2pvo7R+p24Re8Lj9gYah1IrS5qHUmtk6i1 LzX2p7avKfk1I+9+opwlrOEZ5t/MJOrM8qooUmSxFp6EdfAUrIen4Rl4FjZA qRIUB+EQHIYj8CUcha/gGHwNZVAOlfAPRREnoRpOwWmogTPKQXEWvHBBqRL/ ZJw3gx8C0AJBZrd/8fwi/ACX4N/wI21RFFkSIGmz4hn9HHrYz5Xz+kf5dCrn DccU2fA1lEE5VMA3UAnfwnGoghPwD6hTgobvwAffgwz10ADnoRGa4AL8E5qB thh+BEU5GBGrHDRNUIKmSZAIUyFJqTU9yOcsmMPzR+BReEyRTU6YC4t4toTP HHBzvgzyoYDrx/ks5PMJWMf5U4APpuf53MjnC/AS55vgZdgMr1D/W9zfxvk7 nL/P+Yecfwp4ZMIjEx6Z8MhUpSimE4BHJjwy4ZHpFGVOQw3gkek7pcrkg++J RYZ65aipAc7zrJG6m+ACNHONd6YAny1c45E5FdIgHb904jnRWVu59OI5+u4s +rC6ekVw9TuuErmaQi/fq/9SDFL/v5mUgJhIz6yiZ1bRM6vomVX0zCp6ZhU9 s4qeWUXPrKJnVpG7lp4WpKcF6WlBelqQnhakpwXpRTI9JkCPCdBjAvSYAN9X wvdV6X8hIvQpMJcelKqcoddU0Wuq6DVV9Joqek0VvaaKXlNFr6mi11TRa6ro NVX0miqcDOBkACcDuFiFi1U4F8C1Klyrwq0ATgVwqgpXqnCjCtWDqB5E9SCq B1E9iKoyqsooGkDRAIoGULEKFQOoWIWKVahYpY3Y48KElncxks2svX9l7f2j /ihr7VesQqw2mr4+IvyKCE9r+j7OVRxXPdF3DTV8I2azTjpYJx2skw7WSQfr pIN10sE66WCddLBOOlgnHXzT7ayVfVkr+zJmyxizZYzZMsbsacasnzHrZ8z6 GbN+xqyf9TSWMetlzHoZs17GrJcxi99iKuvmCMbpacZpNeP0NOO0Wj9X9NOn QoZYyzrai3W0F+toD9ZOB2ung7XTwdrpYO10sHY6WDsdrJ0O1k4Ha6eDtdPB 2ulgLHoZi17GopexWMbY8zPmyhhzZYw5L2ucgzXOwfrmYH1zsK45GCte1jYH a1tfxoqX9c1B/y+j/5fR/8vo/2X0/9P0/9P0fz/938/6F8v6F0v/99Lny+jz fvq8lzXQwfrnYP1zsP451P6uXEDrC+zPnlOexIHJzOenmc/zcGIyTvyGpxvo 7ZP0x9hJlSk/6svFXM29KnIfJ1clK+Zzyiqu5lL2GGW/5u4Eyj5H2S8om0jZ Mso9LIzhcfQzcpaTs4ycidr+Su0z72o1pfN8PM+P8LyC52Oo6WmefkRNd1NT KTUN1fJ/q+0TT2rHgLBIHUQvaQ5kQCYshmxYAjnghmdY6WOkEhHFt6yh9nzq OaDtjbaKbvpPxW36z/G/RvRh1Z7JLjGWlbs7u8Q++jpmhu9ogY9734vbWM9z lM8p0ZU9ZW91Tad8hpjCCjaHPv+ImKJ/VNt9TRHRtKwHLetBy3rQsh60rAct 60HLetCyHrSsBy3rQcnOlMyiZGdKZmkloygZRckoSkZRMoqSUZSMomQUJaMo GUXJfpS8lZL9KHmrVtJGSRslbZS0UdJGSRslbZS0UdJGSVu45IhwyRFE8ogY yNlATeNibY/QglpV6v8OHB6AGTATHhQW9m4W9m4W9m4W9m6WSPWf/RpQuBNl ksM7jb2aR6dFmdRfqZEGwEAYBIPhFkiAITAUboVhMBxGwG1wO4yEUXAHjIYx cCeMhXEwHibAXXA33AMTYRLcC/fBZJgCiTAVpsH9kATT4TV4Hd6AN+Et2Apv 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 1EhCjSTUSEINJ2o4UcOJGk7UcKKGEzWcqOFEDSdqOFHDiRpO1HCihhM1nKjh RA0najhRw4kaTtRwooYTNZyo4UQNJ2o4UcOJGk7UcKKGEzWSUCMJNZJQIwk1 klAjCTWSUCMJNZzCRF9oJmIbEb9AxEuJOJYIVxHhMhGPRnvRZy/aVKBNBTrE okEsT18i/r3Ev5f49xL/XuKvIP4K4q8g/griryD+CtpRQTsqaEcF7aigHRW0 o4J2VNCOCsaKS3n3qvmuWdyie4A5bja4mOcWMsctggygblp8qm2uW8mcsVo5 aF2h+KyPw0pYBauhEJ6ANVAEa+FJWAfMjVbmRitzo5W50crcaGVutDI3Wpkb rcyNVuZGK/OilXnRyrxoZV60Mi9amRetzItW5sXoSLCAlTlPndl9Wtv9jHEv Y9zLGPeim/qe3o+nxxi7Xsaul7HrZex6Gbte2u6n7X7a7qftftrup+1+2u6n 7X7a7qftftrup+1+2u6n7X7a7qftftrup+1+2u6n7X7a7qftftrup+1+2u6n 7X7a7qftftrup+1+2u6n7X7ars5Zs5VvUfsQCn/eNmepEVWLYURUzPManrfg xiXcuIQbl8hbTV4zea2MFAuRJjBSLESbEP4NaB8OXcKhS0RZTJTFRFlMlMVE WUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFlMlMVE WUyUxURZTJTFRFlMlMVEWUyUxURZTJTFRFksbiOSIrzZjzf7dS7RE3/2E0Eq I+BfjIAAkawlkm7hX2a6qb/MEMkr6q9ZeLcf7/bj3X682493+4mqiKiKiKqI qIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqI qIqIqoioioiqiKiKiKqIqIqIqoioioiqiKiKiKqIcTxbG8ejiOLL8D9zupdW v0Srdwkr8R4m3sPEepi4uhBTF568TDyHiecw8RwmnsPEc1gYdXn4ulT5l26Z ck63ln7xS6VB97L6Szt3L+rWKgEhcfyXGECOgC6fHlEAa5Vy3Tph1j1F6Q1K nW6z+u/qKz/oXlV+sLK/tbK/td4AN0IvsIMDekMaedJhHsyHBeCChbAIMiAT smAxZMMSyIFccEMeLIVlkA8FsFz5QYvnIi09o1up1BLLWd0m5byONz0xR5dD b8+FPO7mE2UBrFaO6grhCVgDa0UX3TrlQ93z5NuonNK9AC/CS7BF+YT4PrHq lENWPRggAoxgAjNEggWsYIMoiIYO0BFiIBY6QWfoAl2hG8RBPHSHHkoDGjag YQMaNqBhAxo2oGEDGjZYRytHrWPgThgL42A8TIC74G64BybCJLgX7oPJMAXS iCMd5sF8WAAuWAiLIAMyIQsWQzYsgRzIBTfkwVJYBvlQAMuVT4SBnnMSFb9G xdO6zUoTfWmtcoF+0iKScSGIC0EcuIgDag87zYoTYMUJkCOAykFUDrLCBFhh AqwwAVaYACtMgBUmgPpB1A+ifhD1g6gfRP0g6gdRP4j6QdQPon4Q9YOoH0T9 IOoHUT+I+kHUD6J+EPWDqB9E/SDqB1E/iPpB1L+I+hdR/yLqX0T9i6h/EfUv ov5FVrkAq1yAVS7AKhdglQuwygVY5QKscgHUDaJuEHWDqBtE3SDqBlE3iLpB 1A2ibhB1g6gbRN0g6gZRN4i6QdQNom4QdYOoG0TdIOoGUTfImFtK71bH4ko0 XUXvXiuiUfsMateg9nmRjcYeNPbQ0+vIuR+tz6D1Gd1yrlcq31HqAj1fpufL 9HyZni/jw7/xwYMPHnxo0j2nfMEI+IYR8A0j4BtGwDeMpUPMDfvwqByPyvHI g0cePPLgkQePPHjkwSMPHnnwyINHHjzy4JEHjzx45MEjDx558MiDRx488uCR B488eOTBIw8eefDIg0cePPLgkQePPHjkwSMPHp3BozN4dAaPzuDRGTw6g0dn 8OgMI0RmhMiMEJkRIjNCZEaIzAiRGSEyI0RmhMiMEJkRIjNCZEaIzAiRGSEy Hnvw2IPHHjz24LEHjz147MFjDx6X43E5HpfjcTkel+NxOR6X43E5HpfjcTke l+NxOR6X43E5HpfjcTkel+NxOR6X43E5HpfjcTkelwsXDnpx0IuD/8Tv3bh4 HueO49z3ONeAcw0414BzDfhvw/9duCfjnqx7lnu/xOnnld/hYB0O1uFgHQ7W 4WA9DjbRT/6Ki9W4WI2LMi7KuCjjooyLMi7KuOjFRS8uenHRi4teXPTiohcX vbjoxUUvLnpx0YuLXlz04qIXF7246MVFLy56cdGLi15c9OKiFxe9uOjFpQZc asClBlxqwKUGXGrApQZcasClBlxqwKUGXGrApQZcasClBlxqwCUZl2RcknFJ xiUZl2RcknFJxqVqXKrGpWpcqsalalyqxqVqXKrGpWpcqsalalyqxqVqXKrG pWpcqsalalyqxqVqXKrGpWpcqsalajEUlwK4FNBGY8iFZlxowoUmHAjggPre 1IS6TajbhLpNqNuEuk2oG0DdAOoGUDeAugHUDaBuAHUDqBtA3QDqBlA3gLoB 1A2gbgB1A6gbQN0A6gZQN4C6AdQNoG4AdQOoG0CdJtRpQp0m1GlCnSbUaUKd JtRpEgOZGS4xM1xi9Mus5xbds0SxgSi01nO+Gbaw3r/Kut2DXV1PuAFuhF5g Bwf0hjTypMM8mA8LgB0kWregdQtat6B1C1q3oHULWregdQtat6B1C1q3oHUL WregdQtat6B1C1q3iAVoXYfWdbRYpsUyo8DHKPAxCnyMAp+mf+sIQPef9Hx2 8Dr1l43/3Nvr8KMOP+rwow4/6vCjDj/q8KMOP+rwow4/6vCjDj/q8KMOP+rw ow4/6vCjDj/q8KMOP+rwow4/6vCjDj/qUFBGQRkFZRSUUVBGQRkFZRSUGQ0+ RoOP0eBjNPgYDT5Gg4/R4GM0+BgNPkaDj9HgYzT4GA0+RoOP0eBjNPiuYzT4 cMiHQz4c8uGQD4d8OOTDIR8O+XDIh0M+HPLhkA+HfDjkwyEfDvlwyIdDPhzy 4ZAPh3w45NPW+Ebtn0LejlcyXsnMNjKzjRftZbRXNZbRWEZjGY1lNJbRWEZj GY1lNJbRWEZjGY1lNJbRWEZjGY1lNJbRWEZjGY1lNJbRWEZjGY1lNFZjlIlR JkaZGGVilIlRJkaZGGVilIlRJkaZGGVilIlRJkaZGGWr2hfyYCksA/obMcrE KIuOzMX+K8cMPe1ZbaQHmFMD/9MYYe++lD0qb6aMNhujzchoO81I68JIs4ik thklj9V4JazivXwt3/W00kjPbiR3kLHZyOrcTKkEFA6gcHO7XVMjvbuR3t1I 726kdzfSuxv/H802jfS+RnpfI72vkd7XSO9rpPc10vsa/6/uitS3lSBKfdH2 3tIs9OF7QVz6QcxC21K0LcW/evyrR1v1zeY4TkSgby361mrz3/Ncb+Id4WV2 Slu496pSi6616FqLrrXoWouutehai66l6FqKrqXoWoqupehaiq6l6FqKrqXo Woqupehaiq6l6FqKrqXoWoqupehaiq6l6FqKrqXoWoqupehaiq6l9Kl6+lQ9 faqePlVPn6qnT9XTp+rpU/XoXovutehei+616F6L7rXo/n+Iu/Pwqspz7+Mr eyV7Jzs7oog41GqtU6undajaVtty2nqsPW3taGu12vbU1gOVVhRUQKYO2tYB Z1DEoVKKWoGaoiLgiAVrAwnZwGYn0MhgSEgWJCSQAPKcz86hfe15z3W9f75/ fK+118pa63me+7mH350rbFrZvZXdW9m9ld1b2b2V3VvZvZXdW9m9ld1b2b2V 3VvZvZXdW9m9ld1b2b21urTOMbgeN+BGjMW40Dpg4/4DkdAXHZpaEA1NvUJx vsovXwuTU8vCnNROOqM3TE31h/pY5ow/pHs9LcyLzwpb/vHXyt+MDo6/FeUO /E3h1lxTWGHHZnnvXLwqAl4L+dRSnv46lhlzueOboSm1QqebN9pqxzXYGlWl 2kRqL427ixLajT2hK45CS5xBJY7U/Z8WNsVnhJ3xmfgIzg674vPCxtz3Qkfu h6Eu92PIEbmfOl4TmnKjICfkxjtOcJwIGjr3c6iYudshKnNT/fwe1+S+3DTn 0/GQd8wK/bknvH8e5oeduT/iGddqnS90tKZcvWsNWIW1zgto8rkZLe7rDC25 ndgdWmqGhKTmMAyF7rBGd1hzgusjQl0NTV9jXjW3hJ6a28POmvvwAB4PSfTv B6xatE99rLqWVTtZtZNV97HqZlYtsOpaVt3JqmtZdS1r7mLNbtbsZsluluxm yW5W7GfFXlbsZcVeFuxkwSILrmXBtSxYZMG1LFhgwQILFlmw8D8sWGTBThbs ZMFOFiywYJEFiyzYyYKdLLiW9TpZr5P1elmvl+U6WayXxXpZrJelelmql6U6 WaqbpbpZqpululmqm6W6WaqbpbpZqpul1h6wVJGlOlmql6V6WaqXpbqj96ee DONTC8J8lnqRD+5lodmssi21IVzFz8ak2sIjvPubqR5Kuz98ip/9OY7D0jgd 7ohz4Se8fXU8JBwXHxv9KD4xjOb5748/HD7Dao/z/gv43Iz4U2Fi/Olw2YG/ zvpb/K3waHxJGBEPD0tKf79kVS/ISa+oEq9hWVhvxLftxwYjbjFCm7fu8MaN 3rhdLJ0nlj6pI3zSjr0SGjxVipe/DsTI1ugYT6/y5Bue3GxuW8yt2hvyA/Fw Vsh78pXwhqfe9tSznjjUE28Z728D8aurHojhY8Xph5yfFjZ4qsUsl0bv5Vk7 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 kd9sp5aL/AYR3yDiG0R8g4hvEPENIr5OtNeJ9qJoL4r2omivE+1F0d5sF+tF ebMobxblzaK8WU+8lTou6eqzwr7obFFW6rN+LKKmi6jpIupV+zxZ1PTb19n2 tda+1oqWdvu6yb7Otadz7elcEdEnCvrsxWR7MVkE9NmPyTy+j5dP5+XTefl0 ezGZl/fx8j5ePp2XT+fN/ew1l53m8uZ+tprLVpvYahOv7mevTTy5n31q2aeW fWrZZxNv7ufN/WxUy0a17DOX9/bx3uk8t9+aa63xtXA7j91tBUuc7TT33vAk 39wQHWVlO51tsbI2K2uzsh1WVScPtFtZnZXVmd1Os6szuzqz22l2dWa104x2 mlGbGbWZUZvZ7DSbnWbTZjZtZlNnFqVeti061ki9RlpnpC1G2mKkrWxY6lHr jdZjtHqj1Rut12j1Rqs3Wq/R6tmimy26jdrLFt1G7jXyFiNvMfIWtug2eq/R e42+xehbjF5v9FJ/uEWPsEG+3BlWWvVKI/cYsVkuWyjjrpVxS/3BcwMZN+2u ngM9VPuBf8N0WnxJdOaA5Vr8pNlPWgbOSr3d3gE7Vhx4qttZh/ev8f4uarhA 03aw8B7rzLJEhAqaNI0MjnN+EmaGHd6xYWBnGtzdpIqU5tgTneQdr/vJ8+zX 7V0vuOPtv/f3A/Umkl8yqEQ2vGBVX7WaH7BjNztuYMcN7FjqrzewX7c5vGAO r5vD6+bwOlv+c9/9Hhz9rv77OPefIBZPcpzp/kdcK/XcZdacRIebX5c5dZnT NnPaduA3ONvNvs28tpvXdvPYbh7bzWG7sbuM3WXsLuNuM+42424z3jbjbTPW duN0GWNbdIK3L7L6P1v58ndl2Tw7P22kXQNZNTvwlyK/PLCX66x+eOkvev6e fax4uVEXGXWRURf9r5mnlGmOc18py5zkWMoYM937PzNG1UAV3UkH9Out0/b1 4nDNgb/uWGnkbw/8xeiZ5r3Bnc/ZtTp9wRrzf4mV5r0rg5QqQ4GlZtrrUt19 m7VmstZM63nJW2/1trl2sY52W8OCM1lwpp2sY8WZIqIgIgp2tM76XhIVBWvc YI0brHGDXa2jwdbQYGvorTX/I3MU7HKdXa77R+Y4zjtOCDOt/SXr3mCX6way x3tYvYnVmwZ+G9Eri/SH18y6k+WbzLjTjEu/w+lk7SbWbjLLTjPsZOUmVm5i 5SZWbmLlJlZuYuEmI3WycBPrNrFuE+s2sW6TqOqVdfeofryHh/WGl6KUKriH UuqPYmpkmbMuZ63Rcc4SPUwffZLQJ4lKuVul3K1S7j7wO8J2mmUHHd+n4rWr dO0q3W6Vbje93qfatdPofXRFQpP3qW67VbfdqttuuruP7u5T2XarbLvpjkRl a6c9EpVmt0qzW3XZHVWp5f1m8pDanajZJV33tlETO/i4HXx8IKtUqfY98RCZ 5EOhwwra3NURnx0NkmH0PNEZxilE5d6z2XtKv3PtK63AinMDv0FoL93PEkPE 09mhz/XSb2Xd4bmN0WHOSqvvsfoeq+8ZWPmltMIVYfW7Vt5j5T0Dq653bMAq NKEZVmdlPVbWY2U90fuMtoJ9e9l3LfuufXdnbuwOo2xh214jbDHCln90488M /MZvC9v2su1atu39pw59rfPCwG8BBzp1tl1r9C1su/bd3XpUZuW90QlxjU9D wiPUUkItJdRSYk7PmtOzrNVLMbVRTKXfrnWy0zbKKLED++zAU3bgKX3kYH1k 6a8jS6qnjeppM69nqZs26qaNummjbtqomTZqps18nqVk2qiYxJyepSjaKIo2 iqKNmmiLMmbzRyPvNGKfEXcard9obxrtzeh4P32L3VrNcZ05rnPnrgO/w/4/ O3Q2ZXcev/40O8wKrWy4hw33/GOXnnGt1vlCx0WU1jLHd+/aWucF/H331run xf0bw7p/2sWhrNbCai2s1sJSLSzVYt5/O/A7qRYWaWGRFtZoYY0W1mhhjRbW aGGNFpZoYYkWVmhhhRZWaGGFlugo61xvjeutcb01brfGvDU2WmOjNTZSqiWv a7SeRqqynapst5b1lGXJAxutpdFaGinJdutotI5G61hvDeutodEaGq2hceBf UR4ffzc6PpoeXRkeiH6IH+G68Gg0LtwVjcdNmICJ2BSmR5uxBd3u6Q93Rnuw F/vwTriz7AOhvuyDOAWn4l/wIXwYp+F0nIEz8RGchbNxDj6Kj+HjOBfn4RP4 JD6FYfhXfBqfwWdxPv4NF+BzuBCfx7/jC/givoSL8GUMjw4vezm8VPZKeK7s VbyGpXgdy8KSsuV4A3/Bm2FJ+SPhrvJH8RjqnK/ASlhr+X6EcGfFweGBisFh egWVXUFlV1DZFYfjCByJlnBXRYd7OrEj3JX+IM7B1eGB9Ej8BD/FmPBo+nqw e3pqqE/XhyVpHU/mpLAkczI+EJ7LfBBn4iPOP4FLw/TMZbgi3JmZhllocf4W NsKeZdrCo5l2bPezHue7wp2VqVBfGaMcFUiDUqykFCurkEU1cqjBQRiEg3EI BuNQfDwsqTwX3/X5R46THX/vOCc8V9kb6qu8q+pQ+vjyaHBYER0K2S86DENx OE7GB/BBnIJT8QV8EV/CRfgyvoKv4mv4Or6Jb+PK8BDPfYjnPsRzJ0ajw8xo DK7HDbgR48Ic3jyHN8/hzXN485zy34QV5bfiNtyOOzAVd+Iu3I17cC/uw/14 xHOP4rEwx64/VLE2rKhoxnr8DS2uv+3Yig4/78QO194JK9JpZFCFLI7AkTgR J4Ed0uzAO+akz3I8x/E8x8/hclyB7+J7uDo8xHMe4jkP8ZyHeM5EnjMxbb1p 6+VBcyp/WrJNdFeoj+7GPbgX9+F+zMbvMQdP4En8BW/ir6jDCqxEPRqwCo3I YzUK2BSekROekROekRPeiHaiB73Yhd3oD/PkiXnyxDx5Yp48Ma98a6gvb0M7 tqEDupPyBNuxA13oho6lvAel5/YjhHni7ZmMXJAR+xmxnhHrGXGeuSi8kfmG 48W41D2X4YowL/Nj56MxBjfgRtyEm3ELxFuGjTJslGGjDBuJp3mZ3zrOcpzn uAjskGGHDDtk2EGsPSPWnhFrz4i1Z8TaG2Ltjcw2dGC7Z3tcZw9xN6/sw1F5 dEhUgTQyqETpu8OzqEau9BWTOAjnRkOj83BlGM/Hx/Px8Xx8DB8fwcdH8PER fHwEHx8RjfWGcWEkPx/Jz0fy85H8fGT082hQ9Av8EjfjFvwKv8ZvcCtuw8Lo mOgFbArj7Og4OzrOjt5rR+fY0Tl2dI4dnWNH50Slb5DuDxPs6gS7OsGuTrCr E8oeDKvLZuAhPIxH8Cgew2/xOGbhd5iN32MOnsCTeAp/wNOYi3mYjz/iGdTi T2F16vRoUOqMaGjqLMdhuDCMT30+XJf6Ar7qfHiYkhoRrk79GFeHq2m2L8SX hdF02xfi7zqODn+Jx4SGuD6qiBuiIXEj1btaV74mysabwpx4My2yJfpA/LZj a+m7gRy3RYPLR0eHlI/B9bgBN2IsxmE8bsIETMQkPBJGyhcj5YuR5auiQeWN yGM11mAtCliHIprQjPVgT94+gbdPkGvGVxwSVvP6cXLMyIptUVZ+GS+/jJdf RlbsjQ5Jx+Bb6cE4FMfjg2Fk+hTHM/CRaKicMjL9UZ+vDuPlj/Hyx3j5Y7z8 MUb+GCN/jJA/RqT5Unoc+FL6gbA6/eDAv6BfnXkvjsGxeB/OwEVhjkgbJ9LG ibQJmVHRoMy1mIwpuAvTXH/E8bHoGNE0IfOUzy3ufwsbwedEzr0i516RM0fk zMl0RlWZBNvd3+Pn/E8ETcjsjgZVDgmrKw/DUByOI3AkjsJ7cDTMtdJcK821 0lwrj8P7cTxOwIn4gXddiR9igvOJmBRWV5WF1dlLwnXZSzEhXJ2dBHGTFTdZ cZMVN1lxkxU32dtxB6biTlhv9m7cg3txH+7HNEzHA3gQM/AQZuJhsE/2UTyG 3+JxzIoGVY/HTZiAiZgEtq1m2+qfQXxXi+9q8V0tvqvNs9o8q82z2jyrzbPa PKvNs9o8q82z2jyrzbHaHKvNsdocq82x2hyrzbHaHHOnRoMOqkIW1aX/KSVe KVI2yUalT6XvHjk8dYNsliv9v42yWU42y8lmuaj0PxhmUY3cwDfY52SzHAVQ pACKFECRAihSAEUKoEgBFCmAIgVQpACKFEBR5jtU5juUEminBNopgXZKoJ0S aKcE2imBdkqgnRJopwTaKYF2WfIqWfIqWfKq6D9DEg3HCPwYV2MkfoKf4hqM wrW4LgyXUa+RUa+RUa+RUa+RUa+RTc+XTc+XTc+XTc+XTc+XTbOyaVY2zcqm Wdk0K5tmZdOsbJqVTbOyaVbdbVZ3m9XdZnW3Wd1tVneb1d3mqPT7jjl4Ak9i YXSkzHuk+puov4n6m6i/ifqbqL+J+puov4n6m6i/ifqbqL+J+pvI1qNk61Gy 9aioVS+7FW1oxzZ0oBMJtmMHutAdpsnss2X22TL7bJl9tsw+W1YfK6uPldXH yupjZfWxNH2Bpi/Q9AWavkDTF2j6Ak1foOkLNH2Bpi/Q9AWavkDTF2j6Ak1f oOkLNH2Bpi/Q9AWavkDTF2j6Ak1foOkLNH2Bpi/Q9AWavkDTF2j6Ak1foOkL NH2Bpi/Q9AWavkDTF2j6Ak1foOkLZV+JhpZ9FV/D1/ENPBjyKlFeJcqrRHmV KK8S5VWivEqUV4nyKlFeJcqrRHmVKK8S5VWivEqUV4nyKlFeJcqrRHmVKK8S 5VWivEqUV4nyKlFeL1Grl1isl1isl1isl1isl1isl6jVS9TqJWr1ErV6idqy v0bZsjqswMooq4rlVLGcKpZLnVv6N6qOn3W8MExSzS5SzS4aqGaXhY7UlRiu ur2rqqVGhg6V7ZMq2wiV7ZMq2wi9+NT4uvB0vCi8Gr8YHRS/ovqt1M836NMb o8NVuXZVLo7X6u//u9JVqHQnDHzHZLvr21Se0VFOlcupcjlVLqfK5VS5nCqX U+VyqlxOlcupcjlVLkdJt1PS7ZR0OyXdTkm3U9LtlHQ7Jd1OSbdT0u2UdDsl 3U5Jt5dPC0n5dDyABzEDD2EmHsYj4XyV83yV83x9V62+q1bfVauKZlXRrCqa VUWzqmhWFc2qollVNKuKZlXRrCqaVUWzdGZCZyZ0ZkJnJnRmQmcmdGZCZyZ0 ZkJnJnRmQmcmdGZS3hs6yndhN/rQjz3Yi30QEyrzWJV5rMp8lcqcV5lH6f8K +r+C/q+g/yvo/wr6v4IuoahLKOoS2nUJRRX8/IrNIdEpFHUKRZX8KpX8qgpz qjAnFf18FT2nayhW7HceQpKOUIYU4iin0ud0FEUdRVFHUdRRFFX+nMqf01kU dRbF9NHufS+Od+1E5ydBrtVlFCmD8ymDXPp0P+eD1MGhuo4ihXA+hZDTeRR1 HkWdR1HnUdR5FHUeRcrhKsrhKsrhKsrhqrQ8mpZH0/Jo+jqMxpgwnJoYTk1c Q01cQ0Wcr58tUBJ5SiKffnjgG5mGpufjTwPfyjQ0/bpjfailMvJpe6nvLaR3 R0MpjjzFkac48hRHXi9cqxeu1Qsv1gsvpkDy+uHF+uHazHlRVk9cqy9I9AWJ viDRFyT6gmYqZba+INEXJNTKKGplVOY7oSNzOa4IY/UHSeZqn8VU5if4Ka7B KO+8Ftald2jWOyR6h0TvkFA4WQonq4dI9BBJ5jfuv3XgWwUTqiern0j0E4l+ ItFPJFTQWCooSwUdqa9IKKGxlFBWb5HoLRK9RaK3SPQWid4ioZBGUUijKKRR FNKozGbv3oK3Iddn5HqqaRrVNI1qmk01zaaWxlJLo6il2dTSWGopq9cv6PUL ev2CXr+g1y/o9Qt6/YJev6DXL+j1C3r9gl6/oNcv6PULev2CXr+g1y/o9QtU V57qylNdeaorT3Xlqa481ZWnuvJUV57qylNdeaorT3Xlqa481ZWnuvJUV57q yleeaU4fwcdDbeW5+K53/8D5lfghfuTaVY7/ieEYgZ+GdgotT6HlKbR85WTP THX99+6dExZXPuHzk+gNhaooGkrB5ausrerQUFt1WJTNfj1syn4D38Ql4SLK 7qLsd3y+MXRkx2I8/q70pvj8S9wS5Si+HMWXo/hyFF+O4stRfDmKL0fx5Si+ HMWXo/hyFF+O4stRfDmKL0fx5Si+HMWXo/hyFF+O4stRfDmKL0fx5Si+HMWX o/hyFF+O4sv9f1R8uX9SfIdFd4RPlF0Rfanse9HXy74f3Vj2H9G/lf0g+kTZ ldG3UhdGl6SGR9+MLw6fiS8Jn45fCLPjF8OX4o3hDdpwSCzDxW+Hu+KtYVnc Fr0nbtdvbQu7omOjO/a/Fj0VVkVLwypv/9SBb4M9x9tP9fZTvf1fy4aHXWrr FqPo5nRlF4dzjfJJo4yJF4dF8RK8uL8jfjksUOPWxq+G1+PXwh1G/4WR++It odXo5xp9qtFjoz9s9NeiynhFmBXXm5NOPl4VfhA3hoVx3lNrQpOquJ5OfSr8 2dz+7M5vq50r3D3N3ePjVfv3u/sxd39eHV3giRs88eDAdzueZrYTVPP3qt6f T31JJR8ehqd+EsWpJ+nk18J/pJaF6akN0dmpXhV5SDQoPi38Ll4c5VTp06zg j0Zaph+N41V6zdXhT6p0hbfvt6K8Sj3+QKWOD/SksZW1xm1W1e76ttBZ9q2o PCyMKpBGBpWoQhbVyKEGB2FQWBQdjHNDU3Qefh7mR7/AL3EzbsGv8Gv8Brfi NtzBhgtDQ/RCaChLhaayGOWoQBoZVKIKWVSjBgfjEAzGoRiCwzAUh+MIHIlj cCzeh+PwfhyPE3AiTsLJ+EpYX/ZVfA1fxzcwARMxCZMxBT/Dz/EL/BI34xb8 CneGdWV34W7cg3txH+7HtLAudXqYnzoLw/DV8Hzq16GY+k0o8vKL7UoHP9vH x+bbiQ4+9mU+ti/etX9rvFtE9IVM3L9/d7xnf1O8N6Tjfftb43fCsHi/6yEc WV6xf2t5OnymPBMy5ZX7d5dX7W8qz4Z0efX+1vJcGFZe4/pB7hsdFpaPwfW4 ATdiLMZhPG7CBEzEJPw2NJU/jln4HWbj95iDJ/AknsIf8DTmYh7m4494BrX4 Exbg+bC+fCFewCIsxhK8iJfwMl7Bq3gNS7EqzC9vRB6rsQZrUcA6FNGEZqwP 8yv2hoXpGPw3XREWpQc7HorjcQrOwEdCU/qjjreF9en7Md25daZ/57P1pK0n bT1p60nPc20+nkEtnsNC11/AIiyGuafNPf0Xn9/EX32uwwqsxBqsDevSRT9r xTZ0oRs70YNe7A7rMwdhEA7GITgirMsciaPwHhyNs0JT5qMYFeZnrsVkTMFd eASPhYbMU467w/zKk8P6ylNDU+WHHU93vAhf9vnbYV3lD/z8SvwQv3Z9uusP 4EHMwFPYG9ZVRWF91SGO4qtKXFUdhaNDU/YHoZgdgavxE1yD0RDvWfGeFe9Z 8Z4V71nxnr0dd2Aq7oT5Zu/GPbgX9+F+TMN0PIAHMQMPYSYehjVmH8Vj+C0e x6wwv/rfQ7H6C/givoSL8GV8BV/F+PB89U2YgImYhMmYgp/h5/gFfombcQt+ hV/jN7gVt+F23IGpuBN34x7ci/twP6ZhOh4Iz+dODfMPqgrPH5RFdXg+Klcr 5sv87fHq6MPy8r7ovmhcmBGNx02YgInoD0X9c1H/XNQ/F/XPRf1zon9O9M+J /jnRPyf650T/nOifE/1zon9O9M+J/jnRPyf650T/nOifE/1zon9O9M+J/jnR Pyf650T/nOifE/1zon9O9M+J/jnRPyf650T/nOifE/1zon9O9M+J/jnRPyf6 50T/nOifk9K3cJX92TyXhQ49a4eetUPP2qFn7dCHTteHTtd3Nuo7G/WdjalZ YevA30f+918dvZXaHd5SzQqq2Ix4ZXSsetmigt2mh5uhh5uhh5uhh+vQw3Xo 4Ur9U1H/VNQ/FfVMiZ4p0TMleqZEz5TomRI90gx90Ax9ygw9yQw9xAw9RKJH 6NAbJPqADn1AR+aUUMycOvB9nB20f0nLF+nsIm1dpIWLNHCR/k3o34T+Tejf hP5N6N+E/k3o34T+TejfhP5N6N+E/k3o34T+TejfhP5N6N+EXu2gVzvo1YRG 7agc492Tff596VvTQkJvJvRmR9UQ8XRJmE5jTqcpG2nKxtyEsDU3EZPC1poh 4a2awzAUx+J9mOL64+GtKKWq/EFdp+PiF6KPx4uiy+OXorPil6Mj2Pe5+FVK 6rXo5HhFdBFbX6Svr6AYPqW3HxznozPZ/W+UwzF0zkZXN0Wn0AsX0QsnxVuj C7z31QO/yz7VSK+Ep9x/z8CY8/1sBFWxKDrItTecrSx9L+X//V26ZcOjYf/7 9+mazxmi4xNG/aJ6+Hlz+O8rZ6iWu139jGq5SLVsH/iO4m2l/43S1aOdfWrg d4qHu/dEcyj9XwRvRx9yx4edrYyGWeEQPzvGWkvf+nZJqItHR+ea/6vln6TX Uq4sd/amu9UmmnC7s/XOro5qnO1xtjw6OSqPhkUVSCODSlQhi2rkUIODjHhx dFh8KY13Ba62pkV04Mt05iuhoXx0NKx8DK7HDbgRYzEO43ETJmAiJkXD9PLD 9OzD9OzD9OjD9OjD9OTD9N/D9N7D9NvDBv7/ixrqtsdI663i7fglO1n630xe Cc9St9usfTSbvGBeS9xltdZeEw0uq4+OL2uITmeZK9jhs/Gl7rosuiy+YuA7 5i6Lrw6vlL6VKL4+bIzvj86Jp0UfNU5ip0+kZOaWfzw6s/zc6HTWuiw6xhPH GOcsuzk6ep+ROkvjD4xUc+D/NVkWf8fTl7v/e47fdxzNw+rDOhq5gz7uH/Cf NVGlp+IoXfqfUNw91J1D3VnlzsQd26Oh0SZZlIaKttBN1xqptKfXh0a6u8Ou D5JxGwbel7eDqz3lnSVFXDE47NPD79PD79Mj79Mj79Mj79Mj79P77jPmxWFr 6V88eeMpIiUz8LbVoSc6/J/G/I6c9T2MtLbRlPjK0GV2260j4XGHGbvXU68b t9q4ff/PcauNu7H0f7N422DjVnhjrzd2eGOPN1Z5W9eBVewTZxe7Wvq+wO9Q 8t/DtX4yOjrSk1VmnPbkLk/u82SNuewvWc2Te0XFpuhz0WZsQT/P3oO92Id3 ZIeLdS6XhNPj78gWl0ffjb/n+H3HkXqfa83n+vB4fBO/uD/6WOl/4mbxeiOe O7A3q8LMgdHyYY2YG6LL2XPAR84s9+7y/QjRyRWDo89lLsVluCI6OTMNs9Di /C1shHlmtrvW47jL3Erf/7jdzPqtud/MTrHufjM7xbqPsu5Sxqi03qy1tsZr o4MHvG6xJ171xGZPHOWJzZ44yhMfc/fB5vz2gOetCnvNu8+Tmweeyg/8vwSX Gu8ynnyF43cdx8iKG6P3y3j/Rd13wFdVZP+fKXfmvvfuS0IIIQktdBBUQIQV RMHFiiy6dhRFQbGAuoKISLGsiohSLOCKFEFdxcUOCgi6iooFRKRI76H3Hsj8 vzPvJSYkEBJY/f3v/cy8uVPOnDv3zHfmzNx73nZgTBjImA5kLAO8m+b+Ucc+ v8XIJRCzHc/hGoSud33DWsNLFd0hVQ9hvFsPvjegxo1mm5O3lSi3FuXCoO6D MkfKYkqnzmYn3Q53B1x3PP1r8Dzbg6+b4R6EZNrcayAl69HSWeBpI/TLTaCy GeNkCyrvJZmd3ha4rWan6grXDe5euPvgHoTrCboJ8f8EWgTKi0F5seiOu3oQ mL8az3ENpGgtepC7W+DwBrTRRvOj08XLg79s8JcN/rLjd2/XlJeDynJQ4aBy GnhMApX9oJIDKtbSvA8Kq+z/EYG/bPCXDf6ywV82+MsGf9ngL5tOp850Od0O dwdcb2pNj8D1gesL149ao8ZE1FgfmOWhha8EZnlo5SuBWW+hpT9ES38OOf0W cnop5PRy8Y4Zinv6ASNErRg3GLcsNxswmziHmkFGm8kWZpEcTa3lGLix1NpL osu9lfjdgt+tcDuotaoL1wSuK12uusHdC3cfnOXPB1f74nLD43LD3bOyLbjR ZLnViIng+814rtR4rlTwvQ05G7kViI1mHiSja85X0AW3QvdbCV1vK3S7lbJO zjrIWtecbYjdjpjtso45D1S75iwX+9DO2Sh9GNhwxMyWntkPvfCAjJg9yDkb OS9yZb9E6lzEzEVM2JXdJg6hvmy0yhEzHzpmjgyRQtkc5JoPXTIHOc8HLnXN WY9acqCl7gFnW8RB/Gaj1sOQzFjJw6g1B9rpHnC8Rfr4DYOLCOJjlA7jDvZC 6rpCr91PDFS2g0oOqBhQ2ODqVsRQejtK56C0QckNcR7q2nbKGQIeVqN0dZRe gtL7xCH0WMv9YcjxEUhcDuYJxhwBL6tBrTqoLQG1fTJkfnV3FcFzDigJmvIm UD4Cnv5jR1HDQfEA+Fgmcoij1AHUvUxGEa5jqtocOXOQIwv12ZZajBxZoGlb aTFo7EDrHvW88PTjzwmli3k+Lq97LshbzPPAPZ7kcwCelrD9gTKnuN1xj8do b5dSZDtTgkyhkCwH/tIoLDNArQLKVMScoRLClZFWBWnVkFYD1zWRVgtptTEe SJmKGiogNRO/NfFMApmCK+gQsjzqz0ANFVCTpVUZ8VUQXxXxNRBfE/Ggg6dg c9uaK8Rz2JosrWTwxZG6TqYipjxcGlUGf8nIuQ40K4M/Dv44Sq2TmUivClcN 8TWQpybiaiFc2/4rOagsA6/2DrlMB68Z5MWp2NLLwL+9Qy6rI60G0mKlOe43 Ba4cZC8VPKeBbgbupQKefkXUVcneF9KrID0T6dWQXgNxNZFeC+m1cX+4Czyb cqCbitjycGlmAXjIQeuslhXxLCvhnisjTxXkyUR6VbhqyFMdeWogTy3kqY2R zT6nwLVrGqWAD9tiB8BHCviIgI/AtW01XNdwLXgAPKSAh4h9KiTcvWfE2znG vW094e47VmJ7nGtOiaWVCfTabWi/o+QCvf1MipZUNlCqAeljyQdSa1LZUyUj oFYfd11KOUHpOlTmZGUFVM6xd3Rq5AVP4nv3HEslM25siJZUbhyq1xH7cjYC STsCcSoC1dqKQznbgWoXisM5m4A+nYFqmUC1ZtLL2QhE7Qg0qghUaytDOduB ahfKSM4mIFNnoFomUK2ZTMnZhxY5HS1SFy1SV6bhOt3UR4skgKuGaJVaaJWa sjLiqyBfJvJUhauG6+rIVwP5aiJfLeSrDakJQXMLoHOdL+z/+nxFZTHbTcFM twZmFX/BXGEmZnuJ7r+FprCbqTnrSBexW+lZdht+O0Fzv8aMFNdCF7nOTMHM Y6T7p7q6x8k10+Wy/4G00MXmXr2fd8WhyU9nX5j3Xcj+u91qhBKhJZ9ORM2g k55GrXA2oDZ0FTWka+k6xN6Audy5dCcNosvoeXqH7qMpNB1XX+AcSt/TAhpG i3COpmXQTsZQFii+zSqwCvQLq8xOp3nsctaW1rB27Gpax9qzm2gzu4XdQtvY rawzbWdd2b20mz3IRtA+9i+cGWwkzgpsFM6K7G32DqvEvmBzWBXegDdiZ/LG vClrxJvxZqwJP4+fz5ryv/LW7Bx+Eb+INeeX8DbsXN6Wt2Ut+ZX8KtaKX8uv Z635jfxGdjG/hd/CLuGd+e3sUt6Fd2Ft+F38XnY5f4D3ZH/nvfjT7Dr+DH+O deGD+cusKx/BX2E9+Hj+AevJP+Iz2T/5t3wBG84X8TXsLb6Rb2Yf8e18B5vE d/H97FN+kGez6dwIYl8KLgT7SmgRZTNFokhmP4oUkcJ+Fqkig80VVUU1tkDU EDXZIlFb1GWLRX1xOlsmzhRnshWioWjEVorGoglbLZqJ5mydaCHOY1mipWjJ NooLxAVsk2gtWrPNoq1ox7aIq8X1bLtoLzqxPaKr6MZyxAPiIU6ij+jDlegn +nEtXhbDuS8miok8LD4WH/OImCwm80B8Jr7iUTFbLORpYrXYzKuJfcLw+tKT CbyJTJF1eEvZQrbg18ge8ml+rRwoP+F3y0/ldP6y/EnO4a/JX+Q6PkZukIZ/ 7IW9MP/RC7yA/+Qlecl8tjfP+43P9ZZ6K/kib423hi/z1nvr+XJvg7eRr/A2 ezv4Km+Xt4tneXu9/XyDd9A7yDd72V423+IdUR7fqrRK4PtUkkriOSpZleNG panKQqiq6iwRVmers0Ul1VRdLCqrduoacabqoB4XTdQ/1VPiJvWMelbcogar weI2NVQNE53US+olcbsarkaKO9QYNUZ0VePUONFNvaHeEPeqCeojcZ+apKaJ XmqG+q/or75R34on1Cw1XzypFqpFYpharBaLF9VytUK8pLLUJjFc7VSHxaua NBdvaa0zxTu6lm4svtbn6BZinm6pW4pF+q/6YvGbvkz/TSzXV+orxRp9tb5a rNXX6mvFOt1e3yLW6066s9ii79J3iW36Ht1LbNe9dT9xRD+qH5NcP6WfllIP 1M9KpQfrEdLX/9L/ksl6pB4py+pRerRM0eP1eJmqJ+ipsrz+Ss+SdfRcvUCe qZfoXfJsvUcfkm31YW3k1X4tv5a83q/jnyZv8M/wz5Q3+Y39xvJm/xy/mbzF P9dvIW/1W/otZSf/Ev8y2dm/3L9cdvH/5reTd/pX+dfIu/0b/BtkN7+T30Xe 69/n/0N293v7vWVPv6/fVz7kP+o/Lnv5T/vPyEf8Z/1Bsp8/2B8sH/WH+cPk Y/7L/qvycf8t/99ygD/BnyAH+hP9ifJZf5e/Ww7y9/p75fP+Af+AHBwC8Mkh IRmSclhIh8LyhVAQKi+Hh9JD6XJcqEKoshwfygxlyn+Hrwq3l2+HO4Y7yg/C ncOd5YfhO8N3yY/C94TvkZ+Eu4XvlZPC94fvl5+Ge4Z7ys/CvcO95ZRwn3B/ OTX8dPhdOSP8Rfg7uS48P7xUbgsvD6+T+8IHIxkyJ1I9MsTLjAyLjPWej0yK TPdGReZEdnlvBTpI834I6gUXesuC64M7vQPBPcH9KhQ8EPRQiUHPoJdKDnoH vVW5oE/wpEoNBgTPq8xgSDBE1Q6GBS+qOsHLwRhVL3g9eF01CcYH76qmwXvB x6plMDmYqi4KPg8+V22CGcEMdXnwZfCdahv8GPyirgl+DX5VNwULgkWqQ7A4 WKE6BquCHeqOYHdwQPUMDgWHVZ8gJ0qqf5RHuXo8KqNKPRH1o1H1VDQpmqoG RdOiaeqFaEa0onoxWjlaQw2P1orWUqOi/aP91ejoY9En1ZjogOhz6o3o0OgL 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 mhIcjiQ7HEkBgiQjbBGkbLR8tDzyWOxIiVaKVkJ8lTh2VAUFix3JDjuSHHaU cdiRDOx4DTRHR0ej1LjoOOQfD9RIdqjBiTfaYVdem67/axO6jK4/1jz//4/D bDAbrYtfrSxK77LrPG6tr6S019oVLqd5f+Gul+TW6fyf49rnFqt/Ol10sVlt sgqu6BRfb+4Knbm/5Bye2sO0geZpf4+pexcqsQGa9relX5fJo7Pl6Cuz0/nx eOiKe9Cyq802uLyVvXyaaEq+0ouRaxHZdY/yCMVXGHO16z/oCOdxk7/egG5w cZuLWl0wmwqvzZldZpX5DSmFdiFKe+Sukhe8sv0nLtX51gvAu8gLbznWUzYr Cq9qnqqj6B2cYkuNN2Pd72G3Gv6ddXZ9yLyN0Kx4nlzJsj14r5mTG1+ietY6 GV39+7VdBTPL8uV4zq0H2bXyFS60FtzkR6h4+57o83Wr1quLz1fyA5KWj67Z Zw7DHbJrXeZIgXzH25f6P3b8wX3+BA4z8iQKX1EEvdVUBzJY+SSoHv+oQw5b LZ46TC3yADac8B7iyY8VR9ErwFX+vneC5T8008378f2BFDPaTHexa+zonn/0 LtX8YRGwcaWbP2S5uYlDMzsmmZX4nRDPtc3tt30PNxNnVsGVa4dk6ZS7Nvs1 xoJZZi7cSMReZuaZH1z8r7FZhNvRvqHknBbifGOBKzeGmg/yxdxtxplu5hm7 ym8eyIttjrhPbb8rvOtIds+18F7oJvMF7mXxqeupufJgxzEgWO68cBbF92fz 8wBcztsbsXssxVD+6VTxWNoDrRR1v0PtfnOh1B7m6wJ5Y7/LMLqtsRJSivrm W6l38y3XTjaE8W1lvNXgm7vMbPe895MoYgyLUoNCNLehH2yN7y4JIEfurtP+ WOrJj2+/70MX3K/MnaXYuZcbt9fi3FZo7rnCzT2L6O3ozacYu4o6jsKzeYXS Dx8dE4//R9HxVJJ99BIf5o4SFoi9YzHAPOl+tzsE+Mg6hP5tJsVCLi13fub2 O/GkPisFdx+aT4GYn8SvvjbvkH0/aLINwwE5gWJfAyVyZ8Hbgb4/xHEitn+W UIjmt+YTMyNOM8VexeMLoIMxJefWlUMvNb/lXeXqLqtsKFevjM3EHaLNsvIR e0ck3n92OUTuYK5wVzPI7ubdD/cQQkPMCIx1D8Wp5Hu3BS0w1fQuBbe3mr7m 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 eGPDrY03NtraeGNjrI03Nt7aeGMTrI03Nt3aeGMzrI039rPqoJ5iC611N86s dTcurXU37lnrblxb627cV2PUOJ5g7brxZGvXjZe1dt14RWvXjVe3dt14bTVL LeJ1rUU3fo616MabqSy1mZ9rLbrxVtaiG29rLbrxK6xFN363tejGH7bfx/F+ Pvc57+8rX/NH/Ygf4Y/7iX4Sf8JP8VP4k36an86f8iv5lfgAv6pfjT9jLa7x Z63FNT7IWlzjg/2GfkM+1Npd48Os3TX+grW7xl/yW/qt+HBrd42/Yu2u8ZHW 7hp/zdpd46Ot3TX+un+H34WPs3bX+Bt+D78H/7e1vsbfttbX+DvW+hqf4D/j P8Mn+oP8Qfw9f7A/hL9vra/xD631Nf6Rtb7GP7PW1/hU/yN/Op/mf+HP49/5 C/yFfKn/m7+EL/eX+Vl8lb/R3823WKtsfL+1ysYP+CbE+EFrlY0ftlbZ+BFr lU2wUHqosohae2yibKhaqI5ICdULnSEqhBqFGokqobNDZ4vMUNNQc1E11CJ0 gagVah1qLeqHLgpdIk4PXRZqIxqE2obaiUah60LXi7ND94YeEE3DmeEa4lxr 3U20stbdxKXWWpu4zFprE/dba23iYWutTTxmrbWJZyJXRzqJCfarPTHVWmsT XwU6SBQ/WjttYn5wY3Cn2GHttIkca6dNSmunTWprp02GrZ02GbF22mQ5a6dN VrR22mQla6dNZlo7bbJeMD6YIOtbO22ysbXTJptZO23yfGunTba0dtpkK2un TV5q7bTJK6ydNnmltdMmrw5WBatle2tlTd5krazJDtbKmrzNWlmTd1ora/Ie a2VNdkvgCb68NyFISJAPJiQnpMhe1rKafCRhf8J+2S+REpnsT5ytBuolQONL pCRiVAanoGSMw5LSMHZ7GNVrIr4WTk21MQr6VB8oGQIeNqcAeGj/5+E89w8Y FjETHGImAjGvRanrcJYBbnYAxZupE7WkzsDQVsDQBzBz6I7zAupBvagcPYwz lXpTP9TcHwibBoQNKJ1FWQJluC+EK7AkYO7pwNzaiKnD6lADVpedhvh6rB7C 9YHF6Q6LGwKL28G/Aoh8obMXms46AJcbOVxu5HD5LOByH8T3ZU9TYzaADQDN Z4DUFYDUg6kJG8JeoqbsZaB2Q4faDR1qN3So3QCo/TbC7wC7GwC7Z2I8+IZ9 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 Un4E3a38DStV9ih7sPZvlb1Y+3fKflai/EQ5gJ6/V/4ePeBdKHgX+jPlCHtG +UflKMb8XDnGipR/Uv4JI48rx3GUk8ov0XNaOYN9goax/3PKOei/KOcx5oLy r1h7UbmI/fxauYT2b5TfsEpQ8m+xtyvKFfYsZ2WWD1aOsLyMaEaMFWTEM3CW wM2jrDTj6xk4VxljGWPsyYxvZHwDPe9lrGXPZ/xVxl+xes7T6AFPs1LO02wW 52kmcp6Ggqeh4Gk2i/M0qwDZLSSebiCeFomkk9z8GTFzPjYQHxvYV7AYiIwb iYwXERlnERk3ERlnExk/TmScQ2Q8+5H8Hh3l98iU36Oj/B4d5fekU36PjvJ7 dJTfk0H5PTrK79FRfo+O8nsyKb9HR/k9mZTfo6P8njcpv+ctyu+ZSfk9X6T8 nmbK73mb8ntaKL8nF6Q+DdycIWQQo89mLwm5Qi4YmpN6NUj9bVZDLP6O8GXh K+jnLP6KYBbMIGyP4IF6BT+4OQAifxlEPsrmg8W/jvZqYTXGcyJ/GUT+PlsI Ft/IXgOF74X+WPgxqxP2CT/FWk7h7xKFv04UXk8U/gYovJxpiMI1j/C3Bvz9 OvH3m+Dvt4jCecKQlhKGZlDC0AxKGHqMEoZmEKN/iRj98+LXxVVsAU/2Z4tT pM65/HnxR+KP2HPifnD500TkzxCRPyv+QvwF+Juz+FPiGfEM+v8Z/P0UpRY9 If5K/DWI/Dfib6A8waiUUt1KxKviv6Hn9+LvoTzbLZ+SjQrF/yPeQpvnGxWJ /yHeQZunHBWLn4gP0OZZR0+KU+KnLJ8Sjwo0gkZEm+ceFWl0Gh3aPP2ogNKP CjXTNNPQkwn6LyPuryDuryTub9XM0eShn9N/meZp0P/nNEWg/zKi/3JNiaYE 7VJNKfRFzTw2D07gZbSrNdXsBc3n4QfKyA+8qKmFHyjTvKp5FfvnfqCMnMCX yQksISfwZXICS8gDNID+J5gB3L+JZRHx5xDxzyHir9buA/G/AuI/yuZrf649 yeqI++sfyWTSUSZTJmUyzaRMphZyAovICbxG+UxvkR+ogR/4mEnkAfS6X8ED SOQB9OQBDET/eqL/HN1V3VVQ/jXd79HDuV8i4n+ciH8REX8WEX8OEf9s3V3d XShn+gZiej0xfRYxfQMxvShJYHo90byeaH42UXsD8bqeSD2LSH020XkDcbme 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 XOdDazofuC6F1plE19XQBpPsuhHabDK4bquSaZbrnqqYcl0PQts6HwyIGDN3 QA7tNBUNGEJ7TKUDs0L7TRUDuaFDpuqBueAr70CRajctGCgNHTXVD1SETrRF BqpVn2nRwILQ6bbWgfrQubalA4vURlPLQEvwjmnJwJLQRdPygeWhK0neMHUM dISum6wDVrxrIIrQLZNjwBG6a3IPuPm7MOD/bGY3+QdCpAloCM9t0pQYGAsz 09jA2rBkWjuwPqyY1g9sCmeZNg1sDeeYtg7sCOcnmba9dGA3KC7JUUQpph0D +zB3EDeadg8chO4bOAKKw7URLmwfG4CaDg6cCpeYjgycDZebjg9cCFeZTvGR bWUDl9V809mBa+HaJLkZjw3cHJk0XRi4g2MRo5ouD9wHqdYPTKmFpmtuLY6+ 1p2O83DTPR16x52tNpvuu/PAYGfdBXg+U+5i1dyldZeF9rfPdVeq+V3p7ppw Xdd098LQJD8D4caubHdD8toON3fluZvUxq4Cd6tq7Cp2Lw0v7ipzrwgvSxJm V6XbFDZ21bh7wmb+uQjbuxa6naB0sHrYldSuBrc3SeBh3yOqksboKKtIx7ua 3AE1q6vVHVFzupa6R9V8TtThia4V7jWp9kbSLfzzFd6eOpPg4fAu0r38WYUP dJnc68IHkm3Sw1097g1qbZfTvRk8DCoOH+vyurclGTh88hE9A1LdpDZ3Bdw7 oRGunFrD55PaNerekyTV8KWuNe796rKude5DUPSjZ4P7aJJaQz1/1vBV/qkP 3yC9ndSuze4TYFEQafhe1zb3aZAnuDT8oGun+5zq69rjvgjd4L4C5rzvvg62 xPsSEZPatd99KyJ3NLnv4tPN78zVXYfck5g9mzwM7aMeKWIwNnoUPiN4siKz uk54ckJ5Xac9+ZHcrnOewsjcrouekkhR1xVPeaQ0dW+nu7cx5qmKVHRd99Ti brzFUxepTt4Ju255GiMLuu56miP1XZP9zsgiM/MsjrSkGGCdZxlmLpplzBK/ byfnaLPiMUaWmLM85shycw6fbc35HjtmPdy1Ih0dkx5XpMNc6JyKWDsOeXzB enOJR43Up+bl055YsNpc7lnFWcIzHjSYqzwTfE73bMSeaz1bggvMdZ7tmIMk zy4+f3lwDzQ3eg6gv9lzGP3LPMc+mynMiz0nIw7zMs8ZPDewRLjWbPScD03y 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 eolbOaXEHfyvKHF38hPHGSO4L/WXir/8dFxP/q0g+ZeBuL/75NBYtJXP7/EQ 9+DxBL8a42PJvw7x+0OooPuM9wj2TyTWfX5obXDK0jK0PjiV+usN/V2l+5Jj Q3ytNW9oU3x90vV3Xx3aGt9ErjPARPa4cFv4D8aEPwn3mChMCp8wrfCpKDBJ 1IkSSxOniQqbJk4XZ7AM8TExm2WKueIcNkMsEJ9mM8Vi8Tn2mPhd8bvscU2j 5k2Wo2vQfYHl6ly6AZan+5nuZyzfgIU9aZhr+CKba2gxLGfNhjZDnH3V8J7h pyxiOG64yf7GcMtwj53Ds/kS09K/fmBgmSyNzWCL2TS2hHWwt5mJrWbL2TfY GhZj4+xjlmD/zH7LTrDfCensXwRFyGCfCpnCY4Ig8N84yfx7k8LjwjLBIuQJ 3UJCKBFGhXVCo7Be+K7wZeHHwi+Fr2o+0nwkeLVurUcY1Ia0EWFIO6pdLQS0 72nfE0La97XfFsLaD7TfF2LaXdrdwte1+7Q/Eca0P9X+VBjX/lz7T8J79HvM ddoz2o+F97WXtJeFb2uvaf9d2Kj9g/YPwmbtn7T/KXyPf4tO2KqbqZsp/FD3 sW5K2C7ppELhrPSs9KxwV3pOKhP+JL0s1Qif8F94CJ9Kr0v1olZqkL4oStLb 0nLRILVLJjFPglkQ50oeSRVfkL4urRFflsaljeJ86QNpm7iI/3JCbJV2Sb8Q 35FOSafEfum0dF50SReli+KwdFm6LAak30s3xBH+fSwxLP1RuismpHvSlDiq Z/oM8T19lv4x8QP94/qnxe/ri/Qvibv1r+nt4mH9gH6teFP/Lf23NIr+ff1G TYb+Q/0uzUz+76pqHtf/nX6/Jk9/QP8zTT7/PpCmSP/P+vOaSv0F/TVNtf7f 9f+peUMukvdoFst/THtK81vDJ4ZPtPz3cj62DaqwEv6b7bpTqSpK1aKH7aLV R9/MXn2i3vzm3frm1adXn1t9sXFq9ZXV1+tXtewayxnLHyusPz9WMlY+VjVW O1Y31thU3LRw9a2mdavvvmF9I7F6coyNSWPKWFbTwjc6cIXpcb3fpuv9T0zA 9T6Jq/5T4VOmwTU+nWkNnzd8nukM8w3zmYTRT9D3VJn4ofghE8SPxI+YKO4W /waj/0H8B6aj76lK4i/FXzKZfieWJn4snmXp9A1Vhb6bmiH+VvwtM9C3UjPF P4h/wGeHf+80SyNohIf/prBOI7Fs+l1ZjiZbk81ma3I0OSyXvkc6R1OsKWZP 0G/G8jW1mlo2l34h9pRmoeY1VkC/mSmkb3Q8g1ekCFl0XrkyWwML2BpsTbZW 21LbCpvJ1mNz2ry2gC0CHbWtsa2zbaDabNtm24l1e2z7bYdsR20nbKdt52wX bVds1223bHdtk3Zml+yKPcueY8+3F1KV2MvtVfZae5290d5sX2xf9hfLebvR brbb7a6Hi8+u2mP2VY8s4/YJ+0Y7CNa+/S+WSyjVvsu+134Aj58th+3H7Ceh fDljv4o93sC422jdsz/oFXvlXgP2ub13Vm9u79zeIrx+Ic2euqfwX7TPoHOS g0XD8rBoWRF7lulYKRY9+xwWmdVgSWO1WNLZAizTWD17g757/hbuSfxXmZns K2wZm85WYMnCXcnEZjIrlllsgLnp95h++iVmkL5vHmW5uFu9x+aw97E8wb6D JZ/9ANf+k+xDLE+xXVgK2E+wPM3+Hksh+wcsz7B/ZEfx/E5gKaZ/K/s5dp79 Cp+WX2MpZb/D8gL7PZYydof9Ec/9Pvsv9iKbwjJPEAU9qxTScWesoW+Xv4I7 43RWS98uXyDkC0+xV4WnhafZ6/Rr0HrcK1vo957LWIPwNcHIviB0CB3sLfqm eRP99vOLgl2ws2ahT+hjbwsewctahBEhwlpxZ02wpbi3fp19RVgtjLGvCuPC OPsa/fbz/7L3NdBRHFe6PTM9wxiLsawoWMaYKArGWGCMBVEwUTAhGMRMzxhj GbMKQcp09/z0jEbzb8wSDCwmCkuIIJgQgjGPJYQoCiEEK0IWGLNYJkRPwUTG mCUsD7OYYK3MwzyZ5WGy937dIwkhx+TsvnPeOcmp831dqq66XT/33rpVgJhH frZRqDA1mZoE2bTf9JqgmFpMbwg+029MvxECpt+aWoUg9DdEPmKkELYX2guF avzdvaj9YXuREMPf10vYJ9onCkn7JPskIYV/Z5TG3857xl5p/6bwrF22y8Lf 09qeE7qg+8X8eye0YkIJYQqhlOAxUGagnFApPK2VaFO0Us2jlWnlWqXm08Ja XJtPvEhbpq2gVKut0zZqW7Tt2g5tt9ak7ddatFbtqHZcO6Wd1S5oF7Uu7VrI HLKHHKHc0JBQfmgEpdGhotCE0KTQ1JAzNDM0OzQ35A0FQpFQMrQgtDg8MLQ8 tDK0JrQ+tCm0NVQX2hlqCDWHDlA6FGoLtYdOUDodOhfqCF0KXQldD4uUssOD w0P5/xe1eq1B2iK/4ZiH377w2H+bfrsp3QEtz4aW3wkt/wy0PBda/llo+WBo eR60fAi0/B5o+VBo+TBo+eeg5fnQ8gJo+Reg5cOh5fdBy0dAy++Hlj8gtFIq hK6Pgq6Phq6Pga4/BF0fC11/GLo+Drr+RdJ1s1AM/f4S9PsR072mYaT3rNkl 0OyvQLMn4V9PPAptngxt/iq0eQq0+Wukzd8iG3jO9BzZAP8biunQ5lJos9P0 fdP3yR5YpyX86wk3tNkDbZ5paiU9nmVqM7UJT9qfsj8llNnL7eXCU/agPcj/ mjt7cfYKWqcsmvvb8beGhOBuQhNhP6HFKGslHCUcJ5ziMvHOYEO0MVT254E6 5fHZwebovuCB6MFQ5Y3gsuCh6OGQjxCOz2UE26JHQvE/D64TbI8eC56IngzN 7wH/HDwdPRNaRFgW9wbPRc+HVvx5oE5tPBDsiHaG1kU7g5eil4Er0auhjYQt sYvIb49HQjviyeD1mKCJMVtodw/wc1N8gTYwlhXa/yloiS8OtcaXa9mxHGBw LE8bGhsWOqqD8zy20PEe8M9aQWx46FRsOD+BkbHC0NlPB9fTxsTGauNjxaEL N0KbGCvJyO0NbXJsSuhiD7RpsdJbQfXp9FBNinm0WbGyfjEnVs6oPpcuYGjz YpW3BCXm07RY+CZEY3FGdUciW0vH5t8Kqi+lR2oLY4uApbFlQE1sBaP6SnoM PyMXU6O1M7Gz2qpYrbY2tq4vqq+nx2sbYhs/DVExPREyNse2ANti27X62I4b sCu2+yY0xppuwL7Y/lvGwViLdjjWehOOxI5qx2LHb8LJ2KkbwOO+BYS64iu1 87ELWmfsYr+gd6Fr8TVhc3w96l2Odd0SrsauhYS4uS9YRthOcMQ3hWxx+60g nBvfGsqKO7qRE8/tBr8fQsiP1yE/Ir4zPDreEMqLD0F/+yBcFG/GmIbF8z8N 4QnxA+FJ8UO924eGx0fcgML46JvAbafG20Jj40VhZ7wdz5nxE/3155MQKo5P CJXEJ92EKfGpodK48yZ44jN7Izw7fjrj22/wxYavzPi48Nz4uYwPCnvjHb39 SLee9FrX7nXJzFEgfql7biPxK737xL4kOpB8Ctl+NFv3AdHBhg2zXQ2NbeR9 g/U9WkAYmZ6c0efomNhx/g6/Dyfj18MLEmJ4cWJgeHkim/eX8MrEYC7nsYXX JIaG1ycK2L+GNyVGsp8Mb02MCdclxvMeEN6ZmMi+HWMmfQ83JCZn/HO4OTEt fCAh8bjDhxKzeC7CbYk57DtZJtCemBc+kVDCpxNa+FwiGu5IpMOXEgvDVxJL sUfyHsR7As/hddonjf2sSoxezsxz1cBEQVV2ooZl4N3gxKqqoYm12Hsye22v NeqWyTD2lMxewH3ivbGqILGB+1Y1MrG5e525Pq0drz32ZdrzeGxVYxLbuKxq PO3hzTp4v+b5vQFt+r6MPYv3Y/pOZi/mJ0D6w2Pru8fyk1E1MSYweI/N7KsZ VE2O5TAyeyT2TGNv7L1X3rBHGvtkBlXTaB+kNcbeR/thlRQrYUBveZ+brKPb ZxGqZiXq8ZyT2FU1L9EIGyP/UaUk9lVpiYNV0cThqnTiCMrJhnn/gN2SHbE9 VS1MHKtamjjJvqiqJnEGvtOwg4xfZN1iOeznqlaRb8rYCK8X+S1un/GBfW2r r11l/Eu3bbEekt+sWps4jzXfkOjMtEd9sreqzYnLVdsSV7nfVfVJoWpX0sY+ HD6Jx9CYzKral8xBu0/zQUa/qg7qfry7H/ZePsroM8baxx93j4f8cAaf6Os+ wZ9WHTaeR+JFPKYMbvKTvX0l+8eMj+zlD7H2LIfrsG+iOag6Fm+Ljk9Pi05M SwyObXi9OaaJTk7PQhn5rEhZsjY6LT0nE79EpfS8iC05BX6M4o7orLSCmIJ8 WmRsMhwRkiWZmCA6J63Bp/H+z3ED+7p56Sjv0VElTZn0wsiU5KJoNL00mk7X RBemV0WXptdGa9IboqvSmxGTGf6S2yI2y8RNHPNkYhSWZchAH9emt7G/RL8y sV0mDkv3+GAgE8MYsQfL4ngsuiFdz/FOdHN6V3d7rs/j4Z85FuSYi8YW3ZZu RBnHjRkYceIN6BsLGrHfDTDmtW9c1w2OxTLoG9dlYrR+YrNovY5Pjc049uod f3HMlYm7esdY3Fduy3Uyc9LXtsj+qk4m826yqzPJYZkYq+p8cnhVZ7KQfVG3 v7qcHMt6XXU1WQx9ypRTHbYr1j88s5KlkZykB/m8ZFlkWLKc0dveIsOTlewj IoVJH/SzOBm/KY4hREqS8wHSRwbskPxWpDS5DE9PckXGBtkmIuXJdZHK5MZu +yO7iviSW9jeIuHk9kg8uSMyP7mb954M4I/4jMX2R2OOLEo2RZYl90M2+Y/I imQLxmnUj9QmWyPrkkcjG5PHI1uSp9gXRbYnz0Z2JC9EdicvRpqSXbz/MeCf KCaI7E9ei7SkzOyPI60pO+sp74WRoylH5HgqN3IqNQTzdTaVH7mQGsHnhEhX qojnKXItNYHrV5tTk6rtqanVjpSTY0D2/xnfXJ2bmlk9JDWbwfKwz/B5KD81 l+e9ekTKWz06FWA9qy5KReDDaB2rJ6SSeDcptQAypqYWsy+vdqaWV89Mraye nVpTPTe1vtqb2lQdSG2tjqTqqpOpnTy/1QtSDfBlNP7qxalmPJenDrA+VK9M Hapek2qrXp9qr96UOpHRH47BOf6o3po6XV2XOle9M9WBcsPnVjekLlU3p66w fLaT6gOp69WH0mJ1W3pgt65mzgHGHsX56vZ0NtepPpEezGWCWTA5ljtqBeFv f77yV/TnKx3CpZ4/B1DmC2Flo7JF2a7sUHYrTcr+J5crLUqrcpT4uHJKmW+k LcBZ5YKyyEgXlS7lmmpW7apDzVWHqPnqCHW0WlSWrU5QJ5VNVqeqTnWmUqsn NZehzlbnKuv0pHrVgBpRk+oCdbG6XF2prlHXq5vUrWqdulNtUJvVA+ohZVkm UY02tV09oZ5WVuhJPad2qJeo3hX0j3vENfkdf5G+wPf8g+pIt2f8t9yDusk2 Hqd0J+5Bc3AP+hncg34W96CDhYCgCXcJYUpDcBt6D25D78Vt6OdwG5qP29DP 4zb0C7gNHY7b0PtwG3o/bkNH4jb0AdyGFuI2dBRuQ0eTzbUKY4Q2Sg/jNrQI t6HjcBv6RdyGFgvvCX8UviS8T2ki7kS/jDvRr+BO9FHciU7GnehXcSf6NdMw 0zBhKu5EH8Od6DTciU7HnWgp7kRn4E7UiTtRF+5EJdO3TM8JHtMS0xLhCdyJ zsKd6JO4E30Kt6GzydJ/LTxt2mPaI5TjTvTruBP9Bu5EK8QV4j8Klfg9hF6x UdwjKGTXLYJPPC/+UQiQ/XbRXPKfBS7q0VV5jlAkz5HnyYqsyVFKaXmhvFSu kVfJa+UN8mak83KnfFm+ygui2JQsJUfJU4Ypw5VCZSwneZtcL++SG+V9SAfB h+UjxMfkk/IZTqw35lGkNw8aepOD77PGmGmN7iftYV0Raf6LSHtYV2zQlQGk KY+RDvGd+W2kHeWkQ6wft0M/snBPPojGFSJNYm3IJl1YTfrEepBDWrCN9Ik1 IFf4JaXPQgMGQwPuovU/SHrL9+F305q/QxrGq34PVn0o7sDvpZW/IAzDGueb smmNP4/VLcC6fgErOtxUYaoU7sOK3k8rGhVGmtK0ooW45R5lWkmrOBqr+CBW cQzutB8y/drUKIwVTPZie0nPenjrxTu99X2TfE0xe3d5GzNJ3u7dZ6SDfZNi 9x72HtGT4vAe8x5TcqmkT1KGKPnek5TOUDrPSRmBZ6f3ciYpo71Xb05KESRc lQUj2fSkTJCz5CxlEnHOzUmZKufJw7rTcK5rpEIjje2bgmODxXKxXJJJvrg8 xUilfVOwRPZkvhWcIpdRGk4lfZLSIM+Xyynx9yo5+evkWnr60AJJjd4sXS71 H4KE0szMymE9BUvluBwPFhLPvzkFPTS+RZlErZZ1pxVGunmmnMpM6tO6TFJm yxs5KXN7ZiKTFK+8Rd6eSVjxgLzjxqRECEl5N1KT3KQsMMoXK8vpuT8zIuqd oKyUW25Oyhq5VVkvH5WPc1I2yaf0pGyVL1LJWfmsUief7ZHTk5SdNEcXutNF uas7VepJaWD9Vpqhu4eVA8oh6FgbZqIdGnWCcqcx3h3KOaUDPepAf3VJrCll WCVPsDxYCW3wYfbDPNNKRLlEtrNLmUuWs0+5Ihcq10l6rSp6j6gD1WzS5TPq YNL3q+pQeZlaQLqc4x2ojqS5ylGzSU9sVHeMOl6dKC9SJ6vTVIl6zPqfo87C KM/QijllmzpHnUgS56kKyWKrxYi4pmErvLo27zFVk1vUqLdeTVN5FtVr9J6X s9SFlNulnFaXevepNeoqda26Qd2sboMtH9OTWq/uYntVG9V9lA6qh8laO3WL VY+ox/hr/CX1JPXmDNukypL3qZ3qZfWqT/DZ5DxflmF/bIGFvhy1k3StFvq2 kd7mya1yk2+YvNE33FfoGyuf8hXT+tJqqdm+Et8UXymNYYfcQnOfp8z0eXxl VLucUqW821fCGohRYq24HiXSGJ4ln48QllvIhnN886m8y7fIt8xX6Vvho2/7 1vk2+rb4tvt2yLVKh28367uvybff1+Jr9R1lHSddwpr7jit1pG1NvlNqp+8s pQu+i/J+TvSuy7fbd41G0Cof9531m+VTfjvrKfFZv8Of6x/iz1e3+UfIYf9o +YK/iPSRNbLSP8E/ib55ljS0i8cXjMvFwfn+czQrU4KLyNtW0nhaVJE8y7Lg CvIChcFa8hSlvjx/JLjOu0Eu8Uq+o8GNwS1s16QzNFvB7cEdwd2+wmBTcD9p KHkO0sdizE5hsCRYoteQcwKzgi0ki/0dNBg14WVYg0lWWbBVzgseJR0/Tm+W Ub0S6k88eIpyxb5TwbPyFKXZt9vfHLwQvBjsghc0PFnwWhCe1dcULAuWaWbN Tn7Op/s6zaHl8tf4S9oQOazlszcjjmv52ghttFbkX6+RR/ed0j0XfNeKYFib pDnkU9pU7ol/Kq0T684pv9M/k/VHT2o29bvUP5t9kn+ur9LvlY96j/gDpFc7 6Cs7/BHyGCP8SXm/f4F/Mb1Z7me/4/Ov8a/3Sl7Jv4n8zQjSnLj3qn+rv86/ 09/gb/YfkM+SnrGlF8tN/kP+Njnub/ef8Pn8p9WFcpb/nL+D1jNPrvQ2KgH/ AbLgWvJZZ+nNJf8V/3V5Y0AMDAxkBwaTjawIDA0UBEbKZYExgfGBiXJtYDJJ rQ1MC0hyOUmuDMyiPtV6pcCcwLyAEtAC0UCa+ughbVhBvr42sDCwNFAjZwVW yaWBtWTHR+QdgQ3UZgetT1Ngs7zRHwlsozmq80f8ETWb5qDSVxaoD+wKbKN5 WBZoDOwLHPR5AocDRwLHAicDZwLnA4flVnp2+uYHLgeu+sqCQiDbPzNoC2bJ XcGcYF5wWHB4IDtYqJxDNPXg306Yf0UnzIAQxd9qGMz/10xloWCqXCbkVo6g NJpSEaUJlCZVTiqnVDm1cmpFeUV5pZPSzMqZKJtNaS4lLvNSClCidnOic6KV EUrJyiR9x+zwOB6nb2TjRCPgRGPGWcaCmFfEWcaKU4wNMe8AnGLsOMXchpPL 7Ti5ZCHmdSDmvQMxbzbOLHfitPIZwZStZEcwpmF8IqhoEEwVbfRspme7eGfp yIpDt4IZrfQcQxj/CZioY8YpHaWTbxHTCFI/mKVjRhc959wanGZ6zjOgGNB0 zKjUn84hhHzKRwnpm+EcTc+Fnw7nBMIkyi81UENY1QfT+sHaPtjwF2AzYVs/ qO9HLmNXHzTeGjw89/sIBz8Bh3V45ugoPXKLOEY42Q/O6PDwup2/NXh4bTsN XDZwVYdH059uL617GUEg2G6Gh3RgRtanw5M2ZOQYyCMM64Ph/aCwD8b+BSgm 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 4eua188Xf28pKJCi4iSSfCnnpWpSS+pJI2kh7UVfletvdI6Ru6S/DJYHZEJi f7JkydlSXorJRfJnqS9XyfW+ft3hr32LPCpjpafcLUPkQZmY2BeWbCklFeQ0 qS615TK5Wm6QjtJVjLSRx/y9sZcMkHtluEzi3ymM+5wiOXKOnCfF5WKpIw38 3eVG6STdxMpfZJQ8Jb3lHhkqI2SyH4Vt1LRpQ7mq+bXX5Eu7Fs2vzpdxeDlN ishJUlrOlPP9HaaGXC7XSDNpKbdJd3+lSnKrjPaWfWSg3Ccj5Rn6ZEsZuUBK yCVyhTSRm6SyTEFfXE6VXCnrK3FFOUNq+kheKdf6St1KOsudkvL39rbyuDwt feWvMkwekmeTEeRJITlX/iQXSkm5VBpKU7lObpbbfezTUlXayRMyXvrJILlf Hpap8lz7Kr3a25VwPdwMd8AD8KgyDNu37do7zIXFYD6sAKvB2rBh+7a9OobN YUvYBnaAXWAP2Ld9+249woFwJBwHp8M5cCFcDjd06Hr7beE2uAce6tD9zm7h UWXKwCzoYB4sAfNh2U4927ZPnQ+rw7rwKtgCtoGdYU9/kbapgXAoHA4f7dq9 T7fUGDgeToHT4Sz4OpwL53e9s33X1CL4OVwB18KN3qRnagvcAffBwzCjTIcw Bxa+0x/SxWBJWAqWgxVhNVgT1r2zZ4fu6StgY9i8h+pbwjawA+wCe8C+cCAc 2suvbHo4HAWfhJPhNDgTvt7r9u6d0nPhfLgILoHL4Sq4vle39j3Sm+AOeEgZ CcyBefCsXr0qVY7KwUqwBqwLG8KmsKVnlehW2Bn2gP3hEDgcjvKsGo2DU+AM +CqcCxfATzyrRcvhKrgeboJb4S54oFefdr2iI8osgWmYC4vA4vCsXn169Moq DSvASrA6rAXrw4a9ffyzmsAWsBW8FXaCXWFP2F/0l5BP9XXgjx+tr0NnSMl/ Uwr48dR/hilfFVO+LkWS9f/pLOQslgNfFU9koT9E6+8RJ/EL0/8ZKfDV/R+z yB+i8f9ZzsxxZ0Fyf1bm/EGe8gd55v9h4T9EHXM+Z/n/5+zvOjlO5/5JWn93 LybF/2XpNCTjX4GU+peO50jpf+lYRsr+C8fA3/3/Wf6zEQz8q5l/lif/AVb2 r+J6+1cvY2SazJFFslI2y4EgDPKC0kG1oEHQIugQ9A6GBWOCacGcYFGwMtgc HDChOcs0NgPMSDPezDTvmCVmrdlmjtgcW8JWsDXtVbaV7WIH2JF2vJ3p975e KyveDbbJCeftTjh/+ITzR393Hp7QnvblZY1Ewe/Oc6odf5479fj+7tDx/vNa HX9eVI73XzTvhPOyJ9g3POG89QnnJ8yn6Nrjz4uVO+G86Qnn/Y8ff8kpx7ef +d7x52XOP+G84u/O/f4tU+mE9qGcG19zisQzPLdpfCwXzzz0+VfM18SyiXZ5 clybHDcnxz3/yLpCteRYOzk2TI4tjh9FhZHHz/K86sefV8wcb39hy+PPK5+w ClWqnHBe7YTz5SecrzjhfMcJ57uOP69a5HdZ5oXqeSecVz/evnqNE85PbL/q hPPGJ5w3OX4VL7nK0/nItA/GSqdgItW6nf9P/E4dI0GqcOoU7kJFJJ3byC3O begWuQVuodekg53BTm+3J9ij7yaDfWKCg8FBsa6eqyehu8xd5u/Xmg/GXm51 vYwpYop6jX4ry+l4bCHfs6I/L+bfUfX07/kWy0Y5EuT5MWT5UeXlNhOT2zC3 uWej3Os8dXaFfQ3Xd5yV/DvCWm6rWFPYj+lnjovdNn8s6s+3c1zsVonxZ2s8 F7u1np/4uWqGlpBSbqMf6wLf+j3HxW6TPy705z9wXPw7y82J5Y+J5ZbE8qfE 8u/jvZrxNma81zDev7c0oeVaWpr+vsUtYYSfM8KljPDvLctpWUHLSlqMRMb/ 57fZSUbfyRc2hX1Ui/qo2twrcq/0UV/gFkjaj2mhj5QVfU0RWJ4f+v/L+f5D /ayG+tOTg5NlcFAiOFOG8O+FDgtaBa3l/qBr0E2G82+EjgzuCnrLQ8HIYKQ8 FowLnpZRwd5grzweHAoOyRPBb8FvMkZTQ8aatEnLkybX5MpT5hRziowzxUwx edqcYc6Q8eYcc45MMOVNeZloKpmmMsn0Nn1kvuln+skCX/0HyAfmr2aQLDTD zDBZZB40D8pHZowZI4vNU+Yp+dhMM6vlE1vIZ81RW81Wk4ytbxtIgW1kGwXG TrKTAhv2Dp8NwlT7VPugSqpjqmNQNXVb6ragWur21O3BRaleqV5B9VSfVJ/g 4lS/VL+gRuqr9PDgkpzrctoGu3MePCkIMrmFcy83d+fenDvZvFKoQ6EuZn+h wYUeNkeccVk2y53tzrYnu3PcObawK+PK2FPcue5cW8SVd+Xtqe48d57Ncxe4 C2xRd6G70BZzlV1le5qr5qrZ4q66q25PdzVcDVvC1XQ17RmulqtlS7rarrY9 09V1de1Zrr6rb//kGrgGNt81dA3t2a6Na2NLuQ6ugz3HdXKdbGnX2XW2ZVw3 182WdXe6O+257i53ly3n+rg+trzr5/rZCu5ud7c9zw12g+357l53r73A3e/u txXdcDfcXuhGupG2knvEPWIru8fcY7aKe9w9bqu6MW6MreaedE/ai9w4N85W d+PdeHuxm+gm2hpusptsL3FT3BRb0011U+2lbpqbZmu56W66/bOb4WbY2m6m m2nruFlulq3rXnYv23ruNfeare/ecG/Yy9yb7k3bwL3l3rKXu7fd2/YK9657 117p5rv5tqH7wH1gG7kP3Yf2KveR+8he7T52H9vG7lP3qb3GfeY+s03cF+4L e61b5pbZpu5L96Vt5r5yX9nm7mv3tb3OrXarbQv3jfvGXu/WuXX2Bved+87e 6Ha6nbal2+P22JvcPrfPtnIH3AF7szvkfrGtffK2pX4JlSsIjgRHfBUrCAp8 9UgZ//6DfZZin6XZZ5EpYUpIlillSkm2KWfKSY5t6KvbSal2qXaSm+qQ6iCF Up1SncSlOqc6y8mpnqmeUjjVO9VbTkn1TfWVIi7f5cuprpQr5fd4aVdairqy rqwUc+VcOTnNVXAVpLg7350vp7uKrqKUcJVcJf4dgKpS0l3kLpIz3cXuYjnL XeIukT+5S92lku/+7P4sZ7s6ro6vVlp/z6H+lnZXuiuljLvF3SJlXXvXXs51 HV1HKeduc7dJedfVdZUKrrvrLue5Hq6HnO96u95ygevr+kpF19/1lwvdIDdI KrkhbohUdsPcMKniHnQPSlU3wo2Qau5h97Bc5B51j0p1N9qNlovdE+4JqeHG urFyiXvKPSU13dPuabnUTXATfL2e5CbJn90z7hmp7Z51z0od95x7Tuq6593z Us+94F6Q+u5F96Jc5l5yL0kDN9vNlsvdq+5VucK97l6XK90cN0caur+5v0kj N9fNlavcO+4dudrNc/OkMfXvGupfE187F8m1vnYulqbuE189m7klvto2d5/7 anudW+qrbQu33FfZ690KX2VvcCt9lb3RrfL3jJZujb9n3OTW+ntGK7fBbZCb +Q3+1m632y23uL1ur7Rx+91++Ys76A7Krcm7NH3lU41aW97nViq4JbjFqzsG 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 01qvlTXCavKkZP/tJnPWvV/6ZcY7PsMv5/0x1vLuqnvYrUOlU0rMBNn7lY2v z++eVdHxgpBS4jFb58u9S6MSpkbcCTtYz9FuTZZRXcF8y/61NpuELrtums4L 8VmetHlLyenyuNEN8aRtdrbFe1fS9J3bmkM7VxaFWE+0fXrkkO/RRw0mnR97 uC2Xhuj1/pFDD30Fpn7QIiE/GqiyWmjVc+jyYJfO19KZ8VWTzPf8XB7v3PqN 2FU6rC0HvFjmJbb7vX+gh0ibtK6di7pxk8aNXKNCo8Qwd7VDaISLu4NraKiL Q6gbbLq7hYWLjZ1dXF1DI74DwBPaj46f22TQAx9zd3QxMNjeKYOtKwZVA6C/ CBCYAxA4pf2/BIDQl6EnQyfuKwLXqR2cRbVIIDC4FgT6iQCCtSCw5V+DwD85 d8KP8E59eYidTneXCRezDj8tb3qhXWdl9os+t2J6bU0qphbvShyQPSd3MXdg XN7M1513pDWpUN2+k/mut42mSepU/abJJUWnNx4btKOJffsxNtqB9UWVqqrD ExlzvzSqt/3oLLOVWp9M1yW88Y8emL3SZtK15wtybg1b9jLGuLBjWPbr5F/1 xnmf6ryhXfmr5vMGt7nyKPmBYU7mgAEaDcuphS+1ZTv6dyva93jjsOXnwk/5 3m1Z+tavsir39k5Kt1lvi5s/eS5dM6eV2mN4wz7ylV6DH7wfldRqd91Tj9pf XHO3d8v3w488iArvd/JixqSfU23Ejy9dz4SbrW/T31fouLep8HJLWtMVHqX1 5iqXT40C2UbvArxbVo13bKhLfWOi1tS/h7m+BD1Yjbn1p817Yx+B6xjIoOHV dUTD73ZqfPOL2kFsVI0LNr/hQrfYWAAHcFR0VHR4aEKkRevhCQNi46MTkgiY gQBzUTs7q5u4OAOYOddsOkub/02c/WcItiG+Z0gdMWKvWUY/C4s2ixIDBrU0 uRR78sTrJwO/LDTQun2racJE461OOc7Pqm7ub+NnfTEelTTuzk47vsbC592r AYWdO6bm707qODSzA3Otst6trOFTi1cNazfu8oSSt7vfuC07FtL++tqiFrcb DlhovCI/fljQa8P5pZWN58fnXErsaz6i/cTJHgZnhvWiocuk5m+IdrpWh/sy N8H2bqJT4A09sWfZudSwyhPH+nqpu2xvoFvaSiyOt9VqaHXE3a9FjnOLOady PRSTQ/yCUhra0c5bO172D394ziHsdfsWDwuV6INXbvbZXjPrBzwatcr3jVex e3OP7E0jQvINs1NPaM8Oar6vUKOv7PxXBOsDLRIsakrIoCs93JgWZVDUQq8f IokEVmaacjn0wCmijkKjJjTRx3KanBjk77d9lHSWyrNqv/P1p6fdSe/XrEAd u7z5risOYp1vH9Kj5Lw5iwLQcAhn2qLW32GZUJjSr1VQg4X36+l+trvDBqT1 LF0mdqnGMh+xg9g+p21O6ymefx3Lvh2Oh64tQRBBscBaKOYtAijXQjGPf0XI SQOmbfVZ/4hfFEY9m7QcV99r7dPYVuudN8c8FZyGFPh8fNp3+PNOzRwuty3i vpx47KBean0yuUv6eMvehS2cOu3IKwhafC9u57ZNZUmbfeI/tnzSetzxO7xh 9In8xRYOn7guB4NOOdzzPbcr7mGBKk+WH3R72/SO3d+ktVn8+u3LF/em1HVt vi0o41WA9WS7ZSmm8+7OZ8ze3PUrm5l7/JFu/i9+R03OzY5Psxs6ONO4zPRV wKX+J62qQsxO5c3c3WBDUnhQu7yup8ofL+0RdCOTat/Oqe+7a2supDgP+bws Tbf0afTDlXn2e4420hIiZy0qeZ/3Sae+RqTH/Nej6vruPHsn6NGZkQuMQo41 Nuh7Y56ZzyyHPUWu7UxfaOkbo943GveyPJ1+ROPFZGGm/2BB169Fsq334viz bwcd3/csbmn3ud3HzE/NMfGWBX8sXtqfTch3e+7gZHj0Qby7zrvY9c37p5R3 25DqYhBpLky/oXUz4l3saa8L5w0fJx2UbzpfYX+r7vTsQrZCt0GrotLyOyvH ee1k+nWI7NfKb12bZ37PNyYmXWFdNQabjlfXvSsE3rifW3G/g1ZRRHpVFwPH 5L205ai7aa0bRB+YNzvtWOqVTMs1qpDFr/LWTBkwkY9x2Jk4EJktKHpjMPqD wUSb7VOLYwo6qJ0yrt8b2uIyGhvW4ezpqce2GX0S4lP3LW2xlmoVUxWdueCu VoHWJvcuyksHWogpCgbw++VX/DYY4Erw2/S/gd+iu+gqAmI3dhElMeqsJpsQ asPmfy/c/2fovSR30PpbJd5z7ZIHOta5s/vuvUOLulp3KTp9w8jPRvPF2RVn OxUliBbaT5mLgWn6PvNN2sxdkx4i1r+GBj4avfvZNEbzoyBPfzXtZN0TLjY/ Z71519/U/vPoh1PNnjz0W5q7zzrgeOqn9sUaZ/qsPbOujTyvfPmgef0vN7zu FbBuypn7Db0cGxRO8f+pG18qs6+ImTNHHPLz255i1qexlxZufGS5cGzZOd23 yq0Bg7ttaj9niTfy7RCl3cA2qmBh6XnFBN+88kkrtDvoaaQsmfT8p5FfcIZZ F+VkpCV6Pd9609pr50GHwCVrzUe2Vo84mXmr2cR5uaHUZjPV+s8fMzfg01Yd A6vK6QP7Lbiv6L0aWmTFP0LvHwbC36G3Vm30ll5cLk5IrwbfCXPECak/ht/c 8GWhf3v3TNFKKjLI9c3JL+o0rMc7Rtcx8v8Z1P9LoTu0tdbC6QdCZO3cbjze VDSi5HRS1854vWPC0F6Ded3Vp/eMnr3N8YJO3szBYdu6Uyf8LHS7LLoxqtXd 7jvX9sgwvWOGpxTuHPlmxplnzfCLu3tms/TRVO+7rwL0b/ivnlv6MDXm4vh9 D+a/UThNlj3+xc7GKq7iw+fSkYscVR+Zu3G7jPyyZg1k49O25TZZ3N/hUFfh SViIp0H6DAvPu4yxc/lJtW+iukWjeO7ok7gWVZNZ3Vv72dBZry5vM3zqN2Pc ocaN+izd+3TXGK7N6AsB8ZYvxOM7R0aG9MKGrJ5w7ppe+vvm26N6bHRwelg+ ecrJrkGPsuLmDyps0unCh6S9q4xGhdm+zMu0dVWMMA471sJ8cN2UV9wR+53F bTfeL382ZvO9ZQUJjbf5HRpqrVM/kWvebebQYK+2ers2blzXuf/RJW2qxidZ js/WF6MetdHpY3w028ryTNvHjR7vfOd90v7CFefxnerbedv0DX4S9HL5zUVZ x5vG7p7QIEGh/SLRcm9myr4GgVvWx7SYlpsYumlIru7yvas6vNKJrZzuPGjD l1tdj860Pha1O8vsZ50IqoXD2p6zt5Va3t+87nj4ppGB9IXWjl0K56/LH7l6 Y86C4cZX5/6sO9zKyblAOSSn18x6e3NeTjpueempuf+xjBc+tz/iyNhp3Jij 0UcfDHmyYuFptW2VcKhXyJXOJrlXPjllezr+ZDDwmO7SSnWKHIawfAWFsQjD 7b+nl388bfLbJHLOhIOSXKvpvxoyNV97hhou4LctTi2ItY/qS2Lw6z/K1QBK CxanzZquGDvbq4V1M8OxvInhzc1xYkStf+HVQWJgjt34hqgzikbhKB7Fkknu KJSALFAgSkJxsNUf9odCbQBKyq0/3uZPB2tCUlxs//jQuAFJFr8jFXkKRqG7 ZL79/IrcM1d/LnHv9qLgl5lb3095UvzI3/PMJePk9+NLLsbMHn+8cwfPVy7F JZX+8/o77o5zS6mKP9ypZMHD7LvN6aFZOnNOqdqc3NgrOH3nle3KTvMOzl74 ZuO5foqDq08XbR+ZP+Gq7r2zTaYcPKrjWfy88/TCGU4bVOleO5U60XxMRZZw cIRG6SCX0LxJB6fW6WnQ4OHrlSfsNZrovO88L+oFvleOg4yTFqwvXctaFZYP HFVquGigd1bvoz5NRtXT7GRq9O5Twiq3AxsNuu27v/rkfZ+24rCpe5943rNM 0/HZHBNWdOT+1YeeCZd+KYy4vv/NzTt67KJc3mNBx87n57YMf/ko4Lyr0+bc FKqhmELZ/OYjhTqF0odd2qRXzvqvqYD/NewzEkhpMtZAAjlJciNmVhiBlsNl WA35wYNu5oYWhmbGRiaGURgp0s7J8ennsH5nU9Ftfq8uvl3nP1MiBq28BqWV hfEnVj2OuejbeX+avqY665wMZsdVi9lMHDac+Ne+r/cDt81CXze983uc1Doe 8E0sKlNqzV/X/Tz3sJPjc7enktp+qfP++3AZFR6XWLrwXewhZqVbFksjOfRc GmMWGCWGLJKp4e+QreP8djAsSODdyshd2b95lnWz1P1Zece2d+cqubYIrjM2 Ukwb/2WHZG6qXRMyi9vs9AIbjYWnoq9MLf0pdrFM2HBtudpWlTPmlWxyXdkv /lz6oy1kyth4YW6VrMv/CpcFE0w/B0r6TLSVuiZnWB57ZGeG8nor4ZZN+nEH JO9Xb7jCeOHSB8a45ZpJGueOrz2mn7nkQuyaFu0Xi92P5avofr1e8JrzpAMD AJgMvw8NCmVuZHN0cmVhbQ1lbmRvYmoNMzcgMCBvYmoNPDwvRmlsdGVyL0Zs YXRlRGVjb2RlL0xlbmd0aCA0NTc0My9MZW5ndGgxIDEwMTIyMD4+c3RyZWFt DQp4nOycCXwURd7+f9U9d67JnRBCJowJRxJCEgJEjkxOwp2DwAQCJJDEICBZ wyEggosIRBERRUAUZBFRUSbDYQIeqOCNxwKiu+tKRLxRcBURyMz/qa4pRPZ+ 39133/fzp8i3n6equ6vr6qru0ECMiEKx0VHP/LLBg4oNBQ8Sa7iNqMPxQfkF hb/xbH+K6IMjROrsQcUjy9wRe/cQfTiMqP6tQWXlucdqd3xKrLAjUfexwwtK B1EEMZx/E3L1H1mWmj7YeeRFItaCeNXk6dUN37310xtECQeI9J0nz55p+7jg VeQ1rBjxkLqG66aztYFvIa/PicyR11U3NlAs2XF9HE/W66bNravf0PkCUUkN UfXd9bXVNV8WdGlD/v2xv3c9EsxFxrcRn4n4NfXTZ97U+9dN7xMpUUT2x6fN mFz9fsaZaiL390ThVdOrb2qIzI7ujOPX4njbDdXTa48+U7OU6NVRRMEjG2Y0 zvT8RKtw/S18f8ONtQ3Prnt4OlEvRKNGEG87/aj5fX586+jEoP4/kNlEPOw7 EdOd66Eh01dfvKP9Pv1UUySiJlJIBJynP9N+hk3Q1V28w1Oin6rldFkwJvIU yw6qRr/kkIozrZRKtWjUEO26jFRdHbub9GTSr9dnIMs4oeq7VKeQyaz4GcyK olMVXRspXgdd9CJbM897eJnNRg6iC4oog7FSUaqIbfzoGM7+Wh/Da8pzJyfQ AldgAQ+BSjAdvAYOgVwwA2z3HbsBfAHSwByQ5TuP6+O+Y0f78tCBFHmNq+F/ Z0DfLAGbfP3I+22Wb0xM8KVvB4vBHp8f60uv9KkcL3x/ti+Nj5sEX/79wJb/ UN3+W2PvsnG/+F9Vpv8rAXUu9rH8Hzh2+T9xXBFHxFnmXzvur6RPuCL+2hXx SVfE+byU9ffK9e8IuO434DzquB4sEWnM5GP7v+F6jf/YcSwZ6KT+q8txNVwN /z8E3DvK3z/qynOo8m/sc17GUrCar5sgCbjBfN/azJ+7av4Lx/PnuRPgLMoe Aj0MTRDzFOPXv8if7a6oo9M3j/3bzwVh/2x7Xg1Xw98LGGPB/+kyXA2/DLjX f0S/lAM76AOm+fADPfk+cRybCO4CASAdWH3nWX37UkBXkOp71vLz5X/uP1vD q+FquBquhqvhargaroar4Wq4GnjAM3rYFfFuIJBzRXqMTx3ydwvw6p+fSweh nX5Oo6/+faX/vxHQHl2uiBv/B6+d8hfSIn3ag7+7/XIfbQVH/4eKdzVcDVfD 1XA1XA3/V4Lqo6P4kohtQQxOXU86tgwJI8hBeuJPTwHUmRKpG/WjwTSGKmgO zaNN9Bt6knZSK0tT+iguZafSEpsXOzh2eGxxbGmsM3Zc7IbYTbH7bFZbvq3B Nte23HbXBcXr1a4cQDbk15WSKYeGIr9qmuvLz30pP7fyNPIbhPxGIr/RV+Q3 07bAtuICQ37M+wPKHsbGEHlf4n9Q1s7eyWwfNbND7KB3nec+3TT+54vKP//T NuLj6o8DPg4g+thf3+r7omrIZdv/WughW5hVKSWsgk1glWyWUqvUK1OU65Wp yjRlunKDMkNpYOPYWKVJuUPtp9yprFDuUlYqdyurlHuU1cq9yn1kYGe1fM5e +a0X4orvy7C/97eF7OeS+BKuBQvZIs3/nbJdlo8OY8FARjKRmSzkR/5IC6Qg slIwhVAohVE4RVAkRVE0dSA+qn4ZFtNttIRup6W0jJZTE91Bd9IKuotW0t20 iu6h1XQv3Udr6H5aS+tw/AO04R9v8H8sKBP+/jH/RFD/9m7lEZ/ZS/v+iVxf v3r30f+Ou48cg2omThhfOW5shbN8VFlpSfHIEcOHDR0yuGhQYUF+Xm6OI3vg gP79rs3q26d3ZmqPlOSuiQnX2DvHRYUFW4MC/Cxmk9Gg16kKo+QCe2GVzZVY 5dIl2ouKUnjcXo2E6ssSqlw2JBX+8hiXrUo7zPbLIx04su6KIx3iSMelI5nV 1p/6pyTbCuw216F8u62FjS1xwq/It1fYXKc0P1zzukQtEoBIfDzOsBVE1efb XKzKVuAqnF3fVFCVj/ya/Sx59rxaS0oyNVv8YP3gXF3tDc2s60CmGaVrwbXN CpkC+GVdakJBdY2ruMRZkB8TH1+hpVGelpfLkOcyannZpvAy0x225uT9TXe2 WGlSVZJ/jb2mutLpUqtxUpNa0NS01BWc5Opmz3d1m/dJFKpc60q25xe4kuzI bGjppQswlz7Barc1/UAovP3U179MqfalGBKsPxC3vIqXmgn7pSeUDSVE/eLj eVnuaHHQJERci0qcIm6jSTFucqQmVbiUKr5nv9wTXs73LJJ7Lp1eZY/nXVVQ 5fuZXR/lWjTJlpKM1td+EvCD/TaXmlg1aXI91+raJnt+vmi3UU6XIx/GUe2r a0Fzz1QcX12FSkzhzVDidKXaG1xh9lxxABJsvA+mlDm1U3ynucLyXFQ12XeW K7Ugn5fLVtBUlS8KyPOylzhbKcN7vLmXLWZnBvWiCl4OV0QeOiWxoMlZU+eK q4qpwfisszlj4l2OCjRfhd1ZW8F7yW51dTuOy8VrV9TOQt2uOFoezGtuTDDZ nEqMWsF7Cwm2Qmzsuf2xw4ru0qK8R3P725wshuRhuIrvCO5+kQ8iakJeEd+l 8lPzimLiK+JF+BtFivGVSZ/gMl2WlxUJl8okrvNXiyaO5gXqZiuozb+sgL/I VO8roC+3v1xOhbeF78I4w8S7s0juUhNw5yJNQTZaEu/FKJuLim1Oe629wo4x 5Ch28rrxttb6d2iZfWjJWKfW275RMuoXMbG/76V9PudS8jAAC5NiZJ9q8UFa /FK06Irdg+VuW5PJPrSsieds92VINtw+qLEhcXD1HX1DeuG+LMTUZi+stmOV KWyqbvEumtTU7HA0NRRU1V/L87APrmmylzn7x2hFK3UuiJnHLxVCQ9nQUbkp yZh4cpvtbFlJs4MtKxvrbLUS2ZaNcroVpuRV5VY0X4N9zlYbZnYtVeGpPJFH bDzCcypFxKQdH9PqIFqk7dVpCVp8cgsjLc0k0xhNblFEmlWmKUjTiTSHlsYD eiiqHu2LubbAVsP75uaK+qaqCn5nUQT6ET/MxewDyaXYBzYzxeDvsthrc11+ 9lyens3Ts0W6gacbMSpYBEPj8AmpqcqOSQqjyUkxTIxDlWdpa/F6RznjD8Wc qojHOKsEY50ucxImfn3CEBw3iFOF5EGuRZOreTmo3MnPNSYMnlyBMSszxCGD XWbkYPblgCMKtXP4WMRJk9E36EDt/EWIuBZVuCqS+EWdUyq0sWx1UZH9WnS7 yFOfyC+UWtEUYk/XbkzcB5aEpVzMKBuVOUVKDKK4WIVoJKM/Sj7Zjl2Tq2xo bR1NLsM4FxOpJUak1GI+1CXWalhifDuJV0tN8AuwuMw9kCF+uPfrwe9HfYKx okIUXost9R2Aa1tdfihR4mVN6TsBrYNdg3lZ8LMUReWHvsCzKWmhUvtNmFZ4 obWcjNjtCkgYXI2ZX5zvhxR7X3myiU8Qfr48DohUI6+5P9pdTRjV4n3UPjf+ spCSbOcrAx+YFNOKgU0VTVcmuMYlpSSbrkwN0JKbmkwBf/kE0V6mgEvKE20F WDKolWyKusscxYbYWhRFGiYN+QzzSuORpl2aC9Kcl+Ynac5J86M0Z6X5QZrv pfmTNN9Jc0aa09J8K8030pyS5mtpvpLmS2m+kOZzaT6T5lNpTkrziTQnpPlY mjZpjkvzkTR/lOZDaf4gze+l+Z00H0jzvjTHpHlPmqPSHJHmsDS/leZdad6R 5m1p3pLmkDRvSvOGNK9L85o0r0rzijQvS3NQmgPSvCTNi9K8IM1+aZ6X5jlp npXmGWn2SbNXmlZpWqR5Wpo90uyWZpc0O6VxS9MsjUuaHdI8Kc12aZ6Q5nFp HpNmmzSPSrNVmkek2SLNZmkelmaTNBuleVCaDdI8IM16adZJs1aa+6VZI819 0twrzWpp7pFmlTR3S7NSmrukWSFNkzTLpVkmzVJpbpdmiTS3SbNYmlulWSjN LdIskOZmaeZLM1eam6SZI81saWZK0yjNjdLMkOYGaaZLM02aqdJcL80Uaeql uU6aOmlqpamRZrI0k6SplqZKmonSTJBmvDSV0oyTpkIapzRjpBktTbk0o6Qp laZEmmJpRkozQprh0gyRZrA0hdLkSpMjjUOabGkGSNNPmixp+krTR5re0mRK 00uaDGnSpUmTpqc0qdL02MlNTh/ldqpRllA5EbZMWYzYbYi9gy2jVGxngB1A xRG/RtppbZuK7Q6gYHsr4g18qyzC2QtxdjG2i4BCVmwdoAGoygJ3TU55i3KL O8cb16rMV25218QF5SQrN1M2mAFU5HczfQT4uTcj54nKPMTnIT5RmQs3F+5b 5SbsuVvbztC2Vr5VZuP6c3B9K7Y2ZY5jlnIjy4mboebE3aDkxE1JqS+/LqWu vDalpnxyyqTy6vSq8tSq7CplYvqE8rixz49VGsYeH6uMTikvzy5no1LKyrPL 2P4ytlH7KU0pKS9OGVneMJKljmQbi1hDEdtfxGYUMUcRK0wpKM9PySvPTckp d7QoN7jNQYWtyjRlqjs9DvGpWty7X6nbafYvfGef0ogiO5Rf7UzrU4jdv3J3 jC9sUVR3p85xeGoQwtyxXSGkCfMK8QhpF3JRyAV3xyTIeSE/CTkn5EchZ4X8 IOR7d0wq5E9CvhNyRshpId8K+UbIKSFfC/lKyJdCvhDyuZDPhHwq5KSQT4Sc EPKxu0NfSJuQ40I+EvJHIR8K+YOQ3wv5nZAPhLwv5JiQ94QcFXJEyGF3dD/I b4W8K+QdIW8LeUvIISFvCnlDyOtCXhPyqpBXhLws5KCQA0JeEvKikBeE7Bfy vJDnhDwr5Bkh+4TsFdIqpMUdlQN5WsgeIbuF7BKyU4hbSLMQl5AdQp4S8qSQ 7UKeEPK4kMeEbBPyqJCtQh4RskXIb4RsFvKwkE1CNgp5SMiDQjYIeUDIeiHr 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 nqUx2v82pSMnNoGYV1QyUhylUWUr2dk6d0pQAP99uNVq6mB8DsuZQqFYAE3E WIbDqlMC1lqtXaPXdTDcr+YE2fCavKurbg3Lo+z2P7a/hc2pkKzUUyz1w7b3 2qxnXg7OSm07eKQtrScLjg/WCAtU7EZ7l4z0zF49FLs9MyO9k8LSI8J5euce SmavgYou8OIQ1dmuU6bacq8r0tUYbry7+7CpDnu3Ketq0zwtCWkBkbaQkLjI wMDIOH3M+ZP6mAs5ukkXHlI+TynP6fLQxcUpRRkxNRkl17V/lZHgOy4kxBYV yL9mtaDWlai1Ea7GEWJRdWad3qQwMyOb0WC2mPBC7uioqKq5q9mwUtmoIOiM hhy9Xsf4fzulQ1UzUoO1n+wMVHZ8SFbfjFTrqXQWnZqR0SHqUPqCpQcOMJ+m 9Yy3q/GqnWWEqqqu8sVx7ccrW5n7+8oPP2SxnhP6mIsPK/vaC/jXnpjB1XMo WTB1om6U1xyduA/PbwYKYVt2BxgsFgO1sC2O4DhD94DotoQEQ9QJY07iCQPK cypba/UsZn3vSBuaPCQLbX8Qjc4bNT443hYcZjB2UlWtxYMz0gcqodL2Vs8N Xvr8LM/jbDbbXXtj5sSi7p9H9a8b0eIeMHlQl6TuxY1Fe55Zt4YtnbCqppc+ xvPi9WsTLD2H1bP2roMyOnmu69C7pP379OI+nTwDbyRGld7T6gl9EnWkfjsD O3aK4L/s1cdiQEXuGhnIAoP5rzksubSPheKQaBbYrORj5Lx3Cow/heK3Wd9D kyUY7DYKxkjISI+IDE9MtHcOVMLDQlDaPuqJB7d7vvIcK137/u3jNhQNWju2 8r76vm+9Mmr9oLQcNpTlP+hproqz7ejSrWDxs3M9Hk8XO+/16ei4WLStP0VQ 11YidnCXNYAFhPEWtZgiQ0+Yc8I+M4mm5MU4Mr5Naz6d1nwkW86mi4111N17 YIHnc1bC0lnKvl7Xb5q2bgl7TtkwYfu9c0enookOenbcsX925sVwtMdr6FMX rutHac0GC79aGGYmHTF/wwmzmelPKDmWk+znLsS1PzwQkqX1XjwuHe5DdbVH K5+1v6HEtbcpmfqYNZ6pazwD+dfXh3CFp3AFM3XfpZqNiqGFbXMEGC3Kx3q9 kZ005RiR+6XMzxy0HshCzUS2dmT8VPtRJbD9uz1Km26xx3lf+17kxSjX+436 vT4F4zB/Z1g8RezDW0QomdgBhzm+e/jx0NDEjt1aWNSukfx//WxhQbsTcwO+ 7JjP68F7Mth3ubYjZ14O4deTfdhJ4aOvT3B8ZnxwoCpveN7N6jeD14+r3zyj X8+6jTNCk5O7WT0/sH3dxk2ckHz7sftLxv7mZJNz42Bdvy5JQ5Y+13jTc7cV 6owWA9u0ur0mtFOYZdQjZzc/7G0eH9eZ/3WW707yo4xmk47/7l1vZrzxraT3 98sxfaaqetzRecSbJpuXNZtZX04987JodzQLmiYD2wz1nLv99263kuBWnO3b 9DHtx5RuvNW34wp7tSt03c3MfjoTmn2rw8/P4HfSnKcndCuaIh0/LPXM0QPW Dw/wNs/0dWdmPPvAc1gN9BxmKRe/Yym6JWvWXAxduxb5bsA4jUS+FircaTEq aNote3R+Zsy+lhbvabfFbGzxHkf3Kjq93mTOwaSszUfBGdkZGbjts/oGZ/Vl qRmpGbyrD6bzyjCtLlgBdZHHPZFuN/vocPtF5db2hajNw8rE9tW8Pl+gPh/g unr+jY6OPeowEzMoOTrf2ERXHmrTRiRaRf2g3bpb6YdZdwHOTEOJM7Wn0wZH bIC/yeRnCQoJVlWcrw8KCg3T66KMUYrD7Ahq8b7viA4yK0adajL6Gwx+IcEB /jkWix9j5Mdr4ZtTM/isGhKZ1ZeHjOAQljUAE2vUgfQsPsFGWX1Gm1lVo2pX u6iqPTQjNLJPaIYu86kOfgNemN8yQBe5zXHYldWn9QM1lWXtaT/Hvn/d03rx I9ygYVu3sq95reeg1qdR9gDK2sVMeosfn3CxsmKkBBkCclSLajEZcwx5jA+U 9OzsjKysBak3p0Zls9S21Lb04KwsrYHVYN7ELDQY4+X0557FN2w9yaYu3orr GtqneyZgjr/oOao8g9dczERZeIZPxZ0VSl3ommcoTLtiJz4NWbpGfxGUa/9c n39pGkrVZiHFYBB3Skjv3ny5NPLZ6LLbSZdatuLZKbfsm9+/dMUz0JsHtNpH zB8zau6IxGuGzxs9at7IRGWNy0uPlozb/uMDTzGYyifOPtr4fNOwkjv2TZn5 /HLoXpRNrkCBFEk9+Cz50s4gU5iR3zkBpqiwkwaDKbTNnGO6YkY50uZbaux8 RtEKmCgXl/63HFi22c0aqt1Li1sfuXfP1oeeUO8ofvDm4Z4kfUxS1dpZt9ze /mkTbxfPWl0d2qUz9aYhrWiXm3YS2VNa2Eu79SxUHxME5/C36/vEPNIh8tNO YfldsZbstuSmf0KivbJTsY7wFZBPOVlWvg6iXPoe6qV2488YxogIvoxEiiZl V7QkO1y/vi5dtmL+7E2VQTfU9Bzfc2TunUOKb5/cnz14ZcP6B9U9eqLJzXSP lYx74k9rN53ZVhXknGpLnN+7R/KYxcoXvHGLlz993ZwXmoYWN7XyEfA47pgY tHI0XUNDHWYlmlF0hJmwNh7Y2cESZ9ZWCUtChPGALdoWbel0wi/Hksd8kxVv 96xUsdbzptcqi7tS3A491Et94KtspOrrCwyTmNdeiuiRmd1llJtNuHHLlLRr Bk3J7zO864jFc7bdnV07qAvb3DM7wcpXgPSxC4cPmF6RYw2dOFIxTKn3FMdm lfE7ZgbWhZPopUwqbE7EMn4A4zgF5bZ07J24lwVRF+9+h39wRFGX7p+lhOrj c7HkRezyC/xS71vmUdj295J4Nx3A2nDAN27QE10yeccMxCDvYRBLQidFLP0G dI5BPTls2fONva6bOKrz0H1zRs8dbu9XNX/R/Kp+fWe3LoofPnJ4/PD1Revu 9iWySePvHN/D5G81b+9oi8kclpY5tF9arwFlDcPzfl070OAXaNoUEVk3OnNY /7ReA8v5c8to9IlVeyqMbSaFz+Vmvcp0Jw05qjbYMY+/fOZlbeG088VLZ/Us 2OVZoO7VLb6wQLd4LW+b6Wib88gjkt/X/J+7hVOAdl9HReb45YR8LO7rbG1Z bPu55pnoPW349YZTzw+Y/cSMeY9PTXPH5k4ZdtdSN3tl2o75eY5ZW2rVGRc3 Dp85ouuW+9SJ/Hr8YXQSrmeiNEeEolOZiWwGPMEaFJNOzWFKHmERyuYrQ0gW n0WjU/nDaQZ+cHGGJ1IWGsp0kzz5pz0jXmMdiktZjHiavrjS42GK+itcIwXX yNJm92W7AnRY31rYp7uNgTqrFY302R5mxB/CiH1gd4OJmXQhLazRYSGdLjTM 6qezWZ7zvk/+3uMU7H2HgrBwhfgFBftbdIbAQCN/MGGiiNoS7Jvvg30TftSR NisewrTBbm1D+bPEFkXnMz6f9sWMzze6LOdnm1NS13w0dltGUPZD8/cM0PXi VWHv3vewBwvVxaXfv81Otp/bvktt9f2LNcw1fJUtaCUD++BpPZ7JVKZY9rH3 +LsWut+qqn7+Jj3T6VQ9HwM5vieFLNGWqWfwqIpnqeCs93hX8jUW7RnZh+nq PF12ebocY7oqJzPi0i2eFHZMzfd03v8UO427fwlGyQuqh2yUSkN3hYebWRz/ 4CAgvksLe90RZO7p/yazUWfWuXMHW0l4C8PSGRb8U4fi5LO6UvF4xe8i/tYh HrAOoFmyUnH3d5GrRO+MjMxe/MYxZg5UtXkvWP15ksMjdIKu9LHxo+eNTGj7 wzs3zip/xBlfMnZS+rh7anvv+DBnQv/YkK6OHv0fGL20pCh5eP2A+59wVkxN tD/oHxni17X05lHtw9hrHXrmdY/N7BY1eCRqtMn7Pcb9EswEiXjK9Yvbx3Zg TBLb6bCGmbr466Pbg4rNZZ0Pm/SoQMYpbQrT3lSsP08AiV3Q8cZfLm/GYDEl qOcLFu65sWLvuKdMQ5+YNPrXzmR3ZPqI3vH5g0t6ZFzfs//0sjTFtODg8sGd E/RDPPP31pYVLW6dN/K2CZnhaSX9PdFhkYkVq9HrD3m/U7er5ymW+rqDKJJ/ F2LoFNjCzA7zwiAWFPKTXzHesIxPN8Sy2A7n1VLSHmUvvZkc0V5M0MaUeeWb ibakqNvzVw77xuMdcvvehhHLBuYsLcqbM7ZX84ODlgxM6BDNlHNzXmwaGhG9 tXNcRlXTmD27bTb+XsJHA9oujOKpV7O/Hx8Kphh0+05HMHU2BeijzltL/Uos ZXE/6Iu16UNbAGTPp/UM9ZUFzWf3jYA+ojzB2uQ5vfDW3TN6jk/ZscEw+PHJ oxePSXZPnZS7uiSpPuOujaxt0SvLB/kHsK3n5z93fV3R4pb5e3bOnsl+Gxbe wleqWSjdaYxV/j7q2OnvH4722bMzLrwbnqmfdoSHd487tFKHW6T7Ne92KA44 6m88ay0V8zx/OtCa7Qweftu0AcrwDhofpvVon3A5VsVEb+zt63H1tKK0Z2/f nOwsHWobtLPq1r1zsgbMenzalM0zsnartrya3KwJ+d31SlJCesT6R4z+QeaV YdGFS16Yd/2zK0flzn2yNG9GcUpycUOe79+tYp1dpf3b0exmPV7s3Y6YQD8/ fyNF+IcH6s/6BZlMwZbQC6ScDR5lKcEdjqLzV5esDEz41pet772FyAHtTRpt GR7ue2fKjM+0xqdHMl3M8slfsRZPUbPnWZbHNtffcuGk7kTsWdeq9j7Ka6u2 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 IqH8+nBxQfAknDiIKq7ZhKhlwaqA+VbfqYZhU1VwoHdowLVG8nG5tUP7L8w+ eAJpaVsWvbICdcP2s9OgG/JZjOmF3Ly8DPCKF8CPU8ikUEx2I6rpTJLkZu/O KyigtDA3HFQoandnUKivWqKqVJwhBLWR0QqX8bXc1+9BlH799yeutva3zI+p sXR5f528vSlvSV7lQkt5lamt9BwotqZGUOxi3crKTE4pr+uLdN26E7TrurOn 9zZnjbxyiSZjRX52VtVyelvLmi5Qb3996/ouVDODI3YQtEx2IGp7Xl5AhpIS xmsq6Z8mKzdXmcVDUFYU7FYqYYyIYyA2U2MP42O3TNxzKKFzwp5DOGGzg5sD qvyChVm1vjdXrG+fn1HeUlq4KKvWvHLQUdJcns1l/npeYbo8eprZl1vdqS1s rF4gV9RoaVld7a+T87UwNqrAX4vBJnWU4RBVQdccnDcvqaSErC06FeASugJV hqSkjEzTxQUFSSoS6+Ww/BFCPIqKHyGKwzY1wZu/9p3KxF2H8J3K4kXd/mUt odLKjcvXWPMqWwrLejrKCleMGtMWVVWlV7u09m7yMAS5Wu71xXpdtlo5qEld XJNVlJ+tTOErWyuLVyzhWamcW61W6cqzSXYyX9VB4r8W7NCOK7lSmL1wYlRw ZKNJCTg6Gw/JtDAb6sRvAEA8Ztvf2/gekyVdc3WW0ZMYrINVTBNwyqbKDlHZ tG4mK0uFVs1SKtMOg04k4oiuu2FEX7P9UFPxiqGOrsG2/I2ahS0VVtNGLtrY 31HEtzrq6GNRU2lzabrVSB+ANfQVkN0PLcqpss4U8hIMK4dVNQvzupSJR02a RKpajJPCl8Xw3TzW/6e7/zD+UJXuEelzV70QnPT330/P4myeyfZjlLZ1Kslr jklpGvLsTH4DJC0tiQTENLlSKpPJNUolp1bL0uRyRpY4O8YidC3MY2Kcxvca heYhOssEGRoFQfoX3zUwL89xd+3wfPn8fsuGAi6PiHTBbPsdiNW8deMfo390 30nD7ENdBtkCOMst6UySSiRyThE3mZxsE6Qgc5IYookkdcI0mrpUCAF0ZnE9 jRMDG4he2Ri9cvuDlVV/JX0uar/4Kf101N1/lUSgDOYXbKukk5pPaSnTIWo+ 3fqCmtIWzdLtB9KTaO38w8ydVCEs7NWUSqPiVaxKxWn2ZR9htlILmZ0Ux2yL Pf6uudBB3hA/fuHU8ePE2tfuDpT4ZyayOZBUXLIyx5kGf2ujpTZn++4HHmjY uLRialnLsL58x20Ok66mvr+KecteWzm/dsXC1f6iQHZWJCUnp9a8JOqmc9rq iqsWVZE+lDO/ZL3SGnge4KmG5xXzXqbbcD+gtpfS5Kqc/Mx9KUdBXgUzReWD zBJB5g6ILiDvqQuaq9dsCpQpm/uIRhrfEchbaZ8wNO9q2SGpGV4W3Hx3+6qK 1WX84oKyrgaeU3dvdlRmZLPtF8PttT/6icenWxo9rUpOW+wk0iWDhrtAujSq mOp8XqkgP2Qjy4NFdtuLlCovn5VkLVOCWMkglgKUnQRiFqKYW2MvtJNPU0Ct F4icGDPEzXfie++Qd4uFZSSdXGWP6DuW7pjm1tzZZF+a/92mznmLFlXm5q9Y wLfVFrD/q2eLo1JDs18+ErmzsjdkDq1LK6kvoSmlImuxTZR2naQdnk6KKePz Kor8+s78Yu5luh0m8GJmZ2daClvIMgR07Fcsx7Ia/iiImwPiyuCsSfCIb+HS USfoVypbkJWwF0/8jyayBlQ0u45mos3sOk9+R1tjRvXW9v/yNxWWUNcKv0n7 PUmP09Ar44qytcm9LqlCKQ2qU554YNm4q05r8NXa7AMmeOCm8+g32fskbVQj pacc1OOHqGS6ZaaswkC8oQrut3UqLWVVFktVGbugMZv8uFBnSROcXlhQoZST H0UpMJes/GFq0Hyn+Qdm1kweY7el0lSqJpVPtaZy+KJsUl6B3pxqTm2xoc1q qUaIdA1ULXS+Ba7zmW+Tzp/Ch8ylOt2iNd9atEZzYamG/DkJpjLQhvj65AXM /ZrNcLKv3QwHv1of/xNTVnZd4mY4ZWQzHGFCITpkK9IyFi5f01TRlaFOrSnd X9PXUVJiud3tGF9VWKktzC/Nz8krW7V+aXaN+lI0o6+vvqtcs2z53sxctaRo ZfuK9pVtK9u5DzOXLqjpaSpIVmn49Ow8RspkaZtLy42NC3IqmourOnOzm+Zr l8/Pb66u6W4qkLCuqz+qnJ+SW5KxMIuVJ2dnZtPnW5s6l7TWkr1i6U7mLfb7 UrLSa3yJpuRJnAJmGXB8jux/QieRYSkFf2fB72k4OoStUGhwmTrN6doT163V v/930d/ddRed8kT0d8xbtDH6Ijt49RN6XvQfyX6i0NJWiGPlVP/zORnk56Ey +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 CTqd7JbvUux+TpqtU22HJLoT4n75x+t0vsv3V+m0Wqerdfq6Ttfq36YZL/bQ aWcf1hp7FBficwrSvN+swvqPF3bMyTE9PQc9h738vVpDWHKAHEBVwPsrfIoa 8Cnq/gaxwi/FGK5HU2HIoWRxQ/DzUh4xafDZtzd9TqRTXR6d5KaLSpoFjdS6 l/RJiMkQRkzPGCpDrWYSph/N8VLNnqjXFoZXeOn85jW+yfEhJxY5bVrmxJyC 2nqhtlNb1hbTGzl9kNMXOYr0jqfVmubtIkzqb9R7Aqde/qaw6TlMn5M59YoW kila0q8lU7XkiVrSQ/tbJ3hr70untQHeNLJSBuWfxCnJd6W0H33uxqmXv6fM PYlHTxLQE4PmLfvNFS38khox3WN6cA1kW8sX8AWoHZNsm0oWdq9dgto0xCiM gmjhV9aAX1kTfmUV/Mpa8Ctrw6+sB35lvfArGwO/sj74lW0Fv7Kx8CvbGn5l 28CvbFv4lW2HORCHORAPv7Lt4Vc2AX5lO8CvbCL8ynaEX9lO8CvbGX5lu8Cv 7AnwK5sEv7LJ8CubAr+yfviVTYVf2RPhVzYNfmVPgl/ZrvAr2w1+ZbvDr2wP +JXtCb+yJ8OvbDr8yp4Cv7K94Ff2VPiV7Q2/sn3gV7Yv/MpmwK9sP/iVzYRf 2QD8yjrwKxuEX9kQ/MqG4Ve2P/zKZsGv7GnwKzsAfmVPh1/ZbPiVPQN+ZQfC r+yvMH6DMH458CsbgV/ZM+FXdjD8yp4Fv7K58Cs7BH5l8+BXdij8yubDr+zZ 8Cs7DH5lz4Ff2eH4Dua58CtbAL+y58Gv7Aj4lT0f37QdSbOB73/4JDSLws2i jMIMMZvCLbQnz6Ec/l2mW8UysVzcJlaLlylnHYU54h3RIO4Uuyj8Vnwh9op5 +C5xBb5L/Ht8l3g+vkv8B3yX+G58l/gefJe4Et8lvhffJV6A7xLfh+8SL5Tz 5HJxv1wh/yRelE/Lp8Vq+Yx8Rrwsn5N0TZAvyBfEq3K1XC1ek/WyXrwu35Jv iTfkdqO9qDc60B5y2Ohp9BTNRtAIiqgxyBgkjhhnGmfShpNr5Epp5Bl50jBe N16XplFv1EtlrDHWSMtYa6yVtrHOWCc9xnpjvfQaG4wNMsZoMBqkz9hobJSt zOfN52Ws+YL5gmxtvmS+JNuYL5svy7bmK+Yrsp35mvmajDPfMN+Q8eab5puy vfmW+ZZMMN8x35EdzN3mbplofmJ+Ijuan5mfyU7m5+bnsrP5hfmF7GL+3fy7 PMH8yvxKJplfm1/LZPZMLVPYJ7X0m0fMIzJV0Z88UdnKlmk0JbzyJNVatZZd VVvVVnZTcSpOdlcdVUfZQ3VWnWVPlayS5ckqVaXKdJWm0uQpqpvqJnupHqqH PFWlq3TZW/VSvWQf1Vv1ln0VBZmh+ql+sp8KqIDMVEEVlAEVVmHpqCyVJYNq gBogQypbZcuwGqgGyv5qkBoks1REReRparAaLAeoPJUnT1f5Kl9mq2FqmDxD DVfD5UBVoArkr9QINUIOUqPUKJnDHrRlhH1nyzPZa7YczP6y5Vle02vKXK/l teQQr8frkXneGG+MHOpt5W0l872tva3l2d623rZymDfOGyfP8bb3tpfDvR28 HeS53s7ezrLA28PbQ57ns3yWHOHz+DzyfF+ML0aO9LXytZKj9MmVfz8sgB3x RPxOCP8GmRBvUpBmF7OLMKx7rXuFiV9RV8f3zON7Zos989sZ1AUzKA33ReVW 8fF5cnyetJgn0hpPO0s7mWYEzMFqNN2pZYlBdLo9ljufHeJT3PsIactYz9l0 bsz1DPEMQ5rnOQfpUM9wpPmeAkqHEHUe0iGeEUjzPOcjHeoZiTTfM5rSPJK7 AOkQz4VI8zwXIR3qKUSa7xlD6VCSuwTpEM+lSPM8lyEd6ilCmu8ZS2k+yV2B dIhnHNI8z6+RDvVciTTfcy6dX4d4RhHmeS4mHOq5nDD/F1hkPHqe67laW2aC tsw12jITtWUmacsUa4tcqy0yWVukRFvkOm2Rqdoi12uL3KAtUqot8httkWna Ijdpi0zXFpmhLXKLtshMbZFbtUVmaYtcRf3P9UyBRW6ERW7+hRYp0xa5XVtk trbIHdoic7RFyrVF7tJzZa62zG+1ZeZpy/xOW6ZCW+b32iLztUXu1ha5R1uk UlvkXm2RBdoiC7VF7tcWqdIWeUBbZJG2yG2wyJ2YKX+ARe77hRZZrC3ykLZI tbbIH7VFHtYWWaIt8qi2SI22yGPaIku1RZZpizyhLbJcz5UntWVWaMv8SVvm KW2Zp7VlarVFntUWeU5bZKW2yPPaIqu0RR6ERR6BRR7HTHnmF1rkRW2Rl7RF VmuLvKwtUqct8qq2yGvaIq9ri7yhLVKvLbJGW+QtbZG12iJ/1hZZpy2yXlvk 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 /brxbVffytSLD41dLYzKUseM95FqY5h3z1i3jpq9/O1EKvfj4mubqh7rbFr8 4TL3LXnAN8qn2mXdNjfMY2S4nJFJeMmmtiusZI/tXct2yo1UkBBvW/Z8/Pwe sEXDm0zBZCnX5wfu6rnWnOaN27ZHc/5Q/ryGnHuOSzcUBOH7NaT3/t6Zsw80 6o4a19tFnDqpLfmF3rthi+z8Z/T+6UT4O3rL9qc3DMGo5OzP8E1eRyWn/xy/ BSFFQf91eYplE8qVCjzyi8tHz53wjs21CPs/Q/2/NHWHbS27adWpAMYImztP qsvn3WpMGOsJ9lrEzpkcJcXd3Xhs4dqDFs3y29Oigg/64+e9tLnem+8scG71 r9kzYYt6iwZILauZ/2b1xWeO4EXrsbUcojbdrfWVr+KdMbsz2trTZ1xNOvEo 8w3LMoXxZL2pvm5M92+/t83fbCHdyW6NOaLilbtmJkeUdbDAfut03pmxMk+D A4YoZa/WHtLKVhN0NfA94vlOZiLJ2qcxTr0pHO69k5ygNa+uH1Tu8Fq95Iy1 2dTC4x1HFkkOW9jsK9J5QdXXzA8LmAyUOQoyl28qZL8fdCh8QhXPsr0rJbVh rN/j3JjMWWX2o5t/Szi+S2VBsMnL7TkmVqx5asF1TppRWuJXkufMa5qGVz3s erZo/4Oikljrg15n5ujJG8ZLDvJJmzPJdbjCkaqqSs/ptduG9SYl6CTlKVLh j4fJT1WrzdPVuTj8idmTmnduDebNNwRJow1N3fQDJz31e7nj7ubceofoo8lG sSy5F/E6x3PEJ4zG/bJ3htPKgvig6tkF3B3Hd418JR/9aZVg1r6ee2Nr0/Tq wo/maiyXD8WdeHsmrj3YpvNwf2V9SPX8cUTzUAvvsszK4vm7q/I3xqn9I2M5 N07XUlBCzs6fnGZwPP/lsnqdax2aY+q2vHC/3wnColdKLqqNrH00++nOTY18 k16ZM5MDbngOLLjx0TJviMV4pZl13MJPfDGznBIzS3EAKNjd/r7x8s+XTb4t Iucnn6WHa336lWDwpfqvUMMCfPNJ8mWo/lcV6cHglxuZfAglMPWKaIGar8jb 85pj/ctV7qYbd1+kwvvdIsWfQPnlmyeZYp5YJBaCibBotMgdjsVi2nB8GA1D YpAbBEPoHQdmFxgm6f9pd41NiImeLgqKiUjQ/uGxwhTDqcA06SmTBmadMjhU 55M2YH8pudDiU4UoULnbsePcuibrU6HT1YRLZurmeK5JeXLQ1KNCUNa68ln8 zErp8b1b70dpHnHuGHXADWPV3l33cVom1032dWcEGP5wXmeuKYUXWKkvtzp9 0efNDPESroIf5XHd8u72CzqXJX7337fWI299ZkB++J2zvfN5v26LFm1200r5 JaowoCdDOtHu3DT3o0ZPo48kuvvPKXFgPVdUcBzINDPALe1jkxtfJ2sNcXYJ PHEG/M4/PS96RumN4NBt1AXuY4nRJ25NyH7CUF9akLxwolQW+9FjvUH+nqX7 RxYNdZ+iXavBuQu2xZhvfOYyZkdvpfz9XPOw7AIxbkyJcf1vVmLxxbgiDJJD ulzzt40Dfv6dRD9VTqFU+otS8tt3KwBm/vUKwR+Alt0E9D9robXVpD9o0sBS sWf+P06ZrcaMOwtMC188cihT/oHYtFZsY0ifov2zEgN0rM6MvW6jUhgy0x68 sumaXJY9uWjoQ1J9ql+4a4uPUKNCl1t+1He/8mKwSJdzc7GoZOqRqedBu2iY hH3M7Lq3OzpCeTOM4+6u9Pfe6e7slH088bzQbfmutM2FE2R6VJVXvXVoaFop mefQ6X7Fee9Ws7SxS3LvaX7coBZjX7fMvrSy61cFc4V9rusik1e+HzOEO3Zj SXVYW/TJBXd6lxi3tHVUb10U1Bmj+ZG41Tl+jLZw2fjH8l4LW48B9YbAzUse eaY/WB4Q0/xSz99tRo6d6Mn9gJUfn5tuMPmkVl7IbngW0308o7yJ28HOSss9 zW8IGjdfkFH59s2xo5/yltFbDv0P5yVQig0KZW5kc3RyZWFtDWVuZG9iag0z OCAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQyNjA3L0xl bmd0aDEgOTcyMjg+PnN0cmVhbQ0KeJzsnQl4VNXZx99z7+yTZGayzEwyWWYY kpCEkI2sBHInK4QlOyYhwIQAAoJGQRYBQWmEBpFShSJapWrRtqiTsBgEETXi ikpB1LYKiFZtjVpFiphMvvfcdxIW0WL7PW2/78kJ//u7Z73v2c+djBEYAATh RQHJhVVjSkJLdH8G1oiBYa+WFBYVP+jd/hjAi8sAxIUl5WVVR9ruPQDwymmA OQ+UVNXkvzXjcUyfsRkgvn58UWUJmIEBc2M8+JVVJaWW3npMA8A60O9umtfY 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 NHZoflfeuqPXWcQF8kHBMQklodKzT8MLwAyU8MLRdHMBinAVjBAAnfeivSd8 UbeIHXTsoiIGMmkc426MNtR0pRIjLukZRNASwQgfsVjDGNDDhLnyvpc3xvV7 +S6s3zWQWtpVEJlb7mCvXWUO0q3LiCY/YLVEM3S7p6l6asPR/kh47dAdG4bX RiL9+E8qX6dlKq5WuQCUwAwvMAJad1HSY79ILUoE8LGbJR/TJccd8c8EvaEL bpQLgn7MDik7oJMzZ0MCxFz/yCgIHLUIoYi6QPI4HMBbwCfwbmkGLEzWsbIT HXGKGPzgNen4OXbO73t/BpdSonSPcjlwPeUe2BD7sBkePAct58nqQ6+//+3x 82xOyf6d5QCwJueeTwIevHhUq7WYRwnfiBTYoHkUZjICE8EjFdaFEhHboqIn Ptn4GqaMeEbivdfGzrHryoah7/MBVjhYRCYLJVyJQgkMMzyb6h4YmrE0Ktdm VXobtubf0/Huxu79fYWe5nV1ZwnXCPrPu3vavY6ygKks8uOmeYHuwa7G+zZv rjr2MV6puPYFW08WAaeSGlnhn5iUQI4+4NQHAnonKURw8AVjVAijrotO+8XM HP2nCqCz6vw6UkvqdFRmDxoRLkYoZBSOaqH4YnJYJ2aV8XpodIxNaCFeYJUl YlNUypYW6P5vHzoFLuLz1XGMZbfFJNZLEQ9PrI8ouTwzSV6tfvQ/96bW1VYa iw90tN3e6HA23tG2Y1tjb6F+yYrGPS3e1tZ27/Kn+iIrFhQvrnHBh+fvW5FH UjzqdyKJMdQYyKgMGE5ZcqpczW1m3TmJUszN6rizbv1OFx1oWBif5f8CZYgG hKq3Ja2qg0PHVFqVFlvzS0YgE1pVF/R6RJ5h1rB6AVI2/ZhQfGlSzUlIeS8O KOwq4vf6zA0WycVWiNf2s1MsX87c/7uNlsrqclN0V8PuA488dQ0Ql8cvdy08 /kAbfHLpU6vyOFwB9a5Y1r94WS9x4rPY39Jm7cG4sQDhho7VK5isShjSZozC sRG+VMpHmv35qJWf4xmFDkamdYyppQYDJftKusB38Tqsx6Pugzha4ur7xDKM 53t9akI5QoYpSVDFkhZefETwkiQmCUy66k0vLP30sr6w9/HfPvDokeWPzMni ETnbapYdujUU0wabwtbi/JDKGO2I+BvDZvhEz+H+ImiF6ctf/tH2ucHfZLbe VqvVWcNLdi3NaghbhHK1aNEDM13W/BZcy8DWobC7EcKgBmxOrht74VFgB0F4 jKF1QKmzo5eEOg0/AxWgEH7GKCS1FYWFkXQvh/Z/Zu5hPmfoSSVx1cCUsoSJ iGhgZP/4Q9gs02oKkis2caBwYfhILtwg4qeaLC8gRXj3UPWmn/es/Fl/vqt8 Vra3qcAeXvGjvsWHVkRT85rH0oqzjIu7uxanFrRQroqg+bb5mKg4S2cSI4aS jlvLZ90/J8vXeWdd2dLOcpO+qLG7sOqurtyM5r6yooUtJaVKby7jKimvrHQW BDO/VvnzKjLqm+XOfLenLJINklGXsyPBQ6qO27VpGo4SYKNZUdj9jNEiGnJR qxmbZBB/lvS6LlDJ2Hsd90CJFLLJTcLWd7CI+h++tA4Hr/oH8DXOIs6nLq9I sogM+7JSlkWU3//RE53lD3+0//4Pn+gsQ1e1Rw7by0v883euktmksSMF+ejH 6/TBLKKVZRHZSswi0kE2vDBsLgCYRFg/oi/S12hSQs+j+2jSQvvoTTRJ0zrv l/be8JeTzGLu6jVJxf6fcYvpWt8kZH+M0k2LNYI/EEHcwqM7MM0AP1uye0FW 1rwdPUt292Rlde+Y4BYJ3dOmcguaTtd9Kem1f5kkF6yffx928T1End41N0rG Rm8Ol7MFsYvokIA3Cj/HvALGecWf4hxhMcsRhhBFKL4Jp3gt4J9CEg7B5tj7 zfDQm4gkEM8cevX9q53n4/tQyL8j/S2gkGUHx7VS9DKbRonKoyi2mlC4P6En UbS3LMTBfkjRC+JzSSwxQLyAnXnDLTluEvG5EgIH/GBVd55O7a3Iql+bu6nl 9XVd+/qKduzeZCa4I3+LzGlryUwt8hly/Y83d/hm3zdj/Z9XdelwtH/wmom8 imSLgM54nKd9Tp3Pp3OSfDbIWxR8Nsh/6YnHY9itgygYe3r5XwnEX1JLJ9Yo 5q6eDOm/S4R0LLTjhhLw6YF4CnVhI/G+b56N3h00lleWm7p+2OlOa7iz44Wn E5F4Z0nt3u6lT66ImHKbgszS2vR3u59aW8KjfkNSFJFa2B7w1kesp6zhGnfD DIvmnFHn67y9trC7Lk8tCzX0snuWdOSnnA3ABspPAgN84bhGh160AkUsRgDo VM0Fo5Ey4FN4tItROHWMCKWXklpOMnp5skscE1HVTCaiqn0yqn468/AnD6py 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 bqwDSgIefarZijUisUbcXKAAaaBg2JRCn4aLEPwp4eJjwKh5NEVyBgksQgIL iPUjJuujeChvYIdyMasCy8vZvktwFVyr6WLFD8dhORyKsxdIZnXeXqv1a545 QLb25c8qMD/nzVbY01xaTUhvyHHryfGmuzq8FPXXq3vqOryt/Q0L2mm92/oN n6fwVuNM4hqSdTFVD8yILZcPcVBO3HtUJRJhp2akFouKM+hgBOJqh4OX+oge W1zEezRFOooUYOXFMJkRB20cmFnY5vJs8TWZeKXX1C3W7CwEuZggYg381joD U1KoDW0t7Ly7zZ3Zsq66clWj+whRWhEtFXDS1X51QRkK0LxBiSyz7fb60vUz c9x1K1JL88vyUE58Gb5H3k3VoYy4DDSBe4/m5ABEFRYdza6tVWIdCgvN5aPI 4C6Px1ySgkdqWloIu5TZZrYxg7NlsFjWJCMImYvmDVZV+SJgMDu7YdCHVByO DOpGiXvYrBnpxZYOZWd/OG8uew5gkMVX7N1jsvhww9ldwA+v2xyM4kJytzDr c+ye4NwpO4ODkzuDnS70EYUyucKbyiXdKlfFgjx7lZ7Hs7qP965xtNwze8b6 Glu61ah0WPVGd+3CAm0g5WrMUVXtLUgVh3If1Gts4UBuNv7HedOVjSipVSgW SoUyK8Hj1LdkNObZdVlFTneJXhM0OcMmE5OR3ZJnpcj142etKpHKINWLSZ4i Ff42kBXy+NOz0dh/iXiLfBqNTDvoGlLL2XBk5CNTHhUIFHZ0PQaAgvOoBZmM oY1qtY4nk4ke1ZUIkDMriY1AwXr4psTQxNtYsuO7h4rjDoMjbHZ8qjtRZ4vT 4esrgtWaRF01SUrFCq/psEWg0prkT+6A+pbMcJFY2+prryXegr9Wq3IrYtvh Gx6hye+I3U+sm5ERzvG4wl3dsSLs5/+N/HwF0kWCPD0d86LFiBdpkIcc5f8P e18DF9V17bvPmXOGcRhQCRokqBMlBgkBAjJfMX4yBGZg+BpgxvisAwxCMszQ Yfy8PutNud486/Vnvblcm5+1qfVa4zPWJtZa67P+rDXWy02ptdZar8/ntZb6 vMRrqbWo5P33OmcGJNokN/247YP1W/+zzj57r7322muvfc4cGJI6E/isp3bK FNbKh6H5ObF3WoN3RkNvjFozq5aXdW7LrFzu+ocvvbkxw/R4YrE9w/x4opTo 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 r0LOceyomufZ69hdVezZX3ykykUlbs/eElfVAs8hitujqL+Y2oYpPsOkoYl2 ojUo4WgiPEHYRb2oiJrIRY59VWF4Pr1qBenpRKveqjWqbCLsovjviu1lu6iv XXR1r+c0rO0AcjmJ8Bw0rOe7TNWmaH3Iyj3Sfmq7n9ru5zp5X7i6lXC7soeS 5SdoLLvU3bPYcaAKGc9xuGo/1VR0KndTp0nnadJ5mqw957lI2KViX5Vyx3WR Wil3XFdI7qJ5OU06z5F8UZ2XYkJTyaYqnhU3VSErOo5VIf84TlbdwhpRdp/T VciKjnerRc8Vx5lqnWd7yenqxOhe6ThfjayI8tS6PselaiP8fLp6Gu1x2A0d VyssnmsoyeLrvTrPc0PZ+xzXq5EbHfXVszy3HDcR+XeVmI/uhupu0jUkw/Pc u6Ba2VWNfFeqdniY43Z1hbIjIz8sqK7lObN6oVcE1uPqQHWz51ZsF1s8ZJ/t GbIPZg7pcWi/hOouoLt/xynZWh306op7qyPcb9WrvInocS1Zss6bXNJRvU7N hybIG8jyzXwXq97iTYSvtnkTnVKFxZuIkh3kmd11fU599T7PXtpTXFwPdrHt 1Qc8zDmm+jD3W+ldbyruWJS7FBFzx9HkHF+mzEUilSQiQoBeI8ld3AbvNLKk y5lWfayuH5achM4pg3qcGdXvqrKJsIt26i7Kuoje6jN0NY/051EdizfLmV19 3ptFch6hBR7g98kd1VeV+yXEXkf19WieJzQRdqEmz+0d1bcJB5Qdluos5B5z S+reWuyc4UaGd9rcY7hmt4SSOe7xyg6L+hxNhHykhd5Ziv5oLxXKnViQW+JO U+7ESOZ33W53BunM5ruMe4Yyd2TDOtUPJmeR28b3ZfccwiLUvOJGznSWuqt4 zLs9hIsIG2P3mTvduKN2VrnbvIUlm9zLPK6S0+7VVOflKDo97lf4anJvpBLk HOci92t1vWiF+2dno3unJ935ons17ot2uvdgvqrcyLTONvdBzzXnMje/Z97q Pg57TvMeOXquFXe7T/Fyfn/lXF2+3utAHX633O0+OxQ9LufL7gveCly9THou 02qd5U0mH6qI8h5uG7/Xdb7i7q3rcW508/tSl7sfsfpqDXYN52s12BEgG7zJ jjM1Sd5awoXAFN62ht+Fbq1JJ8yk/b3em+x8vSbXW6/izhqTtxnyTG/Quadm njKz3gjqF1Mr7AjOt2rcJC8gxCp2HqxpIjmgztou55GasHdV8c6aFd61hOtK XDVrvBucx2s6vJudp2rWeyY5LtVs8m4pPlLTSW238jmqQTZ2dtfsQq7j/rzs PFuzF+tuaw3uOZ0Xag5hRi5j7vqcPaStt+aod5uzr+aEd4ezv6bLuxt42ruv lNWc8x4o1dZc9B6GfMV7DPI17wFcvYFyQ80t78nSpBpk0dKkWpqvWp33XUL4 uRbrtzSlNtl7xnGmlt9bbq01cu/VTiM5awjmEVoIZ3mzgIUkOwgrCGsJF5KG eh5Xtc11vaWTavEkUppei3xVmlm7iq6upZrIVM6NtchRpbm1mwf7qtmvYg9K tlA5f/r21O4gxN2CU1+7j+LnIF09QIh7QueF2mPo0VR70jMJmt+l8jOE56l+ 9yDWXiLkGaO79jrhTf5cVnubP5fVUmZQsE7iUVqnJ3kM4fjBp606rO7SmXVT vOefN9ZhXZfOq1mMeeysy/YeKNlaN4P3Ujcj+tQG2UYlNmXNIuZ5zkzmz4Pe S7HnwTwqt9CKGLo6lOe+hSRTPNfN8V6FDUVUsopwHUdkbGBdaV1fabF7NZUn e5NLXXVVfL3UIs6VEn6H7L0OWeeN0Fq4SX1hFdR5vLcpGxcrSDn5ochE9ii9 +2L01kt53yWqb7r4Oy6Z3m5p6b1WHL3R0tG7rFH0FktP76/i6c2Vgd5TJWgO ac4yo+anmp+z5zQ3NL9lDno35ZYM0kTmk6ZLHtZOb5a+Qu+UTtJbgh/qn9U/ yy7AGv4p8ROMsSdZBpvCMtmnWDr9zuoC9hLbwRrYTvZV9kX2BvsW+xI7zP6N 7WM/Z//OzrH3BB37P+KnxE+xO+I58afsrnhFvMoGxOvie4Ig/lr8tSCLd8R7 glaj0WiFUZqxmkeEBM0ETZowRjNFM0VI1mRoMoVxmlxNvpCi+ZLmS0Ka5JU6 hInS56TdQon0pvSm0CJ9TdovvCj9L+mo0CYdk04IEen70ilhpdQl/Uj4K+nH 0mXhs9IvpGvC56Xr0m3hH6Q7siRsl0fLycIeebw8QXhLTpPThQPyk3KW8B05 R84VvicXyAXCO7JFni2clOfKxUK37JSdwjnZJVcIP5Xdslu4IHvkxcK/yg1y g3BV9sutwi/ksBwWbsir5FXCf8h/LXcIN+V18nrhlvx38kbhjrxJ3iTck/9e /oIwIG+Vt4qy/Lr8FVEr75R3inr5DfkNMV7eI+8RDfLX5G+ICfIh+bCYLB+V j4qPyiflk2KK3CX/RJwgn5d/KT4h/0Y7WizQJmmTRJd2nPZvxXLtSe0t8Zi+ Q79e/A/6D64vAg1sEv8k334RfAV8DXyDpc7YwMl+RTmqdNh+bUaEk/2GclSo YIr9Fj/y9ziIi2zG9M/on2Gi3owY0aA0WbgkXEKs/lz4OWK1R/glYrVX6GWS 8CvhV4jVO8IdxOo94X0WJ2pFLdOLo8XRLF5MFpMRnxPECSxBTBMnskRxijiF jRGfFJ9kY8UcMYclic+I+ewR0Sba2HhxvjifPcpnhqWM+syoz7AJGN85dpFG mcTfT9gzWL09w55tn2G32efYi+yl9iq7x77I3mh/0d4GeZl9Nfhl+yv2jfZX 7a/ZX7fvRGmbfY/9LftB+xH7cfspezfOztov2C/be+y99j57v72/iBVp7ZeL DKCkopSiScB01IpRUSZaKnQ2Rv2DVJRLbZX2SUUm+1tcY9HMonlFjPddVGw/ W+RCPTdqLChajLEIcVjxLA1zN5Hx//z5ZZaKlbaDWbHSvsps7OvsbfYs+wZo FjvGjrPZ7ARoHjsFms9+xv43K8Q6/DdWgpX4c+ZgfewWc7LbIJegETSsXJAF mVWQNyvl38i/ZVXyHfkOq5Hfl99ntZgmDavTylqZebXx2ni2QDtaO5q9oB2v Hc8Wah/XTmH/TVugNbFPaS1aC3KBgDV/iGbCxN9uFV4G94B7wX3gfswOBmLX qmwgnll4CtRDeKqwl7CvsN/OlHO7FmxQy4nsSVSeYp9kTwdn2nPtJvtM+zx7 sd1ld+M8SgvAi+1NoAAoDFbKA7iywr6Gv8HUXNW8R+/F9aqXPaBU+Hore4x9 DVSA3HcB47kOMgtxQhyzaDO1mcyqzdHmMJt2lnYW5kAwpBmmQYsBsxLPhEKs ssL94EPgo3QUCrHqCk8wlr9bvdbFhDlzxNuFOwqP/VF494fww+rt+JDrD6v/ oPYfx4YdDyh/kO6Po3e4zk8yzo86pofZ8V+VP6mdv4/2fypf/bH6fVj8DR// w2Lzk4xr339i3H8ovzxM74ettQfFycddux+W5x40Tx9lHB9W76P097vG9LB6 H5ZDP+oYPm67Pyb/Iez4pDoftJ4+bp/Dz/d9hDr/2bH+vn34h7BzhEf4L4T5 U4Y0Scqgp4yRz1D+/D5D2cF2D366YE5jxeY08xRzhjm7AA+/5owZfTgySDMg mcw2XOM8x1xUYCqYZy4tKDZXgW2cUAIye8yLzI0Fi80vFgTMbThbZl5dcNT8 svkV84vmjbiy3dxofhUlr5lfLzhUcML8unk1yjm9RqRqipbwTwr0FkRXovoM W0fPsAtAafS3pRPZp0GT6anWyH6G51kbuwiayfrYr9lz7Deg2WKv+B6bgyi6 y+ZpHtOksULEzHRWBO0etmjQA6bdbIpJNO027SPmkkjHfUPoAEp354XVcs6H wcdQHr1+gKy2wupxsFqibyXQ0m8U6+hpXM9/mxQkYVSjmczGovc41E1ho9h8 UAL9zXMixvRZNob9DWgs+1tQEvsfoEfY50DJ7O/YRrTZxD7PHmWvsn9kE9h3 2XH4oxs0GWO/BX8IWkmrHxxfQa94u6C3oK+g38RMWpPBlGRKwXGSKd2Uaco1 mUwzCy6Y5pmKTS6T27TANNO02NRkCphS0OY+Mh0y5Rb0K2Q6Cl2M9N1PJ6Cd Uxf6WPyBq6dxRemX02LTOVP05yL6HU5XYFcxkYvoGuzrIhuH0w3oUiigUgpR 2LTCtMbUAV5v2oRjp2kreu+Exg7TdtMu016ToeAUroahPYwr+4HD6TR4jUq3 THfNIum7j8w6aFeog3oZQuZEcDL65T2nx8rvUk2qbU6FLcMpbDZipgymroJT nMzTzFnmPPTVRdY+yEaF9qtEZ2YLzZvqffMs8yzuV+ACcyEwQHVm0Rg66ep2 s4PKKqAhwPWYa80LzfWgZnPQxMwRU6Z5FTSsNa/DTHKZey3dvAF6TebN5i3m bZgDt3kHzhdgplLMu837CroRT03mA+bD5mPmk2QPv5pLcZJufhe0m9cwJZnP mM+bTENtpjjgEYBZNl+Cvqvm6+abqo4AavbDAreZ4hsjGICNQItk0YPGqLGu Es65rQOW8aA0yxRYkEvxb0KZvuCCEm3Q4YInXIRu0qa3ZFjGWPTkucW0OpqU CEPdFUSYE0u2ZQbmjM9wk8UGnUbzdcscXNlv6uDjw+hPwtZOzG0HbA9TtKRb ikCliI0mip2wGmudVG87RQDKUKPDUmXeZvFAXoTy/ZZGy4uWNssyy2rTGsvL llegYS+PdstG2NRBVr8Ku1+zvK5EPixHrFl2YhxRL+wBvWU5qK4wpY0ea2KX ycBlxNwsijzEx31e4H7hUZMeXS/mAfS5hmIvjBhdYMq0HAEdt5yydKPPs6AL 5rWWy5YeS6+lz9Jv6bcyq9ZqsCaZOqwpNFaeDfhxr3WSqdiabs3ElVx4ejv8 GLSasFruWmda51mL4Y9zpmLLWavL6gYtMO2y9FoXo3aTNQAfXgEFrGHTOUup dYV1jbXDuh49zLRusnZat6LWdmuSeZXFZl2DOG2y7jKh1LrXuh/xu8aUYj2E Mey1HsW4iq0nrF3W0zzy0fd26znMdzFs5Jlru/Wi9Yr1mvWGucK8zXoL2u+a zpk3WHpMM238I30dpHOmsLXJlmjeYEtGmw5bKsq0iJMO03r01cF9HM08NqNt mi0Lcci9sMuWZ7PYZtkKbQ5wha0WXIjShbZ6W7Nljq3Q4rEFbUHrTFvEtsq2 1rbOtsG22bbFts22g69fhZANTtNeZBu5P/uzvD9rxn0A/+R9PP/bpLybTMif wZLzekF9eX05p3JOZe/O3p3Xn9fPZf41D/nafG32uux1+YZ8A5UlgVJAk0Bc Ts9P5+XPHHvmWHZtdi0/53+7o/mJ5hz9zVIHW4cYeYWtxz3KBtxdaNlm9gUW j7urrbjzEHDboieL6K1b3i4m5O3HcS+Oh8TbWfvz9o7wCI/wCI/wCI/wCI/w CI/wXwbzz/vpmxVGPu//c3yeFEX+vbl377w2Qv8/En8f8Xv/revfMiP9pvVi +v6fVvrmn0P0m9bfpt+0vkTf2/NLyhq36W3hEf4+QjzG3mQsLhmcCjaqPA2c Bc4DW8CzwIVgB7gCXAteqNZ92LFe1cGPzcPO+TGocgS8ashxLXidWm+DetwM 3qLqjR63DTnuAO8G7wMfUPXvVq8fVu0+Bj4Jfhd8Zsj18+BLaj9XwdfBN4dc vw0eGDzqJLAePAY8fsgxbdj5FHDGA45pD7meDZ4xeOT26GzgOeAicCm4CuwB LwI3gl8Etw0euc26ZeDVKr/8MfmVYbxR5VdVe15T+dX7mXw3hD+g53XwTvAe 8Fvgg0OOR9Ty4+BTavxgjnTdqj7Mm+6sMi+6C8p13WX25uTuyWe1zdrmyRcm X57co90yuXdy3+T+/8fed4dXVWztz8yeffbOSUJJoYQknENLCAFOCgFjRKSG EFqoIipdqQkhVJVmRKkiohQREVBCEREUFFEBlSYC8iEqerGhWAC52JEk31rv GRGvft/l3vv7nuf3h9nPfmedNWtPWbNm7Zl9TvbyCZ/HF+aLwFnNDfjifXV8 Sb4AnRm+LPrckj5n09HJ1x1nH18/3xA34NntG+Er9E1w2vomc+or9s3yzSfZ h33LfCt9Jb6NlD5L12+nc6dvj++g76jvXaJP+k75vvKd9/1A0nxe8iu/66/g j/LH+H3+ekQl++b7U/3N/M0539/an+Pv4u+Js68bwDnAf7t/lL/IP8k/1T/D P8e/wL/Yv5xPrsnh11AlBg//av/qK2n/OnNs8m/ynPHsdto6bf1b/+HYQcdu Ovbpc74S/yHfED7dDP8x/wn/R3SN5is9P3la+06G9PXs9q8j/xTzp/6plfFP Gv7Jhn/ywD858E8u/FMI/JOXPNNxEUqe6Q0RZ31H/qmxVWaViyba0q5oSl6q srhOV9FVRSsdq+NEG11ftxXtdLbuLgbrnrqXKCTvVVcUwXstxv+JPI7/E9nw /337pIyQwf+J2C4aCBGRRGeAzgxzZpmz5RU0n9l0djJ09yv4Gf9w9qGzH51D 6BxBZ6GRm2BS5k2ms9h8nmXS+VecDxveMjpXGl6JaBBBf5F9I/vGz6fjYeD8 +GX0eWV8Sfyy+I2cFzzin42IIN524u6M30jUnviDJHuU0ndxnIw/Ff9V/Hmi fuDfDeB+JdQ7dL+S1kHrsFDWUeu48OB/hUKt89a3oprml0DF6hC6j9XUETpa +HWMriHq6na6nUjQPXQPkah70/2tPt49lvR/Vq5UMfaThC2BaQbnAxcAtwGX AlsTdrWXgZ5O6OpxjPYjzNFTgGORu4jREw5OH3BYZhFkFtlrwHkAuBEydYHX gPME6FagNbAxOLHAu8GJAj0VdE/QFUGPAN4DTgvQj4IOBfJb+rqSVhgPA0OB QX4FyEQDDwOTUALPvMP6OUZ7K3rxHHqxFfwy8C+BXwb+JVy7D9ceAK4DZxww HTiEkOYY6OeAlYFtgPVx1RhG62PQ0LleSBgNHV5ntL0JeB9KC3LyIf8wYT4w FJhmn2cO5BeB/hujfCbYNs/bQNTlCXLeZ6T1kVTPBUuDTL7nSy7TyH8JDiRt jLuHx6VdsEZPLuF6U/uHwHeAJci9FS1k/k0GTyN3B/DvQHAcjLv9LfAD9HEF tx/YNViyE4EyaQTlj+jdKs9oyG8GJgC/Jtxun+Veo51pnh40k6LsiyjhLXC+ B1YFfg1ciR6dRwle6NML+edQSxF6EbT5YsJqpqd3AO9F7nTQGH2brNfq6/mW kSWtPL7WmsptsyaBLkE7f8Eo3AQ912Qk+TnAVGr/nUar36B8YHDUnJ3An5DL NrzK5rd4rrG/hN6gDU8ILGEj+EHLfJxKHod6B3v4LZsFrGf5osml9stbPB1h 56yH087NsCKMkYOZ68Sj5PGgabbK9xwbnEOEU53hKAc1og2hwPUYwTT7BeRO AJK25UXw38dY5wdl9DPUqiymrSxoeBW3Vu5Gm9PsGZBBa+3PMUfYzueypPw0 OCJ6Nl1bHe0PRZmrYI3tkHs3xiIbGGXwXiCXf8aM6UzCx0174CE1Zqiexqhe wByEhvUG4BzUwu3px3xrV9A36v7Uqpk8T+VMexTxFwJPMepo0F8DPwF+BH49 YBI4Z4CPgdME9HugawEVOD8BtwH3gt8SmAxEjXo4cABwMTAR8rvYn1jrbBoR 6yToUh4L6zzTuiPTui34IeCvBSeB5dUvoJsj92fgJ8APgN+ihFjQa4D7+So9 EvwiYDtgZ+R+D8/2Hdu/VpgFJYb+GLgO+D7z2VNR27gXdSH5KSSjPfcTxoGz CXjB4DogX/sJy1jBWjKYQ8icn8CZhVm5HVddMvgxcB3wfSDNL50JSfhJ6z1c 62c/o1NBp6LNjUGPNvgxcB2Q6w32Lp89p+5nxrEG0TXAT0DJn4GuBAx6j4ug swx+DFwHPrftIjRzh4c8kh4CmWbARPRxF9u2tgy+Ayxhvoff0nojxqI2ZsQ5 4El7rpC2g34FwDmPa1MNvgMsAZKk7gl+W9BRuKo97Gov36PJfjg3EuU8DXyH S7CeQBvuBSeEZ5xuzh7MmkUrU2k9g6uaMa0j2fPr+7hky4bH+BssMFhyHNrv BZ2L0r4AXjL0O0Bu7XzIeOw41ips7yi3UOeAHwv5UuAa4BvA1ewfdDbfU/St aMN++I29uCoE2ghBX/ZCn8Uosxj8OMjcCuxskPkVjR6CyHprjb6XOJ3ZVoEX YIFnnLVs/8zRn/E9SyeDXozctzxJLMOogz6tjaeYtQHOXv0Ftw10iZOG9idh lNmivmLUYbA9L9r8rmcu2jwWHJb5EHRDvutZ32I0z4PzKSRXQ2YZ6v0B/M58 T9SdQKcCm7CuyC9N5zkL+V3AzzCLm0HmLr5v6iy+b+oS+y6ep8gNBT4CS14K 7V0PTgeM/gjQd4KegvmVAckUYGPMjvOgR0FyAq/BqIVMV+J2Wm8byfcx+97H nHoftdNdVddDrkD7LeZYC+FnFLAENZbxfdmOZrTOcsl2IuiZ0MkpzL6vgedx VT1clQQ6EzP9bXDGY+Y2Ab+W8UuM24B7g+gMAS5nfUJyNfzAcNADgPPR5sWQ /wHlr0NL3gVexFjP5ZU/3YnYquthTM/gzvUq1iezwQ9njm7Nd3OaIw9gRjB/ hWY7P8FrCb0gOPvsTpj7TNtYVzyJufAyapwF/hzMta8wx0PQwsrghxuPdBr3 wdOYKSWY4x/izsKtOoJ7RxLm+EpepVhrgytDXqvom3mVQv6Hr1rHqxQ9FL0e ymsVssN74FXmcmmYZVhXWB+AjgV/DbDUEwfcxrPbs55yiyBzHXA45mxnSL6J NtfmNQ/N8b+hzX+Dx+a5n+1U5lkJ7VlAgV4con02WQiwjEuwK0Lbh5HbCfgL cAtwM/BD6H8R9OaFBiRz9K3gXMvrKA3PST6WR6cS6KDPCdj8lu5OkEwANgbW oL0+z757UP4KzPEPUTvnVkO9nwKXAN8AvwmwEtrcCHV5QL/KqzJqG+d2Q2kf 8wrNegGcOsAbeXWkByH3HVjCR6AfRb1jgfWBJ9DfUnjXD3EX+JA1pkONHXKN F3BtfbwHfSJ6WgDN3AYcAKxu87vJp6GdA0BXYRvWDZGbgDachRc6Z5M2tB8W fhz3mrZo8zT0/Rzq+gbj6ID+Erlx4ESC8xo4PUB/zq3S48GpAOxHu3CpqwKH 6gxgdcK+mnYr2odavoZkU1796h68wtQp4FQF5vJeUvcENmL718Wo6+/AbcAX jc3w+vkzcL7AtTcABVDD6sLNXZI1o6CHi9BJBWAoOG8AfwGnJ69y6Q7Yheg9 8GwDUX4pyqyCcqZB0gGGc0+tp4Lr5/K5QOzfy58FPgXEk4Fy7H/L1wMfBB4F vglMBS4BPgPEMwRRCTSeVJRjBV7+N+B24H9BJpb3NeVnwOH9aT4wFJhWFka5 Z4N06QlweHfzXFCybAowjNf5Rl4BeZ+13nCm8A6Uadm17CVwsHst8/BewPD5 OUMh5FeVSeQuBgrST1/wyxitWG6D1Rr0ALTnF5SwFDgGLUkrqw28gLZd4D2a aT/vskNLseMu64hcbslg0GllBbwXM2120RJqoVUQrN30fSCwM0rDPqsMT2NK nwdyyV1RWjuU3A76aWfKzwPyLvIiyny/jPehu6Hh3VwOIWtvOKPcHSy/FDvx sveAeBJSeo53cChhbnAUSst5vwadZAOjuJ2EPzNC5l0ukzi8Gjxj+shPoh43 mrnEo4w2dOXyqc3B9mDHWvoL7231g3i2A9vT+4GgPdhfe17DfhAWZVOu7K5Y 28v5qZRVoMn/W8WaYy/M0wt4TMHPAy4GfzHoIcAqwGxG2R30PCO5AOVs4hI0 R4pIt9lCnkHuSuBO4IFgvcC+1la+CpiHeBEF8OeTLLojWBtAF3PUCDUAsSMU 0BfkIHcrrhoCnIerCqwLoLeCZvmVwGPAPGBfw2H5A+YqxmxgX+BiRJ8oRmkb jDw/K1uO2tNUMyDmAr8hnxBeQp4FPQ/0y6CLgA8B+UnIKpaUtwA3Bq+yIGPh GabCExsJvyHPAUuBZEvyO5UJGfI24mPNT2w6KX6WuFDSvl4Wqnrg7Ca6FuQ3 KjxrUoko4QfQKUAqx2ouBsFavoKdzAZinmo8v/JQmbQLW83ojGB/yzT5okNA 9pNDyvgZyAyLZ0dvjKnSn8ASPgFNkrKFsTS2kHTNMVKKwTkJ3ABMxwg2B2YD fcBi6ySVXAL9Z0PzvTHuG4wMj3IYcocAFwdlynleTBUYF0Z+PxFhMjglwAHl pA0dDXohv0tInQCdybQ1CfK3gHOO0doKuh7oL4CLgReAO5E7C7ij7Bj3DvS4 YF3A5ZDcwKgRPUH1BqcY9AjQYcB54MQCT7CnIotEaaxtai36wl7RmgffeDvz rUvwabHskayV8O1lZbzS3oASClByUlAyqBP4rh24KgJXDQm2X/CI+HDVMWAY 6j2FsU7mMuXPkEcEEfk8MKOcZ8SAMn7u1B7l3IEamwMPoJbl0HMJMAC+z+iN dd4X9GnErbiIdh5AyYggZJ0s74u2MV2lrA+u4ueip8vPoZZUtiJcVQx6Eto8 C+1vhXI064pqh0fiXqgjKG04JCNQ+9wynr+BMq7rZvTlHh5NVQL6FeTeD7o1 cBxKGwKcB22Hgb8c/R3A1+pDZb2geea70NsG5ujXDL8X7I110gljmg08idYO KONZWY9l1GiUsArtWQ6cCs7jaNVtwXo5lhLZW0WMOOlBLzO9rgiLqgg7R13o 7x5gBGT2oM2nwFmC0haiX8XQ1WnInA7aNnranDl6Mvi9maN7whpvgXxv0F8B 70SPFgOLIX8EbVjO5etcY8PcCxe1bwa6GN8daPMOyP+EccxhSaqdNZDGI0Uj 7uXRx8x6MqhDlHAKduUE5xp6lAl6KvgHxG2ga3OP5OfsqYxNDsKI8FplH2q8 Hdgd1x6BRfnUAlgF92Vu0HKCuuVarJ1B2wD9BTCbkbQxE3qYiRkxEzbAOmwJ LIIedoP2AIeB8x3wIDjvgn4e9Z4q/wQ97QOvkgqdrEQLyTfqGNYJIWY9cg/g 2sfAwTyS33EJehjfrwl70rzzMk3ItIC3j8H3LC3Nty1Y83i+A+Lu5vC3FV2D uQ5GDXzX+RQyXcHH03LPu0CsQ5wfQWOd7KA0B3ccpx34wW9J8N2WB9+IOXwX WIQn24tMXe2BVRjtctBYnzv4Ts1TDXQxMAN4K/BVyM+BzDfAm8DvD/SBgzus g3rtYAsDQKzHPMNA4/syz72gg3fPO1kPTj9GNwY6CXIyQI8G3QD0RNBpwPMo AejBtzBOE/CjgLjPBr8bwrVpHqwHPByj7DA/wZOHoaVF+IZoEdPELwR/DPiF 4OPJvwdrAAe7FecW9I413w6jluaMAtYAol82+mUHVwW8Z4mG/q8Lfr9QilEo PYU5iFVE6Swgvkstw3crZVvBwT6oFOvS0l1AaK/0ReDnQHyfVYoaS/FtXel2 3vuUwX7p9MoC56ffxaiahBhVGy7HqGqGaFJRiEtUVcSLMFFX1BcB0UJkirYi V+Thf9kHiWGiQIwTdxpph0qvJmqKcMHfL6eIG8S1op3oKLqJG8WtYrAYLkaL 8eKuy7GuovA/6tWFT1QQCaIBzauWIktki06iO83DfmKIGCEKxQQx+XI8rLaI h9Ub8bBmoYxowXHvY0Sk8JPPSBZpoqloJa4T7UVn0UPcJPqTX+L47BPFFMh7 RA2qtxbtGBuaiFpV8M66WCqptqgsEkUj0YT631o0Fzmii+gp+ooB4nZEL50k ppo6Q4Ut4ujKOiJCNBYZ4hrRRlwvOoiuope4GRHcOQLrHWKamD6w/4giqwKw CjAeWA/YCJjBYSit5sDWwBxgF2BPYN+BA0cWWAOABcDJwDnApcAS4NZBI4be Zu0G7gMeAh4bNCp/pHUC+BHwc+AZ4AXgT8CyIYX9B2oNDANGAWOBdYDJwPQR +QNH6CxgS2AOsMuosSMLdU9gX+AA4O3AUcAi4KR8SvRU4AzgHOAC4GLgcuDq /MJBo/Q64Cbg1jGkPb0DuBt4AHgEeBx4cszQUUP0KeBXwPPAH4CXGG01Zkwg xXaBFYBRwBigD1iPMNVOBqYDs4CtgbnA7oRpdl/gIOAIYBHwTmAxYbo9B7gA uBi4HLgauI6wib0JuBW4A7gbuA94iDDDPgY8AfwI+DnwDPACYVP7J2AZo0cD vcBKwCqEzTyxwFrARGAjYDowc8zYAWM8LYBtgbnAPGBv4C1jxhaM8QwCDgMW AMcB7wROx2+5+Q0UV59KE/Htf0P7cjQ49//ZJ41PQVpyzL4/xfCrRGVizf2r qUScQIWof/xJGg/O6L1qrHTVGPkHjEb9FlJ5BXK7ruRVvAqs8k9R0d2m2r+U Vhcx/0Iqyfv/c4y9Coy7Coy/Cqx5FXg1uq3wTzCR7tl96E42jO6ok8R0unsu EEvFSrFObBbbxW5xQBwVJ8QpcUFclEp6ZYSMkbVkkkyVmbKlzJF5HE1WDpOF cpKcLmfJBUFblNkmHWTS+SZdGox5KFcEYxvSvt9DGZLWHUi9qcH8sLygfOWX g2lEZlA+wsREjBhn+EtNuiOYRk436QnIqSgd1ROUjtoatS/qRNS5YH70nGA9 0R8EZ1D0d0F+tWMmPWFSI1/N5FevYNIokxYGr48pCH6Ovc+kRg+xy6ivlNYc ZtKFQX7N5SZdbdKdJt1j0oPmfUPDxDla7VzAXON48UKcFbwze9RajvkfITwh 9UMSnYvOJZd/o62ELbNkFhWBiL6IE6sQJzb4XmmNt/+oYJRaoWQH0rgS/LyX R4zWn9TORvS5Cq3qcmglN1ksJis4Q7W71J6okBShQhJD6BqqNY0w6dccl0p2 ylyPoC2lS+s3V13O8SInDDkVrswJaYDSklFawytLC2mEnMbICSBHU7sjaLbW opW/Rf0tc2tw6vKvyi3nEn2O49QVV0jGG8maRtJnJP1G0iH/Vo3WmYnU2wyR 5dYiLaVQfm1OSb4Opan0uS6nLv++nXsSgZ5EoSeK7JZjIYsrYs2qkHohCVwC 6db2pnvTqR6LdOsjDQfvXYLqVKIXRkFcEStYIVawhVjBGrGCbcQK9iBWsINY wS5iBYcgVrAXsYJDESs4DLGCwxEruAJiBVdErOBKsIHKsIEIxAqORKzgKMQK jkas4CqIFVwVsYKrIVZwdcQKjkGs4BqIFRyLWMFxiBUcj1jBNREr2IdYwX7E Cq6FWMG1ESu4DmIF10Ws4HqIFZyAWMGJiBVcH7GCkxAruAFiBScjVnBDxApu hFjBjRErOIBYwSmIFZyKWMFpiBWcjljBTRArOAOxgpsiVnAzxAq+BrGCMxEr +FrECs5CrODrECu4OWIFX49YwS0QK/gGjF9LjF8rxApujVjBbRAruC1iBbdD rOBsxApuj1jBOYgV3AGxgnMRK7gjYgV3QqzgzogV3AW/q+2KWMF5iBXcDbGC uyNWcA/8eronWQPvf3glVEzHFDGDjqniPjqmkU+eRTn8rq27xUaxSdwjdopd lHOIjlniLXFMzBaf03G/+EacF/Px+/AF+H34g/h9+EL8Pvwh/D78Yfw+fBF+ H74Yvw9fgt+HL8Xvwx/B78OXyflyk3hUbpZbxMvyOfmc2Cm3yW1il3xB0j1B viRfEq/JnXKneF3uk/vEHvmGfEPslR+pSLFPRZMPuaQSVaIoVRkqQ5Splqql KFdtVBtyONkqW0qVo3KkUnvUHmmpfWqf1OqAOiBtdVAdlB51SB2SjjqijkhX HVVHZYg6po5JrzqujstQ60XrRRlmvWS9JMOtV6xXZAVrl7VLVrRetV6VlazX rddlZWuvtVdGWPut/TLSesN6Q0ZZb1lvyWjrtHVaVrG+tL6UVa2vra9lNeus dVZWt76xvpEx1vfW97KG9aP1o4y1frZ+lnEcbVzGc5xxWdMqt8qlT9Of9GuP 9shaZBKurK3DdbisoyvqirKurqwry3q6qq4qE3R1XV0m6jgdJ+trn/bJJF1L 15INdF1dVybrBJ0gG+oknSQb6WSdLBvrRrqRDGg6ZIpO1akyVafrdJmmM3SG TNfNdDPZRGfqTJmhs3SWbKqb6+aymW6hW8hrdEvdUmbq1rq1vFa31W1lls7R OfI6natzZXPdSXeS1+suuotsofN0nrxBd9fdZUvdS/eSrTgqumzN8dBlG46E LttyDHTZzrVcS2a7tmvL9q7jOjLHDXFDZAc31A2VuW64Gy47uhXdirKTW9mt LDu7kW6k7OJGu9Gyq1vdrS7z3AQ3QXbz2l5bdvc6Xkf28IZ4Q2RPb6g3VPYy K1d+J1w6PKIf737h98oJsZ8OacVYMULZS+wlwsKb8fVfPvMvn3mFz/zNgmJg QbWwL5pjF/xlJ3/ZyRV2Iu1h5FkqyVoq3Wqre9NOLVO0pNXt1ex8PhFfYe8j pEeGOR1p3ZjttHc6Ic1xOiPt4HRBmuvkUdqeqG5I2zvdkeY4PZB2cHoizXV6 U5pDcjcibe/0QZrj3IS0g9MXaa5zC6UdSO5WpO2dfkhznP5IOzgDkOY6gyjN JbnBSNs7Q5DmOLch7eDcjjTX6Urr1/ZOL8Ic52bCDs5Awtz/QCPD0PNsZ7jR zAijmZFGM6OMZvKNZgqMRkYbjRQajRQZjYw1GhlnNDLeaGSC0cgko5E7jEbu NBq5y2hkstHIVKORaUYj041G7jYaKTYaGUr9z3bGQCMToZEp/6FGZhiN3Gs0 cp/RyEyjkVlGI3OMRuYaW5lnNHO/0cx8o5kHjGYWGM08aDSy0GjkYaORRUYj i41GlhiNLDUaWWY08qjRyHKjkceMRlYYjdwDjcyGpTwEjTzyH2pkpdHIKqOR 1UYjTxiNPGk0UmI0stZoZJ3RyHqjkQ1GIxuNRp42GtlkbOUZo5nNRjNbjGae NZp5zmhmq9HI80YjLxiNbDcaedFoZIfRyOPQyBpo5ClYyrb/UCMvG428YjSy 02hkl9HIbqOR14xGXjca2WM0stdoZJ/RyAGjkTeMRg4ajbxpNHLIaOSI0chb RiNHjUb+y9jKMaOZt41mjhvNvGM0867RzEvQyKvQyH5o5DBbCr+bg9uNJ2vJ IlLeKgfIwTJfFsgxskhOkJPkZDlNTpf3yBlyppwlP1DdQo7gPxlv4d+ByP6S /xNmkBwklBwpyXfI0bJQ2HK8HC8cOVFOFK68S94lQuQUOVV45d2yWITJe+V9 VML78n1RSeWpPFE55HDIYVoXKFoXeNVdarKaoqaqaWq6ulsVq3vUDH5yogar wdTM2xU/uaHduah2xe68Nj8LkWO5P3Q9v43QwhO+3yTqXJFHpcmxJC3UI+oJ rEG43kfUMvWoWq4eUyvU42qlWqVW/6FeRfbS3FphPW6ttFZZq60nrCetNVaJ tdZaZ623NlhPWRutp61N1jPWZmuL9az1nLXV2mY9b73gecyzyvOTZ7XnCc8l z1on1on3rPdssK71bPRsdmp6tnie9Wxzajt1nKpqlpr9ZzpQ96r71Ey8R/HX +FezqN1zaJ9Zi3aSC6iHC+lIFA+LJaK+eEQsEw2h9cZqtBotUlSRulOkqvVq g7hWbVKbxHVUVjNRXS1RS9UcNVfNU/er+eoBtUA9qBaqh/6U97BapBbjGQqX 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 5wzlEJ8/yuffsvP0aeKPjjyTQ7mJ2e7Df0eTE7ObvQrv5RXi53nCf/JDz/Dr ex/lBv84uya0l8SG3hLd5+7kTgyX0p9Dto18IGwQ08EDm9jojng8FvcJsgEk XBLmY+FWYuatEfRIbi6CE8SIJWPxmB7gS1CB6DnDLw8VDL+MvQ8R39DpfB/q fvxrVkR9kySJTangz3G65ORkJSFMcFi8Obl5/M7GO5ve+iR57vq7ntvaemeR UnBty8J9axtzo0l+ww/mTPR4//OdtjOnD101J95zKCUtcPF1t+2vCJ1MUejo OnCd1+DsGaFXm7sESW8QDSJnILJRNvJE+gPoSSKv1xPxD1yh4eMAKVbVGyoY YlYdUterT7W0RZudgP2rq9FZ8BKv7OVV4mcNRxKJezd++Jk6Lj52+M0WbrLo 3hu6eG9oJtWU/j+LatRUPzoPgSTccngU0fG8XpK5j3wiCRfjxbkiH86Lokw+ DugKJVldBbRf1utq1NaPs3CeqlH/5aqoMWHaKsQr+IbPzuPCYoY/7HuYyNyb wpWhppuHH0ENCVTgeeRKMRMy4Q5NV5Mr2ul2R0ZjzDQNkt6ASXFaXR+446Kj J8Rl4j3wWDjgcgARL3rHJhRZ/xyIK9HsxdYAegDqHqz56irCAdhUF0EHYPyG LdHhZPHqQoqI46gzybN787w8XWpZ3OhaE9o8heXVmd33bF0wPSa5Zst8e/bE TGtD6JMYcmJ7y+NNPQObitLnb3vgpa1NdxcJ0+zxDmPBxdd9565Zs9fXZQiy QSIHbhzuSk6buja4btlPf3Tf5vL4BDqfZTifLerKm6/ZKEomMuH1RpwCQFct GT/WF4vwhwBXyPTPKaDewIde0XLGcsZKjaAO/0sLqnOVp62uPC/XEnopng+L D730FMmMP/dRHMkUtu/de86+bx+QkWdQl73qSfIhTRenWaczSWJ4uBG9is1g JGC1FYrhgyNvDOgjucGRF1Bbj+DhdYLM6cNlkyQZzaZCg7GYAFs2zOmg955C A6Zw3eHKoy49H/2ZP9LHZu+hv7dd1ZnZ7TJR+BSeujS7Kw/92vMPXu3vCL26 aV5E2bH7SOkz1c5WEv0r3kfyjw1/Sv74dOj4uddFdyji3nvJezgbdrRAP1rA DIs0C7h1PDGDwYQuNSAZeMlcaCrUyYXSmCb0Y8vH9Rh9xp9z2ufP0ZZj+N8o rCprpFq6eT9/1euvTr+y4V4iv/Z8+bVV96Jy0vCK0EL0vudCZ7mTpJf+nsgM 3EtduJfskA7FTLeTYCbtEAEe0hEw8FGfGoqSPg3A6CqnfvanQ1QT/V9kYf/i mBvF96RA6Ovz8x0gkDNPPZVYufLGR3p+jLjipuNktXtqc0HtVUtmZbvc+S0a Z3v7pe6zTw1sr37n37vP/mRg+xx+Y8nKOemzNtx29/5AyYrqCZWUQ+1L0K4u tGsUKLBjdG3F6fSx+lij3oDuFZyRBoiESIN1kPQF7NEGZ9yzkbxOZ4j9Q8BY aChW7VegeaH8/CG090+H1LVvpR4gx0e9wJgvs35Vbfbqw12vUB+mHRpkp9Nl n4Qi6gP44KlVZsU3I6WhbwC9a1379Qszc1qvqPHnO5SXDs7bXrulMZPclV2Q ZKHOLrl8SeGcq5ZVRdiXVnOlt4dqMqq66O4Ow1nLxFnLg2tG52wC6QMXhJF1 D/tdGL2i9xGig4SRUwGT1VmRkPSnsAkQU4Ruy3RU0v95dNLoWxAXzvDL6aPv GXYMcp8A79errs59FpeS53RqByeJHpHoyUl7oaIx4iRqEHL5pGUdjfHe8qOX tu+al5Jd3bWsqzq7/JpnrvLW1FV7vBW3VMzfWpeaPRflc7Or9rxq05ks+oMx nsSZDdlZxVN8OVOruopmX7eiUDKG6Q44Xd6pczMzi3NRPqe7ZN7NKwqojV7B tRFUT05F2sqw4kmNF3hBFonwcUAq5NXpY6egM3TsbIs9fGEuezEp1HsLN4S2 /PqhX4e2xPOPCFd+tkW4ch/ty4t9vap6uAGtL5deJxmNcphZEGwgcxYLCRM8 hoDp5Mi7YEUKH3kj4LIYw60mgyCbzbJefSVypNgGhaOeSPVFo66IUO18p3NU 90ZXJbo4VPbo39ksHRv1bTKOz8/LeaqDswuvhu56qyys5oO3Dt57mbKUwKZq d9qH9PBKXrz5ztA09CE7//g8eXv404MP8cepBQ7gzUBCCxigVbNAjJ4YgCO8 EBB0kqjTAVodDxMiNWyhum/QzdJFF6VusuhIyxn1SM5eul9SVlUV1WQ+WJSG L1v40MLQ88/fPXUTWY4aDYYyySt8SSjh1IPkA+rbFuAuWStuR++QBds1rcKN sqyIAp+UqAiKIkQPkuUBlyP2V5Y6s6zwYKoV64X6pNTHAzzUUIOp7zu1+wJ2 wkRnEHZaPH3aSvyjyjr/a9Wp/vjGRzOH8bKSN3YO4EgE3TJCXh47d3K3V3Rm NDz4mKA32Uz3RJU+2VtxcVlC1Z5XQueKZqXPq6uckWFK83VOqNvYNMVr5j81 mcm95yrsM5ft7/v1+suzmzfP3j386MrhpkWXpJYtWnHptOciXFNaetev0c6j JXwIYqBHs4fBJUdFuUVCYiyD5OKAPTxGlkhUjMUixdQ63gyYaqS52jYoUA82 +TbVRarOEYevjt/6lVVw6PaZfJ5fnolO0CkruZOYR8BV97w2TKWuo6/0u1vT D4e7JydV7Fpda5sd5OLVUb3rby1Jfe6J0rZp7vnXBZtD2/FM8SmOpIo/B9FQ FPCCxeayRLoio6L0Dpvr5zwhFketXi8ZTG9LNZE/h7lQgMezf0NtCujVj+73 Z6nDtmpTSJheLgdTSqZnGr9dyeMmT05tXdwz09+a3NRZft2mhZE+kh47XB37 yvWvxPDvvVu8aJpb0u23BzYfXfe73bu5Z3fT33JAzaaijeNgeiDeJbndJDYO 7Rse5yYyb4qrja21DIWHO36r2qmgYCjfNzS2FZhCqlnPs5fLwc6RaK1nDNZw k3hPVGL7uv45uauzY0uKpjurL+uuzk80VAU5/cTLt2/Neje3tTjZbLxfb9IL GVUdF6+ciCZDze4f+QhtFsL7dmFA4YQkWXDJLlMERl+MHIF7wiVZ4NcTaqJ+ 4anR/8JSR61GLxRMN/VQ7B8zmWooCRdubp6DLeU8ey7aT5LzcnOo11d1R+fv SE7m99TetHG+3RhRNG9ChZLcNnnW2llRtnJH0WyjKyzO6rDMWD4rzhI/f/nG YufE7PTwzMV8+6wrDi2eurzZZLxJb0yce1kraV/eSbg9nHv6opKpCwoTOEHi Dxh1uM9J9cj7fASOyw4pkPIYRJGb8Tgg4jMc4kjCQEQNDJKEwwY2Hu34QkZv 9NoetF+QJu958lKdURlTvd7cFEd0Rv6Amk7HdJ6aJt7ICblxcfnp7sjU3NiE qelR3GuqZErGmAR1Qx/EV6MP4vHl7DuOd+fKIxxnx/voFSjSk2sH7JwwSGKO hNXx9bga6NcTQ3R7qd9FoLPjL9CLr/7tt4N7Y7IS7M6kie5YH2Jyjrj9sz8L 0merHYovOnZiosORkBUdm5PkwP7X8kEhSu1fhuyTaJVavFgLZPuADOQEJjjg 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 KpuwInuxdkPWWmHtQGWkOupur+yqXgJcVr3cfbhyZfUq97HKNdVrwa+H5Fjl RkjaK7cAT1Zuq37ZaapEdXX3VO7m61W5r3oTIeJceZBHuPIITudNlcfJt1M8 epVniO8dhhcJLxNeQyavrLxJ/G3COxx9IqGBW/Dxtcv3JWMW53yp4C/4sCPc fb5JdDWbNPHE6G70oY65r/pmDI1FmcNxA3TspMlrmsdXpuFh13mfj3RW09Va Qjw3unf5mjHiDV+oqgeWoyRfQriccNUwXEvI33Gf81EV8vFq0+fbXm0o7PHt 5Our4R5+pvionvgOER4derflQw1x9/tOV7/iHvTxijEH9vcWMd/56lWwf4lG uRR71wb+CkmuqHsWOX/Odx3Y57tVvT3+fvAOl6Oy5Y7YHer7PoV4ymffQPVO XmdIMoPQTpiqYtXWIr13DudRjXOLEn13+X7xJcckvN4Sf0bbHZbYHkQkt1I1 3laUVCX5t1FNfi/uU5GJ7HH6zIrRp1Xq51Si9gkV/2xKpk+l9PR5VAJ9EmWg z6BG0adPRvrcabTgE3wskT5TGqM7qrvIFN07up+y6boBSWAuSS8lMa+ULD3F AtKzUh3rMBgNOewf6DOlE/QpwXeNs42z2QV4w39K/BRj7Gk2mWWyLPZJNpF+ 77SGLWDbWQN95/7/ZF9iX2N/zw6xH7A97Ifsp6yX/UwwsHfEoBhk74oXxbfZ HfGaeJ3dFW+JvxAE8V3xXUHWCTqdoNeN0iUKo3SP654Qxugm6DKFcbrJuslC si5HN1V4TGfSWYUU3au6V4U0KSCtFZ6UPiftFZzSV6SvCC3SV6VDwovSN6QT Qrt0UjotRKXvSmeExdJZ6U3h09Jb0jXhJeln0i3hb6R+mQl/K+vkRGGb/Lic JuyS0+UMYa88Uc4W9stT5Hzhf8lm2SJ8Q54uTxe+Kc+U5wonZKdcJvTIFXKF 0Cv7ZL/whlwr1woX5Dq5WXhLXiAvEK7IbXKn8CN5ibxEuCmvkFcI/yH/pbxW uCWvk18Wbst/K28U3pU3yZuEX8lfkL8o3JW3y9tFWe6Wvyzq5d3ybtEovya/ Jo6W98n7xET5q/K/iWPko/IxMVk+IZ8QH5d75B4xRT4rvy0+IffJ/yE+Jf9a /7hYoE/Vp4ol+if1fy2W6nv0d8Wjxs8aPyfy/0vZy14EJrJ0/pP8/OUa+RjL u8ZS8yK8OZapvdryjzpW5r/Cm2ON2qutYLJjPe/55zjICxNjRqvRykTj88gR HaTJwiXhEnL1h8IPkatXhR8jV28IN5gk/Fz4OXL1XeFd5OqvhF+zBFEv6plR /Ij4ETZaTBaTkZ9PiE+wMWKa+CQbK2aKmWyc+LT4NHtEnCJOYUnis2Iee1S0 iTY2XpwtzmaP85VhKaM+M+oz7AnMr5ddpFkm8c8n7EdZvf2o/YT9tP2s/Tza JfsV+3X7LfuA/a5Dchgd4xzjQWmOTMdk+xVHjiPfYXPMBM1xFDk8Dr9jnqPR 8aKj3bHQsdSxwrHasc6xAbJ5uL7ZsdWxA22XYy/1B6A3J94OkxZvC+Nt3rB2 jO6JtZOOHtzT7jjnuODoc1x13HD0Q3/QMW8Oc+yYw+boMRchwYnIpmHtnsS+ e4l9kaVip21nVuy0V5mNvcb+hT3HvoI2gx1lx9jz7DjaLHYSbTZ7k73N7NiH P2BO7MQfMhfrZ7eZmw2glQjYcqyUf38MK6NoliOXBObR6/Q6VqlP0Ccwn96o H82q9GP0Y1i1/lH9o6xG/7j+cfZxfbo+ndXqn9FnsU/op+tnsE/qZ+pnohYI 2PMHaSVM/NMt+2rQOtAG0GbQVtAO0C6N9hJNs69D20C4zr6ZcKt9h30XcXvt B0CHNbnajpH8pL3Hfg500n7B3me/ar9h77cPOhhea82hByU6ktQGPkmTJzn0 jhRHOv8EU3dD90v6XNyoRdmPlopYb2EfZf+MVoDadwHzuY5mFhKEBGbR5+pz mVVv1puZTT9HPwdrICSmJU7if5eAVRnNBPt6zMwLqgHVgZog24i+FRTRrnVB tkUcsJfZo38Q8r0PPUiv7H2uP0j/fvd/GB/K7iO/n+0PY3ekzd9mnh90Tg/y 44+Vfls/fxf3/7+K1R9q3Afl38j5Pyg3f5t51f4G8/59xeVBdt9vr90vTz7s 3n2/One/dfog83g/vQ8y3n82pwfpvV8N/aBz+LD3/SHp9+HHb2vzfvvpw445 8nXtB9D5Tef6u47h78PPh/SQ/osQf5chTZKm0ruMhz9D+dP7GQr/nzHjP10w nWaFptOms6bzpkumK2jn81cDr4Nu5a/O32UawDVOd81S/q78c/nnzJLZaJYg Q4MEzTzOPD6/35xmzjRP5rw5x5wPtJlnQjIHNA5XxxdsKSgsqDEXEXogRwOP FrMUk/CfFBhnIrvGau9hq+g9bA1aGv196JPsU2gT6F2twt7E+1kbu4g2jfWz X7Dp7Jdoz4v94i/YTGSRyGbpMnSZzI6cmcLmwLqfzRsWgVqWWbDbVGuq58Q5 EO/rh7VmXKvNLTGF4teioCWQh9D49Wby+gV4/RijX/hmeqan3yg20LtxI/9t UjQJs/oIk9kjGD0BuilsFOP/R9EY+rvlsZjTS2wc+wu0R9hn0JLYX6I9yv4K LZn+T9TH6P8QfZxtYJ9nT7D/zY4hHj1oEzD324iHoJf0xqH5FewQBwp2FOwq 2FtwoOBwwbGCkwU96M8VXCjoK7hacKOgv2DQxEx6U6IpyZRiSi/oM000JUFn x73NtNI0ETaomdbA1gGyd08zrYd1NNNG3N/3nqtbcK86LjXTNoxOzdQNL+5p pt2mffBLTy2R2kHTEdNxUMp72qm4nTNqw+jUTFmmqcCpJpNpmmmWqdBUUnDB 5AXVmOpMTaZWU6RgKWkkmbowzjJTTezOuIVe3DdVa2swh4umy/HXsXYN1tU2 i0YZ3m6CbptK+Mh8bK3dgQdqu4yrdSPabtMss2iKoG0sWMqb2WCaah4LSube 3sfHLq0t0xrZNqfSymnRNyvmSTyy5mxTijkXSFFCz2dQaM4GV2e2kL1tsHCG 7Nw0zzDbzXZTktlVcMBcBps+WKg112ONtyGShwsumJsph3rMIXPUvMS83HTG vArrxzOpx7zW/HLBCuTTRPMm8yvm7ead5A+/OpEy5YJ5D9parlFw0rzffAi2 hvlMmcAzAKtsPgp7J8ynzWc1G2fQ70W8z5jP8/w2TzJfgo9XzJfM1823zAPm u1quaw2vsQLmSxYJzWgZh9y/Svl/A3cMFAyq2Wa+ZEo0X+H5BjxiGc+vWdLM d80DpnTLeMox+KrF7hLyK0vNMUumZbIlh6+wJd9is8y05Jh2W+aYplqKELO1 lnxTN+beg1yow5398BrZUnDB4kHzm0pwfZqae+pqcD00ZACXQaPGMs+8xNII /kXIl1naLQstSy0rLKsxwjrLBljYzLPdshUx6OFeW3YgAgOWXZT5NZbxPB8s e813Lbu0KBxAO2w5wF/x/YD1x0yxJ5pMEcsxy0nk3CTKvEnIuuxhUUiCpAu5 olf3C+68hDhM5bmHiIw1pWB83s5ZLlj6wF9Fu2GutfQjmoNWxudt1VsTrUnW FFONNT2+T7ymy9aJ1izTROtUq8k0yzoN9aHOvNw6y1rId5W1xOq11ljrrE3W VstV83VrBK3Lusy8xDqxoMe60rrGpLeuNzebkqwbecSsW6zbMF63dXdBv3Wf 9aD1CEY7bj1lKrSmWM9YBjFOr7nZesR6EbPXY47LSeOy9Rry+QK0blpv88xH pm223jFlIUqHkaM9pjqbaDPYxtqSbanmJTYF893AKxkqZr9tElo2KlRXQZ8t 12YxL7fNgEc1BRtQX2bBRo/JRLWnCZl5jFceU43NbnPZygquUgyabD5brUWy 1duabSFb1LYEuBzSVba1ePUy5Jtsr6Btt+207bHttx2yHbWstp2A5DTWSOF7 2JxtO2s7S2fRrIfPZ3+Sz2fNeA7gP3kfz/82KS+TCXkelpyXjjYxb+KUw1MO 52XlZeVcQcvOyc6bmjf12dPPns4z5ZlyJqFx2bS8aVN7p/bmLs1dmjcrb1bO 2Jyx/L4p46aMy1mFBh3+tzu6t3WX6G+W+P/YzthqtgbPKGvxdKFnL7O/Y6Px dLUFTx4CHluM5BF96pZ7nAm5Z9CfQt8rDmTX5Z56SA/pIT2kh/SQHtJDekgP 6SH91yD+8376ZoWHP+//U3w/KYr8u2/vvLv5Yfv/sfHPI37Xv3UtCUyh37Su k5KlOtZG3+RzkH7T+l/pN60v0ff2/JiqxgB9h81h/nmEeJT9E2MJyaBUkKLR JK3PBuWCLKAZIDvIBSoD+TSdB/W1oHqtbx7xmvchjaKgJcP65aBVWh97vRb0 smZ3k9a/ovXbQTtBe0D7QYc0+VGtPwE6DTqr9edBl0BXtOvXQbe01wOgu4wZ pKHrBiNo3LB+PCjtPvLMB+iN7DMfcH0yKGdYnw+ygWaC5oCKQB7ttV97PQ/U CHpR7bnPhnbQQo2WfkhaMYJWa7QOtAG0WaOtI2jDCBppZwdol7qehr2gA8P6 w6BjoJND9/M1io/ZAzoHugDqU/PBcJX904QbE/r1zWghUHTCoMIMsxS9kqgk KSlKOtFEJUuZqpiUacosUKFSor32otUodURN+mallfdKROlSlikrQWtA65WN yhboblO6ld3KPuWgckQ5rpxSzsBGr3JRuaxcU24qt5U7GWKGIWOscjMjmVNG aoZC/aSM7IzcDEvGjAw7p/h1V0YZXePkU7KIajPqM5ozQhnRjCXol6NflbE2 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 fry7P8F60C52Np+DPd1yvtpIpO9/+jG6/f5DR/3+M+cfP8aI33+olT//LP7D Z4k6i//us/ofP8aG33/+R9cDDFcT6rksF1N+/MSS/0FKvaBl/h/YS/3ftThF Tsic8JMrt4olpf6bSLVOcB7rbHey6DXdNOGvM3s3i62mhUtemiy4XNLW3sYe 9YQmYFnQ6ADapKtPa5bPBrIBdProQaePHixNfeyhT1QmvUSzSuKLjCl9fti3 9n7QS1s+Odt+U+ySUu9Se6n80F6qrV+iCS6Ep/qfnJq14zI/2How83t0uKbd 9XFvuU79GoJuau2kxVO0axvraa+gvhietme6DezVu//zJQP6x3rY3ZTS6mnN 6VHQb0D/gtgge4DS2Dy9W/XuXjxg4ICeJSGNBxQXDSjuVtKbjgi1B6t8zbPS b/m5vfv1iG5b0q1fUUh244b2IF/X2Dh7bXtCXGxsXHxCR/oaT4pHX+1jtv2v 9MzV7qzynT1lq9bZObHV7dUcX4P6N+5d1KtHcUh62yYhTdpmpTa2ZyREx9tT kqLTm2SkxFazV3GMKOBPR9S2R/Hg3t172Et52JMMc51ppdydkd4mSjlnq3ba 3bQem7I7Tug7/m+ZS4MOvn+rczPr+EtFc0bsebtLfhdL+CdTar9TKWxlrZkb z7WYmOq/ecHYTQc61566N264z4s3k1NS7+Y/6FUqet24/k6DyW+ULY1Kyu9a VLtrvtuD/ZVSBmyZeaaB6+hVri9OSeo7YXK4b6XyLddb7XqnhufVvMzpRRlJ 4WUJiesTvvrp/Lm8714fGftmq+Bnro8485prT5cgtzjftKhPRy89dv2nea+K ix90eZgy+n7tUZ0KDiXn1WnzXKfxXY4FBTxI2NPlm4h2RbkL37oxgrXLeC5i XkT7ll/d3eXkN2dMZqT9wE/xIYXXen+47fSHWcftQcmn5+WcXlulydZNeQ2b td6e32uW0GgdLS/lTsSIbg8kSgPd6NThtbJSfNv6r3Vd2tjn9vT9m0/V3LW4 wwnYUCCdU+w+o72qJNz/LCejyHazwYPBD7bV3PJh4jZ3e64qECxb2VvYmy1p uqTJhMa9SkqKUmNiuhcX1ur3aJ5qdR/QL6aob2+ljSkqHlAwqHvJwJjH06hm EZNIVlmLitg7WAxamLpu5Vy2tDe3Zz76bhcT6poNDBky5M8a6FH839RcYvdU /a0mXey2R1Vqxh8WpKas5KUjW4Z/E7PnWvsdxwdeWJdz0qf2/u1HfzlbFtRj x7XM7xdkTNR79gmf0Lns5Q4X93efnjL6ByNjRM2Bb7i913Dd4Y/XzV6RfKeg 9lf7Pv35mPXY+ivV7vTedDrjclnPuLpn5+6LC/3lln+1JZ1dGkVViE8tHfvw ZuC2PcdeXfFqtRfeXl+8ZfHmK8dZ/qSitW81z556KyasYOWaq636vhYVMPTG 6uWx52d0nbGif9ks4Vo/qqrr/j7hY9qMbe7xzqDu6et6G/u165ePO99sn3rj dvFqm8sP7JOwtzaHFW+79tFC54glow99/dXZ2j3t1zJ8K137pfSXZ52H7V7j WhZQrk3pvrVVRVGldfS28ePqXF7a9Nvj3uTGbpAbO/2EG9tSYbNtyok6f/sc bnjLH93Y0P8VZ1HFHupY9P5P5hf0CGnb+/n+VOtjRxZvj41LiIuLj4+vrRxZ ArmxR1/tY8b+v3BkZnHtnxT/l47p2815y0Jc70eM2K0PH7Xx1vXBGyLa1k+9 0GDktunxV5+pv7KNd0LuyuPbp6ytvyb5q+jsm4k+WbdbDbvgOXjilqg7z+at vf7V2RqDrlQeX33B9/ejFzdMqunc4MGeOrvezhs0yyenxaH4fclbvr/+0pof G3rnGT0CQ5PvRO0Kc/Z4w2PRkLDx40a0frvyjC0/Li+b8oPL/KwlPx60hV5e 9zVPavowprTPGO3HtYkXZz+z6EGL026lF1JeqVj29ZlhJRMLvsr/qFqtyE2L KgW7Be3cu7nqdrfs3V8EzMprtmrojp0Xjv1cNDyCj3srssbx99bq+leX3F9o 9XBjXpWxNa5/vK/5gW+rj/vkpf2NnV9j+hute7yw75Fj6kqM5P3ZQtWe8FbP vrCqY3yr8/Oso8vHBe15+efiuIb37G1UdgVJ/mJFhj39j/NDFqK+6p6R8bGJ tRNrJvTs1tOenxwb3a0gPjk6oVu3+OhuSfQ1OSm/uz2RzoAJ3Qp+5wAPV/j2 0KntPh34weRa8T4+b7ecbwu2t3c4wNZ2coFLyAVOaPJvOUCyZbJkMuIu9pTo +NjoOHusHS6w4xMuMMtOTvAJF5j2dC7wn9Rd8mf+LvZs/8iKz8SP+XTR/us/ p55Ob2UsvtX5yz7PvTn0uFi4e3CvxTOWLnT+cNSyqXdb7Xqt9gPXS18t+KFT VffK0yZ6p464sPHYtoOFu2pHNRlZtUJuuN3Vtbzpd5r1mys9O0UNXxS41uOX gC0l91r37rt4bdVx52/OWfLlwBW3+/hvaJG/+O6I971GZR5ttTX95zt1Z/Vr dO7bEVd9lyzo1csp4mcx93YFbdfzORs/+K9tA1ed6n60+eW0K99nPSxfeukd 4VmnU8gX7eov3zSjQWzKoIjOcm1Gv6s/Dhva4N3go982+XTT5U5pPw76+GrP 7l2PfDp/3MvTqtp/up1wonvgG42eb+7W4r1Ut9s7X0tdnXKl2kxj1cSetG3T d5O/W+Hwd7Zu8eH+2K3F/tHNdYH3sDnNDJ80615UAffz0Yj4WD+77++UTo/n JTbaXtPhF6r+5hdyBgwg50AT1btn7+7dSnqENBxU0mtAce+SoXBmdnsK7cTi YmvHx5EzizO/xqmv/z/97L/yYFuLn83zsxe8Fzi/a0hIo9cHty1Mq3xmwJHD d7/rWzbXx+PSl6klY/3fjFkSd6P8i72Nsqp8WswuJD5jm3RoU0izH+702tCq xbSV7w5t8cKCptbzD6t9uWjQxOPrBqaPOjvmwvfv3ktacTCvycXNG+tdiug1 13/1yuKB7e/6zr7yMHF28ZIzg7sEDWkydnyKz4mBz+lkMtNWbu0dc97PuWxm SY3Lg2NyP/eyP3v/1LT8h4cPdsmIzX67uueVBvbjxTU8IsI+Ts6qtySu3oyj S1Ms4/Oy2pdGROpxb7Y427r7tVPR+Xeb1Lu2wWB/z1i6+ORzU8PbfjtsXfN7 GceT66Ys3j4kb6Xv4mmHK7zSvu4HG5y6aJ888mCdiZGOdnflGTw5L5e6XaPk Ce/1p55EOatAdynJAv9PdeceDlW3x/GZcb+NYdxyH0Rpxuxxq95yr3GJiUiU FDJy1yS5JIxQIsJE7jOIYlyit+lFjlBIbgkpySD3Syi5xBl6K+/7ds55zx/n 6Tn7j/0867f2Wns/a/3WZ39/v/U8e4cD/Kwcv4cmgmBmlo2OGfL3mw2y3svn NgzuuXwkqT/p5J48jOetvRXdKGDLt4sEIMzckpwgc9A5RjijB9L5A8ugBcST 2pYKiUNb4SuK/ZzmJOvBbMD0C8sMAX1gf6Zepk641t9n2bdqAsO11xG0QTGL TRQzABhQ3kSxXf+NkFtfMHpfev0rvyBgkPVuzSB5bNG4p3aJ8j2XcSjaI89w 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 +PGexCavPA6IbHZKru97K2DGzb/VsGB4N9JuyuuHmoqa6tG/+CS6YljqjB02 WoHJv3TIxHzqmfX1kD8Re91XUGMh+G1Rbq91IUcDkgeV2A+MnL1CmdauO8wW raBx117TIvx+bnNWnFUerv+i+tkeYTukaFOumbqqzD+QnTyS9LDh3Yplog8f SI+Hk72x4/ihbVa5EexN7flmMvv9o4+9lB/T3F5nK7Xz8yl8xVXvJ78ZUlfT bC10TyD9D7Jq8lf6YHkc1LIyi1APHgnwLa3F4ysCfQqztXfBsnkLzlHJh9H6 YqVvV4sj1NvnQnd0muFjEUInjMWkjGK627sv1AjM6eIjcIGT56tnEz12aqlw vq0c6zUgKX2y7hW65IvgE5/2HFveso0dHa28fIHkKjJgr2P8XPVXA+Ln0Abp d3yHvT4VdTMm4J+MRU5HDQplbmRzdHJlYW0NZW5kb2JqDTQwIDAgb2JqDTw8 L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDc0NTMvTGVuZ3RoMSAxMDM3 NDg+PnN0cmVhbQ0KeJzsnAlgU1Xa959zb/akSZq26ZKWJA1tKWlJF0opIE26 UgqlK7YF2pRSdqTYKi6D4oJIWRUQQUad0VEHt1BciiCi4i4qg8s4iiiKyyiD jiPjAE3e59wnKQWX0Zn55p33m570f3/3rPcsz1luUwAGABF4kUFGUU1Z6Zad w54GdtklAHEvlxYVl1RvmZIC8L4bQBxWWjmpJlDwzBaAD9sB5q8prakruO7j KUeBVWIhQ+dOLK4uBTMwzD8fA3STalxZ469+0wjAetDvbV3Q0h71+ZsfASSh 5CNaL+605R1Lw6iid9E/dmb7rAW2O5P3AjjjAdTGWS0d7RADDnx+BiYyzpp/ 6cyrdng2AYzH+As+nd3WMuNz/ZDbsfwxGD9iNgZo7zG8if5O9A+evaDzEkXO fAuAEAPgeHn+wtaW49e+fjnAThlA1IULWi5pj9wTfhWmvxnT2y5oWdD23P5T eP8Ktj98U/vCjs6AFZ7G5xt5fPuFbe2LZskDAMOx0kYf8L6T117+/HVXPNVs GPMNqFXA3a4PLcmc+8cvuOH0yd6v5E+ploIIKhCAHOaTf9X7FWuSzTx90l+F 8cC2QD+nHMbTaHpgCo5LEeYVwAgu8GKvrJaey0CUzRR2gxxU8s3ybCxyEFF8 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 PS8rzZVb3lpYubGzWKk1qN7WhIcpY52j7cl5GWmZoya2FbTd2TkWe/KZ4Du1 MnRSdkcw3Dn48UUm4vvyYbfCI4QGPCvLJa3yfduk5vuSSEczRwTujEox5Z3T 7/i3OMXnnbKKU92yiv378ZljcPR8+MwEaA7t1fowo5bFJYTFhcXFa41xWjw9 xnvCPOZDbnloXQgtcTgefWcE3Kh/ODGvh16k81VuRLao6HvbiMiWyWO9a3Z3 zL2l1Rn+2xPbdJFDx2WNaS7NMGz7K9u/5NHFeRmNV1QUTBArTt831pU6dmiU tXjeRLGc254Me+yotF9tC5118ZyhVkeE6UQGBlE0RKiUSlO4Qv9YYC9oA5+6 Y0SbqNXjkUIXpguLCPcoPbiD4pZ95uyTL+0nwV1K2qTCaYPKxtgz+9Mu0P8j RfL5ieu8kp+kRCW2nm9R2eJN/s+d+to3/Ecff3tVUtuxrdmG9FcOsPV33uPH g9Tpx46+zA74Ix54WZzGW70NW31SOsPMCp0dVegR8SyHpw25DBcHmQhKUcCu 8MhlQYPAndIVHLZYFzUjhr+XZNHg6X8wR9CGpN2U2YVfTzk5LQBMWJR5DYtk UexVfybbL1b45z/7MuN/SHceWlS+TAcx4ITLQiuiSa/HcR0a6+gRUtzhYkSV rjI2OT6gwjBQVSbz75Dd+OZy5mjOl738fOlsj1UMGpjxp+YLbVumESP4WT5X 1ItKR65eZKFDvVmyPTZ3w+bqrR+um3hp+gPtCl2YUfOcKrpk2iJ2ka0wuXRe RfYgXe7IYbObSsOie367mYm75kTpk3r328rm3bygx1E2JkWcoNVl18y9YF5q Ze34zjVFfEdIx3d+h3wZRMFQWELt34nhKW6DWWOzhunsOp1dq7EPju1hw9wG vTyiUlejrdFUDQ645aGW5HOTwZbgDM/Owo1Av0/aCl7ny173T8sqbXYCvdOk 4GlPORYXOrOStm6l0myWXpgd1VuPrPNc0NrgZKa/FI+zjK9vydqw2Z870lpY mJ+TrMqwFWFHTMSOEB7Y4vfvmqM2mvXyRv+dB51FGbE9PZW1iaMnNTSlH6d+ mIvWuRjbb5GpwAGXB08jDocpYY+QDiowsXw8p5hZdrehEl8msx8xOFi4yP8F yojuUBP6fldx5ncdu39mRv47Dr7aJH/nZc7M3+XExSl1tRW2Q0cdxXNXb583 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 H8hO/RZJfduomWiCVDmxmkGLyWqEnv0kaxmrMxkfs1rNlPg5VB8aNJm75c9S nL1MKAx9I7y7r1YlcqIgT3NQUV+y/pkV2sJ4odbpHkiUNQSVMmdZ/ivtuM2d GtTpatY1B+tq1jTkEJSAfEYk09o8DGNS0OBnQ9cywTooyV1QU6ZDmq0wbhW/ CLl4YdBu9Kr8iHQ1jJ4qoetxY1YWpf6RqjuUJnhCYYhv/rqcIZQLPaitYGLd RzcxvHNcEL5Q1129Ow/IIaqteuPg5uwtlQsSdjFuqfbctO23tDrb6K9WEVQo nJ1vU84tW9NacMetWf3r1/qqyg4xzohdIJL2bZHoNVK1gMmW5wU1dj+S/w6o FesgLwLMx2pJHIZzDL3AbhWxmcCJNwTdeCcK6R0TYjr/8kzUpdOQmpv6EBxO PeXF14CbRp7FG16FUX0TlE4rtHEnFoVRvfWYVYn2fN931KWAaeF9g4zcjvpI TrCiAlsBAw9XCfqkEJfEwy6S8j6sX5R8JCMzfSLz1jY+EeA3XnBVHPfEEs14 /Eab5aAdTY7invEgTphDC3d3Na2tdaiDdXF/UU7L9q6G5ZW2ea22oEl60Bd1 h83iQNQVNonLwyWeiFWWn9CHPf/N3reARXWdi679mPeDAWZgYHhsGBhewwww PEQQUBBheMwwoAKaxAFGGYUZOgygJrXWmMRDbDA+iDWJtTanTW1iE2LUpLnW WA/JSdWmqScxNvWkqTfNTWOvzcnNyU11cv+19p5h1KSn99zzfef2fLK+/9// rFn7X//6X2vtzd5r9IayOxvzUksacjKq5lWkJLZXFixfXGCw1BgXrbXFZ+Wa qY4Eg1qXpEjPS9JlpCSFvpWalxrPpXNx+gyZLhNfMd4Hmu4CvXCoBFW8gDKo 488bzAjFw+rmhTqNOd70PUNamkj3dPydlqdE7mifOR+5qRLPvyBCsoWauWEa N1UIO9DhaRsP/ij2l8k94C+5xqXrtroeyHigxV3NyZnUxpyv3/euJJ5Lyl8C HrMyo5iLodQLRpeXTd5rWB0czTNCxZNxmTbwGcUA+Ey8Mk4cn6FeqeUKwGN+ G9Ixe5lWFItSZ2IVInD6Y2p1XLzch/zgKuRm0ZXZWfKwJrFNopjYge5dsX1V iePxPzzW8MGV7VtCupzg1A96J34z+1Tj0TWhd175u9la/jkBHf15NPcXeO5+ 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 0a6AM+NSxtVFZq3xCwyQrlzcsr9E4YD3ef8pQQt0ei0fl2PlpixIeNIrfnDe sLmPZ698nzGn8BYJ9cUbTVpPTup7+7J2R5yLlP/57Oh7Mo3pTyTKhOOIaTGP FvT0TDfqc1dXo/WIxiHfW9efz8m/O+BdZf66Ll6P5kx4VEmKPk5PDdJePb5s vXx+Xlne1HDzqTfTthy7tC0+rX3o5OD9G1qiA/o9a+yxbO7tg75Ra4zCAnbr hfyU4qwpDB83yLRGcmzt3UPaT7w/mlxIb068EnWkF2KvR4i9Wj6zl5h787FW sUa06HSPtVcx+9b+nsZS/itkYcDqf670Gp2Pj47SC44ZMxHl+pXIbFmJjZ2N ja2tLSYyO9bu6y47a/b/CyLjTyf/5PR/SUz3asJL9GTfmk7fQ09Lr37yMKnK NLiXc5tbWt1i2zuDepUHqtiFlDfXL6rstd7xumXAY3tV/6d+qW3ipPm1Fs8G h1c+vH6h25RbmnNNCl6+tSx0dzCXdvuwr8euneFTlqgG9Ttue8Sx9uXDGetf u6uEM1Ha+o7PLHZ1lVbYrLAmuevcOdMH7NTMrX1d+mnRK5lV/kWvG0X6Nzbc hA7eH60zxs0iX1faX1k6aM2Hfi1yGW1OOUqfbramJs4ffT3ysJGV2aY1XXTl dLb9XGNYLxew5xetJeF9K1K2bmtrehc/zRTO2WHWrXl/JU1fvyY/ye9jdbjB 7G4Pjx3xbbhnMufcjKO9pZcBevOAqElHvhDTSIRI+I8qKtmJrQZPqhhi63c5 XzizY47OvnnvEmzcX7CB3GFFCvFFmRfb5/f2QR7C7dJiM1uJfXd7c7voiGg2 0lFiGTHa1tHSLiLC1jLCAe06OkSOYu1tbO3sIkZ/R4AnFO8dP1uvGgYbHa1s VVV39l8l0mVDPxPgABZRYBGiwEzPf4sAkS8jT0ZOPIJ1srSVWHLtMabAIZ0o 0J9FJNiJAnv+NQr8k7wTf8R3kgsTzZQG2c46v+bow3fOLX38mMInw9vHDd2e 0kys3pM0tjC3eLX0ofSSrOd+u5Z1/yB77XrBq2GG8prZ81Wcp7dVN9U1TtjV 3cIzzVAxxJiVle3wfkAKb9+KHmYxbY12pcJ7rdrEFwNixhdWGs65/Hh5Ufvk sqfjNKr6RRY+n35AOd3nlN+WPu+euSyJ9bh4b/odtaKCsWOlTN8RK54qkrvG BFUfvF83ueLsqFO+N3reeun/saP42m5C3GOY3i8De5VuynWTOE0xHU5VesXe eZ2a4rZX99Q9z/Obbgzr+XrKsTvRo0aePL9qzrxsQ/bNU7vTo7Q3e4zxleu3 31nu6bZlzuucbhnlMRXzozPYDHoP4ruyL701W2MN3FuT/J7mRmD2EEnlGS9Y 8sJiNFRXJRHwEnVW7btEqa92kViy5p95wfAbLwTFxSFyQIaKiY4ZFZEYpec+ JXFsXEJMYgomM5Z1spXY2Ei629ogMrPhd2243b+TZ/8Vg21JGByuzo7er71q pJ6ex8qk4Ak9NVvjTp54/mD8pxWqCtfanRNna2y3LrJ51PHLzx7+BucTQJv9 INGC45v0+r56NrbKr192+d6UfpMKvIWXPxq1r5kyv3nD5D7pF2a1vdz7wqGs MdzzSk216zXTsSs01pUnTA59rrb01kf7pQlFrUkjdJI9Z891Uj09eSiNXCa7 fEuM9WV16U95id1uJFmHXFVmB789mx358UTjCC9JwE4T8S03tjmhm4Jp12OO /q5FNq65p4qdBHPD/UMzTM1om+39LgwYdfesZeRzT9e7VQz41au48MzQLOPg e6kbfF94NTu6OBXWJ4eXqxVmn1DMCXU5WCU1gjz3hcGGI0SGsPIcM4gh7KBo lkRRJ/b6IZNwZKUtT1HIAzNZJYEUPyJRgRSNM0bd369pBJfLxzMS/3PGC5dd zx/ZY70krsJlz0VLVv3rScoEJaMjAsFgChrF9Abu33GZXFXGSLdQkxW3jcS/ mV0XBS8bfKuMDfjMZX1Zb9azqHeRe2avv85lXw8nINfmKAizWEgnFvNhESl3 YjGnf6cjx1WY3p9z/SN/ERAM7t4z3dir5mGc22abreMeyllPXN/3zcMRUx73 72F5oXe19KcT9y0lpQYnpwfkz9QfVuVq3X9XyfrQ1Tfjd++of5uytW/Cm54P 3NOPX5dRizlRvlrP8r10wOHQU5Y3fc/uib+7XraELA+9tmNhv0Evlnmsfv7y 6ZObmbp2LjtCVz0LNphrVpahteTGUqH2ixv+b7OKj98Tl//k36B5Nidhmdmk 2AKNt1rPglvHnOzaEa59qiRrr8mWlFGhfUoCT727XxoWerWA8OxjPeLV5U0t GTYTfytbJr71MOZuZYnFvgZzBbmoxSvbXpe8VzKWinJa+jxV13f3meuh905P Xd4lvNFedcTVJdp9F1vuq7bro/VEQUUDDLtqP1S/Kf+Y1JO5clkDYuXE/q7T u/msTjjzcsLxg4/iSwflDUpbml2k6UMOedNcOkaUWO7w2NJareFOgqPSq7jN LmMy3gVtybZVjdKRW3hV4ZfRr+KavFrOqd1POUzVn/tg0a67sLBK9EFs4lZ9 6931ynSv3cKR3lEj3fxrPR75P65LSrkospOK1Zop0b0hF3L1dvGH294K1aPz OwJUrabvp/VTbyxzN4k5tCRnWWP2xQL9TbLhq5+VbMocO1tmnOXupPFAe3n1 C9Vpv6rONtw5v3ncem+J9aorNye5XgAzIr3PNM1v3NHlvVxC9sFS1xrCbVxH TMHyGwrrFeodA5jWQ65shkCI+PvpF/5WHWuH+Vvr7+Bv1hENoxFj29uyXGfU RoJ3bVlu9+8b7v8r9l5bPGFze5tPntn08Vbq1/feuHlkZaBBQHXT1S7+hvJP zqw70786kdVTfCg8H7JMpe9STY+8TfnhrPFlMP7etL2PFgjl38hR+c8WnNQ9 YWs4b82LV2O0LH6bdne+9oO7/qXFBw2Cj2e/92yWOj285nStB1XyrmLCkjEX TK94Bddmnr5t6mVlUpU5YGCQzC3S4sO43Fx24ryXg9k172e0rqi7p79ixtuz 4pfM9uDYoHrP3LU+wNc7WtGkW/T6FbfOCWb5lrybs07RW1kqY+2cxwOnfoKr tAOYuUCB9Xq8/RcDr92HLUPW1uhMdZcknyxo7zF7SXEEsVVbdvNvbwq2wKau /UI63tGHftaT/sLeGxEi6/439v7hQPg79lbozN4oBbCz8j+T76xcdlb2j+m3 eFRZxH/dPTMUUqpVi32Lyqv7Tw57JRRbRf1/w/p/aeiOsFZYsfBQONnH4er9 +urktqaUQD+42Spx0tBYGfHGpn3TcnZYtSiVZMVG7hhEnPDXEwesvJrqdmPQ 7pqwVVrXtWFm1e6pLxadftQDPrmxL0dEN2T73HgWrHJ1wMa8W3ezx52fefDO 0hcC67nk/Z/MDLvGf/j1t1tTV1rJvhHeiN/TxX/N4vGihGU7iruvHmN5JFDu QWR4L9X8RXq9bgg1bN6dlPgmSVzNE6QbHsS7dswVidt/FkUsfnZhh9pD/0Xp R+zNh5fuf7gnTdpjWktwgv4T9vjuqVHhQ6GaSFnu7GXl/NcuO6PD6iyt776b m3kyMPTemvilE6q692/5NWX/hi6pkd2elhR0sxMka0Q2uurE6mY8kz5msbu5 d93td4/Stt4sW59ov8P/yCQDJeMkaZegrElDvHor76mrq/Ub07DWo2Nmiv7M QhU2+p6H0nCNhsKu+qd73ze/v/uVz0mLlos2M/sbm/kYjhjyIPRpxS8r1xx3 jts7yyRRoPgkSX9/QcZBk5Btm8e5LihOiqifWCyu2L/B+5lS3MeFNhO2fGoP bMgyaIzeu0Z7ntJowtWyZnDOjlv6t7fWHh9VPzWEbnG3CqhaWls+dWNd0fIp Gpfy5omndLW2Wc9MLBqaZbS/6Omc4/qtD3UGNK560vfaGxgVt0A6rSGm4c7E B+tWNEm6dcgdGRp+0U+z+OJ768JeVgNVxzeKSz9KMqgyNoMqIiBkUXX7+/rL P542+TZ3XDTrKNdd4/1XipTIdJ6YRjfwbU9aIsd2PqrCdQa/fJGSIFKq8jA1 3XlIMyScjI0S/7qqo+NIeAYb3ekrMpIwNrTIYqYZ8AMxYBRIAHF4bjsaJAI9 1D+MQynxOIxAKdwyBROLjWca/ml1TUyJjxuTEBE/NkXvd80KlQFBW+5U5YLV zmBRmPbp9+sMu0/PvCK/+cHkgt0LtaZvMS0uWb8yZZtbiO2MtHDpyPGpTyvq B86RPp47KyjWoaExP+RD5VmZwXvk6oV5jQHhTVtzU0MUrRQ9Hru3f5xf5bXw +FY1393qVfV50styFDJWtPo1rD2TrTLslHKP7rYdK57s0/EaJt/sUaLtej3e 2rTpYNant2bJ5AtFNsplVHHP5hb5pvOv9ifL2qcdaXMKtGqn240lI+YptJtc vTWl/5pcd+ltLTq3zz2XKDlY+SuYDlyknuAbvy+h8FnkHLfGMBeZiIv+lzwf mEVsZuUrdJLr4tRPnC27uyhNb/S+2k9P083kVR1+OR9XP7s4g9BlMwjNb1YS SDIIGZTEYL+c+7f1A777KaKTMw5ju3T2Relvv6RAdM2vR2iJPJ5ts+H+7G3t 7Yb8wRWjwmpS6x2NDntXjYj+dXP7iZR3W9b+jqg5FzlldD7T52i47oT0y8c2 LtEzHCg4+ltJ5ceyNtlPY9tXal5/NVEm/QFgOxyEaYeta1sDDh/00kjreJ5T Hh2ZNVLDiux38BIlmHOo59hxK16Wyl1yrNqZOv1Sj6Ly/Kg3GXrvpyZXtneL vkkMnqvj8SB0xnx9y9vRphsz38w2vritZhAV8ZP749m6CksCvab9Vuo3btrw +WpFzYeqckUv+qYdPNC9dfuvbedKtSre5WYpd9398HXrOkuok1SWpmDu2g9q 6bf5XRqx0dIxO+b8gnGH+0yQud6m5LfJXOPBQgdxmlfUPueRn3Snn3tIVCST B1J1P02I2xS3fcMFlZXP6vdXExWD91y+5uH7GwX+B58dq8cNCmVuZHN0cmVh bQ1lbmRvYmoNNDEgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9y U3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUvSGVpZ2h0IDIxNC9J bnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCAxMjU5OS9TdWJ0eXBlL0ltYWdlL1R5 cGUvWE9iamVjdC9XaWR0aCA1NDA+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEA YABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgy IRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjL/wAARCADWAhwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMi MoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJma oqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAop kkscS7pJEQerMBWfP4i0e2z5mowZHZW3H9KiVSEPiaRcKU5/BFv0NOiuZn8d 6NFkRmeb/cjx/PFZs3xDHP2fTmPoZJMfoBXLPMcLDea+Wv5HZDLMXPaD+en5 ncUV5tN451iXIijt4R7KSf1rPm8Qa3c536hMoPZPl/lXLPOaC+FNnVDI8Q/i aR6wzKgyzAD1JqhPrmlW3E2oWyn08wE/kK8nk+0XBzNNJIf9tiaRbX2rmlnU 38EPvZ1QyKC+Op9yPXrfVNPuseRe28meyyAmrYORkV42tr7Vetp722x5FzNH 7K5FXTzh/bh9zM6mSxXwT+9Hq1FcFa+JNWgwHkWZfSRf6itm28WK2BcWrL7x nP6Gu6nmNCe7t6nn1Mtrw219DpKKz4Nb0+fGJwhPZxtq+rBgCpBB7iuyFSM9 Yu5xzpyhpJWFoooqyAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACijpVO51bT7NSbm+t4gP78gFVGMpO0VcTaW5cormrrx74dtsj7b5xHaJ C369Kxrn4pWS8WunXEvvIwQf1rqp5fip/DB/l+Zm69Nbs76ivKrn4m6vLkW1 lawD/ay5/mKybjxh4kushtReMHtEir/TNdkMkxL+JpfP/IyeLgtj2osFGWIA 9TUC39m0hRbuAuOqiQZrwiae/uzm5vLiUn+/ITUaWZznHNdMcijb3qn4f8Eh 4x9In0ECGGQQfpWTrV9q9igfTtMW9UjnbIAy/wDATjP515BbteQHMNzPH/uy EVrW+u65BjZqVwQOzNu/nXPWyObVoVP6/E1p4xRleUb/ANfI177xd4mjyJbG azHr9jY/ryKxJfE+oXbbZNYfJ/hEmz9OK27bxlrcf+saGYf7ceP5Yq9/wlFr eLt1HRLeYdzgH9CP614OJ4cxb2qt/P8A4Y9nD53QhvRX3f8ADnHFZJzueRpP ctmnLbe1dcLTwXenLacbRz3jDR4/74NP/wCEQ0i5507XLmI9kaRZB+TDP614 lXIMVT1ep61PPqEtNUckLb2qRbb2ropvB2t2+TBc2V4nYOGhY/8AoQqjLZ6n Z5+2aPdoo6vCBMv/AI6c/pXFLL60N4nVHMaU/hkUFtvapVtvapoLuznbZHMp cdUPysP+Anmpy6pxjB96y9nbcv2zexWW29qkFt7U43AHSo2ufej3UK82SiFR 1xTsRrVNrn3qFrn3pc6Q1TkzRMqDoKYbkDpWY1z71C1z71DqmkcPc02uvenQ 6vdWjZgndPYHj8qxWufeoWufeo9u4u8Wa/VU1aSO4svHM0RC3kKyr/eT5W/w NdNp/iLS9SIWG5VZD/yzk+Vv/r/hXjbXPvUDXRByDg13UM2xENH7y8/8zjr5 Jh6msfdfl/kfQFFeN6T491PSiqSP9qtx1jlPIHs1ekaD4r0vxAmLabZcAfNB Jww+nqPpXvYbH0q+i0fZnz2LyyvhtXrHujcooortPPCiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqOeUwQ tIInk2jO2MZY/QULUCSiuB1P4q6VYXT2q20nnpwUuGEJB+jc1iT/ABP1W7yt jDZRg9Cr+Yf54/SvRpZViqivy2Xm0Yyrwies0ySaKFS0siIo6lmAFeKXXifx Nef63ULhF9Il2D9BWPKLi4bdcTSyse8jFj+td1PIpP45pemv+RjLGLoj2y68 W6DZ5EuqW5I7I28/pWJdfE3RosiCG6uD2IQKD+Zry5bX2qZbX2rshk2Fj8Tb Mniqj20OyufilePxaaZFH7yyFv0GKx7nx34kus7btIAe0MQH6nJrKW19qlW1 9q6oYTCU/hgvnr+Zm6lSW7IbjUdWvf8Aj51C6k9mlOPyqqLUk5PJ9a1ltfap Vtfat1VjFWirEcre5krae1TLae1ay2vtUy2vtWcsQNQMhbT2qZbT2rWW19qm W19qxliC1AyVtPapltPatVbcDrTxGgrJ12ylAzVtPapls/aru5B0FNMuKh1J MfKiJbTHapBAg6mmmb3qNpvel7zHoWNsa0GRR0AqmZveo2n96apti5jVh1S6 tTmC4dPYHj8ulacHjG6jwJ4o5R6j5T/h+lcm09RtP71MsJTn8URqpJbM7w6z 4e1hfL1G1iz/ANN4gw/PtSSeENLuY/M028ntwenlS+bH/wB8tkfliuAM1LBq NxZyeZbzvE3qjYrhr5HSqrT8TopY+pT2Z0t94V1e1BaNIrxB3gOx/wDvhjg/ g34Vzc8jwTeTMrxS/wDPOVSjfkev4V0Wm/ECeAhNRjE6f89EwrD8Oh/Suqhv dC8U2phP2e6UjJhlUbl98HkfUV81juHXDVK3mtUe3hM8ktJq/wCZ5W1x71E1 x7122r/DlGDS6PdtE3UW9wS6H2DfeH6159qNnfaZcm2vbaSCbsr9G91PRh9K +YxOBr0PiWnc+nwmOw2IVoPXs9yVrn3qFrn3rPe496ge4965lSbO7mSNFrn3 qB7n3rPa596ge4962jQIdQ0HufeoHufes9rj3qB7n3raNAzdQ0HufeolvpIJ VlikaORTlWU4IPsaox+fdTLDbxSTSt0SNSxP4Cuu0f4XeJ9WKvPAthCf4rg4 b/vkc/niuqnhpS+FHNWxNOmvfdjpvCfxaMLJZeITvj6LdqOV/wB8d/qK9bt7 iG7t0uLeVJYZBuR0OQw9jXnuj/BzQ7IrJqU02oSDqpPlp+Q5/Wuq/tPw94bg Swhe3t0TpbwLkr7kL0+pr2qLnSh++kreZ8rjqmGnLmoq35G7RVPTtVsdWgM1 hcxzop2sUP3T6EdquV1RkpK62OEKKKKYBRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFe6sbO9Xbd2sE6+ksYb+dY91 4G8K3mfO0DTyT3WEKfzGK6CirjVnD4ZNCaTOLm+FXhOQkxWU1sf+mFy6/wBa pSfCexH/AB7a7rMA7KbgOP1Feg0V0Rx+Jj9t/n+ZLpxfQ8zl+GOrRD/RPEqy egubJT+owaoz+C/F9ouUt9IvgO0crxN/49kV61RW0c1xK3afy/ysS6MH0PFp bXXLIH7b4V1NQOrWxS4H/jpzVYa7pMZ23M01m/TZd2zxkfpj9a9ypksMUyFJ Y0kU9Qygit45s38cPuf+dyHh49DySzls70A2l3b3HtFKrH8gc1dFqVOCuPrX XX/gLwtqRLXGiWm8/wAcaeW35risaX4bG2OdF8Q6lZKOkMzC4i/75b/Gto5h Rnu2vVf5f5Eug1sZwgUdcU7CLTp9A8X2I5tNM1VB/Fbym2kP4NlayLrVTp5x q2nalpnq9xbl4/8AvtMit4SjU+GV/T/Lf8CHBroapcDoBTDNVKC6ivIfOtJ4 rmL+9C4cD646fjSGWtVTIbLZm96jM1VGlphlq1TJ5i2ZqjM1VDLUZlrRUyeY tmb3qNpveqjS+9RtMB3rRUxcxbab3qMze9UmuKge596tUxXNBpveoWuAO9Zz 3XvUD3PvWigBpNde9QPd+9Zj3PvUD3PvVqA7Gk9371Et/JDKJIpGR1OQynBF ZT3PvVd7n3q1AaR6joHxTntGS31hTcQ9PPT76/Ud/wCdekY0jxTpOf3F9Zyj r1wf5g/rXy89171oaD4w1LwzfC5sJ8KT+8hblJB7j+teTjclp1k5UtH26M6a VeUGejeK/h5c6cj3WnGS6tByV6yxD/2cfrXm9wXgI3cqfusOhr3zwd490rxf bYhcQXyDMtq5+Ye6+oqDxH8O9N1uZri3YWk0h/egJlJPcrxg+4r4HG5TKjNq MbPt/l/Vj6jBZzpy13dd/wDM+f2uPeo1eSaQRxI0jtwFUZJ/CvaNM+C+lQTG TUb6e6XPyxJ+7XHuep/Su4sNF0Pw5bE2lpa2caj5pMAH8WPNZU8BLeWh0Vs4 pR0gr/geE6P8NfFGsbXNn9ihP/LS6Oz/AMd6/pXoGjfBnSbUrJqt3NfOP4E/ dp+nJ/Oui1Lx9pNmrC2L3jL1aP5Yx9XPH5Zrg9Z+J95cbo4JxEp/gtBz+Mh/ oKJVcJR0XvPy1/4B5FfNa9TRO3oemRxeHvClrtjSz0+PHRQFZv6muf1j4lWV mpFpFuPaS4OwH6L94/lXj11rd/dyM4cxlurAlnP1Y81RELOxZyWY9SeTWFTM K0tIWivvf+X5nnSnKTuzr9Y+ImpaluRZpGQ/wr+6T8hyfxNctNd3d2CskpCH +BPlX8hTkt/arCW/tXnzqXfNJ3fmQP0XUb/Q7wXWn3DwydwPusPQjvXsXhr4 g2WrKlvqAW0uzxkn5HPse30NeRpB7VYSD2qqWPqUXeO3YOex9EAgjIORRXj2 heKdU0cLGsnn24/5ZSHOPoe1egaV4x0zUQEkc2sx/hl4B+jdK9vDZpQraN2f ZlRqRZ0NFICGAIIIPQilr0TQKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkZVdSrAEHq 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 xOGr0H+8i1+RySjKO4qRe1TpHUqR+1TJHXBKZncjSOp0jqRI6nSOsZTFcYkd TpH7U9I6eSFFYuRIBQopjyU15Peq7vSSAc8lVZJfekklqpJLW0IXGkLLL71X +2zwnMU0iH/ZYiopZfes+7u47eFpZGAUV2UoNP3dy0jSuPGuq6VbtL/aEhAH Cvhs/nXTfDjxdrvilbl9Qs4RaRcJcoCpZvTHQ/hivK9F0e/8e+IFtoNyWkZz LL2Rf8T2r6H0vTLXRtNgsLKMRwQrtUD+Z96+yyujWjHmnJ/edlOLS1LlFFFe yahRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUh IHU0ALRTDIOwphdj3xSuhqLJSQOppPMX1qE80mKnmK5SbzFo81feosUlLmY+ VE3mr70eYvvUOaaWo5w5Cvrek6f4h0qbTdRi8y3lHPqp7EHsa42H4ReG1SGO e4u7mGJtypK4/LIGcV3BamFq3pY6vRjy05NIHQjJ3Y3S9I0rRoBDp1rDAoGM qOT9T1NaJZQCSwwO+a5PxH4iXQbdJJEAV+FkfOwH0OK4TUfEJvovMvb6W5R/ u29uCkZ+p715OLzWNGVpJyl8/wAy1Qvoj0fUfGWmWUhgt2a9uR/yztxuAPu3 QVyGseMdQlDJcXiWEZH+otvnlP1bt+lcZPq9zJGYYAttAeNkQxn6nqapBCTm vFr5hiq+jfIuy3+82jRhHfX8jSk1pkZvsUIhZvvTOd8jfiaznMkzl5HZ3PVm OTT1jqVY64Uox1W5tq9CFYqmWKpljqVY6iUylEhWKpliqZY6lWOspTLUSJY6 mWOpUjqZY6xlMtRIliqZIqlWPFSqlZOVy0iNUxUqpT1SpVSoGMVKuWlzcWjh 4JWQj0PFRqlSqlOM5QfNF2Ymk9Gb9r4nmAAuYg/+0vBq1c/2Br8Qjv7eCQ9v OUBl+jdvwNc2qVKqV69DPMTTXLO0l5nNPCU5baFm48BhP3mkapNCp6RT/vk/ An5h+dZU+j+JLAnzNMivIx/HayjP/fLYNa0E00BzFIy/Q1oR6zdoPmKv/vCt nisrxGtWm4vy/wCB/kcVTLW9tTjf7btbZxHfxXNg/pdQsn6kYrUtrq1uFDQ3 EUgP91wa6Ya3DMpjubXcp64wwP4Gsy60HwhqTbpLKKCQ/wAcQMR/NcCsZZVg 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 u7edQY5VbPvUxNcndfDXW9LYyaJqglQdIpflP+FZ82t+ItBwuq6ZMijjzF5U /wBK8avlNen8OqOmGMh9tWO7zTSa5Kz8eWE+FlBjb/a4rbt9bsLlQUnX8815 dWhVh8UWdcKtOfws0CaaTTEnik+5IrfQ06uSVzZBRRRUgFFFJQAUUVVv72Ox tmkYjPYVUYuTsiW7FfWNUj0+2b5hvIrzi4nn1O8AUF3dsIvvU2ranJqFyxJO zPHvXovw48H+Si6zfx/vW/1KMPuj1r6zLMvcbL7T/A86vWv6HQ+CfCkfh3Tt 8oVryYZdsdPauqoor7CnTjTioxPObbd2FFFFaCCiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAGmNCclQT64peFHYClo oAiaYD7vPuageQt1Of5VLJADynB9Kh24OCMH0rOV+o0MOT1NJipNtG2oGR4p cVJto20hkeKMVJto20gGYpcU/bRtpWGMxS4p2KXFKwDMUuKdilxSsO4zFLin YoxSsAmKMU7FGKLAJijFLRSsAlFLSYpWGJRS4oxSsAlNeNJUKOisp6hhkGn4 pcUcoHNah4E8O6kCZdOSNj/FD8h/SuTvvhHsZpNK1R4z1Cyj+or1HFGKmVGE t0S0meJ3fhrxjo2GERu4/wC9H83/ANeqY8S6nYHZdWtxCw65yP0Ne8YqG4sr a7TZcW8Uq+jqDXHUyqhU6FRqVI/DI8Zg8bnA3sf+Bp/hWlB4wgkwCImP+y+P 512eoeAfDl4p/wBBEL5zuhYrXOXnwptHybO+lQ9hIoYVwz4fpy+FGqxlaO+o R+IbKTG4Ovv1FWo9UsZThblAf9riufn+FmuQrvtp4ZfYMVNZVx4W8U2Bw1lc MPVRvFcVTh5ra5qswf2kd1JdQxwtL5iMAOxzXn+v6u97OUU/IKgWXUIHMV1D LGrcElCuK0dA8Lz65q624yIB8zye1GEyz2NT3tX0KlilUjoXvAXhA61eC9u1 Is4TkAj75r2pFVECqMKBgAVBY2UGnWcdrboFjjGAAKsV9hhsOqMLdXucE58z CiiiukgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAprIrjBFOooAhMRHTkU0LmrFIVB6ipcUO5Dto21 LtP1pMVPKFyPbRtqXFGKOUdyLbRtqXFJtpcoXI9tLtqTFGKOULke2jFSYoxS 5QuR4oxUmKTFHKFxmKMU/FGKXKO4zFGKfijFLkC5HijFSYoxS5AuR4pcU/FG KfIFxmKMU/FLinyBcjxS4p+KMU+QVxmKQnHSnkUm2qUBXIdpJqVIgOTTwoFO q0hBRRRTAY8MUgw8aMP9pQabBawWy7YIY4x6IoFS0UrIAooopgFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAGKSiigApcUUUgDFGKKKADFGKKKADFJiiig AxRiiigYUYoooAMUUUUAGKMUUUCFxRiiigAoxRRTATFLRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB/9kNCmVuZHN0cmVhbQ1lbmRv YmoNMSAwIG9iag08PC9Db250ZW50cyAyIDAgUi9Dcm9wQm94WzAgMCA2MTIg NzkyXS9Hcm91cDw8L0NTL0RldmljZVJHQi9TL1RyYW5zcGFyZW5jeS9UeXBl L0dyb3VwPj4vTWVkaWFCb3hbMCAwIDYxMiA3OTJdL1BhcmVudCAyMiAwIFIv UmVzb3VyY2VzPDwvRXh0R1N0YXRlPDwvR1M0IDQzIDAgUi9HUzggNDQgMCBS Pj4vRm9udDw8L0YxIDQ3IDAgUi9GMiA1MCAwIFIvRjMgNTMgMCBSL0Y0IDU2 IDAgUi9GNSA1OSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1h Z2VDL0ltYWdlSV0vWE9iamVjdDw8L0ltYWdlMjAgMyAwIFI+Pj4+L1JvdGF0 ZSAwL1RhYnMvUy9UeXBlL1BhZ2U+Pg1lbmRvYmoNMiAwIG9iag08PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU1NTM+PnN0cmVhbQ0KeJylW9tyG0eS fWcE/6Ef5QkZ6rp0XeZpfZG1sxtje8aadWzI+wCBIIkYEC0DoBjcr988J6tv uFDwjh0Borqrq/JyMvNkNfTm3S++uttdX9VVPfMuy2dsXLW9u76ytpnFWNkc Zi5UD3LBxFlt5UKa5aaydZpZU7nazJypTM4zH2XkZrlayNy64UQnC5h61ngZ 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 lDb8uID8kphfxJLBUgR0iIPFhkgjQzWqoIclQV8zTYd6LswWaMVxjCFn9pq7 ggJBGg3UFlnUMwxQdsThRg0p9vS5L+QIRV81tRaaxITYgGYzPwnZatALKHIT G6UGNRPLBfnKtIlMIPhvatISSkCy1ejbGwDI4baHGSFuwKN1OYb20EjiGjFv Cv4bwHJqhIKvxOMsKOC148Tph+ECbD5YKBOrRekIgD4TFclM0riAP2JFcBik H+0PjBpNiQiYKvCefOkYGNPasBBfGcmmTASismZf9FLyQG60DWMv79UexTeC axi10fbaJFqGKE+Y3OjpSDF4nXnBakg3WItFfWqIATnfvr++evODqQwPMt7f Xl+Zqpb/TYUTEmFp0RM878V2b979ksqrwDt8vLu++vCq+up/qvf/cX319r0u dvA4SI78wePHc9/8YCv2naf2RV+l+x6/eZxe+fslggRJWlKesV6FSixfFx9e /XW12La79vYrY1/tq/9abvFldbtazPf81m7w59zSeMEo+0+W5rJ//+pr92qJ j9/x8YiPFT62eiO9euhnbPCxx8dOrp/biifUk62+rHHiC7EDjX97ZX77alb9 8LiGZuvqx/kDvizPqeh5bDda68OrP5+1B6hcmm7MTb8kaaxP+Oa3VxaSfnNz AwG3y93u3LZ4nzNd5WtZRmgfljkvLV4NHGx+kbR4qXXCrg7SnnkU51KHj/Kx H+H4uUIgKUbaHhW8vu6uEyPP+HiDj3cdlDj1phttv4DVk8KftZFFb96ckPtL NvKsE0c28vTo3Vm04d1/GD/9kv8shZpsdZFs0u2ZY9EaiPbTYgGwPX6a71f4 IvF/DuoeaXVY6yVBccg/2fYiMQ3boSM5A+T8+b6FeJuzhsR79PESL4mn7+Qm +10koBSlE3aMkO+79pHy7bfPXwjaYZE/ErOjrS8RtUn5pC0TZP339olJ/qat nunzx+p2udTsOMefXTWvUCh4U4oFS0P162qz4axzEef0BxyjvV9QDAet0itM BL1Is8jXyUeaZWj29rMKWP1a6th8U/3Eb+sV/yyrb57m25uKmm2rbxVUj+cS LV6dgWAMe76UOjJfZk0EvEijwF9WHJetGir9yrDcbFabO2r09mG+YiWTOoE/ Ny/UCavndKMNXhLf8YhvIs1F4kvBtBdW6MaxNTtQ9X1b3a7WSzrlVrxSQLmt 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 f7u++j/eY8yzDQplbmRzdHJlYW0NZW5kb2JqDTMgMCBvYmoNPDwvQml0c1Bl ckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1RE ZWNvZGUvSGVpZ2h0IDI5My9JbnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCA5NTE2 L1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2JqZWN0L1dpZHRoIDI3Mj4+c3RyZWFt DQr/2P/gABBKRklGAAEBAQDcANwAAP/hAFpFeGlmAABJSSoACAAAAAUAAQMF AAEAAABKAAAAAwMBAAEAAAAAAwMDEFEBAAEAAAABAwMDEVEEAAEAAADVIQAA ElEEAAEAAADVIQAAAAAAAKCGAQCPsQAA/9sAQwAIBgYHBgUIBwcHCQkICgwU DQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04Mjwu MzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgBJQEQAwEiAAIRAQMR Af/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMC BAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNi coIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp anN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC w8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMB AQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAEC dwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEX GBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5 eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A7gag 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 H+1V+28F29piS4PmOPXpXo9ywGelc3qV0OQDWnLYw9o5GHMkUAKxgACqDku2 asTyZY1mahqEOnWjzysAAOPeiwN9yprusQ6NYmVjmU8Inqa8l1C9mvrp553L Ox/L2rQ1jVJtUvGnlPH8K/3RWQVLt0rrpw5UcU6nM/IiVCzVcjiwKWOLFWFS tLGbYipTXG9wg5C8n+lTnCIWPQU2FDt3N95uaduggC0EEVMBimuncdKbQIfE /qalVzG4devf3qqOKlDetSNo0lKypvT8RTgcVRhlMTZU8VdyJF3L17iuapSt qhJ20Y7dRuqEtTlyTXOWXd+BTWf5Sx6CoS/OKr3ExPyg8Cqo0ueXkZtlaeQy zAHuc06oITvd5O3QVNXoiF60tIKWmAtLjNNpccUAKMCu1+Gd4n/CRy2Ehwt5 AyL/ALw+YfyNcSRV7Qr1tO1uzvVJHkyq34Z5/Sk1cNtT2R7cJgSKCFYAg+x5 qr43t7Ii3a1AyQB8vOEIJH6g1p6/LHbpNKDhCPMB9iM1x/gy1vNXOp6hON9i 2MBjySp4A9OP51lVp88Dsw2I9hWUi1ovhG1tZINUvoN8jsSoeQBUHbj1q3NL tVZDFZMqPgKSzsw/OrN/PFEiRCK1DpJn5nMhA+gqpdW1xOLlY4pyrAP90Qqf 61UYKKsjKpWlVk5M1/C/iiSx1OezvJkNmXCRoicxk9/YV3N1OEzz1ryRLW5a d4Io8Bkw3kjaufdz1rrtI1JrjRxbyzJJc24wdhJ+Uep9amrD3eZCpS96zLuo XmAea5i7uNxODUl9eliRmsyWQBCxPAGa5DtSsVru6SCNpJGCqoySa8113WZN VuDziBD8q+vvV/xLrTXk7WsTEQqfmI/iNc0ea6aVO2rOStUu7IrsN1Oji9ql CZqRFraxgIqcVIq07ApwHFVYCvN8zJEP4jk/QVMBxxUEX7y5lk/hX5R/WrOO BQgYgFOx7UAe1OPFAiF48cjp6U0Hips1GUxyKlotMVc44qeKVkIPaq2T609X x1pCauXyqzDen3u49adGKppIFIIODV6KVZDzw3865q1LrEIu2jIixAJ9BVG5 kKwse54FWpThcetUJB5lyidl+Y1tQjaBJPEmyNV9BzUlJS1sAtFIeKPfNAC0 7pSAd6O1ACMeKbJJ5UXWjq/0qpeSF32DtTQmew6zff2/4c0G1sJlkur+GKJ9 pzswBu3Y6dK7iLSodM8NNZW8fyxw42P8qn1J9zXMfC/QF0/Qorh4/MlkAY8c hm5x+Veg/I8R3yb4f4lkH3+38/5UntYa1dziL25EV7EiSW8Ilj+YWyb2z6VR uLmUsJ3hYso2Mbls47Z2CupvLS3tU1ALFbqI2V0OeVrO1rV4bR9RSI2/mPFH gAckmqUbicrbHMXTziCWJzMyw4dS3yrgnso61rabGbe8d4mfG5EztITcfvDA 9qz7m9urt7qdj5gVEXYgA5HT9a6jQ7RrZbeEyOJY4zPMsoyC5qmrKxMXrc57 WIGtNTkjY5XOVPqK5DxPrX2eE2sLfvHGCQegrvfGdu9j4fi1CfAmBO7n1ORi vEr2d7i4eWQ5ZjXFCj72p2zrXirdSm5yec5oVeelKBlqmVORXUcpEFqRVp7L z0pVGOtADdtNlYRxO56KCalI5qrfH9wEz99gv60mC3EtIyluoPU8n8ascZoQ YX6U4c80CuHSj60uKMcUDIyKSpCp9aj59KQxCgbkdaZwp5qQcU1xuHvSsO4b gO9SxyjvkH1qsGxwRzThg45pA1ctz/eH0qtCMu7HqTiiiin8CJJlpaKKsA7U lFFAD84FDcDNFFAhnRGbvTNHtlvdZtopD8ryqp4zxmiimthM+oNJtUXTYVjJ QkKMrx1GT/hVvcJryO3lQMm5j6fd6UUVL3ZS2PPvFOsst9qVsluihzGhbNc7 cXDfbI22qTK25sjso4FFFdEEYVGbXhyzt9QgtC6bHnuizsp9Ogru4ePPWTEn mzeXkjkKO1FFRP4mi4fCmeSfFDV57rxC9iMpb24AVA2QTjrXnUjZY0UVBaBR xVjotFFJgK4zTelFFAgBzgVRuH8y/gjxgLlvrRRSZUdy4KcoyKKKokMUHiii kMbmm54oooGLSUUUhkTjvUdFFSxn/9kNCmVuZHN0cmVhbQ1lbmRvYmoNNCAw IG9iag08PC9Db250ZW50cyA1IDAgUi9Dcm9wQm94WzAgMCA2MTIgNzkyXS9H cm91cDw8L0NTL0RldmljZVJHQi9TL1RyYW5zcGFyZW5jeS9UeXBlL0dyb3Vw Pj4vTWVkaWFCb3hbMCAwIDYxMiA3OTJdL1BhcmVudCAyMiAwIFIvUmVzb3Vy Y2VzPDwvRXh0R1N0YXRlPDwvR1M0IDQzIDAgUi9HUzggNDQgMCBSPj4vRm9u dDw8L0YxIDQ3IDAgUi9GMiA1MCAwIFIvRjMgNTMgMCBSL0Y1IDU5IDAgUi9G NiAyMSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0lt YWdlSV0vWE9iamVjdDw8L0ltYWdlMjggOCAwIFIvSW1hZ2UyOSA5IDAgUj4+ Pj4vUm90YXRlIDAvVGFicy9TL1R5cGUvUGFnZT4+DWVuZG9iag01IDAgb2Jq DTw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNDY3MT4+c3RyZWFtDQp4 nI1aXW8bR5Z9F6D/0E8LZ+C0u76rFosAtuN4MguPs7F39yHYB1qmJO5Iooei I3h/1PzGPefcaoqkR7FmEJFVXXXrfpx769ymn71+F4eL29OTaZjGGBr+lhSG zcXpifdpLGXwLY8hD9eYcGWcPCbq2NLgpzp6N4TJjcENrrUxFozC2IYzrJ2S FgYIcNOYIkZ+rAGjPE6YrGUMWujS6BvGeUyQ7eKIjRUnc2kYC+Zq5HkSir1O knLGkZU7wzSNoWKEUypGdZykASea00T0eOxGHzUqSaNEbds4VVvcxuYxkcfi ZFrg4shV1Jhr/ehNYUd/hKnIKqoUhuBgHJZCFyx1tS+Fb2LVuMFESsBG1+RW eAo+Ch5qZ5M7UQQlFcjFntykAvTyHt6h4WV0WosxRDE0Nemp3JJHzB1EDWsv T0/O/0Txno4JPtArimYcPTT3bixZRoYi5bLX6TgvIOCx2oGTTTROeO818s5G 0UaBCDgz4MB7XFSlnJ2SOYABTUaXNi/lBM7DhIcIBIH+5sBpEMeuARSvcg9t hdSSFUDY4H1jLBi9aEAJcHW1x4MPibANiFuDY0PRTsjNJjhUxjwQbBAVGrGl KEDfOI1ZO6uBFZsnQ5GHj0MwzEcEnTo0ZYOzpTCflmEpQ4TjhITMaBM0iFGA 43yZYw8MB7inNuEeeAnBMRcQA6gAG5yFnqEBbkIcHcMGyzGA34iSifYHGt/F FhnjLWp0JU/NRNYhHvZwkgozJHikQBJOMGFjLOdAoCnK5ZTHVjRKdmCa9DgY MCL8E6Q7Mzzo3BBaT46oXIGy9EhEOIihJG/FShQSbd6MjtJGiWSPJwMNDYnQ JWoUwxxQF+TdQMjZ1jBRltKKo0zvyUVN4A1W2uBBZgFGtRoCqX9lRiqmmHfy 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 k7Pvvg9P1vxzjdGSX275Z+CfLf9c8s9yb67a1Ip/Nvzz0R7WJy/55RX/vN2t l+xzPNToje3s5252C273ls4HP503HWnwAfObnQY3/HOxp3d9stgt3cw2Xe1E 3Ozk38/dYtm91R93qlHR3w8PP98pupF6fxxAgqQeB3B1c7P+fbHLHYMaUnC4 FWhXGz3ZMvXODNpXiw/rzQ6qyq/tWh+Xq9vhZnmn75v11XIUKv68HP5XaF/d LE34m9XZZq1UWJ9vB88v/lvKR11jhtQvy8XmdlhcSMLwYXkmbT7fLodLqwmS vbgbLtd3gx5eYYeU/6LDtXGuJMPy+tP6ThshVVYv15+ulvuWfVwP14uL1VlP zO2l2XNx+y210ae6rjWz/vOVefp6sV12fa4Xf5NbutDlQ3mDewCV817gAxn+ 7Kf8dYX2k35/29Pm36aptR++D/x0/TPaZ33VP7N9TuGHymHYDe3xvLz07VnL Wj6ajofbmt+dsi+1pt02TLv08nCXm/rjWUoftxdHSiVToptUfzo69H67Dn9x pKsp4VI7kvrclpcjU9KBCbMuD0hxuR0p0XWddXtx6LC90/b9OpuG6cdfzdmp UT9K/bPLxc3FctgqdZfDnV22Vx/H4YXdV4L+78vNl+F8qQQZLhe/G1gXuNjm jXbRLa+XN1u73zbLv3+24rH8+K+WRguhHSue4qml/ufNmWTd6j58DIxna8Ct 9mDs6Sv6jS7t3+s894PzcjljTnhonvDS/BQILfrenkmGs2eU1fCw1j7Otr4+ 7/KSjXn+fA7X786eFKTd3t2+Wc6LY7l7unbZ/F5f2X86K/c1z01XnsP/5nNo h53b99Ke0s+hnVnwux/v/AF4Pn8MoNiIg47eh+BxRCPVNgPw22uz/iXUEVjf A2h7pftc4BtW5E3idUubePWA7F4BD2RL7vcPbtAPqXsbfgMpwU272F32V/MV f39H6+HdPL86JDCXDx1V9aL24KjOE+pMZ/Dn00wf7unGescQNDwzFapppj9f dts5f7NHkOZNO6Ky3sm+mGnLzW7V/+2Ix/327bxpOOQzZ/P850O/XNiybxKV xFenx/EHVR54wxtrmC9LEWeVLeMWW9WST4aS67U9U0OggtTBMlyt8G1xZhfw nbGZq493K6OvT4e3gtTZEhxjofv6ZuhM58PycnF1LiHfMCLo37FZNKHwu+3i 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 YDVgFeBeZVPYSsDvAdoQ3BCyMIRrCF4YzCWYM8yFZj7MlGDKMPGbTbtMnMNk CctrMCw0vG04ZRAtDMRbtLjdd6BNG5eYB+yI0IZF5DVo8H4NXhWwOWBXAL8r YH8Atz/grYBPAnhHwLCsPBhEbUFYjOHh0VJSHBtb0C71FRV4ZM5xHrzME1lM jg5XuUeyzINKy8e5WzC+t6wFc9klHh35s6yQX7JyJcoKLfCEFrs9W0LLCjwL QTiI8IFAoS1BKKsstnHmrMZZsbGNjY04tnHWzMbGmSj2f3/Cv7UB/5kErm/0 SwjITIgGiJkzZ8XOBOo+BaLRn2aS3EwhSyo3xrYg8rf6TB/Hw4sFB8AAhGqw D+AFdAEuAy4BLgIuAH4GdAJ+AvwI+AvgB8B5wDnA94DvAGcBZwDfAv4M+Abw NeArwJeALwCfAz4DfAo4DTgF+ATwMeAk4CPAnwB/BHwI+ABwAvA+4DjgPcAx wLuAdwBvA94CvAk4CngD8DrgNcARwKuAVwCHAS8DDgFeArwIOAg4ANgPeAHw POA5wLOAfYAOQDvgGcBewB7AbkAboBXQAvAAdgGeBuwAPAXYDngS8ATgccA2 wGOARwFbAY8AtgA2Ax4GbARsADwEeBCwHvAAYB3gfsB9gLWANYBmwGrAKsC9 gJWAJsBywDLAUgC8AOMlgMUAeP3FiwALAHcB7gTMzyTHeYA5gDsAswHwqoln AhoBtwFmAG4BTAdMA0wFTAFMBtQDbgbUAWoBNYBqQBWgElABmASYCJgAGA8Y BygDuAE3AcYCSgElgCKAC+AEFALGAEYDRgJGAPIAWYBMgAOQAUgHDAGkAQYD BgEGAlIBKQA7IBmQBEgEJAAGoJrfZub+u1LZb23Av5bI9yRIOo0f5L3+q58i VIcaURNah7ah41iG7RD/RrQEbUE70UH0GjqHJTgUj/onvu/4RRJbkB4h33fe Bb7Lvv7iH7xfeMdLTD6J+ITPwJ+h58RLkMpb5+v0LvB+6Osvesk73ockdb7+ vnOcA8nYFUTzkB7KLojrxEvET4jfgX71F3q46Z8wazT4YBKqBT9MAUxDDcDj 0QQEc0j47uZW8MdMdDuag+aieehOdAuaDXwX+h26G92DlkG+Ufg2h5xdgBZB 6VK0HK1Av0crhe+cFkHNJcL3Tyv8JcuBVwl1yTXo11HLhW+jWJtmtBYiQr6I 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 Slg0iidRMGZajiTsAgvpoPGYTeIuaJygt8mfHGH4cIoHjwiVT46l7Itj+RJh SuuMwuZyaWVvjn3iY9x77dNLYOUvo+uHv7l29nTKfgHuv2AGLIV2NUR6XUUk nlfvBvEq9otpLJhUVxfRMfkpye++G/qsyE/8ryc3SBOe+rvrT4klw552N33q +nehB5PAgpMhCown6W+Q0bTqdVUMid8UyayWGrLaWVyPQtb69LdltNnkKV1T N26d0jJgLmrPznpgSnbtNCm1pK4g9/5M7pO4mGe+a1xsy4uOWZo4akxRY0lZ fUHiqATQQA196VOVwRiWvUFE8Dd4Z1Zp2FjqoiIjNZuiRTGC2wTmXKTMWPAy /FST/+b1Dw/InhZ2HIifpTB08n22inU0avi3qw4cyDJ21dTUi2/Ef6ehZ7iF /qBnbuXcqvFs/0pHQ/sNqkj0IXYaOANPA2e8TnWjY4n4Y/DvUdzXSBQ3wPhM gcLQoaCyotwUIpRVJZFvWFo5fczk/NKMpUvF8p7qBX6IBt579ZGp+ROHH+Ur z99fnrewB9qPhfbniPeEziTY/jqCztihGcWJ8YPcI69Fr4sAD/oaNP4w9P4d fEFiqxn678iZBDstUbEdS6xPqF5S5fWLD9HocZNTCzsND4lje6rLFvVPKkqL qqwdfhI86Hlo9cfiWOhTdU20mkZqRIEIKh1HePWPoB0NLPiP7ODZT2awfYHc dBHYvbqoGlwreX9h4f5CWK4K5W0ZfvoFTxvF/3j29o1P/eC+lQWbF72YK469 /hp1Dr/A1Q/H0OXDy+lvoOUP6VH+29ByMimqiaVJ8TxJGDUqIpkk0Xg+gf0S ZtS3Vbsgsshtnq1ma2IR+9wcPxo/NbOPuem3fMzlv33hnqb7vzo7Pi0uJiMx vbwkf/Tw0JrtGdn/BCr8prnPPJHr4XhdWmkOqLL0K/Poo/IP/Dz0GekX/z8k OotuoCe4fG4t9wH3AR/HuzCt4X8j5AlLhUPCITFSXC7uE6+p8lT/AOk3Xyap 71X//R9Ne/6aSROp6dN8cGuKiIwY+FTap6RLI0lbE5bWKOmncoqc/idJPkyb lPThrUlXonvqbvobSnvupr+5dONvPUU13E130910N91Nf8Npm5JuRNujXwtP MamQXEoajLkcW4xpzl89bVTS0S+X4lIwtShpfdzP76a76W66m+6mu+lukhMh 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 ff0RSO/oj+s/1p/Wn9df0l8zcAaNIRpygiHFIOmPGzINuYZCyJyhzFBlMBhM hiaD3TAX6DZDl8FrCBiWGpYbVkFaY1hveNrwjGGr4SXDNsCdht1QZyTtg5py agulVWFpH9SR005ITVDjILTynuGw4ajhhGEIeG0gcZXhDJSYa7gAfaFqmPEk FcZuHMy7R8n3SArMtK1kOsy075Ny8ip5jcwgr0OqIvvIflJNDkCaRd6GpCf/ Sn5JDDAP/4MYYSZ+QkzkIrlEzOQypAbKU540UpGKpAmt2Sz+XvwDsYhXxauk Rbwh3iB2GCaeOFSiSiRzVJGqSNKqilHFkK+oklRJZK5qgiqd3K8qUZWSB1Rl qjKIBRTm/C4ciVJ2uqUPQF4KeTnkVZDXQF4P+WklP4O5Qj8X0lLEufrliKv0 a/TrlfunlTw3lJ5B/lb9S/ptkHfqd+v36Q/q39Mf1h/Vn4D7YBqCfEZ/QUk7 Me/E65D+sn6YnWDyQ/yv8Vxcq1jZCSkFbL2ZjCU/hFQCse8Y9OcMpGlUTdWk TJWjyiHTVfmqfFKuqlJVwRhQXaqOzQ0djEokofp50LNiyOWE5D8M1xrgdcB1 Nsw8LvSMVhdyl/Vp+oq/SM74jHyncmmf8fxO5W9X/4vokHYb/u1kfxG5t8r8 Mv38vH26kx7/U/OX1fNPUf+vZau/VLt38r9b+38n3/wy/cr5b/T7z2WXO8n9 rLl2Oz/5onP3s+Lc7cbp8/Tjs8p9nvb+WJ/uVO6zYujn7cMXrfeXzH8OPb6s zNvNpy/a5q33OZ+jzH+3r39qG/459Lyb7+a/kczeMoQ0IQvfMu5+Q/l/7xvK VvLSyNeFkg2ktmRDyeaSLSUvlLwCaUvJDsBdJa8UPQ3U3qJAyWaWSw4UHS7Z W/JOyTtwfb/ocFGAJeCwdKTkSHF6yfGSj4sul5yGu/Mll4rnlVwr5UqOlGqK 00uj4emR4prShGJnsaW4pthZcqlUgymBpaCkIId9KdCWsd+YV95hHfgO2wop FX93dBz5KqTx+FYrkX+F99lychxSBblIfkcqye8hVXPnuF+TGvCia2QWP5ZP JQbwmWwyG6Q7ybwwC6SR9OJlJWklGSwzCjK7ZoSlHHiWNnWezMdnBZBLgR98 noNaTwetE0FrAf/VARX+RLEG38a17KdJIQnQqxgikjhoXQ1lk0kE0UOKwt9p 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 xENeectyr5+WH3o7qOURj966zqR7TGrqtzblyc1MmmjSiV77NmXe55S5JjVy SKE7IZ5XYKxJF3r0QKVJq0y6yaRvmvQt826aseIQnXYOY6+xR3EhvqIgrUes Suz/BOGL6RKT6Rxzjrv8u1olbNlb9iYW8P4Kn6IKPkW9dxBrvClGeR5NhZID SeJK8PNSXjGp+OybQ5+T6FRXRCe5GWIxacFB6t2l8STG5AoVkxlDbajXPMKs kyUucXYaXJ9QrnDp/OaqUyV+lMSipFnjkpiu4JYNbt0ac4vJQUl3lPRAiaZx J9BuzXDbCIvm2+C25dTlXwpbznH6nMqpKxrVTDM1A6ZmuqnZztR0yL61hrf2 HnRa6+1mkJRyqbw9p1S/A6U96XNHTl3+nTLPJAEzScRMFOkt+80VjfySqphO MZ2ZA8nW9gf9QerHItmmk4S9a5egPpUYjlUQjfzKKviVteBXVsOvrA2/sj74 lXXgV9aFX9kY+JX1w69sE/iVjYVf2abwK9sMfmWbw69sHHQgHjqQAL+yLeBX NhF+ZVvCr2wS/Mq2gl/Z1vArmwy/sm3gV7Yt/MqmwK9sKvzKpsGvbAB+ZdPh V7Yd/MpmwK9se/iV7QC/sh3hV7YT/Mp2hl/ZTPiV7QK/slnwK9sVfmWz4Ve2 G/zK5sCvbHf4le0Bv7K58CvbE35l8+BXNgi/siH4lQ3Dr2wEfmWj8CvbC35l 8+FX9iz4le0Nv7Jnw69sAfzKngO/sn3gV/ZXWL++WL9z4Ve2H/zKnge/sv3h V/Z8+JUthF/ZAfArWwS/sgPhV7YYfmUvgF/ZQfAreyH8yg7GbzCHwK9sCfzK XgS/skPhV/Zi/NJ2GGkD3//wSWg2hdvFHAozxVwKd5BNnkcl/F6m34jVYo24 U2wSm6lkJ4V54h1RJ+4R+yn8VnwtvhEL8FviCvyW+H78lnghfkv8O/yW+AH8 lngRfku8GL8lfhC/JV6C3xI/hN8SPywXyDXiEblWPis2yufl82KTfEG+IDbL lyRdE+Qr8hXxutwkN4k35Da5Tbwpd8gdYqvcq1qIbaol2ZDjKlNlinoVVmHR oPqqvuKEOk+dRwanUBVKqYpUkVTqTfWmtNQ2tU1qVaNqpK3eUm9Jn9qpdkpH 1apa6apdapeMUXWqTvrVbrVbNrFetl6WsdYr1iuyqfWq9apsZm22Nsvm1mvW azLOesN6Q8ZbW62tMsHabm2XLawd1g6ZaL1jvSNbWgesAzLJ+tz6XLayvrS+ lK2tr6yvZLL1tfW1bGP93fq7bGv9w/qHTLG+s76TqeyZWqaxT2oZsE5YJ2S6 pj/ZTvu0T2aQSriyvW6qm8oOurluLjvqeB0vO+lWupXsrJN1sszUqTpVdtHp Ol1m6QydIbvqjrqjzNaddWfZTWfpLJmjs3W27K5zdI7soSnIXN1T95Q9dVAH ZZ4O67AM6qiOypDO1/kyrHvr3jKiC3SBjOo+uo/spfvqvjJf99P95Fm6v+4v e+siXSTP1sW6WBboQXqQPEcP1oNlH12iS+Sv9FA9VPbVw/VweS570Jb92He2 PI+9Zsv+7C9bnu9ariULXdu15QDXcR1Z5Ma4MXKg28RtIovdpm5TeYHb3G0u B7nxbry80G3htpCD3ZZuSznETXaTZYnb2e0sL/LbflsO9Tt+R17sj/HHyGH+ Jv4mcrg5ufL7w4KwiO3wnhB+B5kQ2ylIq43VRij7QftBYeEt6vqMzTxjMxvZ zB80qA00KAP3ReV22Rk9OaMnjfRE2mPJssTJDBW0+usRdKeWL/rS6fZ07nz2 iS9w7yOkT8Y6F9C5sdAZ4AxCWuRciHSgMxhpsVNC6QDKXYR0gDMUaZFzMdKB zjCkxc4ISouo3q+RDnAuQVrkXIp0oFOKtNgZSelAqnc50gHOFUiLnCuRDnRG IS12RlNaTPWuRjrAGYO0yLkG6UDnWqTFzhA6vw5whhMWOZcRDnSuIiz+DyQy FjMvdK43khlnJHODkcx4I5kJRjJlRiI3GolMNBKZbCQyxUhkqpHITUYiNxuJ TDMSudVIZLqRyG1GIjOMRGYaidxhJDLLSOQ3RiKzjUSuo/kXOpMgkVsgkdv/ Q4nMMRK5y0hkrpHI3UYi84xEyo1E7jW6Mt9I5rdGMguMZO4zkqkwkrnfSGSh kcgDRiKLjEQWG4k8aCSyxEjkYSORR4xEKo1EHjUSWWokcickcg805XeQyEP/ oUSWGYksNxKpMhJ53EjkCSORFUYiTxmJVBuJrDQSWWUkstpI5PdGImuMrjxj JLPWSOZZI5nnjGSeN5JZZyTyopHIS0Yi641EXjYS2WAk8hgk8iQk8jQ05YX/ UCIbjUReNRLZZCSy2Uhki5HI60YibxiJvGkkstVIZJuRSI2RyA4jkbeMRP5g JLLTSKTWSOQdI5FdRiJ/NLpSZyTzrpHMbiOZ94xk3jeSeQUSeQ0S2Q6JvM2a wu9x4HHjyVq2aCEvl6Pk1XKCLJOT5GR5s5wmZ8g75Cx5p5wj75bz5Ifqopha /NfbSDmSLuZXyiv5mZEcLZS8QZLtkDfKicKWN8mbhCNvkbcIV94mbxMx8nY5 U/jlb+RsESvvknOJwwfyAxGnSlSJiI95O+Ztgf/7FH51m5qhblcz1R1qlvqN mq3uVHP4yYm6Wl1Nw7xW8ZMbujsXrRvdnbfnZyFyCs+H2vPvGCw84fuhRodG ZcRNTqHaQj2kHscZhPt9SD2sHlGV6lG1VD2mlqnlqupn/SrSlwJrqfWYtcxa blVZj1tPWE9aK6ynrGprpbXKetpabf3eWmM9Y621nrWes5631lkvWC9aL/ke 9S33HfVV+R73Hfc95aQ4ab6VvlXWWb7VvrVOwPes7znfC057p4PTSs1T9/yS DNRdaq66G+/cO+kraR6Nu5zuMzPoTrKCZriQQqZ4QDwouoiHxMOiG6TeXd2o bhS5arKaLnqqlWqVOEutUWvE2cQrKpLVg2qJKlf3qvnqt2qBuk9VqPvVQvW7 X6Q9oBapxXiGwpwFZKNINnR1AP+m4J8E/q3h16mJKqX+J6spaqq6Sd2sblHT 1K1UU1GLS9WlhoeEfNXP1rUj1pV7jJEr5FNEfFquFsod5A4W2i1xhwnHvcod LWLdMe51opk7z71HJLj3ugtEonu/u4h4/ZRjJ3BcThybEsdqcHya9HYN3UFr 8LXB1wXfpuDb3L3evUG0cCe4k0QS+miLPlLdh9xHRDv3UXc5Sd873RZTnIme OqPv2RTzTd+dTZ1M6n2umH+KpsQTgp+3Jp6qp2jfrJArzXw1Rudzc9wcmu8F 7gga3SU0lkR3CvWc4z7urhKXsfTwHEC4mW6YRnUBUXv8E6rEHvqvtOghWp6+ LrOmQE8F9NSFnvqhp82gp82hpy3MHYGL+vxfy4ruKl8mnI9+59KK7RO9xQyS 5jyiLaQ2y8QKsVo8R3U3iTfFW2Szd5PV3iv2i4Nkt49SM1fGyUTZWqbIdNlB Zsps2VNGZYHsJ4vkYDlUXiKvkNeSpWM7N5PsW7mskItlpayS1XKtXC+3yBpZ K3fLD8laxEg/YRPJT1sDlMuQmSSlHOIYpk+xMomwqaT5ymaS9F42l8mEcZLu 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 ZHN0cmVhbQ1lbmRvYmoNOCAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50IDgv Q29sb3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWlnaHQg Mjg5L0ludGVycG9sYXRlIHRydWUvTGVuZ3RoIDE1MDIzL1N1YnR5cGUvSW1h Z2UvVHlwZS9YT2JqZWN0L1dpZHRoIDI1Mz4+c3RyZWFtDQr/2P/gABBKRklG AAEBAQDcANwAAP/hAFpFeGlmAABJSSoACAAAAAUAAQMFAAEAAABKAAAAAwMB AAEAAAAAAAAAEFEBAAEAAAABAAAAEVEEAAEAAADVIQAAElEEAAEAAADVIQAA AAAAAKCGAQCPsQAA/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0a Hx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkM CwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIy/8AAEQgBIQD9AwEiAAIRAQMRAf/EAB8AAAEFAQEB AQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQEC AwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SF hoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV 1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj 5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8AZfyjO0HOPesS4bng/hmt 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 gD+ZrCRLucBFIC9eK0YPC8lyFMhwM88daVmytEb1h8Ro7uRYVtpw3TmPr+Vb s0R1SKO6uImRsHYnpnvWNpmgRWjKEQZzya6pU2xgFRheKajYLrocdf2TxsZb c+XKp6f3qdpviA7jFKSrr94HrW9eosil0HT0HNcjrGmtIRcwNslXkHHX2NDj 1Q0+52kOoK6goe1WY7jd0Y/SuC0rV33+VIoWRfvL/UV1Ntc+atJakzNoTkcj im/aAxK8/lVVcsmMmleMkhu9TYybJJW2oRjOf0qoQXXnoKubxg5x0qLaDkep oEOsbQ3B2upEQHX1NJrGpJo9ldIib544i2PTPQk1sWsRhUDICjnFcR8RdRCC G0jGHn+d2z1Re351cE3KwOXJFyPPizE7jg5yT9e9KV4GWH4UmWLZOMZ5Apsh z1wRmvRPIbu7ikjOP503cB3P4CmgtxhsU0MQo68+ooFY67zy2Bn8M1KpdF4b NU0cHJAoM5B+9ivsHG54ly2ZGI5JH4ZqjPNIsgKswIJ9qVrn5SSc4qmHYlmJ 2/7xrGdJS0excJSi+ZbmxYsxQ75Gcsc/N2/KrrLnmqdmpS2EpHVsde1aQUNE QPx4r5bM6EaNa0FZH0GCrSq07yd2VzwMDrWZqKTIkaqdvnPsyOw6k/pWtHHu kBPrV28sWu9OzCm6aFhIq/3sdR+VebY9KLsc9bi3tYliXagU8sO/1rSivtPj j2qWY+vFVL7SGnhE9rIFDDIJHFcpqFh4qsw0yWsc0Y5/d8nH0zVXb0Hc7gX0 LufKXjGBStJHjewww7A9q8lTxNqzXYt5GS3OecqQa6fT7eW+tpJnvZGK8Ajp mhxM/awbtc6hn8zIUruzjAYVGukGZzIxVTjvWfH4VvJbWFlnfzCwD5xxmtAe Fb5QfK1CdSAcAvxnHTiklboV7SHckbTWgVdrBWHUkVpQXcUKKsk8KvjPLVl2 nhW7ntYHutQk+0sAzqD8o9s02PwhdLNdeZd/u0IEQUYJyO5q+ZroCnTe7Ots 7+ERk+bEevIcHNPk1ZRgAAMPXvXBPo7xJcyTXD7Yi2CDgYFctqGt3FgEW3vS 8nfcufw9ajmbew3KKWjPXZdWgyyFQcjk1mPeW5cq2NpGMADmvOLHUfFeoSKl vY+YP75UoP1rrdO0vWncjU5bdCBkLFkn8zV2aFzJkurWUUlubu0UrND84ZR1 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 ZSB0cnVlL0xlbmd0aCAyOTcwL1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2JqZWN0 L1dpZHRoIDE0NT4+c3RyZWFtDQr/2P/gABBKRklGAAEBAQDcANwAAP/hAFpF eGlmAABJSSoACAAAAAUAAQMFAAEAAABKAAAAAwMBAAEAAAAArTU5EFEBAAEA AAABT619EVEEAAEAAADVIQAAElEEAAEAAADVIQAAAAAAAKCGAQCPsQAA/9sA QwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMc HCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy /8AAEQgARgCRAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgME BQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQci cRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqi o6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq 8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGx wQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5 +v/aAAwDAQACEQMRAD8A9/oopGYKpZiAB1JoAWkJCjJIA9TWBrXjLRdBtWub +9jhhHRmPLH0UdSfpXn974413xOSNGsxptgel5fDdI49Ui7fUmgD1G41mwtl ZpLhAq9Tngfj0rAm+JPhyOQxxXbXUo42WkTTHP8AwEED8TXAR+HrGWQTapPP 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 ifwFddpPwt8WasVI01rWM/8ALS5Oz9Ov6V6eGwtLDQ9nRVkc9SpKo7yOMrb8 O+E9Y8UXYh020d0B+eZhiNPqf6V7h4R+AenW7R3GuPJfOMHyuY4vx7n9K9ls NGsNNtY7a0tYYYYxhY40CqPwroIOD+Gvw5tPCdp5ip5l5IMTXTrgt/sqOwr0 oAKMCl6UUAFFFFABRRRQAUUUUARywRTrtljR19GGayrrwvpN2pWS2AB6gdPy PFFFAHMX/wAIPDF6STZQAnv5QB/8dxXP3PwC8OOSVVk/3JWH880UUAUT+z54 fLf8fd8v+7Ov9UqWL9nnwzn57zUj9J0/+IoooA1Lb4BeC4iDJFeTf9dLk/0A rfsPhL4KsCDHoVs7DvLl/wCZoooGdRaaPp1hF5VnZW9un92GMIP0q2kUafdR R9BRRQIfRRRQAUUUUAFFFFAH/9kNCmVuZHN0cmVhbQ1lbmRvYmoNMTAgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDMyL0xlbmd0aCAzNTUv TiA1L1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjedFJda4NAEPwr+5hSwn3oqYEQ 8CNpfUgLMTQF8cHEqzkwnuilxH/fO21SSlNQ5s7ZYWfHJQ5gIC4wCsQD6syA zMCmGPTDHALzOXptC96KupzEBa+VUP0D2vBSdKrtJ34h9/wBJeemqfhJ04AX C63xu4O5uLaF/M9yJwp1BMYwCvPmmYvyOFIRH8umlLloVeVlBxZFK1mrIJCX dGpbdODAcV0jyAZuJSpOwfjeDPeX/MSRH4TRcvkYyrqTVd4NxG7sZGOMYpVX 4uDXZcUBo3V+GS0RgmcoUfz0pt2hbd/wQWh8taJRskXv33Yp04OlVqqHyIgz gkUMwp1Xc156O9s0vVtje//rGRt6WPYVvREZHdG59c4ynXeQd9w4/5NDGEdJ 3+kJ4/pDAhlT0x+38imO1nmDrj8VRTsgWEf1OwCzG0aSnPfKxKOlpsBERX8C QzuzPbpOZ6T3Rx+yLwEGAClhqpsNCmVuZHN0cmVhbQ1lbmRvYmoNMTEgMCBv YmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUvTGVuZ3RoIDExNS9O IDEvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN4yMlQwULCx0XdKLE51y88r0Xd0 cnZxddV2zs8rzs9JLNZ3SS1OTs1LScwrAUkXKxgZADUE6bvmJeenZOal63um pOaVZJZU6nroB5cmlVQWpOqHAAkD/ZD80LxMoKJUBXOwDpCoPsgMOzuAAAMA ri0meA0KZW5kc3RyZWFtDWVuZG9iag0xMiAwIG9iag08PC9MZW5ndGggMzE1 MS9TdWJ0eXBlL1hNTC9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/eHBhY2tl dCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+ Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9 IkFkb2JlIFhNUCBDb3JlIDUuNC1jMDA1IDc4LjE0NzMyNiwgMjAxMi8wOC8y My0xMzowMzowMyAgICAgICAgIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4K ICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAg ICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgog ICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRm LzEuMy8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRv YmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0 cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8eG1w OkNyZWF0ZURhdGU+MjAxNS0wMS0yNVQyMTozNDoyMDwveG1wOkNyZWF0ZURh dGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+Y29udmVydG9ubGluZWZy ZWUuY29tPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5 RGF0ZT4yMDE1LTAxLTI1VDIxOjM1OjExWjwveG1wOk1vZGlmeURhdGU+CiAg ICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMDEtMjVUMjE6MzU6MTFa PC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8cGRmOlByb2R1Y2VyPmNv bnZlcnRvbmxpbmVmcmVlLmNvbTwvcGRmOlByb2R1Y2VyPgogICAgICAgICA8 eG1wTU06RG9jdW1lbnRJRD51dWlkOjZmYTFmNzY3LWEwZTktNDMwMi04YjI0 LWIzYWM1ZWQyMjUyNTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHht cE1NOkluc3RhbmNlSUQ+dXVpZDoxZTMwNGQzZS1lZjJjLTRhNzAtYWU1NC03 MTAxMWNiOGMwYzg8L3htcE1NOkluc3RhbmNlSUQ+CiAgICAgICAgIDxkYzpm b3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgIDwvcmRm OkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0 cmVhbQ1lbmRvYmoNMTMgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0Zp cnN0IDUvTGVuZ3RoIDU2L04gMS9UeXBlL09ialN0bT4+c3RyZWFtDQpo3jIy UjBQsLHRd84vzStRMNb3zkwpjjYyAwoGKRiCSRMQGasfUlmQqh+QmJ5abGcH EGAAaDMOCQ0KZW5kc3RyZWFtDWVuZG9iag0xNCAwIG9iag08PC9GaWx0ZXIv RmxhdGVEZWNvZGUvRmlyc3QgNS9MZW5ndGggOTgvTiAxL1R5cGUvT2JqU3Rt Pj5zdHJlYW0NCmjeMjJWMFCwsdF3LkpNLMnMz3NJLEnVcLEyMjA0NTA0MjUy NDYxMojShMjnF2kk5+eVpRaV5OflZOalphWlpuol5+dq6vvmp2DqNDU0BOoM KMpPKU1OxaXVzg4gwAA3TSmCDQplbmRzdHJlYW0NZW5kb2JqDTE1IDAgb2Jq DTw8L0RlY29kZVBhcm1zPDwvQ29sdW1ucyA1L1ByZWRpY3RvciAxMj4+L0Zp bHRlci9GbGF0ZURlY29kZS9JRFs8NUE1NjJBODcwOTM3ODU0QzlCMTcwNTNF MjRFNjQxNUE+PEM3RjcyRjU4M0YzMkVBNDZBOEY5Q0U3NDEyQjg3NzMzPl0v SW5mbyAyMyAwIFIvTGVuZ3RoIDg5L1Jvb3QgMjUgMCBSL1NpemUgMjQvVHlw ZS9YUmVmL1dbMSAzIDFdPj5zdHJlYW0NCmjeYmIAASZGFtF+BiYGBsYwECn2 HUSq3QSRTCkgUqgVRLYJgEVqgSSjdSyIzeMGFjkE1nsRLDIXzJ4KJvcDTf69 aweIDeRhJxn/gEgmsBpGBoAAAwD/uw1BDQplbmRzdHJlYW0NZW5kb2JqDXN0 YXJ0eHJlZg0KMTE2DQolJUVPRg0K ------=_NextPart_000_009D_01C2A9A6.76D683FC-- From cignahealthsavings@value09.anhealthplanseffective.work Sat Feb 21 12:45:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 407997F50 for ; Sat, 21 Feb 2015 12:45:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C25FCAC003 for ; Sat, 21 Feb 2015 10:45:50 -0800 (PST) X-ASG-Debug-ID: 1424544348-04cbb0610d14600001-NocioJ Received: from value09.anhealthplanseffective.work ([104.148.124.9]) by cuda.sgi.com with ESMTP id OoNn0034AhNZLzOb for ; Sat, 21 Feb 2015 10:45:48 -0800 (PST) X-Barracuda-Envelope-From: cignahealthsavings@value09.anhealthplanseffective.work X-Barracuda-Apparent-Source-IP: 104.148.124.9 Date: Sat, 21 Feb 2015 11:46:31 -0700 Message-ID: <6451261-6451261_6451261@value09.anhealthplanseffective.work> To: Jhxcb-Pgc: 6402324 From: Cigna_Health.Insurance Savings Vrx-Enn: 64512616402324 Lnc-Alftj: 368722a09baf57a27b39c0ba1f12b194 Mime-Version: 1.0 Subject: Second Notice: Coventry Health Premiums 50% Off. Ends Today Content-Type: text/plain X-ASG-Orig-Subj: Second Notice: Coventry Health Premiums 50% Off. Ends Today X-Barracuda-Connect: UNKNOWN[104.148.124.9] X-Barracuda-Start-Time: 1424544348 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15637 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 ****************** Notice: Humana Health Insurance 50% Savings _____________ Expires Today. Apply by 02.20.15. ---------------- Blue Cross Health Plans for xfs@oss.sgi.com, Time is running out for 2015 health coverage. But Aetna, Blue Cross and Assurant are still offering 50% Discount on Health Insurance. Visit our website to get up to 50% off Health Insurance from top national providers before the deadline, http:/signupnow.anhealthplanseffective.work If you prefer to speak to a representative, please call 888-496-4901. Don't Wait. Visit or Call Today. ---------------- ---------------- 6402324 - 6451261 Change subscription status here http:/cancel.anhealthplanseffective.work ---------------- P.O. Box 947, 856 Orci Avenue,Hoorn,Netherlands,7010SH , ****************** 368722a09baf57a27b39c0ba1f12b194 Jutta Hering born 1924 is a German film editor.Ingela Maria Olsson born 28 February 1958 in Nybro, Sweden is a Swedish actress.Olsson was active in many different theatre groups during the 1980s. She started working at the Galeasen theatre in 1989, and appeared at Stockholms stadsteater, Parkteatern, Orionteatern, Dramaten, and radioteatern. Her film debut, in 1989 was Annika Silkeberg's mheten. She is most commonly known for her part as Inger in S som i himmelen, in which, her sister Ola Olsson was one a cowriter.Olsson was active in many different theatre groups during the 1980s. She is most commonly known for her part as Inger in S som i himmelen, in which, her sister Ola Olsson was one a cowriter.Kevin L. Boyce born ca. 1971 is an American politician of the Democratic Party. He currently is a member of the Ohio House of Representatives, serving the 25th District. From 20092010, Boyce served as the 47th Ohio State Treasurer.Buganda is a subnational kingdom within Uganda. T he kingdom of the Ganda people, Buganda is the largest of the traditional kingdoms in presentday Uganda, comprising all of Uganda's Central Region, including the Ugandan capital Kampala. The 6 million Baganda singular Muganda often referred to simply by the root word and adjective, Ganda make up the largest Ugandan ethnic group, representing approximately 16.9 of Uganda's population.Buganda has a long and extensive history. Unified in the fourteenth century under the first king Kato Kintu, the founder of Buganda's Kintu Dynasty, Buganda grew to become one of the largest and most powerful states in East Africa during the eighteenth and nineteenth centuries. During the Scramble for Africa, and following unsuccessful attempts to retain its independence against British imperialism, Buganda became the centre of the Uganda Protectorate in 1894 the name Uganda, the Swahili term for Buganda, was adopted by British officials. Under British rule, many Baganda acquired status as coloni a l administrators, and Buganda became a major producer of cotton and coffee.Buganda has a long and extensive history. Under British rule, many Baganda acquired status as colonial administrators, and Buganda became a major producer of cotton and coffee. From david@fromorbit.com Sat Feb 21 15:38:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1561F7F50 for ; Sat, 21 Feb 2015 15:38:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B5E2AC004 for ; Sat, 21 Feb 2015 13:38:17 -0800 (PST) X-ASG-Debug-ID: 1424554690-04cb6c4bd118020001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PDgtMjBuhL7sdu3k for ; Sat, 21 Feb 2015 13:38:11 -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: A2C5FQDZ+ehUPDkjLHlagwaBLIY2qXkBAQEBAQEGmD8CAgEBAoEZRAEBAQEBAQUBAQEBODuEDwEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiCcH0kgBAQEHAgEfGIVvhQyEbgeEKwWEKJEegVaBeIEchWSDb4hFgiQcgWQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Feb 2015 08:08:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YPHkV-0006YC-OD; Sun, 22 Feb 2015 08:38:07 +1100 Date: Sun, 22 Feb 2015 08:38:07 +1100 From: Dave Chinner To: Andrew Morton Cc: Theodore Ts'o , Tetsuo Handa , hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150221213807.GI12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150221011907.2d26c979.akpm@linux-foundation.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: 1424554690 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Feb 21, 2015 at 01:19:07AM -0800, Andrew Morton wrote: > On Fri, 20 Feb 2015 22:20:00 -0500 "Theodore Ts'o" wrote: > > > +akpm > > I was hoping not to have to read this thread ;) ditto.... > And yes, I agree that sites such as xfs's kmem_alloc() should be > passing __GFP_NOFAIL to tell the page allocator what's going on. I > don't think it matters a lot whether kmem_alloc() retains its retry > loop. If __GFP_NOFAIL is working correctly then it will never loop > anyway... I'm not about to change behaviour "just because". Any sort of change like this requires a *lot* of low memory regression testing because we'd be replacing long standing known behaviour with behaviour that changes without warning. e.g the ext4 low memory failures starting because of changes made in 3.19-rc6 due to changes in oom-killer behaviour. Those changes *did not affect XFS* and that's the way I'd like things to remain. Put simply: right now I don't trust the mm subsystem to get low memory behaviour right, and this thread has done nothing to convince me that it's going to improve any time soon. > Also, this: > > On Wed, 18 Feb 2015 09:54:30 +1100 Dave Chinner wrote: > > > Right now, the oom killer is a liability. Over the past 6 months > > I've slowly had to exclude filesystem regression tests from running > > on small memory machines because the OOM killer is now so unreliable > > that it kills the test harness regularly rather than the process > > generating memory pressure. > > David, I did not know this! If you've been telling us about this then > perhaps it wasn't loud enough. IME, such bug reports get ignored. Instead, over the past few months I have been pointing out bugs and problems in the oom-killer in threads like this because it seems to be the only way to get any attention to the issues I'm seeing. Bug reports simply get ignored. From this process, I've managed to learn that low order memory allocation now never fails (contrary to documentation and long standing behavioural expectations) and pointed out bugs that cause the oom killer to get invoked when the filesystem is saying "I can handle ENOMEM!" (commit 45f87de ("mm: get rid of radix tree gfp mask for pagecache_get_page"). And yes, I've definitely mentioned in these discussions that, for example, xfstests::generic/224 is triggering the oom killer far more often than it used to on my 1GB RAM vm. The only fix that has been made recently that's made any difference is 45f87de, so it's a slow process of raising awareness and trying to ensure things don't get worse before they get better.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Feb 21 15:48:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF3137F50 for ; Sat, 21 Feb 2015 15:48:32 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9148D304066 for ; Sat, 21 Feb 2015 13:48:29 -0800 (PST) X-ASG-Debug-ID: 1424555305-04bdf05c00165f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Ym3G8AHq35F3YMiQ for ; Sat, 21 Feb 2015 13:48:25 -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: A2DvCwAr/OhUPDkjLHlagwaBLIY2qXkBAQEBAQEGmD8EAgKBGUQBAQEBAQEFAQEBATg7hA8BAQEDATocIwULCAMOCgklDwUlAwcaE4gnB9JIAQsgGIVvhQyEbgeEKwWNYYdlg06BHIMVhj6FB4M+gh+CBSoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Feb 2015 08:18:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YPHuR-0006Z7-SM; Sun, 22 Feb 2015 08:48:23 +1100 Date: Sun, 22 Feb 2015 08:48:23 +1100 From: Dave Chinner To: Tetsuo Handa Cc: hannes@cmpxchg.org, mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150221214823.GJ12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <201502212012.BJJ39083.LQFOtJFSHMVOFO@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201502212012.BJJ39083.LQFOtJFSHMVOFO@I-love.SAKURA.ne.jp> 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: 1424555305 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Feb 21, 2015 at 08:12:08PM +0900, Tetsuo Handa wrote: > My main issue is > > c) whether to oom-kill more processes when the OOM victim cannot be > terminated presumably due to the OOM killer deadlock. > > Dave Chinner wrote: > > On Fri, Feb 20, 2015 at 07:36:33PM +0900, Tetsuo Handa wrote: > > > Dave Chinner wrote: > > > > I really don't care about the OOM Killer corner cases - it's > > > > completely the wrong way line of development to be spending time on > > > > and you aren't going to convince me otherwise. The OOM killer a > > > > crutch used to justify having a memory allocation subsystem that > > > > can't provide forward progress guarantee mechanisms to callers that > > > > need it. > > > > > > I really care about the OOM Killer corner cases, for I'm > > > > > > (1) seeing trouble cases which occurred in enterprise systems > > > under OOM conditions > > > > You reach OOM, then your SLAs are dead and buried. Reboot the > > box - its a much more reliable way of returning to a working system > > than playing Russian Roulette with the OOM killer. > > What Service Level Agreements? Such troubles are occurring on RHEL systems > where users are not sitting in front of the console. Unless somebody is > sitting in front of the console in order to do SysRq-b when troubles > occur, the down time of system will become significantly longer. > > What mechanisms are available for minimizing the down time of system > when troubles under OOM condition occur? Software/hardware watchdog? > Indeed they may help, but they may be triggered prematurely when the > system has not entered into the OOM condition. Only the OOM killer knows. # echo 1 > /proc/sys/vm/panic_on_oom .... > We have memory cgroups to reduce the possibility of triggering the OOM > killer, though there will be several bugs remaining in RHEL kernels > which make administrators hesitate to use memory cgroups. Fix upstream first, then worry about vendor kernels. .... > Not only we cannot expect that the OOM killer messages being saved to > /var/log/messages under the OOM killer deadlock condition, but also CONFIG_PSTORE=y and configure appropriately from there. > we do not emit the OOM killer messages if we hit So add a warning. > If you want to stop people from playing Russian Roulette with the OOM > killer, please remove the OOM killer code entirely from RHEL kernels so that > people must use their systems with hardcoded /proc/sys/vm/panic_on_oom == 1 > setting. Can you do it? No. You need to go through vendor channels to get a vendor kernel config change made. Cheers, Dave. -- Dave Chinner david@fromorbit.com From hannes@cmpxchg.org Sat Feb 21 17:53:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 306087F50 for ; Sat, 21 Feb 2015 17:53:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B431BAC002 for ; Sat, 21 Feb 2015 15:53:19 -0800 (PST) X-ASG-Debug-ID: 1424562795-04cbb0610f192d0001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id tBexvz2StSK0EkbA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 15:53:16 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Sat, 21 Feb 2015 18:52:27 -0500 From: Johannes Weiner To: Dave Chinner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150221235227.GA25079@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20141230112158.GA15546@dhcp22.suse.cz> <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219225217.GY12722@dastard> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1424562796 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15648 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 20, 2015 at 09:52:17AM +1100, Dave Chinner wrote: > I will actively work around aanything that causes filesystem memory > pressure to increase the chance of oom killer invocations. The OOM > killer is not a solution - it is, by definition, a loose cannon and > so we should be reducing dependencies on it. Once we have a better-working alternative, sure. > I really don't care about the OOM Killer corner cases - it's > completely the wrong way line of development to be spending time on > and you aren't going to convince me otherwise. The OOM killer a > crutch used to justify having a memory allocation subsystem that > can't provide forward progress guarantee mechanisms to callers that > need it. We can provide this. Are all these callers able to preallocate? --- diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 51bd1e72a917..af81b8a67651 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -380,6 +380,10 @@ extern void free_kmem_pages(unsigned long addr, unsigned int order); #define __free_page(page) __free_pages((page), 0) #define free_page(addr) free_pages((addr), 0) +void register_private_page(struct page *page, unsigned int order); +int alloc_private_pages(gfp_t gfp_mask, unsigned int order, unsigned int nr); +void free_private_pages(void); + void page_alloc_init(void); void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp); void drain_all_pages(struct zone *zone); diff --git a/include/linux/sched.h b/include/linux/sched.h index 6d77432e14ff..1fe390779f23 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1545,6 +1545,8 @@ struct task_struct { #endif /* VM state */ + struct list_head private_pages; + struct reclaim_state *reclaim_state; struct backing_dev_info *backing_dev_info; diff --git a/kernel/fork.c b/kernel/fork.c index cf65139615a0..b6349b0e5da2 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1308,6 +1308,8 @@ static struct task_struct *copy_process(unsigned long clone_flags, memset(&p->rss_stat, 0, sizeof(p->rss_stat)); #endif + INIT_LIST_HEAD(&p->private_pages); + p->default_timer_slack_ns = current->timer_slack_ns; task_io_accounting_init(&p->ioac); diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a47f0b229a1a..546db4e0da75 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -490,12 +490,10 @@ static inline void clear_page_guard(struct zone *zone, struct page *page, static inline void set_page_order(struct page *page, unsigned int order) { set_page_private(page, order); - __SetPageBuddy(page); } static inline void rmv_page_order(struct page *page) { - __ClearPageBuddy(page); set_page_private(page, 0); } @@ -617,6 +615,7 @@ static inline void __free_one_page(struct page *page, list_del(&buddy->lru); zone->free_area[order].nr_free--; rmv_page_order(buddy); + __ClearPageBuddy(buddy); } combined_idx = buddy_idx & page_idx; page = page + (combined_idx - page_idx); @@ -624,6 +623,7 @@ static inline void __free_one_page(struct page *page, order++; } set_page_order(page, order); + __SetPageBuddy(page); /* * If this is not the largest possible page, check if the buddy @@ -924,6 +924,7 @@ static inline void expand(struct zone *zone, struct page *page, list_add(&page[size].lru, &area->free_list[migratetype]); area->nr_free++; set_page_order(&page[size], high); + __SetPageBuddy(page); } } @@ -1015,6 +1016,7 @@ struct page *__rmqueue_smallest(struct zone *zone, unsigned int order, struct page, lru); list_del(&page->lru); rmv_page_order(page); + __ClearPageBuddy(page); area->nr_free--; expand(zone, page, order, current_order, area, migratetype); set_freepage_migratetype(page, migratetype); @@ -1212,6 +1214,7 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype) /* Remove the page from the freelists */ list_del(&page->lru); rmv_page_order(page); + __ClearPageBuddy(page); expand(zone, page, order, current_order, area, buddy_type); @@ -1598,6 +1601,7 @@ int __isolate_free_page(struct page *page, unsigned int order) list_del(&page->lru); zone->free_area[order].nr_free--; rmv_page_order(page); + __ClearPageBuddy(page); /* Set the pageblock if the isolated page is at least a pageblock */ if (order >= pageblock_order - 1) { @@ -2504,6 +2508,40 @@ retry: return page; } +/* Try to allocate from the caller's private memory reserves */ +static inline struct page * +__alloc_pages_private(gfp_t gfp_mask, unsigned int order, + const struct alloc_context *ac) +{ + unsigned int uninitialized_var(alloc_order); + struct page *page = NULL; + struct page *p; + + /* Dopy, but this is a slowpath right before OOM */ + list_for_each_entry(p, ¤t->private_pages, lru) { + int o = page_order(p); + + if (o >= order && (!page || o < alloc_order)) { + page = p; + alloc_order = o; + } + } + if (!page) + return NULL; + + list_del(&page->lru); + rmv_page_order(page); + + /* Give back the remainder */ + while (alloc_order > order) { + alloc_order--; + set_page_order(&page[1 << alloc_order], alloc_order); + list_add(&page[1 << alloc_order].lru, ¤t->private_pages); + } + + return page; +} + /* * This is called in the allocator slow-path if the allocation request is of * sufficient urgency to ignore watermarks and take other desperate measures @@ -2753,9 +2791,13 @@ retry: /* * If we fail to make progress by freeing individual * pages, but the allocation wants us to keep going, - * start OOM killing tasks. + * dip into private reserves, or start OOM killing. */ if (!did_some_progress) { + page = __alloc_pages_private(gfp_mask, order, ac); + if (page) + goto got_pg; + page = __alloc_pages_may_oom(gfp_mask, order, ac, &did_some_progress); if (page) @@ -3046,6 +3088,82 @@ void free_pages_exact(void *virt, size_t size) EXPORT_SYMBOL(free_pages_exact); /** + * alloc_private_pages - allocate private memory reserve pages + * @gfp_mask: gfp flags for the allocations + * @order: order of pages to allocate + * @nr: number of pages to allocate + * + * This allocates @nr pages of order @order as an emergency reserve of + * the calling task, to be used by the page allocator if an allocation + * would otherwise fail. + * + * The caller is responsible for calling free_private_pages() once the + * reserves are no longer required. + */ +int alloc_private_pages(gfp_t gfp_mask, unsigned int order, unsigned int nr) +{ + struct page *page, *page2; + LIST_HEAD(pages); + unsigned int i; + + for (i = 0; i < nr; i++) { + page = alloc_pages(gfp_mask, order); + if (!page) + goto error; + set_page_order(page, order); + list_add(&page->lru, &pages); + } + + list_splice(&pages, ¤t->private_pages); + return 0; + +error: + list_for_each_entry_safe(page, page2, &pages, lru) { + list_del(&page->lru); + rmv_page_order(page); + __free_pages(page, order); + } + return -ENOMEM; +} + +/** + * register_private_page - register a private memory reserve page + * @page: pre-allocated page + * @order: @page's order + * + * This registers @page as an emergency reserve of the calling task, + * to be used by the page allocator if an allocation would otherwise + * fail. + * + * The caller is responsible for calling free_private_pages() once the + * reserves are no longer required. + */ +void register_private_page(struct page *page, unsigned int order) +{ + set_page_order(page, order); + list_add(&page->lru, ¤t->private_pages); +} + +/** + * free_private_pages - free all private memory reserve pages + * + * Frees all (remaining) pages of the calling task's memory reserves + * established by alloc_private_pages() and register_private_page(). + */ +void free_private_pages(void) +{ + struct page *page, *page2; + + list_for_each_entry_safe(page, page2, ¤t->private_pages, lru) { + int order = page_order(page); + + list_del(&page->lru); + rmv_page_order(page); + __free_pages(page, order); + } +} + +/** * nr_free_zone_pages - count number of pages beyond high watermark * @offset: The zone index of the highest zone * @@ -6551,6 +6669,7 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn) #endif list_del(&page->lru); rmv_page_order(page); + __ClearPageBuddy(page); zone->free_area[order].nr_free--; for (i = 0; i < (1 << order); i++) SetPageReserved((page+i)); From hannes@cmpxchg.org Sat Feb 21 18:21:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5758D7F50 for ; Sat, 21 Feb 2015 18:21:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 181FB8F8052 for ; Sat, 21 Feb 2015 16:21:16 -0800 (PST) X-ASG-Debug-ID: 1424564469-04bdf05bff18770001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id KyDCZFBUKVTGuri1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Feb 2015 16:21:10 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Sat, 21 Feb 2015 19:20:58 -0500 From: Johannes Weiner To: Andrew Morton Cc: Theodore Ts'o , Dave Chinner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150222002058.GB25079@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150221011907.2d26c979.akpm@linux-foundation.org> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1424564470 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15649 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Feb 21, 2015 at 01:19:07AM -0800, Andrew Morton wrote: > Short term, we need to fix 3.19.x and 3.20 and that appears to be by > applying Johannes's akpm-doesnt-know-why-it-works patch: > > --- a/mm/page_alloc.c > +++ b/mm/page_alloc.c > @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > if (high_zoneidx < ZONE_NORMAL) > goto out; > /* The OOM killer does not compensate for light reclaim */ > - if (!(gfp_mask & __GFP_FS)) > + if (!(gfp_mask & __GFP_FS)) { > + /* > + * XXX: Page reclaim didn't yield anything, > + * and the OOM killer can't be invoked, but > + * keep looping as per should_alloc_retry(). > + */ > + *did_some_progress = 1; > goto out; > + } > /* > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > Have people adequately confirmed that this gets us out of trouble? I'd be interested in this too. Who is seeing these failures? Andrew, can you please use the following changelog for this patch? --- From: Johannes Weiner mm: page_alloc: revert inadvertent !__GFP_FS retry behavior change Historically, !__GFP_FS allocations were not allowed to invoke the OOM killer once reclaim had failed, but nevertheless kept looping in the allocator. 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath"), which should have been a simple cleanup patch, accidentally changed the behavior to aborting the allocation at that point. This creates problems with filesystem callers (?) that currently rely on the allocator waiting for other tasks to intervene. Revert the behavior as it shouldn't have been changed as part of a cleanup patch. Fixes: 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") Signed-off-by: Johannes Weiner --- From im-xfs=oss.sgi.com@soft-server.com Sat Feb 21 22:24:00 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B39997F50 for ; Sat, 21 Feb 2015 22:24:00 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92D1C304039 for ; Sat, 21 Feb 2015 20:23:57 -0800 (PST) X-ASG-Debug-ID: 1424579031-04cbb0610d1d0c0002-NocioJ Received: from receive.soft-server.com (receive.soft-server.com [84.200.78.178]) by cuda.sgi.com with ESMTP id dQBiVipvhfxJjpCh for ; Sat, 21 Feb 2015 20:23:55 -0800 (PST) X-Barracuda-Envelope-From: im-xfs=oss.sgi.com@soft-server.com X-Barracuda-Apparent-Source-IP: 84.200.78.178 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=soft-server.com; h=MIME-Version:Content-Type:Date:Message-Id:Subject:From:To; i=im@soft-server.com; bh=p+51+pIo1EjsJWI0UjB2RjUIRFE=; b=Fk1/FBUR8Z8WXZQ/TwXtP+IAdrSOYkMPd1BtskD3Lq1fsL5flbdVP+GCM64NOedmnc+MmMKOJf95 45Zul58jZRuIKzsGZ//gb6qLnaArtV/yFiZw4VglxTtD7fxm3EDcc96/xZDGtC8+mP6hGLnpLNvo Xsvrl6e0K/XUkELF9AA= Received: by receive.soft-server.com id ht5ctm0001gv for ; Sat, 21 Feb 2015 21:57:48 -0500 (envelope-from ) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="278fd186776e1832f2109f8ca38227" Date: Sat, 21 Feb 2015 21:57:48 -0500 Message-Id: Subject: =?UTF-8?B?SW52ZW50b3J5IENsZWFyYW5jZSBvbiAyMDE0IENhcnMgJiBUcnVja3MgLg==?= From: iMotors Local Deals for xfs X-ASG-Orig-Subj: =?UTF-8?B?SW52ZW50b3J5IENsZWFyYW5jZSBvbiAyMDE0IENhcnMgJiBUcnVja3MgLg==?= To: xfs@oss.sgi.com X-Barracuda-Connect: receive.soft-server.com[84.200.78.178] X-Barracuda-Start-Time: 1424579032 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15657 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 --278fd186776e1832f2109f8ca38227 Content-Type: text/plain; [February Overstock Lot-Blowout] Below Kelly Blue Book Dealers are making room for 2015 models. That means you can get 2014 for less than what you would expect. Remaining vehicles can be seen below: View vehicles Unsubscribe3759 Butternut Lane,Benton,IL,62812 --278fd186776e1832f2109f8ca38227 Content-Type: text/html;
[February Overstock Lot-Blowout]
Below Kelly Blue Book
Dealers are making room for 2015 models.
That means you can get 2014 for less than what you would expect.

Remaining vehicles can be seen below:

View vehicles



Unsubscribe
3522 Gerald L. Bates Drive,Cambridge,MA,02138 --278fd186776e1832f2109f8ca38227-- From root@krios.tbi.univie.ac.at Sat Feb 21 23:25:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4E4587F5E for ; Sat, 21 Feb 2015 23:25:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C98D304059 for ; Sat, 21 Feb 2015 21:25:07 -0800 (PST) X-ASG-Debug-ID: 1424582705-04cb6c4bd31ef20001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id e18pDxB3rI11PSYH for ; Sat, 21 Feb 2015 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 189CE5EC0E; Sun, 22 Feb 2015 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 0555F5F0DF; Sun, 22 Feb 2015 06:25:02 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20150222052503.0555F5F0DF@krios.tbi.univie.ac.at> Date: Sun, 22 Feb 2015 06:25:02 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1424582705 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15659 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From rwhite@pobox.com Sun Feb 22 12:30:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7DE6A7F4E for ; Sun, 22 Feb 2015 12:30:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6CC57304039 for ; Sun, 22 Feb 2015 10:30:17 -0800 (PST) X-ASG-Debug-ID: 1424629815-04cbb0610d36c30001-NocioJ Received: from resqmta-po-11v.sys.comcast.net (resqmta-po-11v.sys.comcast.net [96.114.154.170]) by cuda.sgi.com with ESMTP id h4qbsSswLfFUeANh (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 22 Feb 2015 10:30:16 -0800 (PST) X-Barracuda-Envelope-From: rwhite@pobox.com X-Barracuda-Apparent-Source-IP: 96.114.154.170 Received: from resomta-po-01v.sys.comcast.net ([96.114.154.225]) by resqmta-po-11v.sys.comcast.net with comcast id vWWC1p0034s37d401WWFVa; Sun, 22 Feb 2015 18:30:15 +0000 Received: from [IPv6:2601:8:a2c0:e3:559e:c2a1:b75:9e6f] ([IPv6:2601:8:a2c0:e3:559e:c2a1:b75:9e6f]) by resomta-po-01v.sys.comcast.net with comcast id vWWE1p00419XbVf01WWEjk; Sun, 22 Feb 2015 18:30:15 +0000 Message-ID: <54EA2037.8000602@pobox.com> Date: Sun, 22 Feb 2015 10:30:15 -0800 From: Robert White User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Michael Kerrisk , Theodore Ts'o CC: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20140121; t=1424629815; bh=d+ZVXuRPrDMAPhFpJxrJExWLeTBMRlSPs8MwVPjV6/w=; h=Received:Received:Message-ID:Date:From:MIME-Version:To:Subject: Content-Type; b=JFZcp99GecSi+7KdAHVPb2MqQQU6j2pZg8AGB0aFMJZb3uozMMgNpLyGjBbB40DLr d/lkW2Op7Xr5cQKwTwqLm44Kf6LIDvvybpKyYarH1U/w8JV2LxtSiXwpMTybypqf1i TdElwFIq8H0KzTOsa8S3+s/zry9lx60vmK4aGKFstCnc6XuhShehmfTV13qcjRt6XX UN/zZAYsN15qEnJ34DnCSGCUmMViv7RrW8+x+BWVj0vGjy/soY0Yz/iI9+IfPscAEU WGB2iBQeUkXGCkQtTliqjMnwsq1ONBE49T5wX186M3hTmgJB5G8QMDRQk67e8BzUY6 AzamaMpHbf4lw== X-Barracuda-Connect: resqmta-po-11v.sys.comcast.net[96.114.154.170] X-Barracuda-Start-Time: 1424629816 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15682 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 02/20/2015 12:50 AM, Michael Kerrisk wrote: > * As at Linux 3.20, this option is supported only on ext4. "As of Linux 3.20" is more correct. From service3@mx2.allarelbus.com Sun Feb 22 14:43:35 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=DEAR_FRIEND,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 1CBBC7F4E for ; Sun, 22 Feb 2015 14:43:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B6FD304064 for ; Sun, 22 Feb 2015 12:43:31 -0800 (PST) X-ASG-Debug-ID: 1424637803-04cbb0610e397d0001-NocioJ Received: from mail.mx2.allarelbus.com (bt1.officetyasservice.cn [23.88.239.85]) by cuda.sgi.com with ESMTP id zICmkQYwQf4mQpLw for ; Sun, 22 Feb 2015 12:43:24 -0800 (PST) X-Barracuda-Envelope-From: service3@mx2.allarelbus.com X-Barracuda-Apparent-Source-IP: 23.88.239.85 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.mx2.allarelbus.com A43A91A4475CE DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mx2.allarelbus.com; s=mx2.allarelbus; t=1424429433; bh=UfR6BJMCfsKFs5NrUfqorCd/xFiTt7sP4lc8pDctGr8=; h=Date:From:To:Reply-To:Subject:Mime-Version:Content-Type: Content-Transfer-Encoding; b=eDdAl4wrzj8OD08EUriA3REzh0xB0RJhEKcXmC2e9Z6mlXS9wR/8TxFciqxfbVCN2 N6YvLyYU/0cegop8n7hkXAlb6o0oqnHM6U0EW7vJvCUhMsUTMn02Qhop/15wRjACEs TdAl/r9I33Ay0v6JbcWrJiMIAAG0h8Em27wINXLA= Date: Fri, 20 Feb 2015 18:50:30 +0800 From: "Jasmine" To: "xfs" Reply-To: Subject: =?GB2312?B?UmU6IGVucXVpcnk=?= X-Mailer: Foxmail 5.0 [cn] X-ASG-Orig-Subj: =?GB2312?B?UmU6IGVucXVpcnk=?= Mime-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: bt1.officetyasservice.cn[23.88.239.85] X-Barracuda-Start-Time: 1424637803 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.34 X-Barracuda-Spam-Status: No, SCORE=1.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA298e, DEAR_FRIEND, DKIM_SIGNED, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.20 BSF_SC7_SA298e Custom Rule SA298e Message-Id: <20150222204331.8C735106C296@cuda.sgi.com> RGVhciBGcmllbmQsDQoNCkhhdmUgYSBuaWNlIGRheSENCg0KQXMgYSBwcm9mZXNzaW9uYWwgbWFu dWZhY3R1cmluZyBpbiBTVE9SQUdFIFJBQ0tJTkcgJiBMT0dJU1RJQyBFUVVJUE1FTlQgc2luY2Ug MjAwMSx3ZSBzaW5jZXJlbHkgdG8gZXN0YWJsaXNoIHRoZSBmcmllbmRseSBidXNpbmVzcyByZWxh dGlvbiB3aXRoIHlvdS4NCg0KRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZXZpZXcgb3Vy IHdlYnNpdGUuDQoNCldhcm1seSBSZWdhcmRzDQpKYXNtaW5lIFpoYW8NCg0KVGVsOiArODYtMjAt ODc0ODIxNzItODE3DQpNb2JpbGWjujg2LTEzNTM4OTgzNDc4DQoNCg0KDQo= From kdhall@binghamton.edu Sun Feb 22 17:35:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AD9467F47 for ; Sun, 22 Feb 2015 17:35:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9C55C304043 for ; Sun, 22 Feb 2015 15:35:24 -0800 (PST) X-ASG-Debug-ID: 1424648122-04cb6c4bd03b4d0001-NocioJ Received: from mail-qg0-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by cuda.sgi.com with ESMTP id 8xh9jaU38TiBLy0q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 22 Feb 2015 15:35:22 -0800 (PST) X-Barracuda-Envelope-From: kdhall@binghamton.edu X-Barracuda-Apparent-Source-IP: 209.85.192.46 Received: by mail-qg0-f46.google.com with SMTP id z107so22000727qgd.5 for ; Sun, 22 Feb 2015 15:35:22 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=oJqRdM32J9jmsgwjlKMVEF+7DvmUeuJbLM6hy5xdYnc=; b=mSKuasgJkLAHYp5dmh2yU+EYSmYJuQfnxOJHAUaEgcBFnkBmAXGcj5CQBWcc6Cjsmb itDW7ux5A+NqAc49OuxKxzfA95CNX0EZhVED3Uj9qIgb5WelmN3sBSMnN7/hyGJ9QGO/ oZo+Ksny95tgwsOX8fZNVWnENJXbGwnuPiO6q8ZDc8z5djWRiREcuUqhGj8r3pUC+DvS xAPeT3eXGrB9c59x1Ul/+MiQ4g7YQ8Te/0tNGx3FeftRWuorbY2aBNbhelbIzeUc1cYe qqNAh9JfDaG6xsx1k3Yx4Bhb0JavCGgFj/lKLFKx4+kyRM8pXrKYluFuiPXIFyhJEIHW 4G/w== X-Gm-Message-State: ALoCoQlxyqt7U1ALZLLXQC4bk0TNLj9E5q2tE3j8skmZy63B4Yxdi87OjFPyaTyO3ikAVSu4ODqh X-Received: by 10.140.150.21 with SMTP id 21mr19440884qhw.69.1424648122196; Sun, 22 Feb 2015 15:35:22 -0800 (PST) Received: from [10.10.10.211] (cpe-108-183-44-87.stny.res.rr.com. [108.183.44.87]) by mx.google.com with ESMTPSA id e92sm26368682qgd.39.2015.02.22.15.35.21 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 22 Feb 2015 15:35:21 -0800 (PST) Message-ID: <54EA67B7.30805@binghamton.edu> Date: Sun, 22 Feb 2015 18:35:19 -0500 From: Dave Hall User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner CC: stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: XFS/LVM/Multipath on a single RAID volume References: <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> X-ASG-Orig-Subj: XFS/LVM/Multipath on a single RAID volume In-Reply-To: <20130416161841.GB13938@destitution> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qg0-f46.google.com[209.85.192.46] X-Barracuda-Start-Time: 1424648122 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave, Stan, Not sure if you remember, but we corresponded for a while a couple years ago about some performance problems I was having with XFS on a 26TB SAS-attached RAID box. If either of you is still working on XFS, I've got some new questions. Actually, what I've got is a new array to set up. Same size, but faster disks and a faster controller. It will replace the existing array as the primary backup volume. So since I have a fresh array that's not in production yet I was hoping to get some pointers on how to configure it to maximize XFS performance. In particular, I've seen a suggestion that a multipathed array should be sliced up into logical drives and pasted back together with LVM. Wondering also about putting the journal in a separate logical drive on the same array. I am able to set up a 2-way multipath right now, and I might be able to justify adding a second controller to the array to get a 4-way multipath going. Even if the LVM approach is the wrong one, I clearly have a rare chance to set this array up the right way. Please let me know if you have any suggestions. Thanks. -Dave Dave Hall Binghamton University kdhall@binghamton.edu 607-760-2328 (Cell) 607-777-4641 (Office) From david@fromorbit.com Sun Feb 22 19:01:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 671DA7F47 for ; Sun, 22 Feb 2015 19:01:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46246304032 for ; Sun, 22 Feb 2015 17:01:08 -0800 (PST) X-ASG-Debug-ID: 1424653264-04cb6c4bd03c570001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id eV7uycnTXibRqP19 for ; Sun, 22 Feb 2015 17:01: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: A2A5EQABe+pUPDkjLHlbgwaBLII5g32pfQEBAQEBAQaYPgQCAoEdRAEBAQEBAQUBAQEBODuEDwEBAQMBOhwjEAgDDgoJJQ8FJQMHGhMbiAwH0iwBCyAYhW+EDn6EbgeEKwWVRoNOgRyDFYY+iEWEJCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 23 Feb 2015 11:31:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YPh9F-0008Oq-41; Mon, 23 Feb 2015 11:45:21 +1100 Date: Mon, 23 Feb 2015 11:45:21 +1100 From: Dave Chinner To: Johannes Weiner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150223004521.GK12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150221235227.GA25079@phnom.home.cmpxchg.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: 1424653264 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Sat, Feb 21, 2015 at 06:52:27PM -0500, Johannes Weiner wrote: > On Fri, Feb 20, 2015 at 09:52:17AM +1100, Dave Chinner wrote: > > I will actively work around aanything that causes filesystem memory > > pressure to increase the chance of oom killer invocations. The OOM > > killer is not a solution - it is, by definition, a loose cannon and > > so we should be reducing dependencies on it. > > Once we have a better-working alternative, sure. Great, but first a simple request: please stop writing code and instead start architecting a solution to the problem. i.e. we need a design and have that documented before code gets written. If you watched my recent LCA talk, then you'll understand what I mean when I say: stop programming and start engineering. > > I really don't care about the OOM Killer corner cases - it's > > completely the wrong way line of development to be spending time on > > and you aren't going to convince me otherwise. The OOM killer a > > crutch used to justify having a memory allocation subsystem that > > can't provide forward progress guarantee mechanisms to callers that > > need it. > > We can provide this. Are all these callers able to preallocate? Anything that allocates in transaction context (and therefor is GFP_NOFS by definition) can preallocate at transaction reservation time. However, preallocation is dumb, complex, CPU and memory intensive and will have a *massive* impact on performance. Allocating 10-100 pages to a reserve which we will almost *never use* and then free them again *on every single transaction* is a lot of unnecessary additional fast path overhead. Hence a "preallocate for every context" reserve pool is not a viable solution. And, really, "reservation" != "preallocation". Maybe it's my filesystem background, but those to things are vastly different things. Reservations are simply an *accounting* of the maximum amount of a reserve required by an operation to guarantee forwards progress. In filesystems, we do this for log space (transactions) and some do it for filesystem space (e.g. delayed allocation needs correct ENOSPC detection so we don't overcommit disk space). The VM already has such concepts (e.g. watermarks and things like min_free_kbytes) that it uses to ensure that there are sufficient reserves for certain types of allocations to succeed. A reserve memory pool is no different - every time a memory reserve occurs, a watermark is lifted to accommodate it, and the transaction is not allowed to proceed until the amount of free memory exceeds that watermark. The memory allocation subsystem then only allows *allocations* marked correctly to allocate pages from that the reserve that watermark protects. e.g. only allocations using __GFP_RESERVE are allowed to dip into the reserve pool. By using watermarks, freeing of memory will automatically top up the reserve pool which means that we guarantee that reclaimable memory allocated for demand paging during transacitons doesn't deplete the reserve pool permanently. As a result, when there is plenty of free and/or reclaimable memory, the reserve pool watermarks will have almost zero impact on performance and behaviour. Further, because it's just accounting and behavioural thresholds, this allows the mm subsystem to control how the reserve pool is accounted internally. e.g. clean, reclaimable pages in the page cache could serve as reserve pool pages as they can be immediately reclaimed for allocation. This could be acheived by setting reclaim targets first to the reserve pool watermark, then the second target is enough pages to satisfy the current allocation. And, FWIW, there's nothing stopping this mechanism from have order based reserve thresholds. e.g. IB could really do with a 64k reserve pool threshold and hence help solve the long standing problems they have with filling the receive ring in GFP_ATOMIC context... Sure, that's looking further down the track, but my point still remains: we need a viable long term solution to this problem. Maybe reservations are not the solution, but I don't see anyone else who is thinking of how to address this architectural problem at a system level right now. We need to design and document the model first, then review it, then we can start working at the code level to implement the solution we've designed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From akpm@linux-foundation.org Sun Feb 22 19:30:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A98A7F47 for ; Sun, 22 Feb 2015 19:30:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65E5B8F8033 for ; Sun, 22 Feb 2015 17:30:15 -0800 (PST) X-ASG-Debug-ID: 1424655012-04cb6c4bd23cb30001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id 9y0unD6AXaHJa7V4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Feb 2015 17:30:13 -0800 (PST) X-Barracuda-Envelope-From: akpm@linux-foundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from localhost (c-67-161-9-76.hsd1.ca.comcast.net [67.161.9.76]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id D4532268; Mon, 23 Feb 2015 01:30:11 +0000 (UTC) Date: Sun, 22 Feb 2015 17:29:30 -0800 From: Andrew Morton To: Dave Chinner Cc: Johannes Weiner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-Id: <20150222172930.6586516d.akpm@linux-foundation.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? In-Reply-To: <20150223004521.GK12722@dastard> References: <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> X-Mailer: Sylpheed 2.7.1 (GTK+ 2.18.9; x86_64-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1424655013 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Mon, 23 Feb 2015 11:45:21 +1100 Dave Chinner wrote: > > > I really don't care about the OOM Killer corner cases - it's > > > completely the wrong way line of development to be spending time on > > > and you aren't going to convince me otherwise. The OOM killer a > > > crutch used to justify having a memory allocation subsystem that > > > can't provide forward progress guarantee mechanisms to callers that > > > need it. > > > > We can provide this. Are all these callers able to preallocate? > > Anything that allocates in transaction context (and therefor is > GFP_NOFS by definition) can preallocate at transaction reservation > time. However, preallocation is dumb, complex, CPU and memory > intensive and will have a *massive* impact on performance. > Allocating 10-100 pages to a reserve which we will almost *never > use* and then free them again *on every single transaction* is a lot > of unnecessary additional fast path overhead. Hence a "preallocate > for every context" reserve pool is not a viable solution. Yup. > Reservations are simply an *accounting* of the maximum amount of a > reserve required by an operation to guarantee forwards progress. In > filesystems, we do this for log space (transactions) and some do it > for filesystem space (e.g. delayed allocation needs correct ENOSPC > detection so we don't overcommit disk space). The VM already has > such concepts (e.g. watermarks and things like min_free_kbytes) that > it uses to ensure that there are sufficient reserves for certain > types of allocations to succeed. Yes, as we do for __GFP_HIGH and PF_MEMALLOC etc. Add a dynamic reserve. So to reserve N pages we increase the page allocator dynamic reserve by N, do some reclaim if necessary then deposit N tokens into the caller's task_struct (it'll be a set of zone/nr-pages tuples I suppose). When allocating pages the caller should drain its reserves in preference to dipping into the regular freelist. This guy has already done his reclaim and shouldn't be penalised a second time. I guess Johannes's preallocation code should switch to doing this for the same reason, plus the fact that snipping a page off task_struct.prealloc_pages is super-fast and needs to be done sometime anyway so why not do it by default. Both reservation and preallocation are vulnerable to deadlocks - 10,000 tasks all trying to reserve/prealloc 100 pages, they all have 50 pages and we ran out of memory. Whoops. We can undeadlock by returning ENOMEM but I suspect there will still be problematic situations where massive numbers of pages are temporarily AWOL. Perhaps some form of queuing and throttling will be needed, to limit the peak number of reserved pages. Per zone, I guess. And it'll be a huge pain handling order>0 pages. I'd be inclined to make it order-0 only, and tell the lamer callers that vmap-is-thattaway. Alas, one lame caller is slub. But the biggest issue is how the heck does a caller work out how many pages to reserve/prealloc? Even a single sb_bread() - it's sitting on loop on a sparse NTFS file on loop on a five-deep DM stack on a six-deep MD stack on loop on NFS on an eleventy-deep networking stack. And then there will be an unknown number of slab allocations of unknown size with unknown slabs-per-page rules - how many pages needed for them? And to make it much worse, how many pages of which orders? Bless its heart, slub will go and use a 1-order page for allocations which should have been in 0-order pages.. From david@fromorbit.com Mon Feb 23 01:32:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 771DA7F47 for ; Mon, 23 Feb 2015 01:32:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA6BEAC001 for ; Sun, 22 Feb 2015 23:32:42 -0800 (PST) X-ASG-Debug-ID: 1424676758-04cb6c4bd141a60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hEpy1CgPRrzaSoG8 for ; Sun, 22 Feb 2015 23:32:39 -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: A2A7FADp1upUPDkjLHlTCIMGgSyCOYN9qgABAQEBAQEGmD4CAgEBAoEeRAEBAQEBAQUBAQEBODuEDwEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTG4gMB9JdAQEBBwIBHxiFb4UMhBcBEUUHhCsFlUaDToEciVOFB4M+hCQqMYECAR8EgR0BAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Feb 2015 18:02:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YPnVL-0000Ov-Mk; Mon, 23 Feb 2015 18:32:35 +1100 Date: Mon, 23 Feb 2015 18:32:35 +1100 From: Dave Chinner To: Andrew Morton Cc: Johannes Weiner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150223073235.GT4251@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150222172930.6586516d.akpm@linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150222172930.6586516d.akpm@linux-foundation.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: 1424676758 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Sun, Feb 22, 2015 at 05:29:30PM -0800, Andrew Morton wrote: > On Mon, 23 Feb 2015 11:45:21 +1100 Dave Chinner wrote: > > > > > I really don't care about the OOM Killer corner cases - it's > > > > completely the wrong way line of development to be spending time on > > > > and you aren't going to convince me otherwise. The OOM killer a > > > > crutch used to justify having a memory allocation subsystem that > > > > can't provide forward progress guarantee mechanisms to callers that > > > > need it. > > > > > > We can provide this. Are all these callers able to preallocate? > > > > Anything that allocates in transaction context (and therefor is > > GFP_NOFS by definition) can preallocate at transaction reservation > > time. However, preallocation is dumb, complex, CPU and memory > > intensive and will have a *massive* impact on performance. > > Allocating 10-100 pages to a reserve which we will almost *never > > use* and then free them again *on every single transaction* is a lot > > of unnecessary additional fast path overhead. Hence a "preallocate > > for every context" reserve pool is not a viable solution. > > Yup. > > > Reservations are simply an *accounting* of the maximum amount of a > > reserve required by an operation to guarantee forwards progress. In > > filesystems, we do this for log space (transactions) and some do it > > for filesystem space (e.g. delayed allocation needs correct ENOSPC > > detection so we don't overcommit disk space). The VM already has > > such concepts (e.g. watermarks and things like min_free_kbytes) that > > it uses to ensure that there are sufficient reserves for certain > > types of allocations to succeed. > > Yes, as we do for __GFP_HIGH and PF_MEMALLOC etc. Add a dynamic > reserve. So to reserve N pages we increase the page allocator dynamic > reserve by N, do some reclaim if necessary then deposit N tokens into > the caller's task_struct (it'll be a set of zone/nr-pages tuples I > suppose). > > When allocating pages the caller should drain its reserves in > preference to dipping into the regular freelist. This guy has already > done his reclaim and shouldn't be penalised a second time. I guess > Johannes's preallocation code should switch to doing this for the same > reason, plus the fact that snipping a page off > task_struct.prealloc_pages is super-fast and needs to be done sometime > anyway so why not do it by default. That is at odds with the requirements of demand paging, which allocate for objects that are reclaimable within the course of the transaction. The reserve is there to ensure forward progress for allocations for objects that aren't freed until after the transaction completes, but if we drain it for reclaimable objects we then have nothing left in the reserve pool when we actually need it. We do not know ahead of time if the object we are allocating is going to modified and hence locked into the transaction. Hence we can't say "use the reserve for this *specific* allocation", and so the only guidance we can really give is "we will to allocate and *permanently consume* this much memory", and the reserve pool needs to cover that consumption to guarantee forwards progress. Forwards progress for all other allocations is guaranteed because they are reclaimable objects - they either freed directly back to their source (slab, heap, page lists) or they are freed by shrinkers once they have been released from the transaction. Hence we need allocations to come from the free list and trigger reclaim, regardless of the fact there is a reserve pool there. The reserve pool needs to be a last resort once there are no other avenues to allocate memory. i.e. it would be used to replace the OOM killer for GFP_NOFAIL allocations. > Both reservation and preallocation are vulnerable to deadlocks - 10,000 > tasks all trying to reserve/prealloc 100 pages, they all have 50 pages > and we ran out of memory. Whoops. Yes, that's the big problem with preallocation, as well as your proposed "depelete the reserved memory first" approach. They *require* up front "preallocation" of free memory, either directly by the application, or internally by the mm subsystem. Hence my comments about appropriate classification of "reserved memory". Reserved memory does not necessarily need to be on the free list. It could be "immediately reclaimable" memory, so that reserving memory doesn't need to immediately reclaim memory, but can it can be pulled from the reclaimable memory reserves when memory pressure occurs. If there is no memory pressure, we do nothing beause we have no need to do anything.... > We can undeadlock by returning ENOMEM but I suspect there will > still be problematic situations where massive numbers of pages are > temporarily AWOL. Perhaps some form of queuing and throttling > will be needed, Yes, think that is necessary, but I don't see it as necessary in the MM subsystem. XFS already has a ticket-based queue mechanisms for throttling concurrent access to ensure we don't overcommit log space and I'd want to tie the two together... > to limit the peak number of reserved pages. Per > zone, I guess. Internal implementation issue that I don't really care about. When it comes to guaranteeing memory allocation, global context is all I care about. Locality of allocation simple doesn't matter; we want that page we reserved, no matter wher eit is located. > And it'll be a huge pain handling order>0 pages. I'd be inclined > to make it order-0 only, and tell the lamer callers that > vmap-is-thattaway. Alas, one lame caller is slub. Sure, but vmap requires GFP_KERNEL memory allocation and we're talking about allocation in transactions, which are GFP_NOFS. I've lost count of the number of times we've asked for that problem to be fixed. Refusing to fix it has simply lead to the growing use of ugly hacks around that problem (i.e. memalloc_noio_save() and friends). > But the biggest issue is how the heck does a caller work out how > many pages to reserve/prealloc? Even a single sb_bread() - it's > sitting on loop on a sparse NTFS file on loop on a five-deep DM > stack on a six-deep MD stack on loop on NFS on an eleventy-deep > networking stack. Each subsystem needs to take care of itself first, then we can worry about esoteric stacking requirements. Besides, stacking requirements through the IO layer is still pretty trivial - we only need to guarantee single IO progress from the highest layer as it can be recycled again and again for every IO that needs to be done. And, because mempools already give that guarantee to most block devices and drivers, we won't need to reserve memory for most block devices to make forwards progress. It's only crazy "recurse through filesystem" configurations where this will be an issue. > And then there will be an unknown number of > slab allocations of unknown size with unknown slabs-per-page rules > - how many pages needed for them? However many pages needed to allocate the number of objects we'll consume from the slab. > And to make it much worse, how > many pages of which orders? Bless its heart, slub will go and use > a 1-order page for allocations which should have been in 0-order > pages.. The majority of allocations will be order-0, though if we know that they are going to be significant numbers of high order allocations, then it should be simple enough to tell the mm subsystem "need a reserve of 32 order-0, 4 order-1 and 1 order-3 allocations" and have memory compaction just do it's stuff. But, IMO, we should cross that bridge when somebody actually needs reservations to be that specific.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bonbons@linux-vserver.org Mon Feb 23 01:56:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A018D7F47 for ; Mon, 23 Feb 2015 01:56:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8DB0B8F8037 for ; Sun, 22 Feb 2015 23:56:31 -0800 (PST) X-ASG-Debug-ID: 1424678183-04cbb0610f42ec0001-NocioJ Received: from smtprelay.restena.lu (smtprelay.restena.lu [158.64.1.62]) by cuda.sgi.com with ESMTP id 5DttGmX9YH58a2gb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Feb 2015 23:56:24 -0800 (PST) X-Barracuda-Envelope-From: bonbons@linux-vserver.org X-Barracuda-Apparent-Source-IP: 158.64.1.62 Received: from pluto.restena.lu (pluto.restena.lu [IPv6:2001:a18:1:8::156]) by smtprelay.restena.lu (Postfix) with ESMTPS id 4FCC4411D9; Mon, 23 Feb 2015 08:56:23 +0100 (CET) Date: Mon, 23 Feb 2015 08:56:21 +0100 From: Bruno =?UTF-8?B?UHLDqW1vbnQ=?= To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: XFS crashing system with general protection fault Message-ID: <20150223085621.09cd73fc@pluto.restena.lu> X-ASG-Orig-Subj: Re: XFS crashing system with general protection fault In-Reply-To: <20150210080547.730f6180@pluto.restena.lu> References: <20141224111403.54d7226b@neptune.home> <20141228115127.GN24183@dastard> <20141229084452.615e1900@pluto.restena.lu> <20150113081742.6c3a5823@pluto.restena.lu> <20150205151007.7c954c01@pluto.restena.lu> <20150205221516.GT4251@dastard> <20150209094701.6b1d480d@pluto.restena.lu> <20150209212420.GU12722@dastard> <20150210080547.730f6180@pluto.restena.lu> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay.restena.lu[158.64.1.62] X-Barracuda-Start-Time: 1424678184 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, Yet another crash (following assertion trace see further down), hopefully with some more useful information. The server is always running under some memory pressure (also expressed by hpsa having a hard time to allocate order-4 memory): [1018038.443525] hpacucli: page allocation failure: order:4, mode:0xc0d0 [1018038.443528] CPU: 0 PID: 12482 Comm: hpacucli Not tainted 3.18.5-x86_64 #2 [1018038.443530] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1018038.443533] 0000000000000000 ffff8800025bb978 ffffffff817b2be3 000000000000d4d4 [1018038.443535] 000000000000c0d0 ffff8800025bba08 ffffffff81104e9f 0000000000000004 [1018038.443537] ffff8800ac2ae9e0 ffff8800025bba08 ffffffff817b0752 ffff8800025bb9d0 [1018038.443538] Call Trace: [1018038.443544] [] dump_stack+0x46/0x58 [1018038.443549] [] warn_alloc_failed+0xcf/0x120 [1018038.443553] [] ? __alloc_pages_direct_compact+0x61/0x18e [1018038.443556] [] __alloc_pages_nodemask+0x577/0x940 [1018038.443559] [] alloc_kmem_pages+0x12/0x20 [1018038.443562] [] kmalloc_order+0x13/0x50 [1018038.443566] [] hpsa_scan_start+0x156/0x1830 [1018038.443568] [] ? sg_open+0x376/0x5b0 [1018038.443572] [] ? chrdev_open+0xa5/0x1a0 [1018038.443576] [] ? generic_permission+0xda/0x1e0 [1018038.443578] [] ? cdev_put+0x30/0x30 [1018038.443580] [] hpsa_ioctl+0x1af/0xcd0 [1018038.443582] [] ? do_last.isra.60+0x175/0xf60 [1018038.443584] [] ? link_path_walk+0x69/0x7e0 [1018038.443587] [] ? check_bytes_and_report+0x36/0x110 [1018038.443590] [] ? check_object+0xa3/0x250 [1018038.443594] [] scsi_ioctl+0x30a/0x410 [1018038.443596] [] sg_ioctl+0x1bb/0xc50 [1018038.443598] [] do_vfs_ioctl+0x2c8/0x4a0 [1018038.443601] [] ? kmem_cache_free+0xef/0x120 [1018038.443602] [] ? final_putname+0x21/0x50 [1018038.443605] [] ? do_sys_open+0x198/0x220 [1018038.443607] [] SyS_ioctl+0x3c/0x80 [1018038.443610] [] system_call_fastpath+0x16/0x1b [1018038.443611] Mem-Info: [1018038.443612] DMA per-cpu: [1018038.443613] CPU 0: hi: 0, btch: 1 usd: 0 [1018038.443614] CPU 1: hi: 0, btch: 1 usd: 0 [1018038.443615] CPU 2: hi: 0, btch: 1 usd: 0 [1018038.443616] CPU 3: hi: 0, btch: 1 usd: 0 [1018038.443617] CPU 4: hi: 0, btch: 1 usd: 0 [1018038.443618] CPU 5: hi: 0, btch: 1 usd: 0 [1018038.443619] CPU 6: hi: 0, btch: 1 usd: 0 [1018038.443620] CPU 7: hi: 0, btch: 1 usd: 0 [1018038.443621] DMA32 per-cpu: [1018038.443622] CPU 0: hi: 186, btch: 31 usd: 0 [1018038.443623] CPU 1: hi: 186, btch: 31 usd: 0 [1018038.443624] CPU 2: hi: 186, btch: 31 usd: 0 [1018038.443625] CPU 3: hi: 186, btch: 31 usd: 0 [1018038.443626] CPU 4: hi: 186, btch: 31 usd: 0 [1018038.443627] CPU 5: hi: 186, btch: 31 usd: 0 [1018038.443628] CPU 6: hi: 186, btch: 31 usd: 0 [1018038.443629] CPU 7: hi: 186, btch: 31 usd: 0 [1018038.443629] Normal per-cpu: [1018038.443630] CPU 0: hi: 186, btch: 31 usd: 0 [1018038.443632] CPU 1: hi: 186, btch: 31 usd: 0 [1018038.443633] CPU 2: hi: 186, btch: 31 usd: 0 [1018038.443634] CPU 3: hi: 186, btch: 31 usd: 0 [1018038.443635] CPU 4: hi: 186, btch: 31 usd: 0 [1018038.443636] CPU 5: hi: 186, btch: 31 usd: 0 [1018038.443637] CPU 6: hi: 186, btch: 31 usd: 0 [1018038.443638] CPU 7: hi: 186, btch: 31 usd: 0 [1018038.443642] active_anon:175496 inactive_anon:196056 isolated_anon:0 [1018038.443642] active_file:320293 inactive_file:1080120 isolated_file:0 [1018038.443642] unevictable:8 dirty:3899 writeback:0 unstable:0 [1018038.443642] free:108229 slab_reclaimable:115980 slab_unreclaimable:17333 [1018038.443642] mapped:10797 shmem:40 pagetables:7135 bounce:0 [1018038.443642] free_cma:0 [1018038.443647] DMA free:15836kB min:260kB low:324kB high:388kB active_anon:0kB inactive_anon:0kB active_file:0kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:15992kB managed:15908kB mlocked:0kB dirty:0kB writeback:0kB mapped:0kB shmem:0kB slab_reclaimable:0kB slab_unreclaimable:0kB kernel_stack:0kB pagetables:0kB unstable:0kB bounce:0kB free_cma:0kB writ eback_tmp:0kB pages_scanned:0 all_unreclaimable? yes [1018038.443649] lowmem_reserve[]: 0 3533 8000 8000 [1018038.443655] DMA32 free:256676kB min:59584kB low:74480kB high:89376kB active_anon:340428kB inactive_anon:387756kB active_file:667068kB inactive_file:1671452kB unevictable:32kB isolated(anon):0kB isolated(file):0kB present:3643520kB managed:3630440kB mlocked:32kB dirty:7568kB writeback:0kB mapped:25180kB shmem:84kB slab_reclaimable:235772kB slab_unreclaimable:28068kB kernel_stack:1616kB pagetables:12260kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [1018038.443656] lowmem_reserve[]: 0 0 4466 4466 [1018038.443662] Normal free:160404kB min:75316kB low:94144kB high:112972kB active_anon:361556kB inactive_anon:396468kB active_file:614104kB inactive_file:2649028kB unevictable:0kB isolated(anon):0kB isolated(file):0kB present:4718588kB managed:4574088kB mlocked:0kB dirty:8028kB writeback:0kB mapped:18008kB shmem:76kB slab_reclaimable:228148kB slab_unreclaimable:41264kB kernel_stack:2336kB pagetables:16280kB unstable:0kB bounce:0kB free_cma:0kB writeback_tmp:0kB pages_scanned:0 all_unreclaimable? no [1018038.443664] lowmem_reserve[]: 0 0 0 0 [1018038.443673] DMA: 1*4kB (U) 1*8kB (U) 1*16kB (U) 0*32kB 1*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (U) 3*4096kB (MR) = 15836kB [1018038.443681] DMA32: 14482*4kB (UEM) 14822*8kB (UEM) 4479*16kB (UEM) 245*32kB (UEM) 17*64kB (UEM) 5*128kB (EM) 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 257736kB [1018038.443689] Normal: 34007*4kB (UEM) 1494*8kB (UEM) 79*16kB (UEM) 65*32kB (UEM) 98*64kB (UM) 26*128kB (UM) 1*256kB (M) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 161180kB [1018038.443690] 1431624 total pagecache pages [1018038.443691] 31052 pages in swap cache [1018038.443692] Swap cache stats: add 487562, delete 456510, find 302043467/302273642 [1018038.443692] Free swap = 3038676kB [1018038.443693] Total swap = 4192252kB [1018038.443693] 2094525 pages RAM [1018038.443694] 0 pages HighMem/MovableOnly [1018038.443694] 39416 pages reserved (above OOM complaint happened multiple times, no at each hpaccucli run but for some runs multiple times in a row) The XFS trace: [1020178.803465] XFS: Assertion failed: xfs_isiflocked(ip), file: /data/kernel/linux-git/fs/xfs/xfs_inode.c, line: 3195 [1020178.817795] ------------[ cut here ]------------ [1020178.825680] WARNING: CPU: 6 PID: 630 at /data/kernel/linux-git/fs/xfs/xfs_message.c:99 asswarn+0x2e/0x30() [1020178.839685] Modules linked in: [1020178.839689] CPU: 6 PID: 630 Comm: xfsaild/sda3 Not tainted 3.18.5-x86_64 #2 [1020178.839690] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1020178.839693] 0000000000000009 ffff8802143a3c28 ffffffff817b2be3 000000000000a8a8 [1020178.839694] 0000000000000000 ffff8802143a3c68 ffffffff81088a97 ffff8802143a3c88 [1020178.839696] ffff8801008ab400 ffff880122d89dc0 0000000000000008 ffff880213c5bb00 [1020178.839698] Call Trace: [1020178.839705] [] dump_stack+0x46/0x58 [1020178.839708] [] warn_slowpath_common+0x77/0xa0 [1020178.839710] [] warn_slowpath_null+0x15/0x20 [1020178.839712] [] asswarn+0x2e/0x30 [1020178.839714] [] xfs_iflush_int+0x81/0x480 [1020178.839716] [] xfs_iflush_cluster+0x1f3/0x3c0 [1020178.839718] [] xfs_iflush+0x1e3/0x2f0 [1020178.839723] [] ? schedule_timeout+0x107/0x190 [1020178.839726] [] xfs_inode_item_push+0x146/0x190 [1020178.839729] [] xfsaild+0x1d9/0x4b0 [1020178.839731] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [1020178.839734] [] kthread+0xc4/0xe0 [1020178.839737] [] ? kthread_create_on_node+0x170/0x170 [1020178.839739] [] ret_from_fork+0x7c/0xb0 [1020178.839741] [] ? kthread_create_on_node+0x170/0x170 [1020178.839743] ---[ end trace 8908bf05bbd238cf ]--- [1020179.700610] general protection fault: 0000 [#1] SMP [1020179.708213] Modules linked in: [1020179.712243] CPU: 0 PID: 175 Comm: kworker/0:1H Tainted: G W 3.18.5-x86_64 #2 [1020179.724201] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1020179.734151] Workqueue: xfslogd xfs_buf_ioend_work [1020179.740276] task: ffff880212decba0 ti: ffff880213788000 task.ti: ffff880213788000 [1020179.752158] RIP: 0010:[] [] xfs_trans_ail_delete_bulk+0x87/0x1a0 [1020179.766094] RSP: 0018:ffff88021378bcc8 EFLAGS: 00010202 [1020179.772314] RAX: dead000000100100 RBX: ffff880213869980 RCX: ffff880213869990 [1020179.784156] RDX: 6b6b6b6b6b6b6b6b RSI: 6b6b6b6b6b6b6b6b RDI: ffff880213869980 [1020179.794234] RBP: ffff88021378bd18 R08: 0000000000000000 R09: 0000000000000bfd [1020179.804273] R10: 0000000000001c1e R11: ffffea00006e0180 R12: ffff88001b806000 [1020179.814335] R13: ffff88021378bd38 R14: ffff880122d89dc0 R15: 0000000000000000 [1020179.826195] FS: 0000000000000000(0000) GS:ffff88021fa00000(0000) knlGS:0000000000000000 [1020179.838174] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [1020179.846235] CR2: 00007fabeb28cff8 CR3: 0000000001c15000 CR4: 00000000000007f0 [1020179.856292] Stack: [1020179.860196] ffff88021378bd28 00000008810aeaf9 ffff880213869990 ffff88021378bd38 [1020179.870324] ffff880213869980 0000000000000002 0000000000000002 ffff880213869980 [1020179.882184] 0000000000000000 ffff8801bd4b36e0 ffff88021378bd88 ffffffff81269614 [1020179.892310] Call Trace: [1020179.896275] [] xfs_iflush_done+0x1b4/0x1e0 [1020179.904318] [] ? put_prev_entity+0x2c/0x3b0 [1020179.912395] [] xfs_buf_do_callbacks+0x61/0x80 [1020179.922280] [] xfs_buf_iodone_callbacks+0x29/0x140 [1020179.932220] [] xfs_buf_ioend+0x9b/0xe0 [1020179.940235] [] xfs_buf_ioend_work+0x10/0x20 [1020179.948328] [] process_one_work+0x134/0x360 [1020179.956376] [] worker_thread+0x119/0x440 [1020179.964401] [] ? rescuer_thread+0x2a0/0x2a0 [1020179.974254] [] kthread+0xc4/0xe0 [1020179.980395] [] ? kthread_create_on_node+0x170/0x170 [1020179.990359] [] ret_from_fork+0x7c/0xb0 [1020179.998371] [] ? kthread_create_on_node+0x170/0x170 [1020180.008332] Code: 1f 44 00 00 4d 8b 75 00 49 83 c5 08 41 f6 46 34 01 0f 84 9d 00 00 00 48 b8 00 01 10 00 00 00 ad de 49 8b 36 48 89 df 49 8b 56 08 <48> 89 56 08 48 89 32 4c 89 f6 49 89 06 48 b8 00 02 20 00 00 00 [1020180.036304] RIP [] xfs_trans_ail_delete_bulk+0x87/0x1a0 [1020180.046295] RSP [1020180.221761] ---[ end trace 8908bf05bbd238d0 ]--- [1020180.230144] BUG: unable to handle kernel paging request at ffffffffffffffd8 [1020180.240440] IP: [] kthread_data+0xc/0x20 [1020180.248467] PGD 1c16067 PUD 1c18067 PMD 0 [1020180.254511] Oops: 0000 [#2] SMP [1020180.258656] Modules linked in: [1020180.264457] CPU: 0 PID: 175 Comm: kworker/0:1H Tainted: G D W 3.18.5-x86_64 #2 [1020180.276417] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1020180.284579] task: ffff880212decba0 ti: ffff880213788000 task.ti: ffff880213788000 [1020180.296517] RIP: 0010:[] [] kthread_data+0xc/0x20 [1020180.308433] RSP: 0018:ffff88021378ba50 EFLAGS: 00010092 [1020180.316420] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 000000000000000f [1020180.326483] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff880212decba0 [1020180.336554] RBP: ffff88021378ba68 R08: 000000000000c000 R09: 000000000000bb23 [1020180.346618] R10: 0000000000000000 R11: ffffea00084f1a00 R12: ffff880212decfa8 [1020180.358445] R13: 0000000000000000 R14: 0000000000000000 R15: ffff880212decba0 [1020180.368507] FS: 0000000000000000(0000) GS:ffff88021fa00000(0000) knlGS:0000000000000000 [1020180.380496] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [1020180.388568] CR2: 0000000000000028 CR3: 0000000001c15000 CR4: 00000000000007f0 [1020180.398621] Stack: [1020180.402532] ffffffff8109cee0 ffff88021378ba68 ffff88021fa10980 ffff88021378bad8 [1020180.412656] ffffffff817b7e53 ffff88021378ba88 ffff880212decba0 0000000000010980 [1020180.424540] ffffffff8108946d ffff88021378bfd8 0000000000010980 ffff88021378baa8 [1020180.434650] Call Trace: [1020180.438585] [] ? wq_worker_sleeping+0x10/0xa0 [1020180.448461] [] __schedule+0x393/0x5e0 [1020180.454680] [] ? release_task+0x2fd/0x3f0 [1020180.464506] [] schedule+0x24/0x70 [1020180.470659] [] do_exit+0x65a/0x970 [1020180.478619] [] oops_end+0x89/0xd0 [1020180.486555] [] die+0x46/0x70 [1020180.492643] [] do_general_protection+0xca/0x150 [1020180.502534] [] general_protection+0x22/0x30 [1020180.510617] [] ? xfs_trans_ail_delete_bulk+0x87/0x1a0 [1020180.520616] [] ? xfs_trans_ail_delete_bulk+0xa7/0x1a0 [1020180.530604] [] xfs_iflush_done+0x1b4/0x1e0 [1020180.538667] [] ? put_prev_entity+0x2c/0x3b0 [1020180.546738] [] xfs_buf_do_callbacks+0x61/0x80 [1020180.556625] [] xfs_buf_iodone_callbacks+0x29/0x140 [1020180.566630] [] xfs_buf_ioend+0x9b/0xe0 [1020180.574567] [] xfs_buf_ioend_work+0x10/0x20 [1020180.582643] [] process_one_work+0x134/0x360 [1020180.590716] [] worker_thread+0x119/0x440 [1020180.598756] [] ? rescuer_thread+0x2a0/0x2a0 [1020180.608596] [] kthread+0xc4/0xe0 [1020180.614739] [] ? kthread_create_on_node+0x170/0x170 [1020180.624709] [] ret_from_fork+0x7c/0xb0 [1020180.632721] [] ? kthread_create_on_node+0x170/0x170 [1020180.642671] Code: 48 89 e5 5d 48 8b 40 c8 48 c1 e8 02 83 e0 01 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 48 8b 87 b0 03 00 00 55 48 89 e5 5d <48> 8b 40 d8 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 55 [1020180.670633] RIP [] kthread_data+0xc/0x20 [1020180.678649] RSP [1020180.682790] CR2: ffffffffffffffd8 [1020180.688680] ---[ end trace 8908bf05bbd238d1 ]--- [1020180.694787] Fixing recursive fault but reboot is needed! [1021280.341447] Clocksource tsc unstable (delta = 899898448637 ns) [1025061.698138] INFO: rcu_sched detected stalls on CPUs/tasks: { 0 1 2 5 7} (detected by 3, t=482838 jiffies, g=32626328, c=32626327, q=3381) [1025061.716261] Task dump for CPU 0: [1025061.720357] kworker/0:1H D 0000000000000046 0 175 2 0x00000000 [1025061.730423] 00000001000f000d ffff880213c68840 ffff88021378b968 ffffffff810ae624 [1025061.742300] ffff880212decc08 ffff880212decc08 ffff88021fa109f0 0000000000000001 [1025061.752446] ffff880212decfa8 0000000000000000 0000000000000000 ffff880212decba0 [1025061.764260] Call Trace: [1025061.766477] [] ? update_curr+0xa4/0x100 [1025061.774495] [] ? do_page_fault+0xc/0x10 [1025061.784271] [] ? page_fault+0x22/0x30 [1025061.790497] [] ? kthread_data+0xc/0x20 [1025061.798505] [] ? wq_worker_sleeping+0x10/0xa0 [1025061.808376] [] ? __schedule+0x393/0x5e0 [1025061.816395] [] ? release_task+0x2fd/0x3f0 [1025061.824450] [] ? schedule+0x24/0x70 [1025061.832454] [] ? do_exit+0x65a/0x970 [1025061.840379] [] ? oops_end+0x89/0xd0 [1025061.848341] [] ? die+0x46/0x70 [1025061.854462] [] ? do_general_protection+0xca/0x150 [1025061.864407] [] ? general_protection+0x22/0x30 [1025061.872522] [] ? xfs_trans_ail_delete_bulk+0x87/0x1a0 [1025061.882480] [] ? xfs_trans_ail_delete_bulk+0xa7/0x1a0 [1025061.892480] [] ? xfs_iflush_done+0x1b4/0x1e0 [1025061.902352] [] ? put_prev_entity+0x2c/0x3b0 [1025061.910423] [] ? xfs_buf_do_callbacks+0x61/0x80 [1025061.918549] [] ? xfs_buf_iodone_callbacks+0x29/0x140 [1025061.928543] [] ? xfs_buf_ioend+0x9b/0xe0 [1025061.936555] [] ? xfs_buf_ioend_work+0x10/0x20 [1025061.946434] [] ? process_one_work+0x134/0x360 [1025061.954540] [] ? worker_thread+0x119/0x440 [1025061.964373] [] ? rescuer_thread+0x2a0/0x2a0 [1025061.972446] [] ? kthread+0xc4/0xe0 [1025061.980430] [] ? kthread_create_on_node+0x170/0x170 [1025061.988587] [] ? ret_from_fork+0x7c/0xb0 [1025061.998393] [] ? kthread_create_on_node+0x170/0x170 [1025062.006579] Task dump for CPU 1: [1025062.012454] nrpe R running task 0 2998 1612 0x00000008 [1025062.022521] 00000001002e0018 ffff880059317c30 ffffffff81106beb ffffffff81c8b248 [1025062.032619] 0000000100000141 0000000000002200 0000000100200013 ffff880059317c50 [1025062.044507] ffffffff8113b7d8 ffff880216843010 ffff880216843030 ffffea0000af48a0 [1025062.054633] Call Trace: [1025062.058578] [] ? get_page_from_freelist+0x32b/0x6a0 [1025062.068530] [] ? deactivate_slab+0x118/0x400 [1025062.076615] [] ? deactivate_slab+0x118/0x400 [1025062.086502] [] ? check_object+0xa3/0x250 [1025062.094524] [] ? init_object+0x38/0x70 [1025062.102512] [] ? alloc_pid+0x29/0x480 [1025062.110514] [] ? copy_process.part.52+0xb7b/0x1600 [1025062.120469] [] ? task_rq_lock+0x4b/0xa0 [1025062.128484] [] ? sched_move_task+0x9d/0x120 [1025062.136551] [] ? set_task_cpu+0x2c/0xe0 [1025062.144576] [] ? cpumask_next_and+0x30/0x50 [1025062.152664] [] ? select_task_rq_fair+0x1de/0x7d0 [1025062.162564] [] ? sched_slice.isra.61+0x46/0x90 [1025062.170681] [] ? init_task_runnable_average+0x2a/0x60 [1025062.180678] [] ? wake_up_new_task+0x9a/0x140 [1025062.190547] [] ? __alloc_fd+0x7d/0x120 [1025062.198541] [] ? do_fork+0x11b/0x2b0 [1025062.206517] [] ? get_unused_fd_flags+0x2b/0x30 [1025062.214654] [] ? __do_pipe_flags+0x65/0xb0 [1025062.222703] [] ? __fd_install+0x1f/0x60 [1025062.230715] [] ? SyS_clone+0x11/0x20 [1025062.238689] [] ? stub_clone+0x69/0x90 [1025062.246699] [] ? system_call_fastpath+0x16/0x1b [1025062.256582] Task dump for CPU 2: [1025062.260700] xfsaild/sda3 R running task 0 630 2 0x00000008 [1025062.270738] ffff8802143a3d18 ffffffff810c96c6 ffff8802143a3d88 ffff8802143a3d88 [1025062.282649] ffffffff82807340 0000000000000282 ffff8802143a3d48 ffffffff810c9793 [1025062.292776] ffff8802143a3d68 0000000000000282 ffff8802143a3d88 ffff8802143a3d88 [1025062.304665] Call Trace: [1025062.308578] [] ? lock_timer_base.isra.30+0x26/0x50 [1025062.316753] [] try_to_del_timer_sync+0x43/0x60 [1025062.326667] [] del_timer_sync+0x4a/0x60 [1025062.334686] [] schedule_timeout+0x107/0x190 [1025062.343966] [] ? _raw_spin_lock+0x1c/0x30 [1025062.351780] [] xfsaild+0x11f/0x4b0 [1025062.359727] [] ? xfs_trans_ail_cursor_first+0x90/0x90 [1025062.369714] [] kthread+0xc4/0xe0 [1025062.377657] [] ? kthread_create_on_node+0x170/0x170 [1025062.387590] [] ret_from_fork+0x7c/0xb0 [1025062.395595] [] ? kthread_create_on_node+0x170/0x170 [1025062.403791] Task dump for CPU 5: [1025062.409690] swapper/5 R running task 0 0 1 0x00200000 [1025062.419715] ffff88021454ff18 ffffffff810d82c8 0000000000001000 0000000000001000 [1025062.429831] ffff88021fb90980 0000000000000000 0000000000200000 0100000000000000 [1025062.441734] ffff88021454ffd8 0000000000000000 ffff88021fb4bee0 ffffffffffffff1d [1025062.451835] Call Trace: [1025062.455782] [] ? __tick_nohz_idle_enter+0xd8/0x400 [1025062.465761] [] ? cpu_startup_entry+0x102/0x2e0 [1025062.473858] [] ? cpu_startup_entry+0xe5/0x2e0 [1025062.483723] [] start_secondary+0x183/0x190 [1025062.491779] Task dump for CPU 7: [1025062.497647] swapper/7 R running task 0 0 1 0x00200000 [1025062.507703] ffff880214557e98 ffffffff810d82c8 ffff880214557e68 00000001061abf32 [1025062.517826] 00000001061abf31 00000000145dd330 ffff880214557fd8 ffffffffffffffff [1025062.529688] ffff88021fbcbee0 0000000000000096 ffff880214557ea8 0000000000000096 [1025062.539813] Call Trace: [1025062.543770] [] ? __tick_nohz_idle_enter+0xd8/0x400 [1025062.553713] [] ? cpu_startup_entry+0xe5/0x2e0 [1025062.561817] [] ? start_secondary+0x183/0x190 [1025062.586685] ============================================================================= [1025062.596941] BUG xfs_ili (Tainted: G D W ): Poison overwritten [1025062.606904] ----------------------------------------------------------------------------- [1025062.606904] [1025062.620946] INFO: 0xffff880122d89df8-0xffff880122d89e53. First byte 0x0 instead of 0x6b [1025062.632938] INFO: Slab 0xffffea00048b6240 objects=23 used=0 fp=0xffff880122d89790 flags=0x8000000000000080 [1025062.646949] INFO: Object 0xffff880122d89dc0 @offset=3520 fp=0xffff880122d89bb0 [1025062.646949] [1025062.660839] Bytes b4 ffff880122d89db0: b0 90 d8 22 01 88 ff ff 5a 5a 5a 5a 5a 5a 5a 5a ..."....ZZZZZZZZ [1025062.674834] Object ffff880122d89dc0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.688799] Object ffff880122d89dd0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.700991] Object ffff880122d89de0: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.714958] Object ffff880122d89df0: 6b 6b 6b 6b 6b 6b 6b 6b 00 00 00 00 00 00 00 00 kkkkkkkk........ [1025062.728935] Object ffff880122d89e00: 60 94 26 81 ff ff ff ff 6b 6b 6b 6b 6b 6b 6b 6b `.&.....kkkkkkkk [1025062.742883] Object ffff880122d89e10: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.756849] Object ffff880122d89e20: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.770808] Object ffff880122d89e30: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [1025062.782997] Object ffff880122d89e40: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 01 00 6b 6b 6b 6b kkkkkkkkkk..kkkk [1025062.796976] Object ffff880122d89e50: 00 00 00 00 6b 6b 6b a5 ....kkk. [1025062.809043] Redzone ffff880122d89e58: bb bb bb bb bb bb bb bb ........ [1025062.822922] Padding ffff880122d89e68: 5a 5a 5a 5a 5a 5a 5a 5a ZZZZZZZZ [1025062.835006] CPU: 3 PID: 25139 Comm: kworker/3:2 Tainted: G B D W 3.18.5-x86_64 #2 [1025062.847001] Hardware name: HP ProLiant DL360 G6, BIOS P64 07/02/2013 [1025062.856957] Workqueue: xfs-reclaim/sda3 xfs_reclaim_worker [1025062.864974] ffff880122d89dc0 ffff88011e7939a8 ffffffff817b2be3 00000000000000fc [1025062.875094] ffff8800da170700 ffff88011e7939e8 ffffffff8113a288 0000000000000008 [1025062.886964] ffff880100000001 ffff880122d89e54 ffff8800da170700 000000000000006b [1025062.897098] Call Trace: [1025062.901052] [] dump_stack+0x46/0x58 [1025062.908996] [] print_trailer+0x148/0x200 [1025062.917031] [] check_bytes_and_report+0xcf/0x110 [1025062.926948] [] check_object+0x1d7/0x250 [1025062.934963] [] __free_slab+0x140/0x180 [1025062.942961] [] ? xfs_inode_item_destroy+0x17/0x20 [1025062.951164] [] discard_slab+0x2c/0x40 [1025062.959168] [] __slab_free+0x297/0x2a6 [1025062.967116] [] ? call_rcu_sched+0x12/0x20 [1025062.976944] [] ? __radix_tree_delete_node+0x58/0x150 [1025062.985135] [] kmem_cache_free+0xef/0x120 [1025062.994968] [] xfs_inode_item_destroy+0x17/0x20 [1025063.003091] [] xfs_inode_free+0x79/0x130 [1025063.011120] [] xfs_reclaim_inode+0x20b/0x330 [1025063.020991] [] xfs_reclaim_inodes_ag+0x257/0x370 [1025063.029126] [] xfs_reclaim_worker+0x28/0x40 [1025063.038989] [] process_one_work+0x134/0x360 [1025063.047059] [] worker_thread+0x119/0x440 [1025063.055105] [] ? rescuer_thread+0x2a0/0x2a0 [1025063.063192] [] kthread+0xc4/0xe0 [1025063.071079] [] ? kthread_create_on_node+0x170/0x170 [1025063.081050] [] ret_from_fork+0x7c/0xb0 [1025063.089063] [] ? kthread_create_on_node+0x170/0x170 [1025063.099093] FIX xfs_ili: Restoring 0xffff880122d89df8-0xffff880122d89e53=0x6b [1025063.099093] Cheers, Bruno From mhocko@suse.cz Mon Feb 23 04:26:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BD62F7F47 for ; Mon, 23 Feb 2015 04:26:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F4D9304032 for ; Mon, 23 Feb 2015 02:26:40 -0800 (PST) X-ASG-Debug-ID: 1424687193-04bdf05bff47ae0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id hDeMVyWgS0HM96jo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 02:26:35 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 EBCD6ABE7; Mon, 23 Feb 2015 10:26:32 +0000 (UTC) Date: Mon, 23 Feb 2015 11:26:33 +0100 From: Michal Hocko To: Theodore Ts'o Cc: Dave Chinner , Tetsuo Handa , hannes@cmpxchg.org, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150223102633.GC24272@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150221032000.GC7922@thunk.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424687194 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 22:20:00, Theodore Ts'o wrote: [...] > So based on akpm's sage advise and wisdom, I added back GFP_NOFAIL to > ext4/jbd2. I am currently going through opencoded GFP_NOFAIL allocations and have this in my local branch currently. I assume you did the same so I will drop mine if you have pushed yours already. --- >From dc49cef75dbd677d5542c9e5bd27bbfab9a7bc3a Mon Sep 17 00:00:00 2001 From: Michal Hocko Date: Fri, 20 Feb 2015 11:32:58 +0100 Subject: [PATCH] jbd2: revert must-not-fail allocation loops back to GFP_NOFAIL This basically reverts 47def82672b3 (jbd2: Remove __GFP_NOFAIL from jbd2 layer). The deprecation of __GFP_NOFAIL was a bad choice because it led to open coding the endless loop around the allocator rather than removing the dependency on the non failing allocation. So the deprecation was a clear failure and the reality tells us that __GFP_NOFAIL is not even close to go away. It is still true that __GFP_NOFAIL allocations are generally discouraged and new uses should be evaluated and an alternative (pre-allocations or reservations) should be considered but it doesn't make any sense to lie the allocator about the requirements. Allocator can take steps to help making a progress if it knows the requirements. Signed-off-by: Michal Hocko --- fs/jbd2/journal.c | 11 +---------- fs/jbd2/transaction.c | 20 +++++++------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 1df94fabe4eb..878ed3e761f0 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -371,16 +371,7 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction, */ J_ASSERT_BH(bh_in, buffer_jbddirty(bh_in)); -retry_alloc: - new_bh = alloc_buffer_head(GFP_NOFS); - if (!new_bh) { - /* - * Failure is not an option, but __GFP_NOFAIL is going - * away; so we retry ourselves here. - */ - congestion_wait(BLK_RW_ASYNC, HZ/50); - goto retry_alloc; - } + new_bh = alloc_buffer_head(GFP_NOFS|__GFP_NOFAIL); /* keep subsequent assertions sane */ atomic_set(&new_bh->b_count, 1); diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index 5f09370c90a8..dac4523fa142 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -278,22 +278,16 @@ static int start_this_handle(journal_t *journal, handle_t *handle, alloc_transaction: if (!journal->j_running_transaction) { + /* + * If __GFP_FS is not present, then we may be being called from + * inside the fs writeback layer, so we MUST NOT fail. + */ + if ((gfp_mask & __GFP_FS) == 0) + gfp_mask |= __GFP_NOFAIL; new_transaction = kmem_cache_zalloc(transaction_cache, gfp_mask); - if (!new_transaction) { - /* - * If __GFP_FS is not present, then we may be - * being called from inside the fs writeback - * layer, so we MUST NOT fail. Since - * __GFP_NOFAIL is going away, we will arrange - * to retry the allocation ourselves. - */ - if ((gfp_mask & __GFP_FS) == 0) { - congestion_wait(BLK_RW_ASYNC, HZ/50); - goto alloc_transaction; - } + if (!new_transaction) return -ENOMEM; - } } jbd_debug(3, "New handle %p going live.\n", handle); -- 2.1.4 -- Michal Hocko SUSE Labs From mhocko@suse.cz Mon Feb 23 04:48:15 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DD9377F47 for ; Mon, 23 Feb 2015 04:48:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 864B6AC002 for ; Mon, 23 Feb 2015 02:48:14 -0800 (PST) X-ASG-Debug-ID: 1424688491-04bdf05c0148830001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id X7pWsDM34M1gXn8r (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 02:48:12 -0800 (PST) X-Barracuda-Envelope-From: mhocko@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 39269AC97; Mon, 23 Feb 2015 10:48:11 +0000 (UTC) Date: Mon, 23 Feb 2015 11:48:10 +0100 From: Michal Hocko To: Johannes Weiner Cc: Andrew Morton , Theodore Ts'o , Dave Chinner , Tetsuo Handa , dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150223104810.GD24272@dhcp22.suse.cz> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> <20150222002058.GB25079@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150222002058.GB25079@phnom.home.cmpxchg.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424688492 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat 21-02-15 19:20:58, Johannes Weiner wrote: > On Sat, Feb 21, 2015 at 01:19:07AM -0800, Andrew Morton wrote: > > Short term, we need to fix 3.19.x and 3.20 and that appears to be by > > applying Johannes's akpm-doesnt-know-why-it-works patch: > > > > --- a/mm/page_alloc.c > > +++ b/mm/page_alloc.c > > @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > if (high_zoneidx < ZONE_NORMAL) > > goto out; > > /* The OOM killer does not compensate for light reclaim */ > > - if (!(gfp_mask & __GFP_FS)) > > + if (!(gfp_mask & __GFP_FS)) { > > + /* > > + * XXX: Page reclaim didn't yield anything, > > + * and the OOM killer can't be invoked, but > > + * keep looping as per should_alloc_retry(). > > + */ > > + *did_some_progress = 1; > > goto out; > > + } > > /* > > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > > > Have people adequately confirmed that this gets us out of trouble? > > I'd be interested in this too. Who is seeing these failures? > > Andrew, can you please use the following changelog for this patch? > > --- > From: Johannes Weiner > > mm: page_alloc: revert inadvertent !__GFP_FS retry behavior change > > Historically, !__GFP_FS allocations were not allowed to invoke the OOM > killer once reclaim had failed, but nevertheless kept looping in the > allocator. 9879de7373fc ("mm: page_alloc: embed OOM killing naturally > into allocation slowpath"), which should have been a simple cleanup > patch, accidentally changed the behavior to aborting the allocation at > that point. This creates problems with filesystem callers (?) that > currently rely on the allocator waiting for other tasks to intervene. > > Revert the behavior as it shouldn't have been changed as part of a > cleanup patch. OK, if this a _short term_ change. I really think that all the requests except for __GFP_NOFAIL should be able to fail. I would argue that it should be the caller who should be fixed but it is true that the patch was introduced too late (rc7) and so it caught other subsystems unprepared so backporting to stable makes sense to me. But can we please move on and stop pretending that allocations do not fail for the upcoming release? > Fixes: 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") > Signed-off-by: Johannes Weiner Acked-by: Michal Hocko -- Michal Hocko SUSE Labs From eflorac@intellique.com Mon Feb 23 05:18:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9CE4F7F47 for ; Mon, 23 Feb 2015 05:18:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CE2B8F8052 for ; Mon, 23 Feb 2015 03:18:14 -0800 (PST) X-ASG-Debug-ID: 1424690290-04cbb0611049700001-NocioJ Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id 5a3f2ECMoqHhLfx1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 03:18:11 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.5 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp5-g21.free.fr (Postfix) with ESMTP id 361E8D48015; Mon, 23 Feb 2015 12:17:58 +0100 (CET) Date: Mon, 23 Feb 2015 12:18:12 +0100 From: Emmanuel Florac To: Dave Hall Cc: Dave Chinner , stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: XFS/LVM/Multipath on a single RAID volume Message-ID: <20150223121812.5077ff07@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume In-Reply-To: <54EA67B7.30805@binghamton.edu> References: <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> Organization: Intellique X-Mailer: Claws Mail 3.11.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: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1424690291 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15718 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Sun, 22 Feb 2015 18:35:19 -0500 Dave Hall =C3=A9crivait: > So since I have a fresh array that's not in production yet I was > hoping to get some pointers on how to configure it to maximize XFS=20 > performance. In particular, I've seen a suggestion that a > multipathed array should be sliced up into logical drives and pasted > back together with LVM. Wondering also about putting the journal in > a separate logical drive on the same array. What's the hardware configuration like? before multipathing, you need to know if your RAID controller and disks can actually saturate your link. Generally SAS-attached enclosures are driven through a 4 way SFF-8088 cable, with a bandwidth of 4x 6Gbps (maximum throughput per link: 3 GB/s) or 4 x 12 Gbps (max thruput: 6 GB/s). > I am able to set up a 2-way multipath right now, and I might be able > to justify adding a second controller to the array to get a 4-way > multipath going. A multipath can double the throughput, provided that you have enough drives: you'll need about 24 7k RPM drives to saturate _one_ 4x6Gbps SAS link. If you have only 12 drives, dual attachment probably won't yield much. > Even if the LVM approach is the wrong one, I clearly have a rare > chance to set this array up the right way. Please let me know if you > have any suggestions. In my experience, software RAID-0 with md gives slightly better performance than LVM, though not much. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From penguin-kernel@i-love.sakura.ne.jp Mon Feb 23 05:23:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92B337F47 for ; Mon, 23 Feb 2015 05:23:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3676F8F8049 for ; Mon, 23 Feb 2015 03:23:26 -0800 (PST) X-ASG-Debug-ID: 1424690603-04bdf05bff49ef0001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id 03r0EYvjjfsKD4Qv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 03:23:24 -0800 (PST) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from fsav401.sakura.ne.jp (fsav401.sakura.ne.jp [133.242.250.100]) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1NBN9NK027821; Mon, 23 Feb 2015 20:23:09 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) Received: from www262.sakura.ne.jp (202.181.97.72) by fsav401.sakura.ne.jp (F-Secure/virusgw_smtp/412/fsav401.sakura.ne.jp); Mon, 23 Feb 2015 20:23:09 +0900 (JST) X-Virus-Status: clean(F-Secure/virusgw_smtp/412/fsav401.sakura.ne.jp) Received: from AQUA (softbank126072124077.bbtec.net [126.72.124.77]) (authenticated bits=0) by www262.sakura.ne.jp (8.14.5/8.14.5) with ESMTP id t1NBN86Z027817; Mon, 23 Feb 2015 20:23:08 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: mhocko@suse.cz, hannes@cmpxchg.org Cc: akpm@linux-foundation.org, tytso@mit.edu, david@fromorbit.com, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? From: Tetsuo Handa X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> <20150222002058.GB25079@phnom.home.cmpxchg.org> <20150223104810.GD24272@dhcp22.suse.cz> In-Reply-To: <20150223104810.GD24272@dhcp22.suse.cz> Message-Id: <201502232023.BBG39069.SHOQLFtJFOOFMV@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Mon, 23 Feb 2015 20:23:08 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1424690604 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Michal Hocko wrote: > On Sat 21-02-15 19:20:58, Johannes Weiner wrote: > > On Sat, Feb 21, 2015 at 01:19:07AM -0800, Andrew Morton wrote: > > > Short term, we need to fix 3.19.x and 3.20 and that appears to be by > > > applying Johannes's akpm-doesnt-know-why-it-works patch: > > > > > > --- a/mm/page_alloc.c > > > +++ b/mm/page_alloc.c > > > @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, > > > if (high_zoneidx < ZONE_NORMAL) > > > goto out; > > > /* The OOM killer does not compensate for light reclaim */ > > > - if (!(gfp_mask & __GFP_FS)) > > > + if (!(gfp_mask & __GFP_FS)) { > > > + /* > > > + * XXX: Page reclaim didn't yield anything, > > > + * and the OOM killer can't be invoked, but > > > + * keep looping as per should_alloc_retry(). > > > + */ > > > + *did_some_progress = 1; > > > goto out; > > > + } > > > /* > > > * GFP_THISNODE contains __GFP_NORETRY and we never hit this. > > > * Sanity check for bare calls of __GFP_THISNODE, not real OOM. > > > > > > Have people adequately confirmed that this gets us out of trouble? > > > > I'd be interested in this too. Who is seeing these failures? So far ext4 and xfs. I don't have environment to test other filesystems. > > > > Andrew, can you please use the following changelog for this patch? > > > > --- > > From: Johannes Weiner > > > > mm: page_alloc: revert inadvertent !__GFP_FS retry behavior change > > > > Historically, !__GFP_FS allocations were not allowed to invoke the OOM > > killer once reclaim had failed, but nevertheless kept looping in the > > allocator. 9879de7373fc ("mm: page_alloc: embed OOM killing naturally > > into allocation slowpath"), which should have been a simple cleanup > > patch, accidentally changed the behavior to aborting the allocation at > > that point. This creates problems with filesystem callers (?) that > > currently rely on the allocator waiting for other tasks to intervene. > > > > Revert the behavior as it shouldn't have been changed as part of a > > cleanup patch. > > OK, if this a _short term_ change. I really think that all the requests > except for __GFP_NOFAIL should be able to fail. I would argue that it > should be the caller who should be fixed but it is true that the patch > was introduced too late (rc7) and so it caught other subsystems > unprepared so backporting to stable makes sense to me. But can we please > move on and stop pretending that allocations do not fail for the > upcoming release? > > > Fixes: 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") > > Signed-off-by: Johannes Weiner > > Acked-by: Michal Hocko > Without this patch, I think the system becomes unusable under OOM. However, with this patch, I know the system may become unusable under OOM. Please do write patches for handling below condition. Reported-by: Tetsuo Handa Johannes's patch will get us out of filesystem error troubles, at the cost of getting us into stall troubles (as with until 3.19-rc6). I retested http://marc.info/?l=linux-ext4&m=142443125221571&w=2 with debug printk patch shown below. ---------- debug printk patch ---------- diff --git a/mm/oom_kill.c b/mm/oom_kill.c index d503e9c..5144506 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -610,6 +610,8 @@ void oom_zonelist_unlock(struct zonelist *zonelist, gfp_t gfp_mask) spin_unlock(&zone_scan_lock); } +atomic_t oom_killer_skipped_count = ATOMIC_INIT(0); + /** * out_of_memory - kill the "best" process when we run out of memory * @zonelist: zonelist pointer @@ -679,6 +681,8 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, nodemask, "Out of memory"); killed = 1; } + else + atomic_inc(&oom_killer_skipped_count); out: /* * Give the killed threads a good chance of exiting before trying to diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8e20f9c..eaea16b 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2382,8 +2382,15 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, if (high_zoneidx < ZONE_NORMAL) goto out; /* The OOM killer does not compensate for light reclaim */ - if (!(gfp_mask & __GFP_FS)) + if (!(gfp_mask & __GFP_FS)) { + /* + * XXX: Page reclaim didn't yield anything, + * and the OOM killer can't be invoked, but + * keep looping as per should_alloc_retry(). + */ + *did_some_progress = 1; goto out; + } /* * GFP_THISNODE contains __GFP_NORETRY and we never hit this. * Sanity check for bare calls of __GFP_THISNODE, not real OOM. @@ -2635,6 +2642,8 @@ bool gfp_pfmemalloc_allowed(gfp_t gfp_mask) return !!(gfp_to_alloc_flags(gfp_mask) & ALLOC_NO_WATERMARKS); } +extern atomic_t oom_killer_skipped_count; + static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, struct zonelist *zonelist, enum zone_type high_zoneidx, @@ -2649,6 +2658,8 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, enum migrate_mode migration_mode = MIGRATE_ASYNC; bool deferred_compaction = false; int contended_compaction = COMPACT_CONTENDED_NONE; + unsigned long first_retried_time = 0; + unsigned long next_warn_time = 0; /* * In the slowpath, we sanity check order to avoid ever trying to @@ -2821,6 +2832,19 @@ retry: if (!did_some_progress) goto nopage; } + if (!first_retried_time) { + first_retried_time = jiffies; + if (!first_retried_time) + first_retried_time = 1; + next_warn_time = first_retried_time + 5 * HZ; + } else if (time_after(jiffies, next_warn_time)) { + printk(KERN_INFO "%d (%s) : gfp 0x%X : %lu seconds : " + "OOM-killer skipped %u\n", current->pid, + current->comm, gfp_mask, + (jiffies - first_retried_time) / HZ, + atomic_read(&oom_killer_skipped_count)); + next_warn_time = jiffies + 5 * HZ; + } /* Wait for some write requests to complete then retry */ wait_iff_congested(preferred_zone, BLK_RW_ASYNC, HZ/50); goto retry; ---------- debug printk patch ---------- GFP_NOFS allocations stalled for 10 minutes waiting for somebody else to volunteer memory. GFP_FS allocations stalled for 10 minutes waiting for the OOM killer to kill somebody. The OOM killer stalled for 10 minutes waiting for GFP_NOFS allocations to complete. I guess the system made forward progress because the number of remaining a.out processes decreased over time. (From http://I-love.SAKURA.ne.jp/tmp/serial-20150223-3.19-ext4-patched.txt.xz ) ---------- ext4 / Linux 3.19 + patch ---------- [ 1335.187579] Out of memory: Kill process 14156 (a.out) score 760 or sacrifice child [ 1335.189604] Killed process 14156 (a.out) total-vm:2167392kB, anon-rss:1360196kB, file-rss:0kB [ 1335.191920] Kill process 14177 (a.out) sharing same memory [ 1335.193465] Kill process 14178 (a.out) sharing same memory [ 1335.195013] Kill process 14179 (a.out) sharing same memory [ 1335.196580] Kill process 14180 (a.out) sharing same memory [ 1335.198128] Kill process 14181 (a.out) sharing same memory [ 1335.199674] Kill process 14182 (a.out) sharing same memory [ 1335.201217] Kill process 14183 (a.out) sharing same memory [ 1335.202768] Kill process 14184 (a.out) sharing same memory [ 1335.204316] Kill process 14185 (a.out) sharing same memory [ 1335.205871] Kill process 14186 (a.out) sharing same memory [ 1335.207420] Kill process 14187 (a.out) sharing same memory [ 1335.208974] Kill process 14188 (a.out) sharing same memory [ 1335.210515] Kill process 14189 (a.out) sharing same memory [ 1335.212063] Kill process 14190 (a.out) sharing same memory [ 1335.213611] Kill process 14191 (a.out) sharing same memory [ 1335.215165] Kill process 14192 (a.out) sharing same memory [ 1335.216715] Kill process 14193 (a.out) sharing same memory [ 1335.218286] Kill process 14194 (a.out) sharing same memory [ 1335.219836] Kill process 14195 (a.out) sharing same memory [ 1335.221378] Kill process 14196 (a.out) sharing same memory [ 1335.222918] Kill process 14197 (a.out) sharing same memory [ 1335.224461] Kill process 14198 (a.out) sharing same memory [ 1335.225999] Kill process 14199 (a.out) sharing same memory [ 1335.227545] Kill process 14200 (a.out) sharing same memory [ 1335.229095] Kill process 14201 (a.out) sharing same memory [ 1335.230643] Kill process 14202 (a.out) sharing same memory [ 1335.232184] Kill process 14203 (a.out) sharing same memory [ 1335.233738] Kill process 14204 (a.out) sharing same memory [ 1335.235293] Kill process 14205 (a.out) sharing same memory [ 1335.236834] Kill process 14206 (a.out) sharing same memory [ 1335.238387] Kill process 14207 (a.out) sharing same memory [ 1335.239930] Kill process 14208 (a.out) sharing same memory [ 1335.241471] Kill process 14209 (a.out) sharing same memory [ 1335.243011] Kill process 14210 (a.out) sharing same memory [ 1335.244554] Kill process 14211 (a.out) sharing same memory [ 1335.246101] Kill process 14212 (a.out) sharing same memory [ 1335.247645] Kill process 14213 (a.out) sharing same memory [ 1335.249182] Kill process 14214 (a.out) sharing same memory [ 1335.250718] Kill process 14215 (a.out) sharing same memory [ 1335.252305] Kill process 14216 (a.out) sharing same memory [ 1335.253899] Kill process 14217 (a.out) sharing same memory [ 1335.255443] Kill process 14218 (a.out) sharing same memory [ 1335.256993] Kill process 14219 (a.out) sharing same memory [ 1335.258531] Kill process 14220 (a.out) sharing same memory [ 1335.260066] Kill process 14221 (a.out) sharing same memory [ 1335.261616] Kill process 14222 (a.out) sharing same memory [ 1335.263143] Kill process 14223 (a.out) sharing same memory [ 1335.264647] Kill process 14224 (a.out) sharing same memory [ 1335.266121] Kill process 14225 (a.out) sharing same memory [ 1335.267598] Kill process 14226 (a.out) sharing same memory [ 1335.269077] Kill process 14227 (a.out) sharing same memory [ 1335.270560] Kill process 14228 (a.out) sharing same memory [ 1335.272038] Kill process 14229 (a.out) sharing same memory [ 1335.273508] Kill process 14230 (a.out) sharing same memory [ 1335.274999] Kill process 14231 (a.out) sharing same memory [ 1335.276469] Kill process 14232 (a.out) sharing same memory [ 1335.277947] Kill process 14233 (a.out) sharing same memory [ 1335.279428] Kill process 14234 (a.out) sharing same memory [ 1335.280894] Kill process 14235 (a.out) sharing same memory [ 1335.282361] Kill process 14236 (a.out) sharing same memory [ 1335.283832] Kill process 14237 (a.out) sharing same memory [ 1335.285304] Kill process 14238 (a.out) sharing same memory [ 1335.286768] Kill process 14239 (a.out) sharing same memory [ 1335.288242] Kill process 14240 (a.out) sharing same memory [ 1335.289714] Kill process 14241 (a.out) sharing same memory [ 1335.291196] Kill process 14242 (a.out) sharing same memory [ 1335.292731] Kill process 14243 (a.out) sharing same memory [ 1335.294258] Kill process 14244 (a.out) sharing same memory [ 1335.295734] Kill process 14245 (a.out) sharing same memory [ 1335.297215] Kill process 14246 (a.out) sharing same memory [ 1335.298710] Kill process 14247 (a.out) sharing same memory [ 1335.300188] Kill process 14248 (a.out) sharing same memory [ 1335.301672] Kill process 14249 (a.out) sharing same memory [ 1335.303157] Kill process 14250 (a.out) sharing same memory [ 1335.304655] Kill process 14251 (a.out) sharing same memory [ 1335.306141] Kill process 14252 (a.out) sharing same memory [ 1335.307621] Kill process 14253 (a.out) sharing same memory [ 1335.309107] Kill process 14254 (a.out) sharing same memory [ 1335.310573] Kill process 14255 (a.out) sharing same memory [ 1335.312052] Kill process 14256 (a.out) sharing same memory [ 1335.313528] Kill process 14257 (a.out) sharing same memory [ 1335.315039] Kill process 14258 (a.out) sharing same memory [ 1335.316522] Kill process 14259 (a.out) sharing same memory [ 1335.317992] Kill process 14260 (a.out) sharing same memory [ 1335.319462] Kill process 14261 (a.out) sharing same memory [ 1335.320965] Kill process 14262 (a.out) sharing same memory [ 1335.322459] Kill process 14263 (a.out) sharing same memory [ 1335.323958] Kill process 14264 (a.out) sharing same memory [ 1335.325472] Kill process 14265 (a.out) sharing same memory [ 1335.326966] Kill process 14266 (a.out) sharing same memory [ 1335.328454] Kill process 14267 (a.out) sharing same memory [ 1335.329945] Kill process 14268 (a.out) sharing same memory [ 1335.331444] Kill process 14269 (a.out) sharing same memory [ 1335.332944] Kill process 14270 (a.out) sharing same memory [ 1335.334435] Kill process 14271 (a.out) sharing same memory [ 1335.335930] Kill process 14272 (a.out) sharing same memory [ 1335.337437] Kill process 14273 (a.out) sharing same memory [ 1335.338927] Kill process 14274 (a.out) sharing same memory [ 1335.340400] Kill process 14275 (a.out) sharing same memory [ 1335.341890] Kill process 14276 (a.out) sharing same memory [ 1339.640500] 464 (systemd-journal) : gfp 0x201DA : 5 seconds : OOM-killer skipped 22459181 [ 1339.649374] 615 (vmtoolsd) : gfp 0x201DA : 5 seconds : OOM-killer skipped 22459438 [ 1339.649611] 4079 (pool) : gfp 0x201DA : 5 seconds : OOM-killer skipped 22459447 [ 1340.343322] 14258 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478275 [ 1340.343331] 14194 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478275 [ 1340.343345] 14210 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478276 [ 1340.343360] 14179 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478277 [ 1340.345290] 14154 (su) : gfp 0x201DA : 5 seconds : OOM-killer skipped 22478339 [ 1340.345312] 14180 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478339 [ 1340.345319] 14260 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478339 [ 1340.345337] 14178 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478340 [ 1340.345345] 14245 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478340 [ 1340.345361] 14226 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478341 [ 1340.346119] 14256 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478368 [ 1340.346139] 14181 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478369 [ 1340.347082] 14274 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478402 [ 1340.347091] 14267 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478402 [ 1340.347095] 14189 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478402 [ 1340.347099] 14238 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478402 [ 1340.347107] 14276 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478403 [ 1340.347112] 14183 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478403 [ 1340.347397] 14254 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478413 [ 1340.347402] 14228 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478413 [ 1340.347414] 14185 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478414 [ 1340.347419] 14261 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478414 [ 1340.347423] 14217 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478414 [ 1340.347427] 14203 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478414 [ 1340.347439] 14234 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478415 [ 1340.347452] 14269 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478415 [ 1340.347461] 14255 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478416 [ 1340.347465] 14192 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478416 [ 1340.347473] 14259 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478416 [ 1340.347492] 14232 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478417 [ 1340.347497] 14223 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478417 [ 1340.347505] 14220 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478417 [ 1340.347523] 14252 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478418 [ 1340.347531] 14193 (a.out) : gfp 0x50 : 5 seconds : OOM-killer skipped 22478418 (...snipped...) [ 1949.672951] 43 (kworker/1:1) : gfp 0x10 : 90 seconds : OOM-killer skipped 41315348 [ 1949.993045] 4079 (pool) : gfp 0x201DA : 615 seconds : OOM-killer skipped 41325108 [ 1950.694909] 14269 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41346727 [ 1950.703945] 14181 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41347003 [ 1950.742087] 14254 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41348208 [ 1950.744937] 14193 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41348299 [ 1950.748884] 2 (kthreadd) : gfp 0x2000D0 : 10 seconds : OOM-killer skipped 41348418 [ 1950.751565] 14203 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41348502 [ 1950.756955] 14232 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41348656 [ 1950.776918] 14185 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41349279 [ 1950.791214] 14217 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41349720 [ 1950.798961] 14179 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41349957 [ 1950.806551] 14255 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41350209 [ 1950.810860] 14234 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41350356 [ 1950.813821] 14258 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41350450 [ 1950.860422] 14261 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41351919 [ 1950.864015] 14210 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41352033 [ 1950.866636] 14226 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41352107 [ 1950.905003] 14238 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41353303 [ 1950.907813] 14180 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41353381 [ 1950.913963] 14276 (a.out) : gfp 0x50 : 615 seconds : OOM-killer skipped 41353567 [ 1952.238344] 649 (chronyd) : gfp 0x201DA : 25 seconds : OOM-killer skipped 41393388 [ 1952.243228] 4030 (gnome-shell) : gfp 0x201DA : 25 seconds : OOM-killer skipped 41393566 [ 1952.247225] 592 (audispd) : gfp 0x201DA : 25 seconds : OOM-killer skipped 41393701 [ 1952.258265] 1 (systemd) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41394041 [ 1952.269296] 1691 (rpcbind) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41394365 [ 1952.299073] 702 (rtkit-daemon) : gfp 0x201DA : 95 seconds : OOM-killer skipped 41395288 [ 1952.301231] 627 (lsmd) : gfp 0x201DA : 105 seconds : OOM-killer skipped 41395385 [ 1952.350200] 464 (systemd-journal) : gfp 0x201DA : 165 seconds : OOM-killer skipped 41396935 [ 1952.472040] 543 (auditd) : gfp 0x201DA : 95 seconds : OOM-killer skipped 41400669 [ 1952.475211] 14154 (su) : gfp 0x201DA : 95 seconds : OOM-killer skipped 41400795 [ 1952.527084] 3514 (smbd) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41402412 [ 1952.543205] 613 (irqbalance) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41402892 [ 1952.568276] 12672 (pickup) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41403656 [ 1952.572329] 770 (tuned) : gfp 0x201DA : 95 seconds : OOM-killer skipped 41403784 [ 1952.578076] 3392 (master) : gfp 0x201DA : 35 seconds : OOM-killer skipped 41403955 [ 1952.597273] 615 (vmtoolsd) : gfp 0x201DA : 105 seconds : OOM-killer skipped 41404520 [ 1952.619187] 14146 (sleep) : gfp 0x201DA : 105 seconds : OOM-killer skipped 41405206 [ 1952.621214] 811 (NetworkManager) : gfp 0x201DA : 105 seconds : OOM-killer skipped 41405265 [ 1952.765035] 3700 (gnome-settings-) : gfp 0x201DA : 315 seconds : OOM-killer skipped 41409551 [ 1952.776099] 603 (alsactl) : gfp 0x201DA : 315 seconds : OOM-killer skipped 41409856 [ 1952.823163] 661 (crond) : gfp 0x201DA : 325 seconds : OOM-killer skipped 41411303 [ 1953.201269] SysRq : Resetting ---------- ext4 / Linux 3.19 + patch ---------- I also tested on XFS. One is Linux 3.19 and the other is Linux 3.19 with debug printk patch shown above. According to console logs, oom_kill_process() is trivially called via pagefault_out_of_memory() for the former kernel. Due to giving up !GFP_FS allocations immediately? (From http://I-love.SAKURA.ne.jp/tmp/serial-20150223-3.19-xfs-unpatched.txt.xz ) ---------- xfs / Linux 3.19 ---------- [ 793.283099] su invoked oom-killer: gfp_mask=0x0, order=0, oom_score_adj=0 [ 793.283102] su cpuset=/ mems_allowed=0 [ 793.283104] CPU: 3 PID: 9552 Comm: su Not tainted 3.19.0 #40 [ 793.283159] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/31/2013 [ 793.283161] 0000000000000000 ffff88007ac03bf8 ffffffff816ae9d4 000000000000bebe [ 793.283162] ffff880078b0d740 ffff88007ac03c98 ffffffff816ac7ac 0000000000000206 [ 793.283163] 0000000481f30298 ffff880073e55850 ffff88007ac03c88 ffff88007a20bef8 [ 793.283164] Call Trace: [ 793.283169] [] dump_stack+0x45/0x57 [ 793.283171] [] dump_header+0x7f/0x1f1 [ 793.283174] [] oom_kill_process+0x22b/0x390 [ 793.283177] [] ? has_capability_noaudit+0x20/0x30 [ 793.283178] [] out_of_memory+0x4b2/0x500 [ 793.283179] [] pagefault_out_of_memory+0x77/0x90 [ 793.283180] [] mm_fault_error+0x67/0x140 [ 793.283182] [] __do_page_fault+0x3f6/0x580 [ 793.283185] [] ? remove_wait_queue+0x4d/0x60 [ 793.283186] [] ? do_wait+0x12b/0x240 [ 793.283187] [] do_page_fault+0x31/0x70 [ 793.283189] [] page_fault+0x28/0x30 ---------- xfs / Linux 3.19 ---------- On the other hand, stall is observed for the latter kernel. I guess that this time the system failed to make forward progress, for oom_killer_skipped_count is increasing over time but the number of remaining a.out processes remained unchanged. (From http://I-love.SAKURA.ne.jp/tmp/serial-20150223-3.19-xfs-patched.txt.xz ) ---------- xfs / Linux 3.19 + patch ---------- [ 2062.847965] 505 (abrt-watch-log) : gfp 0x2015A : 682 seconds : OOM-killer skipped 22388568 [ 2062.850270] 515 (lsmd) : gfp 0x2015A : 674 seconds : OOM-killer skipped 22388662 [ 2062.850389] 491 (audispd) : gfp 0x2015A : 666 seconds : OOM-killer skipped 22388667 [ 2062.850400] 346 (systemd-journal) : gfp 0x2015A : 683 seconds : OOM-killer skipped 22388667 [ 2062.850402] 610 (rtkit-daemon) : gfp 0x2015A : 677 seconds : OOM-killer skipped 22388667 [ 2062.850424] 494 (alsactl) : gfp 0x2015A : 546 seconds : OOM-killer skipped 22388668 [ 2062.850446] 558 (crond) : gfp 0x2015A : 645 seconds : OOM-killer skipped 22388669 [ 2062.850451] 25532 (su) : gfp 0x2015A : 682 seconds : OOM-killer skipped 22388669 [ 2062.850456] 516 (vmtoolsd) : gfp 0x2015A : 683 seconds : OOM-killer skipped 22388669 [ 2062.850494] 741 (NetworkManager) : gfp 0x2015A : 530 seconds : OOM-killer skipped 22388670 [ 2062.850503] 3132 (master) : gfp 0x2015A : 644 seconds : OOM-killer skipped 22388671 [ 2062.850508] 3144 (pickup) : gfp 0x2015A : 604 seconds : OOM-killer skipped 22388671 [ 2062.850512] 3145 (qmgr) : gfp 0x2015A : 526 seconds : OOM-killer skipped 22388671 [ 2062.850540] 25653 (a.out) : gfp 0x102005A : 683 seconds : OOM-killer skipped 22388672 [ 2062.850561] 655 (tuned) : gfp 0x2015A : 682 seconds : OOM-killer skipped 22388673 [ 2062.852404] 10429 (kworker/0:14) : gfp 0x2040D0 : 683 seconds : OOM-killer skipped 22388748 [ 2062.852430] 543 (chronyd) : gfp 0x2015A : 293 seconds : OOM-killer skipped 22388749 [ 2062.852436] 13012 (goa-daemon) : gfp 0x2015A : 679 seconds : OOM-killer skipped 22388749 [ 2062.852449] 1454 (rpcbind) : gfp 0x2015A : 662 seconds : OOM-killer skipped 22388749 [ 2062.854288] 466 (auditd) : gfp 0x2015A : 626 seconds : OOM-killer skipped 22388751 [ 2062.854305] 25622 (a.out) : gfp 0x102005A : 683 seconds : OOM-killer skipped 22388751 [ 2062.854426] 1419 (dhclient) : gfp 0x2015A : 388 seconds : OOM-killer skipped 22388751 [ 2062.854443] 25638 (a.out) : gfp 0x204250 : 683 seconds : OOM-killer skipped 22388751 [ 2062.854450] 25582 (a.out) : gfp 0x102005A : 683 seconds : OOM-killer skipped 22388751 [ 2062.854462] 25400 (sleep) : gfp 0x2015A : 635 seconds : OOM-killer skipped 22388751 [ 2062.854469] 532 (smartd) : gfp 0x2015A : 246 seconds : OOM-killer skipped 22388751 [ 2062.854486] 2 (kthreadd) : gfp 0x2040D0 : 682 seconds : OOM-killer skipped 22388752 [ 2062.854497] 3867 (gnome-shell) : gfp 0x2015A : 683 seconds : OOM-killer skipped 22388752 [ 2062.854502] 3562 (gnome-settings-) : gfp 0x2015A : 676 seconds : OOM-killer skipped 22388752 [ 2062.854524] 25641 (a.out) : gfp 0x102005A : 683 seconds : OOM-killer skipped 22388753 [ 2062.854536] 25566 (a.out) : gfp 0x102005A : 683 seconds : OOM-killer skipped 22388753 [ 2062.908915] 61 (kworker/3:1) : gfp 0x2040D0 : 682 seconds : OOM-killer skipped 22390715 [ 2062.913407] 531 (irqbalance) : gfp 0x2015A : 679 seconds : OOM-killer skipped 22390894 [ 2064.988155] SysRq : Resetting ---------- xfs / Linux 3.19 + patch ---------- Oh, current code is too hintless to determine whether forward progress is made, for no kernel messages are printed when the OOM victim failed to die immediately. I wish we had debug printk patch shown above and/or like http://marc.info/?l=linux-mm&m=141671829611143&w=2 . From ahferroin7@gmail.com Mon Feb 23 06:20:48 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 F10F67F47 for ; Mon, 23 Feb 2015 06:20:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8AEADAC002 for ; Mon, 23 Feb 2015 04:20:47 -0800 (PST) X-ASG-Debug-ID: 1424694044-04bdf05c004c740001-NocioJ Received: from mail-ig0-f173.google.com (mail-ig0-f173.google.com [209.85.213.173]) by cuda.sgi.com with ESMTP id H0lSuitOXHh7OOEu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 23 Feb 2015 04:20:45 -0800 (PST) X-Barracuda-Envelope-From: ahferroin7@gmail.com Received: by mail-ig0-f173.google.com with SMTP id a13so17607529igq.0 for ; Mon, 23 Feb 2015 04:20:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:disposition-notification-to:date:from:user-agent :mime-version:to:cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=89S5iwER2LFwD+vBJ52aeml4WbM+8gqfCb987fepjrk=; b=sONOsxGvGlCXkWsdUhF077hzigLx0W2cqJVMCuGEiSj3FhJRQHRhTxmVi32FWR8UIR Dj6CLbdZGCWAA+S3rRpEbYo/tkzEZf337JaYBjlmLrqIRdE97QN/rJnYmccqZXPBr8CV TxL2h7fSqqLQ6VDlNC2vPEhZev8b5qTuWD9llxKq09RSOhcvBEvY2u0QzVlzwgpm5vOv PIxk2RDNvxb0vCwYc6wheYrXUIIUKWEo2PooS4IjwzsRgMRr05TsajEzveXmCoBiYmXs dv/8gmZBepklKS52N/2z+vs8IUElQbHEEuIq1BIRuUQpNqmqBpTGRPdeg2rmGv1p3ktc YLUQ== X-Received: by 10.50.107.36 with SMTP id gz4mr12582167igb.25.1424694044893; Mon, 23 Feb 2015 04:20:44 -0800 (PST) Received: from [191.9.212.191] (rrcs-70-62-41-24.central.biz.rr.com. [70.62.41.24]) by mx.google.com with ESMTPSA id l6sm6016111igv.8.2015.02.23.04.20.43 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 23 Feb 2015 04:20:43 -0800 (PST) Message-ID: <54EB1B19.8050808@gmail.com> X-Barracuda-Apparent-Source-IP: 191.9.212.191 Disposition-Notification-To: Austin S Hemmelgarn Date: Mon, 23 Feb 2015 07:20:41 -0500 From: Austin S Hemmelgarn User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Theodore Ts'o , Eric Sandeen CC: Michael Kerrisk , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <20150221025636.GB7922@thunk.org> x-hashcash: 1:21:150223:tytso@mit.edu::a46288c48deb3064c54ec5d84754d6de:eeddda86ac5c9fb0 x-hashcash: 1:21:150223:sandeen@redhat.com::1478533e181c3175df53a8d06c6c118:a116bdab50ebec7c x-hashcash: 1:21:150223:mtk.manpages@gmail.com::6e401c4f8cb01adc089ee6e7bb2a5f:50f09360aa236ca2 x-hashcash: 1:21:150223:linux-ext4@vger.kernel.org::b4c6532ec7e22199abe8fb3498a63ee5:d2a267144cc222bf x-hashcash: 1:21:150223:linux-btrfs@vger.kernel.org::b85a32b290b080724628d78f63f81cc:d1eb1c733599cae x-hashcash: 1:21:150223:xfs@oss.sgi.com::8db37747edde457d49829d080368c55b:fdcf6b5ded2ea8f7 x-hashcash: 1:21:150223:linux-man@vger.kernel.org::ea036dce8d82441bc6c0ddef41bd31a4:dafa2d8fa7338e5a x-hashcash: 1:21:150223:linux-fsdevel@vger.kernel.org::f911f3204a975c35a899478f273c1e15:a69c6f4cb9a1c964 x-hashcash: 1:21:150223:linux-api@vger.kernel.org::e628f073270247d412a5aa938f243b82:83a7e650624befc4 x-stampprotocols: hashcash:1:17;mbound:0:10:3000:5000 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ig0-f173.google.com[209.85.213.173] X-Barracuda-Start-Time: 1424694045 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15721 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 2015-02-20 21:56, Theodore Ts'o wrote: > On Fri, Feb 20, 2015 at 09:49:34AM -0600, Eric Sandeen wrote: >> >>> This mount option significantly reduces writes to the >>> inode table for workloads that perform frequent random >>> writes to preallocated files. >> >> This seems like an overly specific description of a single workload out >> of many which may benefit, but what do others think? "inode table" is also >> fairly extN-specific. > > How about somethign like "This mount significantly reduces writes > needed to update the inode's timestamps, especially mtime and actime. > Examples of workloads where this could be a large win include frequent > random writes to preallocated files, as well as cases where the > MS_STRICTATIME mount option is enabled."? > > (The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat system > calls will return the correctly updated atime, but those atime updates > won't get flushed to disk unless the inode needs to be updated for > file system / data consistency reasons, or when the inode is pushed > out of memory, or when the file system is unmounted.) > If you want to list some specific software, it should help with anything that uses sqlite (which notably includes firefox and chrome), as well as most RDMS software and systemd-journald. From jack@suse.cz Mon Feb 23 06:52:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B9C3B7F47 for ; Mon, 23 Feb 2015 06:52:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 51401AC003 for ; Mon, 23 Feb 2015 04:52:59 -0800 (PST) X-ASG-Debug-ID: 1424695975-04bdf05c024df70001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id G0SEBEYBv7a5aRlf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 04:52: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 A3AE5AAC8; Mon, 23 Feb 2015 12:52:54 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D4DCB8274F; Mon, 23 Feb 2015 13:52:50 +0100 (CET) Date: Mon, 23 Feb 2015 13:52:50 +0100 From: Jan Kara To: Matthew Wilcox Cc: Jan Kara , "Wilcox, Matthew R" , "ross.zwisler@linux.intel.com" , "akpm@linux-foundation.org" , "Dilger, Andreas" , "axboe@kernel.dk" , "boaz@plexistor.com" , "david@fromorbit.com" , "hch@lst.de" , "kirill.shutemov@linux.intel.com" , "mathieu.desnoyers@efficios.com" , "rdunlap@infradead.org" , "tytso@mit.edu" , "mm-commits@vger.kernel.org" , "linux-ext4@vger.kernel.org" , xfs@oss.sgi.com Subject: Re: + ext4-add-dax-functionality.patch added to -mm tree Message-ID: <20150223125250.GB2682@quack.suse.cz> X-ASG-Orig-Subj: Re: + ext4-add-dax-functionality.patch added to -mm tree References: <54b45495.+RptMlNQorYE9TTf%akpm@linux-foundation.org> <20150115124106.GF12739@quack.suse.cz> <100D68C7BA14664A8938383216E40DE040853440@FMSMSX114.amr.corp.intel.com> <20150119141858.GF5662@quack.suse.cz> <20150217085200.GA23192@quack.suse.cz> <20150217133745.GG3364@wil.cx> <20150218104009.GB4614@quack.suse.cz> <20150220221551.GB2780@wil.cx> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150220221551.GB2780@wil.cx> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424695976 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15722 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 20-02-15 17:15:51, Matthew Wilcox wrote: > > So to handle this it can start transaction in ext4_dax_fault() / > > ext4_dax_mkwrite() if write is requested and call ext4_jbd2_file_inode() > > after dax_fault() / dax_mkwrite() returns. Complete function will look > > something like follows: > > How about this? I tried to encompass both the unwritten extent conversion > as well as starting the journal at the right point in the locking hierarchy. > > If we're going to expose do_dax_fault(), I think it needs to be called > __dax_fault(). > > I decided to return VM_FAULT_RETRY and a new flag VM_FAULT_UNWRITTEN from > __dax_fault(), rather than convert it to return an errno. I don't like using VM_FAULT_RETRY for ENOSPC. Different filesystems may want different things on this condition. In particular, if a filesystem decides to use dax_fault(), VM_FAULT_RETRY will get propagated up into mm code which just retries the fault (or gets confused if FAULT_FLAG_ALLOW_RETRY wasn't set). If you want to stay with VM_FAULT_XXX return values (which makes some sense), then I guess you need something like VM_FAULT_ENOSPC and convert that to VM_FAULT_SIGBUS in dax_fault(). Otherwise the patch looks good. Honza > P.S. I love patches which touch *both* fs.h *and* mm.h. In case there > were any files that weren't already being rebuilt. > > diff --git a/fs/dax.c b/fs/dax.c > index 556238f..81dbdaa 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -316,7 +316,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, > return error; > } > > -static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > +int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > get_block_t get_block) > { > struct file *file = vma->vm_file; > @@ -329,7 +329,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > sector_t block; > pgoff_t size; > int error; > - int major = 0; > + int ret = 0; > > size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; > if (vmf->pgoff >= size) > @@ -367,13 +367,15 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > error = -EIO; /* fs corruption? */ > if (error) > goto unlock_page; > + if (buffer_unwritten(&bh)) > + ret |= VM_FAULT_UNWRITTEN; > > if (!buffer_mapped(&bh) && !buffer_unwritten(&bh) && !vmf->cow_page) { > if (vmf->flags & FAULT_FLAG_WRITE) { > error = get_block(inode, block, &bh, 1); > count_vm_event(PGMAJFAULT); > mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); > - major = VM_FAULT_MAJOR; > + ret = VM_FAULT_MAJOR; > if (!error && (bh.b_size < PAGE_SIZE)) > error = -EIO; > if (error) > @@ -407,7 +409,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > } > > /* Check we didn't race with a read fault installing a new page */ > - if (!page && major) > + if (!page && (ret & VM_FAULT_MAJOR)) > page = find_lock_page(mapping, vmf->pgoff); > > if (page) { > @@ -421,12 +423,14 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > error = dax_insert_mapping(inode, &bh, vma, vmf); > > out: > + if (error == -ENOSPC) > + return VM_FAULT_RETRY | ret; > if (error == -ENOMEM) > - return VM_FAULT_OOM | major; > + return VM_FAULT_OOM | ret; > /* -EBUSY is fine, somebody else faulted on the same PTE */ > if ((error < 0) && (error != -EBUSY)) > - return VM_FAULT_SIGBUS | major; > - return VM_FAULT_NOPAGE | major; > + return VM_FAULT_SIGBUS | ret; > + return VM_FAULT_NOPAGE | ret; > > unlock_page: > if (page) { > @@ -435,6 +439,7 @@ static int do_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > } > goto out; > } > +EXPORT_SYMBOL_GPL(__dax_fault); > > /** > * dax_fault - handle a page fault on a DAX file > @@ -455,7 +460,7 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > sb_start_pagefault(sb); > file_update_time(vma->vm_file); > } > - result = do_dax_fault(vma, vmf, get_block); > + result = __dax_fault(vma, vmf, get_block); > if (vmf->flags & FAULT_FLAG_WRITE) > sb_end_pagefault(sb); > > diff --git a/fs/ext4/file.c b/fs/ext4/file.c > index 4340e38..84b4f1c 100644 > --- a/fs/ext4/file.c > +++ b/fs/ext4/file.c > @@ -194,7 +194,58 @@ errout: > #ifdef CONFIG_FS_DAX > static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) > { > - return dax_fault(vma, vmf, ext4_get_block_write); > + handle_t *handle; > + int create = (vmf->flags & FAULT_FLAG_WRITE) && !vmf->cow_page; > + struct inode *inode = file_inode(vma->vm_file); > + int ret, err = 0; > + int retries = 0; > + > + if (create) { > + sb_start_pagefault(inode->i_sb); > + file_update_time(vma->vm_file); > + retry_alloc: > + handle = ext4_journal_start(inode, EXT4_HT_WRITE_PAGE, > + ext4_writepage_trans_blocks(inode)); > + if (IS_ERR(handle)) { > + err = PTR_ERR(handle); > + goto err; > + } > + } > + > + ret = __dax_fault(vma, vmf, ext4_get_block); > + > + if (create) { > + if (ret & VM_FAULT_UNWRITTEN) { > + loff_t offset = (loff_t)vmf->pgoff << PAGE_SHIFT; > + err = ext4_convert_unwritten_extents(NULL, inode, > + offset, PAGE_SIZE); > + ret &= ~VM_FAULT_UNWRITTEN; > + } > + if (!err && > + ext4_test_inode_state(inode, EXT4_STATE_ORDERED_MODE)) > + err = ext4_jbd2_file_inode(handle, inode); > + > + if (err == -ENOSPC) { > + ret |= VM_FAULT_RETRY; > + err = 0; > + } > + > + ext4_journal_stop(handle); > + if (err < 0) > + goto err; > + if ((ret & VM_FAULT_RETRY) && > + ext4_should_retry_alloc(inode->i_sb, &retries)) > + goto retry_alloc; > + ret &= ~VM_FAULT_RETRY; > + } > + > + out: > + if (create) > + sb_end_pagefault(inode->i_sb); > + return ret; > + err: > + ret = block_page_mkwrite_return(err); > + goto out; > } > > static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 85404f1..8f1ea7d 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -657,18 +657,6 @@ has_zeroout: > return retval; > } > > -static void ext4_end_io_unwritten(struct buffer_head *bh, int uptodate) > -{ > - struct inode *inode = bh->b_assoc_map->host; > - /* XXX: breaks on 32-bit > 16GB. Is that even supported? */ > - loff_t offset = (loff_t)(uintptr_t)bh->b_private << inode->i_blkbits; > - int err; > - if (!uptodate) > - return; > - WARN_ON(!buffer_unwritten(bh)); > - err = ext4_convert_unwritten_extents(NULL, inode, offset, bh->b_size); > -} > - > /* Maximum number of blocks we map for direct IO at once. */ > #define DIO_MAX_BLOCKS 4096 > > @@ -706,11 +694,6 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock, > > map_bh(bh, inode->i_sb, map.m_pblk); > bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; > - if (IS_DAX(inode) && buffer_unwritten(bh) && !io_end) { > - bh->b_assoc_map = inode->i_mapping; > - bh->b_private = (void *)(unsigned long)iblock; > - bh->b_end_io = ext4_end_io_unwritten; > - } > if (io_end && io_end->flag & EXT4_IO_END_UNWRITTEN) > set_buffer_defer_completion(bh); > bh->b_size = inode->i_sb->s_blocksize * map.m_len; > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 239c89c..2af5050 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -2597,6 +2597,7 @@ int dax_clear_blocks(struct inode *, sector_t block, 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); > +int __dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t); > int dax_pmd_fault(struct vm_area_struct *, unsigned long addr, pmd_t *, > unsigned int flags, get_block_t); > #define dax_mkwrite(vma, vmf, gb) dax_fault(vma, vmf, gb) > diff --git a/include/linux/mm.h b/include/linux/mm.h > index ceb50ec..ffc9947 100644 > --- a/include/linux/mm.h > +++ b/include/linux/mm.h > @@ -1100,7 +1100,7 @@ static inline int page_mapped(struct page *page) > #define VM_FAULT_HWPOISON 0x0010 /* Hit poisoned small page */ > #define VM_FAULT_HWPOISON_LARGE 0x0020 /* Hit poisoned large page. Index encoded in upper bits */ > #define VM_FAULT_SIGSEGV 0x0040 > - > +#define VM_FAULT_UNWRITTEN 0x0080 /* Unwritten extent needs conversion */ > #define VM_FAULT_NOPAGE 0x0100 /* ->fault installed the pte, not return page */ > #define VM_FAULT_LOCKED 0x0200 /* ->fault locked the returned page */ > #define VM_FAULT_RETRY 0x0400 /* ->fault blocked, must retry */ -- Jan Kara SUSE Labs, CR From bfoster@redhat.com Mon Feb 23 09:51:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9D437F47 for ; Mon, 23 Feb 2015 09:51:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B6DE38F8039 for ; Mon, 23 Feb 2015 07:51:53 -0800 (PST) X-ASG-Debug-ID: 1424706711-04cbb0611055050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Oby1WmPrkLOsRAkX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 07:51:52 -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 (8.14.4/8.14.4) with ESMTP id t1NFppTg009422 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NFpplK006897 for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 326B91200A7; Mon, 23 Feb 2015 10:51:50 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/4] metadump: check for non-zero inode alignment Date: Mon, 23 Feb 2015 10:51:47 -0500 X-ASG-Orig-Subj: [PATCH 2/4] metadump: check for non-zero inode alignment Message-Id: <1424706709-21594-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1424706709-21594-1-git-send-email-bfoster@redhat.com> References: <1424706709-21594-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: 1424706712 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The copy_inode_chunk() function performs some basic sanity checks on the inode record, block number, etc. One of these checks includes whether the inode chunk is aligned according to sb_inoalignmt. sb_inoalignment can equal 0 with larger block sizes. This results in a mod-by-zero, "badly aligned inode ..." warnings and skipped inodes in metadump images. This can be reproduced with a '-m crc=1,finobt=1 -b size=64k' fs on ppc64. Update copy_inode_chunk() to only enforce the inode alignment check when sb_inoalignmt is non-zero. Signed-off-by: Brian Foster --- db/metadump.c | 1 + 1 file changed, 1 insertion(+) diff --git a/db/metadump.c b/db/metadump.c index 604fcf4..94f92bc 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -1865,6 +1865,7 @@ copy_inode_chunk( (mp->m_sb.sb_inopblock > XFS_INODES_PER_CHUNK && off % XFS_INODES_PER_CHUNK != 0) || (xfs_sb_version_hasalign(&mp->m_sb) && + mp->m_sb.sb_inoalignmt != 0 && agbno % mp->m_sb.sb_inoalignmt != 0)) { if (show_warnings) print_warning("badly aligned inode (start = %llu)", -- 1.9.3 From bfoster@redhat.com Mon Feb 23 09:51:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 232F47F47 for ; Mon, 23 Feb 2015 09:51:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10DDA304043 for ; Mon, 23 Feb 2015 07:51:54 -0800 (PST) X-ASG-Debug-ID: 1424706712-04cbb0610e55050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VCTURWXD6ISr8ASh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 07:51:52 -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 (8.14.4/8.14.4) with ESMTP id t1NFppHJ009426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 10:51:52 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NFppXG019008 for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 59642124FE1; Mon, 23 Feb 2015 10:51:50 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfsprogs: remove bitfield based superblock updates Date: Mon, 23 Feb 2015 10:51:48 -0500 X-ASG-Orig-Subj: [PATCH 3/4] xfsprogs: remove bitfield based superblock updates Message-Id: <1424706709-21594-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1424706709-21594-1-git-send-email-bfoster@redhat.com> References: <1424706709-21594-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: 1424706712 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a backport of the following kernel commit: 4d11a4023940 xfs: remove bitfield based superblock updates ... which kills the per-field superblock logging mechanism in shared libxfs code. Also update the callers of the old code throughout xfsprogs to no longer pass the associated bitfield logging parameter to the updated libxfs_sb_to_disk() and xfs_mod_sb() functions. Signed-off-by: Brian Foster --- db/sb.c | 9 +- libxfs/support/trans.c | 2 +- libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap.c | 14 +-- libxfs/xfs_sb.c | 277 ++++++++++++++++------------------------------ libxfs/xfs_sb.h | 10 +- mdrestore/xfs_mdrestore.c | 2 +- mkfs/proto.c | 6 +- mkfs/xfs_mkfs.c | 4 +- repair/phase5.c | 2 +- repair/sb.c | 2 +- repair/scan.c | 2 +- 12 files changed, 121 insertions(+), 211 deletions(-) diff --git a/db/sb.c b/db/sb.c index 38f74f8..1b8b6d5 100644 --- a/db/sb.c +++ b/db/sb.c @@ -335,7 +335,7 @@ do_uuid(xfs_agnumber_t agno, uuid_t *uuid) } /* set uuid */ memcpy(&tsb.sb_uuid, uuid, sizeof(uuid_t)); - libxfs_sb_to_disk(iocur_top->data, &tsb, XFS_SB_UUID); + libxfs_sb_to_disk(iocur_top->data, &tsb); write_cur(); return uuid; } @@ -488,7 +488,7 @@ do_label(xfs_agnumber_t agno, char *label) memset(&tsb.sb_fname, 0, sizeof(tsb.sb_fname)); memcpy(&tsb.sb_fname, label, len); memcpy(&lbl[0], &tsb.sb_fname, sizeof(tsb.sb_fname)); - libxfs_sb_to_disk(iocur_top->data, &tsb, XFS_SB_FNAME); + libxfs_sb_to_disk(iocur_top->data, &tsb); write_cur(); return &lbl[0]; } @@ -569,7 +569,6 @@ static int do_version(xfs_agnumber_t agno, __uint16_t version, __uint32_t features) { xfs_sb_t tsb; - __int64_t fields = 0; if (!get_sb(agno, &tsb)) return 0; @@ -583,14 +582,12 @@ do_version(xfs_agnumber_t agno, __uint16_t version, __uint32_t features) if ((version & XFS_SB_VERSION_LOGV2BIT) && !xfs_sb_version_haslogv2(&tsb)) { tsb.sb_logsunit = 1; - fields |= (1LL << XFS_SBS_LOGSUNIT); } tsb.sb_versionnum = version; tsb.sb_features2 = features; tsb.sb_bad_features2 = features; - fields |= XFS_SB_VERSIONNUM | XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; - libxfs_sb_to_disk(iocur_top->data, &tsb, fields); + libxfs_sb_to_disk(iocur_top->data, &tsb); write_cur(); return 1; } diff --git a/libxfs/support/trans.c b/libxfs/support/trans.c index 2447764..bf13127 100644 --- a/libxfs/support/trans.c +++ b/libxfs/support/trans.c @@ -845,7 +845,7 @@ libxfs_trans_commit( sbp->sb_fdblocks += tp->t_fdblocks_delta; if (tp->t_frextents_delta) sbp->sb_frextents += tp->t_frextents_delta; - xfs_mod_sb(tp, XFS_SB_ALL_BITS); + xfs_mod_sb(tp); } #ifdef XACT_DEBUG diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 714c257..8d38a04 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -399,7 +399,7 @@ xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) if (!xfs_sb_version_hasattr2(&mp->m_sb)) { xfs_sb_version_addattr2(&mp->m_sb); spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp, XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); + xfs_mod_sb(tp); } else spin_unlock(&mp->m_sb_lock); } diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index c4e9da6..cf500a6 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1213,22 +1213,20 @@ xfs_bmap_add_attrfork( goto bmap_cancel; if (!xfs_sb_version_hasattr(&mp->m_sb) || (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { - __int64_t sbfields = 0; + bool mod_sb = false; spin_lock(&mp->m_sb_lock); if (!xfs_sb_version_hasattr(&mp->m_sb)) { xfs_sb_version_addattr(&mp->m_sb); - sbfields |= XFS_SB_VERSIONNUM; + mod_sb = true; } if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { xfs_sb_version_addattr2(&mp->m_sb); - sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); + mod_sb = true; } - if (sbfields) { - spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp, sbfields); - } else - spin_unlock(&mp->m_sb_lock); + spin_unlock(&mp->m_sb_lock); + if (mod_sb) + xfs_mod_sb(tp); } error = xfs_bmap_finish(&tp, &flist, &committed); diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 4d41d42..05f0c94 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -38,69 +38,6 @@ * Physical superblock buffer manipulations. Shared with libxfs in userspace. */ -static const struct { - short offset; - short type; /* 0 = integer - * 1 = binary / string (no translation) - */ -} xfs_sb_info[] = { - { offsetof(xfs_sb_t, sb_magicnum), 0 }, - { offsetof(xfs_sb_t, sb_blocksize), 0 }, - { offsetof(xfs_sb_t, sb_dblocks), 0 }, - { offsetof(xfs_sb_t, sb_rblocks), 0 }, - { offsetof(xfs_sb_t, sb_rextents), 0 }, - { offsetof(xfs_sb_t, sb_uuid), 1 }, - { offsetof(xfs_sb_t, sb_logstart), 0 }, - { offsetof(xfs_sb_t, sb_rootino), 0 }, - { offsetof(xfs_sb_t, sb_rbmino), 0 }, - { offsetof(xfs_sb_t, sb_rsumino), 0 }, - { offsetof(xfs_sb_t, sb_rextsize), 0 }, - { offsetof(xfs_sb_t, sb_agblocks), 0 }, - { offsetof(xfs_sb_t, sb_agcount), 0 }, - { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, - { offsetof(xfs_sb_t, sb_logblocks), 0 }, - { offsetof(xfs_sb_t, sb_versionnum), 0 }, - { offsetof(xfs_sb_t, sb_sectsize), 0 }, - { offsetof(xfs_sb_t, sb_inodesize), 0 }, - { offsetof(xfs_sb_t, sb_inopblock), 0 }, - { offsetof(xfs_sb_t, sb_fname[0]), 1 }, - { offsetof(xfs_sb_t, sb_blocklog), 0 }, - { offsetof(xfs_sb_t, sb_sectlog), 0 }, - { offsetof(xfs_sb_t, sb_inodelog), 0 }, - { offsetof(xfs_sb_t, sb_inopblog), 0 }, - { offsetof(xfs_sb_t, sb_agblklog), 0 }, - { offsetof(xfs_sb_t, sb_rextslog), 0 }, - { offsetof(xfs_sb_t, sb_inprogress), 0 }, - { offsetof(xfs_sb_t, sb_imax_pct), 0 }, - { offsetof(xfs_sb_t, sb_icount), 0 }, - { offsetof(xfs_sb_t, sb_ifree), 0 }, - { offsetof(xfs_sb_t, sb_fdblocks), 0 }, - { offsetof(xfs_sb_t, sb_frextents), 0 }, - { offsetof(xfs_sb_t, sb_uquotino), 0 }, - { offsetof(xfs_sb_t, sb_gquotino), 0 }, - { offsetof(xfs_sb_t, sb_qflags), 0 }, - { offsetof(xfs_sb_t, sb_flags), 0 }, - { offsetof(xfs_sb_t, sb_shared_vn), 0 }, - { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, - { offsetof(xfs_sb_t, sb_unit), 0 }, - { offsetof(xfs_sb_t, sb_width), 0 }, - { offsetof(xfs_sb_t, sb_dirblklog), 0 }, - { offsetof(xfs_sb_t, sb_logsectlog), 0 }, - { offsetof(xfs_sb_t, sb_logsectsize), 0 }, - { offsetof(xfs_sb_t, sb_logsunit), 0 }, - { offsetof(xfs_sb_t, sb_features2), 0 }, - { offsetof(xfs_sb_t, sb_bad_features2), 0 }, - { offsetof(xfs_sb_t, sb_features_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_incompat), 0 }, - { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, - { offsetof(xfs_sb_t, sb_crc), 0 }, - { offsetof(xfs_sb_t, sb_pad), 0 }, - { offsetof(xfs_sb_t, sb_pquotino), 0 }, - { offsetof(xfs_sb_t, sb_lsn), 0 }, - { sizeof(xfs_sb_t), 0 } -}; - /* * Reference counting access wrappers to the perag structures. * Because we never free per-ag structures, the only thing we @@ -444,58 +381,49 @@ xfs_sb_from_disk( __xfs_sb_from_disk(to, from, true); } -static inline void +static void xfs_sb_quota_to_disk( - xfs_dsb_t *to, - xfs_sb_t *from, - __int64_t *fields) + struct xfs_dsb *to, + struct xfs_sb *from) { __uint16_t qflags = from->sb_qflags; + to->sb_uquotino = cpu_to_be64(from->sb_uquotino); + if (xfs_sb_version_has_pquotino(from)) { + to->sb_qflags = cpu_to_be16(from->sb_qflags); + to->sb_gquotino = cpu_to_be64(from->sb_gquotino); + to->sb_pquotino = cpu_to_be64(from->sb_pquotino); + return; + } + /* - * We need to do these manipilations only if we are working - * with an older version of on-disk superblock. + * The in-core version of sb_qflags do not have XFS_OQUOTA_* + * flags, whereas the on-disk version does. So, convert incore + * XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags. */ - if (xfs_sb_version_has_pquotino(from)) - return; + qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | + XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); - if (*fields & XFS_SB_QFLAGS) { - /* - * The in-core version of sb_qflags do not have - * XFS_OQUOTA_* flags, whereas the on-disk version - * does. So, convert incore XFS_{PG}QUOTA_* flags - * to on-disk XFS_OQUOTA_* flags. - */ - qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | - XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); - - if (from->sb_qflags & - (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) - qflags |= XFS_OQUOTA_ENFD; - if (from->sb_qflags & - (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) - qflags |= XFS_OQUOTA_CHKD; - to->sb_qflags = cpu_to_be16(qflags); - *fields &= ~XFS_SB_QFLAGS; - } + if (from->sb_qflags & + (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) + qflags |= XFS_OQUOTA_ENFD; + if (from->sb_qflags & + (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) + qflags |= XFS_OQUOTA_CHKD; + to->sb_qflags = cpu_to_be16(qflags); /* - * GQUOTINO and PQUOTINO cannot be used together in versions of - * superblock that do not have pquotino. from->sb_flags tells us which - * quota is active and should be copied to disk. If neither are active, - * make sure we write NULLFSINO to the sb_gquotino field as a quota - * inode value of "0" is invalid when the XFS_SB_VERSION_QUOTA feature - * bit is set. + * GQUOTINO and PQUOTINO cannot be used together in versions + * of superblock that do not have pquotino. from->sb_flags + * tells us which quota is active and should be copied to + * disk. If neither are active, we should NULL the inode. * - * Note that we don't need to handle the sb_uquotino or sb_pquotino here - * as they do not require any translation. Hence the main sb field loop - * will write them appropriately from the in-core superblock. + * In all cases, the separate pquotino must remain 0 because it + * it beyond the "end" of the valid non-pquotino superblock. */ - if ((*fields & XFS_SB_GQUOTINO) && - (from->sb_qflags & XFS_GQUOTA_ACCT)) + if (from->sb_qflags & XFS_GQUOTA_ACCT) to->sb_gquotino = cpu_to_be64(from->sb_gquotino); - else if ((*fields & XFS_SB_PQUOTINO) && - (from->sb_qflags & XFS_PQUOTA_ACCT)) + else if (from->sb_qflags & XFS_PQUOTA_ACCT) to->sb_gquotino = cpu_to_be64(from->sb_pquotino); else { /* @@ -509,63 +437,72 @@ xfs_sb_quota_to_disk( to->sb_gquotino = cpu_to_be64(NULLFSINO); } - *fields &= ~(XFS_SB_PQUOTINO | XFS_SB_GQUOTINO); + to->sb_pquotino = 0; } -/* - * Copy in core superblock to ondisk one. - * - * The fields argument is mask of superblock fields to copy. - */ void xfs_sb_to_disk( - xfs_dsb_t *to, - xfs_sb_t *from, - __int64_t fields) + struct xfs_dsb *to, + struct xfs_sb *from) { - xfs_caddr_t to_ptr = (xfs_caddr_t)to; - xfs_caddr_t from_ptr = (xfs_caddr_t)from; - xfs_sb_field_t f; - int first; - int size; - - ASSERT(fields); - if (!fields) - return; + xfs_sb_quota_to_disk(to, from); + + to->sb_magicnum = cpu_to_be32(from->sb_magicnum); + to->sb_blocksize = cpu_to_be32(from->sb_blocksize); + to->sb_dblocks = cpu_to_be64(from->sb_dblocks); + to->sb_rblocks = cpu_to_be64(from->sb_rblocks); + to->sb_rextents = cpu_to_be64(from->sb_rextents); + memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid)); + to->sb_logstart = cpu_to_be64(from->sb_logstart); + to->sb_rootino = cpu_to_be64(from->sb_rootino); + to->sb_rbmino = cpu_to_be64(from->sb_rbmino); + to->sb_rsumino = cpu_to_be64(from->sb_rsumino); + to->sb_rextsize = cpu_to_be32(from->sb_rextsize); + to->sb_agblocks = cpu_to_be32(from->sb_agblocks); + to->sb_agcount = cpu_to_be32(from->sb_agcount); + to->sb_rbmblocks = cpu_to_be32(from->sb_rbmblocks); + to->sb_logblocks = cpu_to_be32(from->sb_logblocks); + to->sb_versionnum = cpu_to_be16(from->sb_versionnum); + to->sb_sectsize = cpu_to_be16(from->sb_sectsize); + to->sb_inodesize = cpu_to_be16(from->sb_inodesize); + to->sb_inopblock = cpu_to_be16(from->sb_inopblock); + memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname)); + to->sb_blocklog = from->sb_blocklog; + to->sb_sectlog = from->sb_sectlog; + to->sb_inodelog = from->sb_inodelog; + to->sb_inopblog = from->sb_inopblog; + to->sb_agblklog = from->sb_agblklog; + to->sb_rextslog = from->sb_rextslog; + to->sb_inprogress = from->sb_inprogress; + to->sb_imax_pct = from->sb_imax_pct; + to->sb_icount = cpu_to_be64(from->sb_icount); + to->sb_ifree = cpu_to_be64(from->sb_ifree); + to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); + to->sb_frextents = cpu_to_be64(from->sb_frextents); - /* We should never write the crc here, it's updated in the IO path */ - fields &= ~XFS_SB_CRC; - - xfs_sb_quota_to_disk(to, from, &fields); - while (fields) { - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); - first = xfs_sb_info[f].offset; - size = xfs_sb_info[f + 1].offset - first; - - ASSERT(xfs_sb_info[f].type == 0 || xfs_sb_info[f].type == 1); - - if (size == 1 || xfs_sb_info[f].type == 1) { - memcpy(to_ptr + first, from_ptr + first, size); - } else { - switch (size) { - case 2: - *(__be16 *)(to_ptr + first) = - cpu_to_be16(*(__u16 *)(from_ptr + first)); - break; - case 4: - *(__be32 *)(to_ptr + first) = - cpu_to_be32(*(__u32 *)(from_ptr + first)); - break; - case 8: - *(__be64 *)(to_ptr + first) = - cpu_to_be64(*(__u64 *)(from_ptr + first)); - break; - default: - ASSERT(0); - } - } - fields &= ~(1LL << f); + to->sb_flags = from->sb_flags; + to->sb_shared_vn = from->sb_shared_vn; + to->sb_inoalignmt = cpu_to_be32(from->sb_inoalignmt); + to->sb_unit = cpu_to_be32(from->sb_unit); + to->sb_width = cpu_to_be32(from->sb_width); + to->sb_dirblklog = from->sb_dirblklog; + to->sb_logsectlog = from->sb_logsectlog; + to->sb_logsectsize = cpu_to_be16(from->sb_logsectsize); + to->sb_logsunit = cpu_to_be32(from->sb_logsunit); + to->sb_features2 = cpu_to_be32(from->sb_features2); + to->sb_bad_features2 = cpu_to_be32(from->sb_bad_features2); + + if (xfs_sb_version_hascrc(from)) { + to->sb_features_compat = cpu_to_be32(from->sb_features_compat); + to->sb_features_ro_compat = + cpu_to_be32(from->sb_features_ro_compat); + to->sb_features_incompat = + cpu_to_be32(from->sb_features_incompat); + to->sb_features_log_incompat = + cpu_to_be32(from->sb_features_log_incompat); + to->sb_pad = 0; + to->sb_lsn = cpu_to_be64(from->sb_lsn); } } @@ -806,35 +743,13 @@ xfs_initialize_perag_data( * access. */ void -xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) +xfs_mod_sb( + struct xfs_trans *tp) { - xfs_buf_t *bp; - int first; - int last; - xfs_mount_t *mp; - xfs_sb_field_t f; - - ASSERT(fields); - if (!fields) - return; - mp = tp->t_mountp; - bp = xfs_trans_getsb(tp, mp, 0); - first = sizeof(xfs_sb_t); - last = 0; - - /* translate/copy */ - - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); - - /* find modified range */ - f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - last = xfs_sb_info[f + 1].offset - 1; - - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - first = xfs_sb_info[f].offset; + struct xfs_mount *mp = tp->t_mountp; + struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); - xfs_trans_log_buf(tp, bp, first, last); + xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb)); } diff --git a/libxfs/xfs_sb.h b/libxfs/xfs_sb.h index 8eb1c54..e193caa 100644 --- a/libxfs/xfs_sb.h +++ b/libxfs/xfs_sb.h @@ -27,11 +27,11 @@ extern struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *, xfs_agnumber_t, extern void xfs_perag_put(struct xfs_perag *pag); extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); -extern void xfs_sb_calc_crc(struct xfs_buf *); -extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern void xfs_sb_mount_common(struct xfs_mount *, struct xfs_sb *); -extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); -extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); +extern void xfs_sb_calc_crc(struct xfs_buf *bp); +extern void xfs_mod_sb(struct xfs_trans *tp); +extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp); +extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); +extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); #endif /* __XFS_SB_H__ */ diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index e57bdb2..f3c846e 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -168,7 +168,7 @@ perform_restore( memset(block_buffer, 0, sb.sb_sectsize); sb.sb_inprogress = 0; - libxfs_sb_to_disk((xfs_dsb_t *)block_buffer, &sb, XFS_SB_ALL_BITS); + libxfs_sb_to_disk((xfs_dsb_t *)block_buffer, &sb); if (xfs_sb_version_hascrc(&sb)) { xfs_update_cksum(block_buffer, sb.sb_sectsize, offsetof(struct xfs_sb, sb_crc)); diff --git a/mkfs/proto.c b/mkfs/proto.c index 0c8bd2f..18a2553 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -551,7 +551,7 @@ parseproto( if (!pip) { pip = ip; mp->m_sb.sb_rootino = ip->i_ino; - libxfs_mod_sb(tp, XFS_SB_ROOTINO); + libxfs_mod_sb(tp); isroot = 1; } else { libxfs_trans_ijoin(tp, pip, 0); @@ -657,7 +657,7 @@ rtinit( rbmip->i_d.di_flags = XFS_DIFLAG_NEWRTBM; *(__uint64_t *)&rbmip->i_d.di_atime = 0; libxfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE); - libxfs_mod_sb(tp, XFS_SB_RBMINO); + libxfs_mod_sb(tp); mp->m_rbmip = rbmip; error = -libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, &creds, &fsxattrs, &rsumip); @@ -667,7 +667,7 @@ rtinit( mp->m_sb.sb_rsumino = rsumip->i_ino; rsumip->i_d.di_size = mp->m_rsumsize; libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE); - libxfs_mod_sb(tp, XFS_SB_RSUMINO); + libxfs_mod_sb(tp); libxfs_trans_commit(tp, 0); mp->m_rsumip = rsumip; /* diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index d4856b1..176a6b2 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2651,7 +2651,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), buf = libxfs_getbuf(mp->m_ddev_targp, XFS_SB_DADDR, XFS_FSS_TO_BB(mp, 1)); buf->b_ops = &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); - libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); + libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); libxfs_purgebuf(buf); @@ -2712,7 +2712,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), XFS_FSS_TO_BB(mp, 1)); buf->b_ops = &xfs_sb_buf_ops; memset(XFS_BUF_PTR(buf), 0, sectorsize); - libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); + libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); /* diff --git a/repair/phase5.c b/repair/phase5.c index 71bf751..1ce57a1 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1500,7 +1500,7 @@ sync_sb(xfs_mount_t *mp) update_sb_version(mp); - libxfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, XFS_SB_ALL_BITS); + libxfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); libxfs_writebuf(bp, 0); } diff --git a/repair/sb.c b/repair/sb.c index 79f7882..c85b9e2 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -434,7 +434,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) do_error(_("couldn't seek to offset 0 in filesystem\n")); } - libxfs_sb_to_disk(buf, sbp, XFS_SB_ALL_BITS); + libxfs_sb_to_disk(buf, sbp); if (xfs_sb_version_hascrc(sbp)) xfs_update_cksum((char *)buf, size, XFS_SB_CRC_OFF); diff --git a/repair/scan.c b/repair/scan.c index ebc8535..259ab40 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1597,7 +1597,7 @@ scan_ag( if (sb_dirty && !no_modify) { if (agno == 0) memcpy(&mp->m_sb, sb, sizeof(xfs_sb_t)); - libxfs_sb_to_disk(XFS_BUF_TO_SBP(sbbuf), sb, XFS_SB_ALL_BITS); + libxfs_sb_to_disk(XFS_BUF_TO_SBP(sbbuf), sb); libxfs_writebuf(sbbuf, 0); } else libxfs_putbuf(sbbuf); -- 1.9.3 From bfoster@redhat.com Mon Feb 23 09:51:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CCD6F7F4E for ; Mon, 23 Feb 2015 09:51:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB6468F8049 for ; Mon, 23 Feb 2015 07:51:53 -0800 (PST) X-ASG-Debug-ID: 1424706711-04cbb0610f55050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xoCrWEjPqJQ66rRi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 07:51:52 -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 (8.14.4/8.14.4) with ESMTP id t1NFppQc018334 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NFppOt020412 for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 44670124FE3; Mon, 23 Feb 2015 10:51:49 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/4] metadump: include NULLFSINO check in inode copy code Date: Mon, 23 Feb 2015 10:51:46 -0500 X-ASG-Orig-Subj: [PATCH 1/4] metadump: include NULLFSINO check in inode copy code Message-Id: <1424706709-21594-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1424706709-21594-1-git-send-email-bfoster@redhat.com> References: <1424706709-21594-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: 1424706712 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The copy_ino() function includes a check for effectively NULL inode numbers. It checks for 0 but does not include NULLFSINO. This leads to spurious warnings in some instances. For example, copy_ino() is called unconditionally for sb quota inodes from copy_sb_inodes(), values of which can be NULLFSINO. Check for NULLFSINO and return quietly from copy_ino(). Signed-off-by: Brian Foster --- db/metadump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/metadump.c b/db/metadump.c index 3eafac6..604fcf4 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -2112,7 +2112,7 @@ copy_ino( int offset; int rval = 0; - if (ino == 0) + if (ino == 0 || ino == NULLFSINO) return 1; agno = XFS_INO_TO_AGNO(mp, ino); -- 1.9.3 From bfoster@redhat.com Mon Feb 23 09:51:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 374BD7F67 for ; Mon, 23 Feb 2015 09:51:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4CB6AC001 for ; Mon, 23 Feb 2015 07:51:56 -0800 (PST) X-ASG-Debug-ID: 1424706712-04bdf05c0056a60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wKstn9pNZ8sVAknc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 07:51:52 -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 (8.14.4/8.14.4) with ESMTP id t1NFpphx025099 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 10:51:52 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NFppRS005489 for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0895F124FE2; Mon, 23 Feb 2015 10:51:49 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfsprogs: a couple metadump fixes and sb logging backports Date: Mon, 23 Feb 2015 10:51:45 -0500 X-ASG-Orig-Subj: [PATCH 0/4] xfsprogs: a couple metadump fixes and sb logging backports Message-Id: <1424706709-21594-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: 1424706712 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Patches 1 and 2 are a couple metadump fixes that fell out from playing around with large block size filesystems (e.g., 64k on ppc64), similar to the repair patches I had sent recently. Patches 3 and 4 are backports of a couple of the sb logging rework fixes. Dave, I'm not sure what the workflow here is wrt to the sb logging backports. FWIW, these are the only patches I need on top of the libxfs-3.19-update branch to get most of the sparse inode bits to backport cleanly. Do you want to include them in that branch? Otherwise, I'll just keep them in my sparse inodes branch for now. Brian Brian Foster (4): metadump: include NULLFSINO check in inode copy code metadump: check for non-zero inode alignment xfsprogs: remove bitfield based superblock updates xfsprogs: consolidate superblock logging functions db/metadump.c | 3 +- db/sb.c | 9 +- libxfs/support/libxfs_api_defs.h | 2 +- libxfs/support/trans.c | 2 +- libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap.c | 14 +- libxfs/xfs_sb.c | 286 ++++++++++++++------------------------- libxfs/xfs_sb.h | 11 +- libxfs/xfs_shared.h | 33 ++--- libxfs/xfs_trans_resv.c | 14 -- libxfs/xfs_trans_resv.h | 1 - mdrestore/xfs_mdrestore.c | 2 +- mkfs/proto.c | 6 +- mkfs/xfs_mkfs.c | 4 +- repair/phase5.c | 2 +- repair/sb.c | 2 +- repair/scan.c | 2 +- 17 files changed, 144 insertions(+), 251 deletions(-) -- 1.9.3 From bfoster@redhat.com Mon Feb 23 09:51:58 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E84F7F67 for ; Mon, 23 Feb 2015 09:51:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEE52AC001 for ; Mon, 23 Feb 2015 07:51:54 -0800 (PST) X-ASG-Debug-ID: 1424706712-04cb6c4bd352830001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lMDDfy357lpETyuc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 07:51:53 -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 (8.14.4/8.14.4) with ESMTP id t1NFppBq025103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 10:51:52 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NFppvM006906 for ; Mon, 23 Feb 2015 10:51:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 65D38124FE4; Mon, 23 Feb 2015 10:51:50 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfsprogs: consolidate superblock logging functions Date: Mon, 23 Feb 2015 10:51:49 -0500 X-ASG-Orig-Subj: [PATCH 4/4] xfsprogs: consolidate superblock logging functions Message-Id: <1424706709-21594-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1424706709-21594-1-git-send-email-bfoster@redhat.com> References: <1424706709-21594-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: 1424706713 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a backport of the following kernel commit: 61e63ecb577f xfs: consolidate superblock logging functions ... which converts the xfs_mod_sb() function to xfs_log_sb(). The xfs_sync_sb() function uses a transaction interface not available in userspace. The former function is not required, so is dropped from the patch. Also update callers of xfs_mod_sb() in mkfs to use xfs_log_sb(). Signed-off-by: Brian Foster --- libxfs/support/libxfs_api_defs.h | 2 +- libxfs/support/trans.c | 2 +- libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_bmap.c | 10 +++++----- libxfs/xfs_sb.c | 11 +++++------ libxfs/xfs_sb.h | 3 ++- libxfs/xfs_shared.h | 33 +++++++++++++++------------------ libxfs/xfs_trans_resv.c | 14 -------------- libxfs/xfs_trans_resv.h | 1 - mkfs/proto.c | 6 +++--- 10 files changed, 33 insertions(+), 51 deletions(-) diff --git a/libxfs/support/libxfs_api_defs.h b/libxfs/support/libxfs_api_defs.h index ebed749..4147df6 100644 --- a/libxfs/support/libxfs_api_defs.h +++ b/libxfs/support/libxfs_api_defs.h @@ -99,7 +99,7 @@ #define xfs_idestroy_fork libxfs_idestroy_fork #define xfs_dinode_verify libxfs_dinode_verify -#define xfs_mod_sb libxfs_mod_sb +#define xfs_log_sb libxfs_log_sb #define xfs_mod_incore_sb libxfs_mod_incore_sb #define xfs_sb_from_disk libxfs_sb_from_disk #define xfs_sb_quota_from_disk libxfs_sb_quota_from_disk diff --git a/libxfs/support/trans.c b/libxfs/support/trans.c index bf13127..885c5f4 100644 --- a/libxfs/support/trans.c +++ b/libxfs/support/trans.c @@ -845,7 +845,7 @@ libxfs_trans_commit( sbp->sb_fdblocks += tp->t_fdblocks_delta; if (tp->t_frextents_delta) sbp->sb_frextents += tp->t_frextents_delta; - xfs_mod_sb(tp); + xfs_log_sb(tp); } #ifdef XACT_DEBUG diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 8d38a04..f3f70fb 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -399,7 +399,7 @@ xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) if (!xfs_sb_version_hasattr2(&mp->m_sb)) { xfs_sb_version_addattr2(&mp->m_sb); spin_unlock(&mp->m_sb_lock); - xfs_mod_sb(tp); + xfs_log_sb(tp); } else spin_unlock(&mp->m_sb_lock); } diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index cf500a6..09f0847 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1213,20 +1213,20 @@ xfs_bmap_add_attrfork( goto bmap_cancel; if (!xfs_sb_version_hasattr(&mp->m_sb) || (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { - bool mod_sb = false; + bool log_sb = false; spin_lock(&mp->m_sb_lock); if (!xfs_sb_version_hasattr(&mp->m_sb)) { xfs_sb_version_addattr(&mp->m_sb); - mod_sb = true; + log_sb = true; } if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { xfs_sb_version_addattr2(&mp->m_sb); - mod_sb = true; + log_sb = true; } spin_unlock(&mp->m_sb_lock); - if (mod_sb) - xfs_mod_sb(tp); + if (log_sb) + xfs_log_sb(tp); } error = xfs_bmap_finish(&tp, &flist, &committed); diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 05f0c94..cbd47d7 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -736,14 +736,13 @@ xfs_initialize_perag_data( } /* - * xfs_mod_sb() can be used to copy arbitrary changes to the - * in-core superblock into the superblock buffer to be logged. - * It does not provide the higher level of locking that is - * needed to protect the in-core superblock from concurrent - * access. + * xfs_log_sb() can be used to copy arbitrary changes to the in-core superblock + * into the superblock buffer to be logged. It does not provide the higher + * level of locking that is needed to protect the in-core superblock from + * concurrent access. */ void -xfs_mod_sb( +xfs_log_sb( struct xfs_trans *tp) { struct xfs_mount *mp = tp->t_mountp; diff --git a/libxfs/xfs_sb.h b/libxfs/xfs_sb.h index e193caa..b25bb9a 100644 --- a/libxfs/xfs_sb.h +++ b/libxfs/xfs_sb.h @@ -28,7 +28,8 @@ extern void xfs_perag_put(struct xfs_perag *pag); extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); extern void xfs_sb_calc_crc(struct xfs_buf *bp); -extern void xfs_mod_sb(struct xfs_trans *tp); +extern void xfs_log_sb(struct xfs_trans *tp); +extern int xfs_sync_sb(struct xfs_mount *mp, bool wait); extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp); extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); diff --git a/libxfs/xfs_shared.h b/libxfs/xfs_shared.h index 82404da..8dda4b3 100644 --- a/libxfs/xfs_shared.h +++ b/libxfs/xfs_shared.h @@ -82,7 +82,7 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; #define XFS_TRANS_ATTR_RM 23 #define XFS_TRANS_ATTR_FLAG 24 #define XFS_TRANS_CLEAR_AGI_BUCKET 25 -#define XFS_TRANS_QM_SBCHANGE 26 +#define XFS_TRANS_SB_CHANGE 26 /* * Dummy entries since we use the transaction type to index into the * trans_type[] in xlog_recover_print_trans_head() @@ -95,17 +95,15 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; #define XFS_TRANS_QM_DQCLUSTER 32 #define XFS_TRANS_QM_QINOCREATE 33 #define XFS_TRANS_QM_QUOTAOFF_END 34 -#define XFS_TRANS_SB_UNIT 35 -#define XFS_TRANS_FSYNC_TS 36 -#define XFS_TRANS_GROWFSRT_ALLOC 37 -#define XFS_TRANS_GROWFSRT_ZERO 38 -#define XFS_TRANS_GROWFSRT_FREE 39 -#define XFS_TRANS_SWAPEXT 40 -#define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_CHECKPOINT 42 -#define XFS_TRANS_ICREATE 43 -#define XFS_TRANS_CREATE_TMPFILE 44 -#define XFS_TRANS_TYPE_MAX 44 +#define XFS_TRANS_FSYNC_TS 35 +#define XFS_TRANS_GROWFSRT_ALLOC 36 +#define XFS_TRANS_GROWFSRT_ZERO 37 +#define XFS_TRANS_GROWFSRT_FREE 38 +#define XFS_TRANS_SWAPEXT 39 +#define XFS_TRANS_CHECKPOINT 40 +#define XFS_TRANS_ICREATE 41 +#define XFS_TRANS_CREATE_TMPFILE 42 +#define XFS_TRANS_TYPE_MAX 43 /* new transaction types need to be reflected in xfs_logprint(8) */ #define XFS_TRANS_TYPES \ @@ -113,7 +111,6 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ { XFS_TRANS_INACTIVE, "INACTIVE" }, \ { XFS_TRANS_CREATE, "CREATE" }, \ - { XFS_TRANS_CREATE_TMPFILE, "CREATE_TMPFILE" }, \ { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ { XFS_TRANS_REMOVE, "REMOVE" }, \ @@ -134,23 +131,23 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ - { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_SB_CHANGE, "SBCHANGE" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ - { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ - { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ - { XFS_TRANS_DUMMY1, "DUMMY1" }, \ - { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XFS_TRANS_ICREATE, "ICREATE" }, \ + { XFS_TRANS_CREATE_TMPFILE, "CREATE_TMPFILE" }, \ { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } /* diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index d81ce08..0c40b52 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -715,17 +715,6 @@ xfs_calc_clear_agi_bucket_reservation( } /* - * Clearing the quotaflags in the superblock. - * the super block for changing quota flags: sector size - */ -STATIC uint -xfs_calc_qm_sbchange_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); -} - -/* * Adjusting quota limits. * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) */ @@ -863,9 +852,6 @@ xfs_trans_resv_calc( * The following transactions are logged in logical format with * a default log count. */ - resp->tr_qm_sbchange.tr_logres = xfs_calc_qm_sbchange_reservation(mp); - resp->tr_qm_sbchange.tr_logcount = XFS_DEFAULT_LOG_COUNT; - resp->tr_qm_setqlim.tr_logres = xfs_calc_qm_setqlim_reservation(mp); resp->tr_qm_setqlim.tr_logcount = XFS_DEFAULT_LOG_COUNT; diff --git a/libxfs/xfs_trans_resv.h b/libxfs/xfs_trans_resv.h index 1097d14..2d5bdfc 100644 --- a/libxfs/xfs_trans_resv.h +++ b/libxfs/xfs_trans_resv.h @@ -56,7 +56,6 @@ struct xfs_trans_resv { struct xfs_trans_res tr_growrtalloc; /* grow realtime allocations */ struct xfs_trans_res tr_growrtzero; /* grow realtime zeroing */ struct xfs_trans_res tr_growrtfree; /* grow realtime freeing */ - struct xfs_trans_res tr_qm_sbchange; /* change quota flags */ struct xfs_trans_res tr_qm_setqlim; /* adjust quota limits */ struct xfs_trans_res tr_qm_dqalloc; /* allocate quota on disk */ struct xfs_trans_res tr_qm_quotaoff; /* turn quota off */ diff --git a/mkfs/proto.c b/mkfs/proto.c index 18a2553..45565b7 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -551,7 +551,7 @@ parseproto( if (!pip) { pip = ip; mp->m_sb.sb_rootino = ip->i_ino; - libxfs_mod_sb(tp); + libxfs_log_sb(tp); isroot = 1; } else { libxfs_trans_ijoin(tp, pip, 0); @@ -657,7 +657,7 @@ rtinit( rbmip->i_d.di_flags = XFS_DIFLAG_NEWRTBM; *(__uint64_t *)&rbmip->i_d.di_atime = 0; libxfs_trans_log_inode(tp, rbmip, XFS_ILOG_CORE); - libxfs_mod_sb(tp); + libxfs_log_sb(tp); mp->m_rbmip = rbmip; error = -libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, &creds, &fsxattrs, &rsumip); @@ -667,7 +667,7 @@ rtinit( mp->m_sb.sb_rsumino = rsumip->i_ino; rsumip->i_d.di_size = mp->m_rsumsize; libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE); - libxfs_mod_sb(tp); + libxfs_log_sb(tp); libxfs_trans_commit(tp, 0); mp->m_rsumip = rsumip; /* -- 1.9.3 From sandeen@redhat.com Mon Feb 23 10:25:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 48DA27F47 for ; Mon, 23 Feb 2015 10:25:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C97E4AC009 for ; Mon, 23 Feb 2015 08:25:04 -0800 (PST) X-ASG-Debug-ID: 1424708702-04cbb0610d56980001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6ZtZ0AsbN5lAVIi6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 08:25:03 -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 (8.14.4/8.14.4) with ESMTP id t1NGOuTX009527 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 23 Feb 2015 11:24:57 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NGOsZW012803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 23 Feb 2015 11:24:55 -0500 Message-ID: <54EB5456.5030607@redhat.com> Date: Mon, 23 Feb 2015 10:24:54 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Austin S Hemmelgarn , "Theodore Ts'o" CC: Michael Kerrisk , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EB1B19.8050808@gmail.com> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <54EB1B19.8050808@gmail.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424708703 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 2/23/15 6:20 AM, Austin S Hemmelgarn wrote: > On 2015-02-20 21:56, Theodore Ts'o wrote: >> On Fri, Feb 20, 2015 at 09:49:34AM -0600, Eric Sandeen wrote: >>> >>>> This mount option significantly reduces writes to the >>>> inode table for workloads that perform frequent random >>>> writes to preallocated files. >>> >>> This seems like an overly specific description of a single workload out >>> of many which may benefit, but what do others think? "inode table" is also >>> fairly extN-specific. >> >> How about somethign like "This mount significantly reduces writes >> needed to update the inode's timestamps, especially mtime and actime. >> Examples of workloads where this could be a large win include frequent >> random writes to preallocated files, as well as cases where the >> MS_STRICTATIME mount option is enabled."? >> >> (The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat system >> calls will return the correctly updated atime, but those atime updates >> won't get flushed to disk unless the inode needs to be updated for >> file system / data consistency reasons, or when the inode is pushed >> out of memory, or when the file system is unmounted.) >> > If you want to list some specific software, it should help with > anything that uses sqlite (which notably includes firefox and > chrome), as well as most RDMS software and systemd-journald. I'm really uneasy with starting to list specific workloads and applications here. It's going to get dated quickly, and will lead to endless cargo-cult tuning. I'd strongly prefer to just describe what it does (reduces the number of certain metadata writes to disk) and leave it at that.... -Eric From sandeen@redhat.com Mon Feb 23 12:57:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9101D7F47 for ; Mon, 23 Feb 2015 12:57:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4152B8F8059 for ; Mon, 23 Feb 2015 10:57:54 -0800 (PST) X-ASG-Debug-ID: 1424717873-04bdf05c025ed90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EKxGPNZxu5mPwazN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 10:57:53 -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-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1NIvqbh001928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 13:57:53 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NIvpEZ003917 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 23 Feb 2015 13:57:52 -0500 Message-ID: <54EB782F.8020201@redhat.com> Date: Mon, 23 Feb 2015 12:57:51 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/2] Fix a couple coverity-spotted issues Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH 0/2] Fix a couple coverity-spotted issues Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424717873 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com From sandeen@sandeen.net Mon Feb 23 12:59:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 55EEA7F50 for ; Mon, 23 Feb 2015 12:59:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44A94304043 for ; Mon, 23 Feb 2015 10:59:13 -0800 (PST) X-ASG-Debug-ID: 1424717952-04cb6c4bd058f40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Hkz2z1EkoKox72Jm for ; Mon, 23 Feb 2015 10:59:12 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id DE54363C3A20; Mon, 23 Feb 2015 12:59:11 -0600 (CST) Message-ID: <54EB787F.5090600@sandeen.net> Date: Mon, 23 Feb 2015 12:59:11 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss CC: Carlos Maiolino Subject: [PATCH 1/2] xfs: Ensure we have target_ip for RENAME_EXCHANGE References: <54EB782F.8020201@redhat.com> X-ASG-Orig-Subj: [PATCH 1/2] xfs: Ensure we have target_ip for RENAME_EXCHANGE In-Reply-To: <54EB782F.8020201@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: 1424717952 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We shouldn't get here with RENAME_EXCHANGE set and no target_ip, but let's be defensive, because xfs_cross_rename() will dereference it. Spotted by Coverity. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index daafa1f..6163767 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2867,6 +2867,10 @@ xfs_rename( * Handle RENAME_EXCHANGE flags */ if (flags & RENAME_EXCHANGE) { + if (target_ip == NULL) { + error = -EINVAL; + goto error_return; + } error = xfs_cross_rename(tp, src_dp, src_name, src_ip, target_dp, target_name, target_ip, &free_list, &first_block, spaceres); From sandeen@sandeen.net Mon Feb 23 13:00:46 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 23B1F7F54 for ; Mon, 23 Feb 2015 13:00:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9885AAC007 for ; Mon, 23 Feb 2015 11:00:45 -0800 (PST) X-ASG-Debug-ID: 1424718027-04cbb0610f5d530001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4KwFAx4HAuw2WRPq for ; Mon, 23 Feb 2015 11:00:28 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BD25963C3A20; Mon, 23 Feb 2015 13:00:27 -0600 (CST) Message-ID: <54EB78CB.6050709@sandeen.net> Date: Mon, 23 Feb 2015 13:00:27 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss CC: Christoph Hellwig Subject: [PATCH 2/2] xfs: cancel failed transaction in xfs_fs_commit_blocks() References: <54EB782F.8020201@redhat.com> X-ASG-Orig-Subj: [PATCH 2/2] xfs: cancel failed transaction in xfs_fs_commit_blocks() In-Reply-To: <54EB782F.8020201@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: 1424718027 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15735 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If xfs_trans_reserve fails we don't cancel the transaction, and we'll leak the allocated transaction pointer. Spotted by Coverity. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 4b33ef1..365dd57 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -300,8 +300,10 @@ xfs_fs_commit_blocks( tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); - if (error) + if (error) { + xfs_trans_cancel(tp, 0); goto out_drop_iolock; + } xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); From sandeen@redhat.com Mon Feb 23 13:13:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 074AC7F47 for ; Mon, 23 Feb 2015 13:13:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB4E1304043 for ; Mon, 23 Feb 2015 11:13:34 -0800 (PST) X-ASG-Debug-ID: 1424718813-04cbb061105def0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5ENBqp7gxv8hfiPW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 11:13:33 -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 (8.14.4/8.14.4) with ESMTP id t1NJDWvw022080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 14:13:33 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NJDVB1027312 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 23 Feb 2015 14:13:32 -0500 Message-ID: <54EB7BDB.7080202@redhat.com> Date: Mon, 23 Feb 2015 13:13:31 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/2] xfs: minor kernel logging updates Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH 0/2] xfs: minor kernel logging updates Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424718813 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Two very minor changes to error logging that I wished for when doing some debugging ... (not xfs logging ... dmesg "logging" ...) -Eric From mikegree@mediasuitel-alb-vps01.digiweb.net.nz Mon Feb 23 13:15:27 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE,MIME_HTML_ONLY,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6169F7F47 for ; Mon, 23 Feb 2015 13:15:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1563F8F8059 for ; Mon, 23 Feb 2015 11:15:23 -0800 (PST) X-ASG-Debug-ID: 1424718919-04bdf05c015f9a0001-NocioJ Received: from mediasuitel-alb-vps01.digiweb.net.nz (mediasuitel-alb-vps01.digiweb.net.nz [202.174.116.123]) by cuda.sgi.com with ESMTP id GAxGp4qfuKzHPkH7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 11:15:20 -0800 (PST) X-Barracuda-Envelope-From: mikegree@mediasuitel-alb-vps01.digiweb.net.nz X-Barracuda-Apparent-Source-IP: 202.174.116.123 Received: from mikegree by mediasuitel-alb-vps01.digiweb.net.nz with local (Exim 4.84) (envelope-from ) id 1YPyTO-00007Q-31 for xfs@oss.sgi.com; Tue, 24 Feb 2015 08:15:18 +1300 To: xfs@oss.sgi.com Subject: Update Account X-PHP-Script: www.mikegreerhomes.co.nz/assets/s.php for 41.225.186.178 X-ASG-Orig-Subj: Update Account From: MIME-Version: 1.0 Content-Type: text/html Message-Id: Date: Tue, 24 Feb 2015 08:15:18 +1300 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - mediasuitel-alb-vps01.digiweb.net.nz X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [513 514] / [47 12] X-AntiAbuse: Sender Address Domain - mediasuitel-alb-vps01.digiweb.net.nz X-Get-Message-Sender-Via: mediasuitel-alb-vps01.digiweb.net.nz: authenticated_id: mikegree/only user confirmed/virtual account not confirmed X-Barracuda-Connect: mediasuitel-alb-vps01.digiweb.net.nz[202.174.116.123] X-Barracuda-Start-Time: 1424718920 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE, MIME_HTML_ONLY, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15735 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message PayPal
Your Account Will Be Limited.
Dear customer,
Your Account Will Be Limited , Until We Here From You . To Update Your Info . Simply click on the web address below
Update Your Info
Update Your AccountUpdate Now
From sandeen@sandeen.net Mon Feb 23 13:15:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 838787F47 for ; Mon, 23 Feb 2015 13:15:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70A72304059 for ; Mon, 23 Feb 2015 11:15:51 -0800 (PST) X-ASG-Debug-ID: 1424718950-04cbb0610d5e060001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 020fi5qlzJCOYblm for ; Mon, 23 Feb 2015 11:15:50 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E856663CFEAF; Mon, 23 Feb 2015 13:15:49 -0600 (CST) Message-ID: <54EB7C65.3000307@sandeen.net> Date: Mon, 23 Feb 2015 13:15:49 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> X-ASG-Orig-Subj: [PATCH 1/2] xfs: log unmount events on console In-Reply-To: <54EB7BDB.7080202@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: 1424718950 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15735 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- There are times, when doing triage and forensics, that we would like to know whether a filesystem was unmounted, or if the plug was pulled without a clean unmount. Log unmounts at the same level (NOTICE) as we log mounts. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 8fcc4cc..dd40d25 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1039,6 +1039,7 @@ xfs_fs_put_super( { struct xfs_mount *mp = XFS_M(sb); + xfs_notice(mp, "Unmounting Filesystem"); xfs_filestream_unmount(mp); xfs_unmountfs(mp); From sandeen@sandeen.net Mon Feb 23 13:19:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C91C27F47 for ; Mon, 23 Feb 2015 13:19:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57DF5AC002 for ; Mon, 23 Feb 2015 11:19:13 -0800 (PST) X-ASG-Debug-ID: 1424719151-04cbb0610e5e230001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id eF5iA8MV6Ffg9Zl6 for ; Mon, 23 Feb 2015 11:19:11 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9EDA963C3A20; Mon, 23 Feb 2015 13:19:11 -0600 (CST) Message-ID: <54EB7D2F.3030305@sandeen.net> Date: Mon, 23 Feb 2015 13:19:11 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 2/2] xfs: clarify async write failure ratelimit message References: <54EB7BDB.7080202@redhat.com> X-ASG-Orig-Subj: [PATCH 2/2] xfs: clarify async write failure ratelimit message In-Reply-To: <54EB7BDB.7080202@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: 1424719151 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, when the "failing async writes" get ratelimited, we see: XFS:: 62836 callbacks suppressed Aside from the extra ":" it's not entirely clear which message is being suppressed, especially if other messages or ratelimits are happening at the same time. Clarify this as i.e.: XFS (dm-11): Failing async write on buffer block 0x140090. Retrying async write. XFS: Failing async write: 62836 callbacks suppressed Signed-off-by: Eric Sandeen --- I ... don't *think* this is abuse of __ratelimit(), is it? diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 4751c5f..08f315d 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -537,9 +537,9 @@ xfs_buf_item_push( /* has a previous flush failed due to IO errors? */ if ((bp->b_flags & XBF_WRITE_FAIL) && - ___ratelimit(&xfs_buf_write_fail_rl_state, "XFS:")) { + ___ratelimit(&xfs_buf_write_fail_rl_state, "XFS: Failing async write")) { xfs_warn(bp->b_target->bt_mount, -"Detected failing async write on buffer block 0x%llx. Retrying async write.", +"Failing async write on buffer block 0x%llx. Retrying async write.", (long long)bp->b_bn); } From bfoster@redhat.com Mon Feb 23 14:07:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 14B587F47 for ; Mon, 23 Feb 2015 14:07:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8F80304032 for ; Mon, 23 Feb 2015 12:07:33 -0800 (PST) X-ASG-Debug-ID: 1424722051-04bdf05c01618f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GtDoSEK0eCsg5wA4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:07: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-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1NK7Vk9010612 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 23 Feb 2015 15:07:31 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1NK7Uqd010794 for ; Mon, 23 Feb 2015 15:07:31 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 390FB120078; Mon, 23 Feb 2015 15:07:30 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks Date: Mon, 23 Feb 2015 15:07:30 -0500 X-ASG-Orig-Subj: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks Message-Id: <1424722050-24149-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: 1424722052 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The attr3 leaf header has a 16-bit firstused field that tracks the first used entry offset. This field is initialized to the block size in xfs_attr3_leaf_create() and updated accordingly in xfs_attr3_leaf_add_work() when new attributes are added. The initialization of firstused overflows if the block size exceeds 16-bits. E.g., xfstests test generic/117 causes assert failures on a -bsize=64k fs on ppc64 because ichdr.firstused evaluates to 0. Update the firstused initialization to not exceed the maximum value of an unsigned short. This avoids the overflow to 0 and allows firstused to be updated appropriately on subsequent xattr addition. Also update the freemap size calculation to use the actual block size rather than the potentially minimized version stored in firstused. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_attr_leaf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 15105db..dc7bda3 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -970,7 +970,8 @@ xfs_attr3_leaf_create( memset(leaf, 0, args->geo->blksize); memset(&ichdr, 0, sizeof(ichdr)); - ichdr.firstused = args->geo->blksize; + /* firstused is 16-bit */ + ichdr.firstused = min_t(int, USHRT_MAX, args->geo->blksize); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_blkinfo *hdr3 = bp->b_addr; @@ -986,7 +987,7 @@ xfs_attr3_leaf_create( ichdr.magic = XFS_ATTR_LEAF_MAGIC; ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); } - ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; + ichdr.freemap[0].size = args->geo->blksize - ichdr.freemap[0].base; xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); -- 1.9.3 From sandeen@sandeen.net Mon Feb 23 14:32:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8D457F4E for ; Mon, 23 Feb 2015 14:32:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D56B2304032 for ; Mon, 23 Feb 2015 12:32:33 -0800 (PST) X-ASG-Debug-ID: 1424723549-04cb6c4bd25be30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ao7cwy0djqYYfnzs for ; Mon, 23 Feb 2015 12:32:30 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B122760FCB25; Mon, 23 Feb 2015 14:32:29 -0600 (CST) Message-ID: <54EB8E5D.8080905@sandeen.net> Date: Mon, 23 Feb 2015 14:32:29 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks References: <1424722050-24149-1-git-send-email-bfoster@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks In-Reply-To: <1424722050-24149-1-git-send-email-bfoster@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: 1424723549 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/23/15 2:07 PM, Brian Foster wrote: > The attr3 leaf header has a 16-bit firstused field that tracks the first > used entry offset. This field is initialized to the block size in > xfs_attr3_leaf_create() and updated accordingly in > xfs_attr3_leaf_add_work() when new attributes are added. > > The initialization of firstused overflows if the block size exceeds > 16-bits. E.g., xfstests test generic/117 causes assert failures on a > -bsize=64k fs on ppc64 because ichdr.firstused evaluates to 0. cool :) > Update the firstused initialization to not exceed the maximum value of > an unsigned short. This avoids the overflow to 0 and allows firstused to > be updated appropriately on subsequent xattr addition. Also update the > freemap size calculation to use the actual block size rather than the > potentially minimized version stored in firstused. I'm a little scared by this; does this truncated value risk going to disk? (Yes, I think so.) Is that ok? Does that ... mean we lose a byte of space we'd otherwise have? Maybe that's ok ... FWIW, I think the same problem exists in xfs_attr3_leaf_compact(): /* Initialise the incore headers */ ichdr_src = *ichdr_dst; /* struct copy */ ichdr_dst->firstused = args->geo->blksize; and xfs_attr3_leaf_unbalance(): tmphdr.firstused = state->args->geo->blksize; > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_attr_leaf.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index 15105db..dc7bda3 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -970,7 +970,8 @@ xfs_attr3_leaf_create( > memset(leaf, 0, args->geo->blksize); > > memset(&ichdr, 0, sizeof(ichdr)); > - ichdr.firstused = args->geo->blksize; > + /* firstused is 16-bit */ > + ichdr.firstused = min_t(int, USHRT_MAX, args->geo->blksize); > > if (xfs_sb_version_hascrc(&mp->m_sb)) { > struct xfs_da3_blkinfo *hdr3 = bp->b_addr; > @@ -986,7 +987,7 @@ xfs_attr3_leaf_create( > ichdr.magic = XFS_ATTR_LEAF_MAGIC; > ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); > } > - ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; > + ichdr.freemap[0].size = args->geo->blksize - ichdr.freemap[0].base; But now freemap.size is out of sync with firstused; is that ok? -Eric > xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); > xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); > From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:48:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B2E2E7F50 for ; Mon, 23 Feb 2015 14:48:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3454AAC004 for ; Mon, 23 Feb 2015 12:48:39 -0800 (PST) X-ASG-Debug-ID: 1424724517-04bdf05bff63a00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QYBhwJZUxG23Ol4g (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:48:37 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YPzvg-0003dd-Jf; Mon, 23 Feb 2015 20:48:36 +0000 Date: Mon, 23 Feb 2015 12:48:36 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Christoph Hellwig Subject: Re: [PATCH 2/2] xfs: cancel failed transaction in xfs_fs_commit_blocks() Message-ID: <20150223204836.GB13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: cancel failed transaction in xfs_fs_commit_blocks() References: <54EB782F.8020201@redhat.com> <54EB78CB.6050709@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB78CB.6050709@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724517 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 23, 2015 at 01:00:27PM -0600, Eric Sandeen wrote: > If xfs_trans_reserve fails we don't cancel the transaction, > and we'll leak the allocated transaction pointer. > > Spotted by Coverity. Thanks, looks good. Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:48:51 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CC10E7F50 for ; Mon, 23 Feb 2015 14:48:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F5B9AC002 for ; Mon, 23 Feb 2015 12:48:51 -0800 (PST) X-ASG-Debug-ID: 1424724502-04cbb0610d61aa0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id dXJdtIT8YbAhx6lc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:48:23 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YPzvS-0003cd-JD; Mon, 23 Feb 2015 20:48:22 +0000 Date: Mon, 23 Feb 2015 12:48:22 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Carlos Maiolino Subject: Re: [PATCH 1/2] xfs: Ensure we have target_ip for RENAME_EXCHANGE Message-ID: <20150223204822.GA13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: Ensure we have target_ip for RENAME_EXCHANGE References: <54EB782F.8020201@redhat.com> <54EB787F.5090600@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB787F.5090600@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724503 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Seems a little pointless, but given that we overload these different operations over ->rename making Coverity happy might not be the worst idea. Maybe we should just add a different ->rename_exchange methods given that there's not much shared code anywhere. Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:49:09 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B95997F50 for ; Mon, 23 Feb 2015 14:49:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9656F8F8078 for ; Mon, 23 Feb 2015 12:49:06 -0800 (PST) X-ASG-Debug-ID: 1424724545-04bdf05c0163a50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VkXMymFLNgbCZQdM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:49:05 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YPzw8-0003gD-CV; Mon, 23 Feb 2015 20:49:04 +0000 Date: Mon, 23 Feb 2015 12:49:04 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console Message-ID: <20150223204904.GC13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB7C65.3000307@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724545 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Oh well, even more spam during xfstest runs :) From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:49:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 13D837F50 for ; Mon, 23 Feb 2015 14:49:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7977304043 for ; Mon, 23 Feb 2015 12:49:36 -0800 (PST) X-ASG-Debug-ID: 1424724573-04bdf05c0063a90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id JMtEzjARWs0jybJI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:49:33 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YPzwa-0003kg-7U; Mon, 23 Feb 2015 20:49:32 +0000 Date: Mon, 23 Feb 2015 12:49:32 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/2] xfs: clarify async write failure ratelimit message Message-ID: <20150223204932.GD13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: clarify async write failure ratelimit message References: <54EB7BDB.7080202@redhat.com> <54EB7D2F.3030305@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB7D2F.3030305@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724573 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:51:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 422307F50 for ; Mon, 23 Feb 2015 14:51:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D380DAC001 for ; Mon, 23 Feb 2015 12:51:10 -0800 (PST) X-ASG-Debug-ID: 1424724669-04bdf05c0063c20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BQ6ND96O3xvw0YnZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:51:09 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YPzy9-00054L-7p; Mon, 23 Feb 2015 20:51:09 +0000 Date: Mon, 23 Feb 2015 12:51:09 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk Message-ID: <20150223205109.GE13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk References: <1424299725-26067-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424299725-26067-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724669 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This looks correct, but is there a good (performance) reason against simply unconditionally flushing and waiting? From sandeen@sandeen.net Mon Feb 23 14:53:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 144177F50 for ; Mon, 23 Feb 2015 14:53:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6028304032 for ; Mon, 23 Feb 2015 12:53:05 -0800 (PST) X-ASG-Debug-ID: 1424724784-04bdf05c0263d60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id tWJPLf1EM0uBPACc for ; Mon, 23 Feb 2015 12:53:04 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 564CD60FCAF8; Mon, 23 Feb 2015 14:53:04 -0600 (CST) Message-ID: <54EB9330.4080604@sandeen.net> Date: Mon, 23 Feb 2015 14:53:04 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> <20150223204904.GC13522@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console In-Reply-To: <20150223204904.GC13522@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1424724784 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/23/15 2:49 PM, Christoph Hellwig wrote: > Oh well, even more spam during xfstest runs :) Heh, but no review...? I could be talked out of it, if people think it's not useful enough. -Eric From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:55:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 690587F4E for ; Mon, 23 Feb 2015 14:55:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 53C858F8084 for ; Mon, 23 Feb 2015 12:55:44 -0800 (PST) X-ASG-Debug-ID: 1424724943-04cb6c4bd35ca00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 618iO7wxXY122KxP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:55:43 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ02Y-0006lD-Vz; Mon, 23 Feb 2015 20:55:42 +0000 Date: Mon, 23 Feb 2015 12:55:42 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: use generic percpu counters for inode counter Message-ID: <20150223205542.GA20040@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: use generic percpu counters for inode counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724943 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:56:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C58F7F4E for ; Mon, 23 Feb 2015 14:56:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF037304039 for ; Mon, 23 Feb 2015 12:56:04 -0800 (PST) X-ASG-Debug-ID: 1424724963-04bdf05c0063f00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id XS4n7NRkHFHZj3Gn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:56:03 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ02t-0006o7-Fu; Mon, 23 Feb 2015 20:56:03 +0000 Date: Mon, 23 Feb 2015 12:56:03 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] xfs: use generic percpu counters for free inode counter Message-ID: <20150223205603.GB20040@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: use generic percpu counters for free inode counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424724963 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:57:21 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E160B7F47 for ; Mon, 23 Feb 2015 14:57:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F2E4AC001 for ; Mon, 23 Feb 2015 12:57:21 -0800 (PST) X-ASG-Debug-ID: 1424725039-04cb6c4bd15cae0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Cp8dodBvUQvEv3i4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:57:19 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ047-00070G-Fr; Mon, 23 Feb 2015 20:57:19 +0000 Date: Mon, 23 Feb 2015 12:57:19 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter Message-ID: <20150223205719.GC20040@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: use generic percpu counters for free block counter References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424725039 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 14:59:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4085B7F47 for ; Mon, 23 Feb 2015 14:59:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A5B9304032 for ; Mon, 23 Feb 2015 12:59:36 -0800 (PST) X-ASG-Debug-ID: 1424725174-04bdf05c02641b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CKFQhVqlShbkEVnZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 12:59:34 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ06I-0007HZ-Lm; Mon, 23 Feb 2015 20:59:34 +0000 Date: Mon, 23 Feb 2015 12:59:34 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/7] xfs: Remove icsb infrastructure Message-ID: <20150223205934.GD20040@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: Remove icsb infrastructure References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424725174 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig Although it might be worth mentining that you moved the put_super implementation around in the changelog. From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 15:02:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6593D7F47 for ; Mon, 23 Feb 2015 15:02:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 53FE430405F for ; Mon, 23 Feb 2015 13:02:03 -0800 (PST) X-ASG-Debug-ID: 1424725321-04cb6c4bd05cd30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nBocHcJT83SiN47o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 13:02:01 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ08f-0000Tx-2R; Mon, 23 Feb 2015 21:02:01 +0000 Date: Mon, 23 Feb 2015 13:02:01 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/7] xfs: introduce xfs_mod_frextents Message-ID: <20150223210201.GE20040@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce xfs_mod_frextents References: <1423083249-27493-1-git-send-email-david@fromorbit.com> <1423083249-27493-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1423083249-27493-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424725321 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This and the next two are basically just a rebase of my patch, so I not Reviewed-by as I can't really be reviewing my own code :) But the rebased versions still look fine to me. From BATV+ea3182469eafa39d099f+4201+infradead.org+hch@bombadil.srs.infradead.org Mon Feb 23 15:06:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A72A7F47 for ; Mon, 23 Feb 2015 15:06:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58F178F8084 for ; Mon, 23 Feb 2015 13:06:33 -0800 (PST) X-ASG-Debug-ID: 1424725591-04cbb0610f62730001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id TEGhNOMqhj9X3JJO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Feb 2015 13:06:31 -0800 (PST) X-Barracuda-Envelope-From: BATV+ea3182469eafa39d099f+4201+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 1YQ0Cz-0002Wx-V3; Mon, 23 Feb 2015 21:06:29 +0000 Date: Mon, 23 Feb 2015 13:06:29 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console Message-ID: <20150223210629.GA9370@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> <20150223204904.GC13522@infradead.org> <54EB9330.4080604@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB9330.4080604@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1424725591 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Feb 23, 2015 at 02:53:04PM -0600, Eric Sandeen wrote: > On 2/23/15 2:49 PM, Christoph Hellwig wrote: > > Oh well, even more spam during xfstest runs :) > > Heh, but no review...? > > I could be talked out of it, if people think it's not useful > enough. I can't really get excited enough either way to give a review or nak.. From rientjes@google.com Mon Feb 23 15:33:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 713277F47 for ; Mon, 23 Feb 2015 15:33:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 007AFAC002 for ; Mon, 23 Feb 2015 13:33:55 -0800 (PST) X-ASG-Debug-ID: 1424727234-04cbb0610f63720001-NocioJ Received: from mail-ig0-f182.google.com (mail-ig0-f182.google.com [209.85.213.182]) by cuda.sgi.com with ESMTP id DGIx1aczBsUSRkas (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 23 Feb 2015 13:33:54 -0800 (PST) X-Barracuda-Envelope-From: rientjes@google.com Received: by mail-ig0-f182.google.com with SMTP id h15so21946059igd.3 for ; Mon, 23 Feb 2015 13:33:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=CbCLDBRBvwfsBDzA0A68GF8Zm/3CNE+C09zMYXaBzJE=; b=eWR1zUtL8fgdgI6dRqNYmeAyWtPYx8Nvpqh/4cHCN8ZX/k9Cw+NNW9AUV4VLhj7XVG QKfrlz+7vlhKjr8XiIXbKImKy0wFoHJRKrj7Jpphsbrc8okfabKbDWdfp+ZBVWM5OVFp ug8ebXSVGZyv1y/tQrhh7tHpu1RJmLU+sAiku6X4BPXKtEmI5JS3j65N0NzdA1YYwkim /onHES41Wb2Nks/yKdzbRN7NUs0brKs58Hj4oI/0R5+GLCm8C1Pr1fYouRcGR+gL5hXJ bhtQPnSJC3Uq7yQTlv1sZwJnB0lStzKy58POB90somoMQe0a9S/plbIcGFf+wtJwhviz I0aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=CbCLDBRBvwfsBDzA0A68GF8Zm/3CNE+C09zMYXaBzJE=; b=UciT+nHoC6XGA4GVAgFL0zpYFs4ulX9cspWui7phRIzXjMTGPkbbqrwdAtiZ1x6wyr Cb5lFmWcBo3Rr53BPR60Mnd1szkBI1AGtyysVPVdf0Uyaa9E2iEMXcaSDJyusqwpgTvF xYBmiJ3uzcMF3Cf3jAhOZPZx9nIklFd0qM9jkjpiqGwLDb0fVrP4bT2TM5rUNqZRlkSA 08yGBDNKjNw1kEldgDLdduGLCtWyqDPuLq+i68zZB3MEGtvrCiV4YosT9WSNsFhFruNr qSthL9uuxNe382xA1SPx45K1GFUIl0cobWnTpADpN/A9X7gQFeuKA5bZseAyEQI30P6Y ngcw== X-Gm-Message-State: ALoCoQlUvLnEL3MfaWRQq06/COyU308Gf00UUooAgSe4+asn1gZo5C9DaY0JPkldkloBmD6phRUD X-Received: by 10.50.60.72 with SMTP id f8mr16048596igr.31.1424727234311; Mon, 23 Feb 2015 13:33:54 -0800 (PST) Received: from [2620:0:1008:1101:8555:17da:84da:938] ([2620:0:1008:1101:8555:17da:84da:938]) by mx.google.com with ESMTPSA id 130sm17262836ioz.10.2015.02.23.13.33.52 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 23 Feb 2015 13:33:53 -0800 (PST) Date: Mon, 23 Feb 2015 13:33:51 -0800 (PST) X-Barracuda-Apparent-Source-IP: 2620:0:1008:1101:8555:17da:84da:938 From: David Rientjes X-X-Sender: rientjes@chino.kir.corp.google.com To: Johannes Weiner cc: Andrew Morton , Theodore Ts'o , Dave Chinner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: How to handle TIF_MEMDIE stalls? In-Reply-To: <20150222002058.GB25079@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? Message-ID: References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <201502201936.HBH34799.SOLFFFQtHOMOJV@I-love.SAKURA.ne.jp> <20150220231511.GH12722@dastard> <20150221032000.GC7922@thunk.org> <20150221011907.2d26c979.akpm@linux-foundation.org> <20150222002058.GB25079@phnom.home.cmpxchg.org> User-Agent: Alpine 2.10 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-ig0-f182.google.com[209.85.213.182] X-Barracuda-Start-Time: 1424727234 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15740 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, 21 Feb 2015, Johannes Weiner wrote: > From: Johannes Weiner > > mm: page_alloc: revert inadvertent !__GFP_FS retry behavior change > > Historically, !__GFP_FS allocations were not allowed to invoke the OOM > killer once reclaim had failed, but nevertheless kept looping in the > allocator. 9879de7373fc ("mm: page_alloc: embed OOM killing naturally > into allocation slowpath"), which should have been a simple cleanup > patch, accidentally changed the behavior to aborting the allocation at > that point. This creates problems with filesystem callers (?) that > currently rely on the allocator waiting for other tasks to intervene. > > Revert the behavior as it shouldn't have been changed as part of a > cleanup patch. > > Fixes: 9879de7373fc ("mm: page_alloc: embed OOM killing naturally into allocation slowpath") > Signed-off-by: Johannes Weiner Cc: stable@vger.kernel.org [3.19] Acked-by: David Rientjes From david@fromorbit.com Mon Feb 23 15:53:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EF747F47 for ; Mon, 23 Feb 2015 15:53:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DEF96AC001 for ; Mon, 23 Feb 2015 13:53:04 -0800 (PST) X-ASG-Debug-ID: 1424728382-04bdf05bff66630001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id w101YOKGaHJ7WDfE for ; Mon, 23 Feb 2015 13:53:02 -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: A2CPFAAnoOtUPDkjLHlbgwaBLII5g32qAwEBAQEBAQaYPgICAQECgSJEAQEBAQEBBQEBAQE4O4QPAQEBAwEnExwjEAgDDgoJJQ8FJQMHGhOIJwfTJAEBCAIBHxiFb4UMhG4HhCsFjWGLM4Eci0uGTYQkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 24 Feb 2015 08:23:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ0w0-00026C-5d; Tue, 24 Feb 2015 08:53:00 +1100 Date: Tue, 24 Feb 2015 08:53:00 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks Message-ID: <20150223215300.GU4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks References: <1424722050-24149-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424722050-24149-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1424728382 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 23, 2015 at 03:07:30PM -0500, Brian Foster wrote: > The attr3 leaf header has a 16-bit firstused field that tracks the first > used entry offset. This field is initialized to the block size in > xfs_attr3_leaf_create() and updated accordingly in > xfs_attr3_leaf_add_work() when new attributes are added. > > The initialization of firstused overflows if the block size exceeds > 16-bits. E.g., xfstests test generic/117 causes assert failures on a > -bsize=64k fs on ppc64 because ichdr.firstused evaluates to 0. > > Update the firstused initialization to not exceed the maximum value of > an unsigned short. This avoids the overflow to 0 and allows firstused to > be updated appropriately on subsequent xattr addition. Also update the > freemap size calculation to use the actual block size rather than the > potentially minimized version stored in firstused. > > Signed-off-by: Brian Foster > --- > fs/xfs/libxfs/xfs_attr_leaf.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index 15105db..dc7bda3 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -970,7 +970,8 @@ xfs_attr3_leaf_create( > memset(leaf, 0, args->geo->blksize); > > memset(&ichdr, 0, sizeof(ichdr)); > - ichdr.firstused = args->geo->blksize; > + /* firstused is 16-bit */ > + ichdr.firstused = min_t(int, USHRT_MAX, args->geo->blksize); Needs a better comment. > > if (xfs_sb_version_hascrc(&mp->m_sb)) { > struct xfs_da3_blkinfo *hdr3 = bp->b_addr; > @@ -986,7 +987,7 @@ xfs_attr3_leaf_create( > ichdr.magic = XFS_ATTR_LEAF_MAGIC; > ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); > } > - ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; > + ichdr.freemap[0].size = args->geo->blksize - ichdr.freemap[0].base; And that also needs an explanation, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 23 15:58:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F12B7F47 for ; Mon, 23 Feb 2015 15:58:07 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1ACA38F80CB for ; Mon, 23 Feb 2015 13:58:06 -0800 (PST) X-ASG-Debug-ID: 1424728683-04cbb0610d64510001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vvDuZpPFiyppVcxP for ; Mon, 23 Feb 2015 13:58:04 -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: A2C8CgBnoetUPDkjLHlbgwaBLII5g32qAwEBAQEBAQaYPgQCAoEiRAEBAQEBAQUBAQEBODuEEAEFJxMcIxAIAxgJJQ8FJQMHGhOILtMoAQEIAiAYhW+FDIRuB4QrBZkUgRyLS4ZNhCQqMYJDAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 24 Feb 2015 08:28:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ10s-00027D-Rl; Tue, 24 Feb 2015 08:58:02 +1100 Date: Tue, 24 Feb 2015 08:58:02 +1100 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks Message-ID: <20150223215802.GV4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks References: <1424722050-24149-1-git-send-email-bfoster@redhat.com> <54EB8E5D.8080905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB8E5D.8080905@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1424728684 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 23, 2015 at 02:32:29PM -0600, Eric Sandeen wrote: > On 2/23/15 2:07 PM, Brian Foster wrote: > > The attr3 leaf header has a 16-bit firstused field that tracks the first > > used entry offset. This field is initialized to the block size in > > xfs_attr3_leaf_create() and updated accordingly in > > xfs_attr3_leaf_add_work() when new attributes are added. > > > > The initialization of firstused overflows if the block size exceeds > > 16-bits. E.g., xfstests test generic/117 causes assert failures on a > > -bsize=64k fs on ppc64 because ichdr.firstused evaluates to 0. > > cool :) > > > Update the firstused initialization to not exceed the maximum value of > > an unsigned short. This avoids the overflow to 0 and allows firstused to > > be updated appropriately on subsequent xattr addition. Also update the > > freemap size calculation to use the actual block size rather than the > > potentially minimized version stored in firstused. > > I'm a little scared by this; does this truncated value risk going to disk? > (Yes, I think so.) Is that ok? Does that ... mean we lose a byte of space > we'd otherwise have? Maybe that's ok ... > > FWIW, I think the same problem exists in xfs_attr3_leaf_compact(): > > /* Initialise the incore headers */ > ichdr_src = *ichdr_dst; /* struct copy */ > ichdr_dst->firstused = args->geo->blksize; > > and xfs_attr3_leaf_unbalance(): > > tmphdr.firstused = state->args->geo->blksize; And a loop in xfs_attr3_leaf_remove() that does: tmp = args->geo->blksize; ..... ichdr.firstused = tmp; so if the the loop in between does not modify tmp... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 23 16:09:01 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 71A347F47 for ; Mon, 23 Feb 2015 16:09:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1DB66AC001 for ; Mon, 23 Feb 2015 14:08:57 -0800 (PST) X-ASG-Debug-ID: 1424729335-04bdf05bff66ef0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vbDk9y7knBrfnvoh for ; Mon, 23 Feb 2015 14:08:56 -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: A2C9CgDBo+tUPDkjLHlbgwaBLII5g32qAwEBAQEBAQaYPgQCAoEiRAEBAQEBAQUBAQEBODuEDwEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiCcH0yMBAQgCIBiFb4UMhG4HhCsFmRSBHItLhk2EJCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 24 Feb 2015 08:38:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ1BO-000295-Q6; Tue, 24 Feb 2015 09:08:54 +1100 Date: Tue, 24 Feb 2015 09:08:54 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/4] xfsprogs: a couple metadump fixes and sb logging backports Message-ID: <20150223220854.GW4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/4] xfsprogs: a couple metadump fixes and sb logging backports References: <1424706709-21594-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424706709-21594-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1424729335 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 23, 2015 at 10:51:45AM -0500, Brian Foster wrote: > Hi all, > > Patches 1 and 2 are a couple metadump fixes that fell out from playing > around with large block size filesystems (e.g., 64k on ppc64), similar > to the repair patches I had sent recently. Patches 3 and 4 are backports > of a couple of the sb logging rework fixes. I'll pull the fixes into the current branch - we've probably got enough fixes queued up now to justify a 3.2.3 release. > Dave, > > I'm not sure what the workflow here is wrt to the sb logging backports. > FWIW, these are the only patches I need on top of the libxfs-3.19-update > branch to get most of the sparse inode bits to backport cleanly. Do you > want to include them in that branch? Otherwise, I'll just keep them in > my sparse inodes branch for now. What needs to happen is a full sync up to 4.0-rc1 - the libxfs kernel side is a moving target. Hopefully that's not a huge amount of work right now - I'll see if I can get it done by the end of the week. But, really, the biggest roadblock right now is getting some review of the major updates and build changes that are in that branch so we can move it towards a 3.3. release sooner rather than later. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Feb 23 17:11:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 37BD57F4E for ; Mon, 23 Feb 2015 17:11:02 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 04C058F80B7 for ; Mon, 23 Feb 2015 15:11:01 -0800 (PST) X-ASG-Debug-ID: 1424733058-04cb6c4bd0606c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Zs5aieD6BUiPSQfn for ; Mon, 23 Feb 2015 15:10:59 -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: A2C8CgDesutUPDkjLHlbgwaBLII5g32qAwEBAQEBAQaYPgQCAoEjRAEBAQEBAQUBAQEBODuEEAEFOhwjEAgDDgoJJQ8FJQMHGhOILtM2AQEIAiAYhW+FDIRuB4QrBZkUkzSEJCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail06.adl6.internode.on.net with ESMTP; 24 Feb 2015 09:40:16 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ28l-0002Gr-Ik; Tue, 24 Feb 2015 10:10:15 +1100 Date: Tue, 24 Feb 2015 10:10:15 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk Message-ID: <20150223231015.GX4251@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: ensure truncate forces zeroed blocks to disk References: <1424299725-26067-1-git-send-email-david@fromorbit.com> <20150223205109.GE13522@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150223205109.GE13522@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: 1424733058 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Feb 23, 2015 at 12:51:09PM -0800, Christoph Hellwig wrote: > This looks correct, but is there a good (performance) reason against > simply unconditionally flushing and waiting? No idea. All I am concerned about is correctness - getting the partial block flushed in the case that the on-disk size is the same as the in-memory size is the fix needed here, otherwise the behaviour should be unchanged. Given that I'm not sure what the effect of an unconditional flush is going to be, I'm not going to mix such a change with an otherwise obvious data corruption fix that we need to backport to other kernels. If you have the time to determine there is no performance impact from an unconditional flush, then I'll happily take the change. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Feb 23 20:39:56 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 96EFC7F47 for ; Mon, 23 Feb 2015 20:39:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 770CC304039 for ; Mon, 23 Feb 2015 18:39:53 -0800 (PST) X-ASG-Debug-ID: 1424745590-04bdf05c026ed30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id YPk3dZAAKdxns4y8 for ; Mon, 23 Feb 2015 18:39:50 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DPBwAq4+tUPDkjLHlbgwaBLIY2qgQBAQEBAQEGmW1EAQEBAQEBBQEBAQE4O4RsOxhqAwctiC6qX6hPhgeJFoEBhBUFo2iIYIFnAQsBgjAqMYECgUEBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Feb 2015 13:09:49 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YQ5PY-0002cO-CG for xfs@oss.sgi.com; Tue, 24 Feb 2015 13:39:48 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YQ5PY-0004GU-B3 for xfs@oss.sgi.com; Tue, 24 Feb 2015 13:39:48 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] mkfs: log stripe unit fails to influence default log size Date: Tue, 24 Feb 2015 13:39:48 +1100 X-ASG-Orig-Subj: [PATCH] mkfs: log stripe unit fails to influence default log size Message-Id: <1424745588-16361-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424745590 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15751 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This fails: # mkfs.xfs -f -l version=2,su=256k /dev/ram1 log size 2560 blocks too small, minimum size is 3264 blocks .... We should be automatically calculating an appropriate, valid log size when the user does not specify it. Signed-off-by: Dave Chinner --- mkfs/xfs_mkfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 66711cb..5e10c4e 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2441,9 +2441,11 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), */ logblocks = (dblocks << blocklog) / 2048; logblocks = logblocks >> blocklog; - logblocks = MAX(min_logblocks, logblocks); } + /* Log size must exceed the minimum the geometry requires. */ + logblocks = MAX(min_logblocks, logblocks); + /* make sure the log fits wholly within an AG */ if (logblocks >= agsize) logblocks = min_logblocks; -- 2.0.0 From david@fromorbit.com Mon Feb 23 21:19:39 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EED6F7F47 for ; Mon, 23 Feb 2015 21:19:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BFD7E304032 for ; Mon, 23 Feb 2015 19:19:35 -0800 (PST) X-ASG-Debug-ID: 1424747971-04bdf05bff6fb90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 1HE2oj3D9lQRvzjQ for ; Mon, 23 Feb 2015 19:19:32 -0800 (PST) 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: A2DVCgBm7OtUPDkjLHlbgwYiMFqCOYN9qXcMAQEBAQEBBpJKAoVyBIErRAEBAQEBAQUBAQEBODuEbDskNAUlAwctiC6qXqhPGIVviS2DAQxBgTEFhWKHf4VPhWSBHIVkg1SCE4ZNgWcLAQEBgi8qMYEDgUABAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Feb 2015 13:49:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ61r-0002hy-QF for xfs@oss.sgi.com; Tue, 24 Feb 2015 14:19:23 +1100 Date: Tue, 24 Feb 2015 14:19:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 88e8fda Message-ID: <20150224031923.GY4251@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 88e8fda MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="XWOWbaMNXpFDWE00" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424747971 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --XWOWbaMNXpFDWE00 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. I've also updated the master branch to point at v4.0-rc1, so you should update you current dev trees and post patches against the updated branch. The new head of the for-next branch is commit: 88e8fda Merge branch 'xfs-mmap-lock' into for-next New Commits: Dave Chinner (19): [501ab32] xfs: use generic percpu counters for inode counter [e88b64e] xfs: use generic percpu counters for free inode counter [0d485ad] xfs: use generic percpu counters for free block counter [5681ca4] xfs: Remove icsb infrastructure [bab98bb] xfs: introduce xfs_mod_frextents [0bd5dde] xfs: replace xfs_mod_incore_sb_batched [964aa8d9] xfs: remove xfs_mod_incore_sb API [653c60b] xfs: introduce mmap/truncate lock [de0e8c2] xfs: use i_mmaplock on read faults [075a924] xfs: use i_mmaplock on write faults [e8e9ad4] xfs: take i_mmap_lock on extent manipulation operations [0f9160b] xfs: xfs_setattr_size no longer races with page faults [723cac4] xfs: lock out page faults from extent swap operations [5885ebd] xfs: ensure truncate forces zeroed blocks to disk [58c9047] xfs: inodes are new until the dentry cache is set up [3790a8c] xfs: xfs_alloc_fix_minleft can underflow near ENOSPC [3cabb83] Merge branch 'xfs-misc-fixes-for-4.1' into for-next [4225441] Merge branch 'xfs-generic-sb-counters' into for-next [88e8fda] Merge branch 'xfs-mmap-lock' into for-next Eric Sandeen (7): [c29aad4] xfs: pass mp to XFS_WANT_CORRUPTED_GOTO [5fb5aee] xfs: pass mp to XFS_WANT_CORRUPTED_RETURN [fc92156] xfs: Ensure we have target_ip for RENAME_EXCHANGE [3b9ce79] xfs: log unmount events on console [fdadf26] xfs: clarify async write failure ratelimit message [83d5f01] xfs: cancel failed transaction in xfs_fs_commit_blocks() [444a702] xfs: remove deprecated mount options Jan Kara (1): [dfcc70a] xfs: Fix quota type in quota structures when reusing quota = file Wang Sheng-Hui (1): [dd5e712] xfs: remove old and redundant comment in xfs_mount_validate= _sb Code Diffstat: Documentation/filesystems/xfs.txt | 29 +- fs/xfs/libxfs/xfs_alloc.c | 104 +++-- fs/xfs/libxfs/xfs_bmap.c | 174 ++++---- fs/xfs/libxfs/xfs_btree.c | 24 +- fs/xfs/libxfs/xfs_dir2_data.c | 39 +- fs/xfs/libxfs/xfs_format.h | 62 --- fs/xfs/libxfs/xfs_ialloc.c | 48 +- fs/xfs/libxfs/xfs_sb.c | 20 +- fs/xfs/xfs_bmap_util.c | 31 +- fs/xfs/xfs_buf_item.c | 4 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_error.h | 8 +- fs/xfs/xfs_file.c | 84 +++- fs/xfs/xfs_fsops.c | 20 +- fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_inode.c | 154 +++++-- fs/xfs/xfs_inode.h | 58 ++- fs/xfs/xfs_ioctl.c | 5 +- fs/xfs/xfs_iomap.c | 3 +- fs/xfs/xfs_iops.c | 123 ++--- fs/xfs/xfs_iops.h | 2 - fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_linux.h | 9 - fs/xfs/xfs_log_recover.c | 4 +- fs/xfs/xfs_mount.c | 918 +++++-----------------------------= ---- fs/xfs/xfs_mount.h | 95 +--- fs/xfs/xfs_pnfs.c | 4 +- fs/xfs/xfs_qm.c | 18 +- fs/xfs/xfs_super.c | 126 ++++-- fs/xfs/xfs_super.h | 2 + fs/xfs/xfs_symlink.c | 58 ++- fs/xfs/xfs_trace.h | 3 + fs/xfs/xfs_trans.c | 234 ++++++---- 33 files changed, 925 insertions(+), 1546 deletions(-) --=20 Dave Chinner david@fromorbit.com --XWOWbaMNXpFDWE00 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJU6+27AAoJEK3oKUf0dfodi7UQAMZtfZZoEmmnH6RtNOGi22/2 Oka96YufehBHR9exIW6swrAU1Mt8cds3PlSpwaIWlzHIDH3fzvofDqKyRBpTD5UC XTfkvggQgwjPkNkbsiB3cGYg7/udTbdH2q3kSUeyEei9srP7so4GdJmDy1jnA3D6 nIV0aPARSLtXpC61uO/iG/hiiezjree+qcm5kb23GmYSE/0O7AP8Khm8xLejGtcz WzpJ1KZ3zPYpaUQF8jl1AY6vhTAzB3RL9US88ZOzyYvFvfAkrLrigsx5+DgHzb4H Bd9tiMRxD5sFR2J2sDozKmdJK8+b7VDBpLdfv2LaAihAHwjqN8BBAl7YVfXN0vn2 QacgQCNEh1DTmU6QIMtcGa5zzgSc8Mwm2DVp98MqNROOMCxg2tb9yu0Ad7DFAQdW OURtmOW3Z68shBI4fVU/GLrxjZAu32lAte2pCbfQ1p+bfBFjh99f7Z9hMuYfwlmr AwLBORNcJ8smRksd7Oi7+gOCxzI4eVHjW9ZxEJjCnXtGr56YT4rHnSOBx2YwMtbn YsCsP93I8BLrFKIbiK+9eUBOY27WQ16WL2XIxykcV2FL9uZBykRgeBp0mW/909rl ao8x1MuzidSiPEqzi59mHtglieHHLLe7c1jp3OF+cPsRmSazU/g3HGrGpifVfFPj 023qvAivWf3A0hikSe5h =4z63 -----END PGP SIGNATURE----- --XWOWbaMNXpFDWE00-- From sandeen@sandeen.net Mon Feb 23 21:48:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F103B7F47 for ; Mon, 23 Feb 2015 21:48:19 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD8E3304043 for ; Mon, 23 Feb 2015 19:48:19 -0800 (PST) X-ASG-Debug-ID: 1424749698-04cb6c4bd265c00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sAxutiCzei4FbhyF for ; Mon, 23 Feb 2015 19:48:18 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0194C65F1A36; Mon, 23 Feb 2015 21:48:17 -0600 (CST) Message-ID: <54EBF481.8000309@sandeen.net> Date: Mon, 23 Feb 2015 21:48:17 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] mkfs: log stripe unit fails to influence default log size References: <1424745588-16361-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] mkfs: log stripe unit fails to influence default log size In-Reply-To: <1424745588-16361-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1424749698 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15753 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2/23/15 8:39 PM, Dave Chinner wrote: > From: Dave Chinner > > This fails: > > # mkfs.xfs -f -l version=2,su=256k /dev/ram1 > log size 2560 blocks too small, minimum size is 3264 blocks > .... > > We should be automatically calculating an appropriate, valid log > size when the user does not specify it. > > Signed-off-by: Dave Chinner > --- > mkfs/xfs_mkfs.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 66711cb..5e10c4e 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -2441,9 +2441,11 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), > */ > logblocks = (dblocks << blocklog) / 2048; > logblocks = logblocks >> blocklog; > - logblocks = MAX(min_logblocks, logblocks); > } > > + /* Log size must exceed the minimum the geometry requires. */ ok, so 4G device with 4k sectors; 4k sectors + log sunit is what made the calculated min_logblocks large enough that it is failing without this change. Those details should probably be in the commit log. Also, nitpick, it doesn't have to exceed, and MAX() doesn't make it exceed.... maybe: /* Log size can't be less than the minimum the geometry requires. */ Code wise it's fine, I'd prefer to see commit log & comment tidied up, but: Reviewed-by: Eric Sandeen > + logblocks = MAX(min_logblocks, logblocks); > + > /* make sure the log fits wholly within an AG */ > if (logblocks >= agsize) > logblocks = min_logblocks; > From david@fromorbit.com Mon Feb 23 22:34:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD8A47F47 for ; Mon, 23 Feb 2015 22:34:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47862AC003 for ; Mon, 23 Feb 2015 20:34:09 -0800 (PST) X-ASG-Debug-ID: 1424752447-04bdf05c0271390001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GqxVcvNd1YubfMi4 for ; Mon, 23 Feb 2015 20:34:07 -0800 (PST) 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: A2DVCgA1/utUPDkjLHlbgwYiMFqCOYN9qXcMAQEBAQEBBpJKAoVyBIErRAEBAQEBAQUBAQEBODuEbDskNAUlAwctiC6qQ6hNGIVviheCFwxBgTEFkzCFZIEciTiCE4ZNgWcBCgEBAYIvKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Feb 2015 15:03:56 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQ7Bz-0002pZ-Vb for xfs@oss.sgi.com; Tue, 24 Feb 2015 15:33:56 +1100 Date: Tue, 24 Feb 2015 15:33:55 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to bd76b93 Message-ID: <20150224043355.GZ4251@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to bd76b93 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="W5WqUoFLvi1M7tJE" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424752447 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --W5WqUoFLvi1M7tJE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. With this update, I'll start the process of a 3.2.3 release - consider this update a 3.2.3-rc1 and I'll work towards a full release over the next couple of weeks. -Dave. The new head of the master branch is commit: bd76b93 mkfs: log stripe unit fails to influence default log size New Commits: Brian Foster (2): [39fe84a] metadump: include NULLFSINO check in inode copy code [0ab7cbc] metadump: check for non-zero inode alignment Dave Chinner (1): [bd76b93] mkfs: log stripe unit fails to influence default log size Namjae Jeon (1): [5c6afe9] xfsprog: xfsio: update xfs_io manpage for FALLOC_FL_INSERT_= RANGE Code Diffstat: db/metadump.c | 3 ++- man/man8/xfs_io.8 | 5 +++++ mkfs/xfs_mkfs.c | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) --=20 Dave Chinner david@fromorbit.com --W5WqUoFLvi1M7tJE Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJU6/8zAAoJEK3oKUf0dfod+BcQAMBuuYQw1uIRW+3+hFYYEcWd 1bihb4o/GNUg30LgRQOicKhSExHON1q+udDebCIwLwDykr3asD9cJCy0N1IUYmFq tVjBCu9xM3RXxaV9VbqDp2YvvvT1SD/nWCL3HxE/fBQzz4bLSAdaTXkTwnEL/2Vz +EVMh7gkiL4Ebqah6ZK+wx3rOcDah9lXEo4xoO77VVV78j/Kv4O8bXIQ4ccNzR7m kR3S0nBMBus+zhOojZx7tEtgzSyUk+S1aPHPNtH0wISW9KYKGyhE5VpFZRuDz+MW ZWiaOSlC4hQVydMSxt8ynIMKxQ9CfJHzRAHmXa0ONPdSsC9PO3KX/QURnqkmzras Zb7gsuqhOOziwYYGSr0JbFhkCGhrEvRQ2AIIFV102eodXKTaSmBrtkLu49FGLXqd 33+uJZ5+xisNs/S6yz2j2j5ZNEFRV1HK00GHLOS1hznHkS2xH2ecOVAzvpcW/zJF h8FHf/3ueCcax0iLUY4cM/+RHY7rzEBcb2jhP1Qc8czfOtot8OxDkTD3Rn4HkUQN VwvjMDWSR0LyxMX5U5U8Z5Hf6Irq6CgZUUHYQSMQ66djwAR3dXZ0mHsghuMaTQry qGOHlxffssInI2KlCRP8lpC3EI2GK+bGPw5909uMypnBLwkheVzK0j93ZfimVcyV WeNhO29G1WkYD/RiF8Id =ecl3 -----END PGP SIGNATURE----- --W5WqUoFLvi1M7tJE-- From dave@fromorbit.com Tue Feb 24 01:12:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 316B07F3F for ; Tue, 24 Feb 2015 01:12:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0EFF68F80C5 for ; Mon, 23 Feb 2015 23:12:40 -0800 (PST) X-ASG-Debug-ID: 1424761957-04cbb0610d73680001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NoYDrNVKBcP3zJXs for ; Mon, 23 Feb 2015 23:12:38 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DPBwDhI+xUPDkjLHlbgwaBLIY2qggBAQEBAQEGmWlEAQEBAQEBBQEBAQE4O4RsOxhqAwctiC6qW6hKhgeJFoEBhBUFo2iIYIFnAQsBLR+BZCoxgQKBQQEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Feb 2015 17:42:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YQ9fM-000333-7o for xfs@oss.sgi.com; Tue, 24 Feb 2015 18:12:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YQ9fM-0000XP-6M for xfs@oss.sgi.com; Tue, 24 Feb 2015 18:12:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: superblock buffers need to be sector sized Date: Tue, 24 Feb 2015 18:12:24 +1100 X-ASG-Orig-Subj: [PATCH] xfs: superblock buffers need to be sector sized Message-Id: <1424761944-2034-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1424761957 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner In secondary_sb_wack() we zero the unused portion of both the on-disk superblock and the in-memory copy that we have. When the device sector size is 4k, this causes xfs_repair to crash like so: # xfs_repair /dev/ram1 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... bad magic number bad on-disk superblock 3 - bad magic number primary/secondary superblock 3 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #3) # The stack trace is indicative: #0 memset () #1 0x000000000040404b in secondary_sb_wack #2 verify_set_agheader #3 0x0000000000427b4b in scan_ag #4 0x000000000042a2ca in worker_thread #5 0x00007ffff77ba0a4 in start_thread #6 0x00007ffff74efc2d in clone Which points at memset overrunning the in memory buffer, as it is only 512 bytes in length. Signed-off-by: Dave Chinner --- repair/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repair/scan.c b/repair/scan.c index ce8d7f5..12aa782 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1485,7 +1485,7 @@ scan_ag( int status; char *objname = NULL; - sb = (struct xfs_sb *)calloc(BBSIZE, 1); + sb = (struct xfs_sb *)calloc(BBTOB(XFS_FSS_TO_BB(mp, 1)), 1); if (!sb) { do_error(_("can't allocate memory for superblock\n")); return; -- 2.0.0 From bfoster@redhat.com Tue Feb 24 05:54:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18EAE7F3F for ; Tue, 24 Feb 2015 05:54:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA12CAC002 for ; Tue, 24 Feb 2015 03:53:58 -0800 (PST) X-ASG-Debug-ID: 1424778837-04bdf05c017e350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jesdG6cm9IhtZrzX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 03:53: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-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1OBrTMt006311 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 24 Feb 2015 06:53:29 -0500 Received: from laptop.bfoster (vpn-48-120.rdu2.redhat.com [10.10.48.120]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1OBrQWr022831 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Tue, 24 Feb 2015 06:53:28 -0500 Date: Tue, 24 Feb 2015 06:53:25 -0500 From: Brian Foster To: Christoph Hellwig Cc: Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console Message-ID: <20150224115325.GA2356@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> <20150223204904.GC13522@infradead.org> <54EB9330.4080604@sandeen.net> <20150223210629.GA9370@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150223210629.GA9370@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424778837 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 23, 2015 at 01:06:29PM -0800, Christoph Hellwig wrote: > On Mon, Feb 23, 2015 at 02:53:04PM -0600, Eric Sandeen wrote: > > On 2/23/15 2:49 PM, Christoph Hellwig wrote: > > > Oh well, even more spam during xfstest runs :) > > > > Heh, but no review...? > > > > I could be talked out of it, if people think it's not useful > > enough. > > I can't really get excited enough either way to give a review or nak.. > Heh, what verbosity is xfs_notice()? Maybe using debug level would be better? Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Feb 24 06:51:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 39B687F3F for ; Tue, 24 Feb 2015 06:51:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28342304032 for ; Tue, 24 Feb 2015 04:51:36 -0800 (PST) X-ASG-Debug-ID: 1424782293-04cb6c4bd372620001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id hahxG4GmgcNfvgwQ for ; Tue, 24 Feb 2015 04:51:34 -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: A2CCDACdcuxU/zkjLHlbgwaBLLBAAQEBAQEBBoxii1wEAgKBKUQBAQEBAQF8hBABBTocIxAIAw4KCSUPBSUDIROILtMpAQEBBwIBHxiFb4UMhG4HgxeBFAEEmRqTOCKEAioxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Feb 2015 23:21:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQExM-0003jb-6e; Tue, 24 Feb 2015 23:51:20 +1100 Date: Tue, 24 Feb 2015 23:51:20 +1100 From: Dave Chinner To: Brian Foster Cc: Christoph Hellwig , Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console Message-ID: <20150224125120.GC4251@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> <20150223204904.GC13522@infradead.org> <54EB9330.4080604@sandeen.net> <20150223210629.GA9370@infradead.org> <20150224115325.GA2356@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150224115325.GA2356@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1424782293 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 24, 2015 at 06:53:25AM -0500, Brian Foster wrote: > On Mon, Feb 23, 2015 at 01:06:29PM -0800, Christoph Hellwig wrote: > > On Mon, Feb 23, 2015 at 02:53:04PM -0600, Eric Sandeen wrote: > > > On 2/23/15 2:49 PM, Christoph Hellwig wrote: > > > > Oh well, even more spam during xfstest runs :) > > > > > > Heh, but no review...? > > > > > > I could be talked out of it, if people think it's not useful > > > enough. > > > > I can't really get excited enough either way to give a review or nak.. > > > > Heh, what verbosity is xfs_notice()? Maybe using debug level would be > better? The context Eric and I wanted to see this was when triaging bugs on production systems. e.g. to know if someone unmounted a shut down filesystem and tried to repair it before rebooting the system... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue Feb 24 07:03:53 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3CFC47F3F for ; Tue, 24 Feb 2015 07:03:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE31DAC005 for ; Tue, 24 Feb 2015 05:03:49 -0800 (PST) X-ASG-Debug-ID: 1424783028-04bdf05bff80900001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1n5wugP1kA7WcM3M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 05:03:48 -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 (8.14.4/8.14.4) with ESMTP id t1OD3PTk032161 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 24 Feb 2015 08:03:25 -0500 Received: from laptop.bfoster (vpn-48-120.rdu2.redhat.com [10.10.48.120]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1OD3MxK002746 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Tue, 24 Feb 2015 08:03:24 -0500 Date: Tue, 24 Feb 2015 08:03:21 -0500 From: Brian Foster To: Dave Chinner Cc: Christoph Hellwig , Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/2] xfs: log unmount events on console Message-ID: <20150224130321.GB2356@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: log unmount events on console References: <54EB7BDB.7080202@redhat.com> <54EB7C65.3000307@sandeen.net> <20150223204904.GC13522@infradead.org> <54EB9330.4080604@sandeen.net> <20150223210629.GA9370@infradead.org> <20150224115325.GA2356@laptop.bfoster> <20150224125120.GC4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150224125120.GC4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424783028 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Feb 24, 2015 at 11:51:20PM +1100, Dave Chinner wrote: > On Tue, Feb 24, 2015 at 06:53:25AM -0500, Brian Foster wrote: > > On Mon, Feb 23, 2015 at 01:06:29PM -0800, Christoph Hellwig wrote: > > > On Mon, Feb 23, 2015 at 02:53:04PM -0600, Eric Sandeen wrote: > > > > On 2/23/15 2:49 PM, Christoph Hellwig wrote: > > > > > Oh well, even more spam during xfstest runs :) > > > > > > > > Heh, but no review...? > > > > > > > > I could be talked out of it, if people think it's not useful > > > > enough. > > > > > > I can't really get excited enough either way to give a review or nak.. > > > > > > > Heh, what verbosity is xfs_notice()? Maybe using debug level would be > > better? > > The context Eric and I wanted to see this was when triaging bugs on > production systems. e.g. to know if someone unmounted a shut down > filesystem and tried to repair it before rebooting the system... > I guess that makes sense on a clean reboot, less so if the shutdown is a rootfs and leads to a panic or something of that sort (and what does a umount matter once the fs is shutdown?). Anyways, it's not a common operation and if the extra xfstests logging is the most significant tradeoff then it seems harmless to me: Reviewed-by: Brian Foster > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From siq6f8@mail.missouri.edu Tue Feb 24 07:26:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,SPOOF_COM2COM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5ECA37F3F for ; Tue, 24 Feb 2015 07:26:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DE2C6AC001 for ; Tue, 24 Feb 2015 05:26:01 -0800 (PST) X-ASG-Debug-ID: 1424784359-04cbb0610e7f180001-NocioJ Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1hn0252.outbound.protection.outlook.com [157.56.110.252]) by cuda.sgi.com with ESMTP id zSpYaEJJEo1uqZHy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 05:26:00 -0800 (PST) X-Barracuda-Envelope-From: siq6f8@mail.missouri.edu X-Barracuda-Apparent-Source-IP: 157.56.110.252 Received: from [100.66.14.237] (116.202.32.59) by DM2PR0101MB1200.prod.exchangelabs.com (25.160.135.16) with Microsoft SMTP Server (TLS) id 15.1.93.16; Tue, 24 Feb 2015 13:25:48 +0000 Content-Type: multipart/alternative; boundary="===============2060980315==" MIME-Version: 1.0 Subject: ALERT To: Recipients X-ASG-Orig-Subj: ALERT From: Date: Tue, 24 Feb 2015 18:55:35 +0530 Reply-To: Message-ID: X-Originating-IP: [116.202.32.59] X-ClientProxiedBy: DB4PR07CA010.eurprd07.prod.outlook.com (10.242.229.20) To DM2PR0101MB1200.prod.exchangelabs.com (25.160.135.16) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=siq6f8@mail.missouri.edu; X-Microsoft-Antispam: UriScan:; X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:;SRVR:DM2PR0101MB1200; X-Exchange-Antispam-Report-CFA: BCL:0;PCL:0;RULEID:;SRVR:DM2PR0101MB1200; X-Forefront-PRVS: 04976078F0 X-Forefront-Antispam-Report: SFV:SPM;SFS:(10009020)(6049001)(199003)(189002)(107886001)(53806999)(87976001)(250100001)(40100003)(110136001)(229853001)(89122001)(62966003)(122386002)(77156002)(50986999)(54356999)(18206015028)(110146008)(75432002)(74316001)(48046002)(46102003)(86152002)(64706001)(101416001)(2171001)(66066001)(42186005)(88552001)(221733001)(71646002)(512934002)(86362001)(84326002)(81956001)(19580395003)(2420400003)(68736005)(19617315012)(5000100001)(105586002)(106356001)(97736003)(33656002)(43066003)(15975445007)(82596007);DIR:OUT;SFP:1501;SCL:5;SRVR:DM2PR0101MB1200;H:[100.66.14.237];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: mail.missouri.edu does not designate permitted sender hosts) X-Exchange-Antispam-Report-CFA: BCL:0;PCL:0;RULEID:;SRVR:DM2PR0101MB1200; X-OriginatorOrg: mail.missouri.edu X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2015 13:25:48.4200 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0101MB1200 X-Barracuda-Connect: mail-bn1hn0252.outbound.protection.outlook.com[157.56.110.252] X-Barracuda-Start-Time: 1424784360 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.44 X-Barracuda-Spam-Status: No, SCORE=2.44 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA609_NRN, BSF_SC0_SA_TO_FROM_ADDR_MATCH, BSF_SC7_SA578_CH, HTML_MESSAGE, NO_REAL_NAME, SPOOF_COM2COM, SPOOF_COM2COM_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 SPOOF_COM2COM URI: URI contains ".com" in middle and end 0.00 HTML_MESSAGE BODY: HTML included in message 0.34 SPOOF_COM2COM_2 URI contains ".com" in middle and end 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.10 BSF_SC0_SA609_NRN Custom Rule SA609_NRN 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH --===============2060980315== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body = = = Dear Email User, = This is to inform you that we are having a General System Confirmation ong= oing in our Online Database for 2015, kindly Confirm your Online outlook Ac= count in order to continue enjoying our online outlook security services.Yo= u are required to complete this quick Verification process. = Therefore we request that you CLICK HERE = to Confirm Your Email. = Thanks for your understanding. = We are always there to keep you informed. = Signed: Microsoft Management. --===============2060980315== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body

3D"Inline


Dear Email User,


This is to inform you that we are having a General System Confirm= ation ongoing in our Online Database for 2015, kindly Confirm your Online o= utlook Account in order to continue enjoying our online outlook security se= rvices.You are required to complete this quick Verification process.


Therefore we request that you CLICK HERE


 to Confirm Your Email.


Thanks for your understanding.


We are always there to keep you informed.


Signed:
Microsoft Management.

<= /DIV> --===============2060980315==-- From bfoster@redhat.com Tue Feb 24 07:28:30 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D1337F3F for ; Tue, 24 Feb 2015 07:28:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF1AF304032 for ; Tue, 24 Feb 2015 05:28:26 -0800 (PST) X-ASG-Debug-ID: 1424784505-04cb6c4bd273570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jm7Wld9dggJe1z7F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 05:28:25 -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 (8.14.4/8.14.4) with ESMTP id t1ODSOCT016533 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 24 Feb 2015 08:28:24 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1ODSO88019706; Tue, 24 Feb 2015 08:28:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45ACD124880; Tue, 24 Feb 2015 08:28:23 -0500 (EST) Date: Tue, 24 Feb 2015 08:28:23 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks Message-ID: <20150224132822.GA45528@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid firstused overflow in attr3 leaf header with 64k blocks References: <1424722050-24149-1-git-send-email-bfoster@redhat.com> <54EB8E5D.8080905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EB8E5D.8080905@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424784505 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Feb 23, 2015 at 02:32:29PM -0600, Eric Sandeen wrote: > On 2/23/15 2:07 PM, Brian Foster wrote: > > The attr3 leaf header has a 16-bit firstused field that tracks the first > > used entry offset. This field is initialized to the block size in > > xfs_attr3_leaf_create() and updated accordingly in > > xfs_attr3_leaf_add_work() when new attributes are added. > > > > The initialization of firstused overflows if the block size exceeds > > 16-bits. E.g., xfstests test generic/117 causes assert failures on a > > -bsize=64k fs on ppc64 because ichdr.firstused evaluates to 0. > > cool :) > > > Update the firstused initialization to not exceed the maximum value of > > an unsigned short. This avoids the overflow to 0 and allows firstused to > > be updated appropriately on subsequent xattr addition. Also update the > > freemap size calculation to use the actual block size rather than the > > potentially minimized version stored in firstused. > > I'm a little scared by this; does this truncated value risk going to disk? > (Yes, I think so.) Is that ok? Does that ... mean we lose a byte of space > we'd otherwise have? Maybe that's ok ... > I don't think it goes to disk in this situation, but even if it does I'm not sure it matters. Either it's a sane value for the field or it isn't. :) We've lost a byte according to the technical meaning of the field but I don't think that is the practical result. If you follow xfs_attr_shortform_to_leaf() down to xfs_attr3_leaf_add(), we use the freemap size and compare firstused against the base, so this is insignificant there. Continue further to xfs_attr3_leaf_add_work() where we do this: ichdr->freemap[mapindex].size -= xfs_attr_leaf_newentsize(args, &tmp); entry->nameidx = cpu_to_be16(ichdr->freemap[mapindex].base + ichdr->freemap[mapindex].size); ... if (be16_to_cpu(entry->nameidx) < ichdr->firstused) ichdr->firstused = be16_to_cpu(entry->nameidx); ... ... and it looks to me that firstused will be updated appropriately on first insertion just the same since the data structure to track the entry itself is larger than a single byte (I think there's also 4-byte alignment rules in play here). All that said, that's just the insert after sf->leaf conversion case and I'm still working on grokking this code. I haven't considered the other compaction cases and whatnot yet. TBH, even if we do lose a byte in some circumstances, I think that's just a limitation of the on-disk format. We just have to make sure it's documented and handled correctly. Another question is what happens if one one of these blocks is emptied some time later (e.g., is conversion/removal guaranteed? maybe it's more appropriate to reduce the size as well, pretend the blocks are a few bytes shorter and avoid a landmine altogether). > FWIW, I think the same problem exists in xfs_attr3_leaf_compact(): > > /* Initialise the incore headers */ > ichdr_src = *ichdr_dst; /* struct copy */ > ichdr_dst->firstused = args->geo->blksize; > > and xfs_attr3_leaf_unbalance(): > > tmphdr.firstused = state->args->geo->blksize; > Indeed, thanks for catching these. I'll look through them and the one Dave pointed out. > > Signed-off-by: Brian Foster > > --- > > fs/xfs/libxfs/xfs_attr_leaf.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > > index 15105db..dc7bda3 100644 > > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > > @@ -970,7 +970,8 @@ xfs_attr3_leaf_create( > > memset(leaf, 0, args->geo->blksize); > > > > memset(&ichdr, 0, sizeof(ichdr)); > > - ichdr.firstused = args->geo->blksize; > > + /* firstused is 16-bit */ > > + ichdr.firstused = min_t(int, USHRT_MAX, args->geo->blksize); > > > > if (xfs_sb_version_hascrc(&mp->m_sb)) { > > struct xfs_da3_blkinfo *hdr3 = bp->b_addr; > > @@ -986,7 +987,7 @@ xfs_attr3_leaf_create( > > ichdr.magic = XFS_ATTR_LEAF_MAGIC; > > ichdr.freemap[0].base = sizeof(struct xfs_attr_leaf_hdr); > > } > > - ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; > > + ichdr.freemap[0].size = args->geo->blksize - ichdr.freemap[0].base; > > But now freemap.size is out of sync with firstused; is that ok? > I think so, according to the above logic. I'll have to see about those other cases... Brian > -Eric > > > xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); > > xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Feb 24 07:36:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D69C47F3F for ; Tue, 24 Feb 2015 07:36:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58B518F80BE for ; Tue, 24 Feb 2015 05:36:56 -0800 (PST) X-ASG-Debug-ID: 1424785015-04bdf05c01819e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 536TaK9kh8kwLboW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 05:36:55 -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 (8.14.4/8.14.4) with ESMTP id t1ODartI018702 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 24 Feb 2015 08:36:53 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1ODaruV009476; Tue, 24 Feb 2015 08:36:53 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 71774124880; Tue, 24 Feb 2015 08:36:52 -0500 (EST) Date: Tue, 24 Feb 2015 08:36:52 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: superblock buffers need to be sector sized Message-ID: <20150224133652.GB45528@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: superblock buffers need to be sector sized References: <1424761944-2034-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424761944-2034-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424785015 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Feb 24, 2015 at 06:12:24PM +1100, Dave Chinner wrote: > From: Dave Chinner > > In secondary_sb_wack() we zero the unused portion of both the > on-disk superblock and the in-memory copy that we have. When > the device sector size is 4k, this causes xfs_repair to crash like > so: > > # xfs_repair /dev/ram1 > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > bad magic number > bad on-disk superblock 3 - bad magic number > primary/secondary superblock 3 conflict - AG superblock geometry info conflicts with filesystem geometry > zeroing unused portion of secondary superblock (AG #3) > # > > The stack trace is indicative: > > #0 memset () > #1 0x000000000040404b in secondary_sb_wack > #2 verify_set_agheader > #3 0x0000000000427b4b in scan_ag > #4 0x000000000042a2ca in worker_thread > #5 0x00007ffff77ba0a4 in start_thread > #6 0x00007ffff74efc2d in clone > > Which points at memset overrunning the in memory buffer, as it is > only 512 bytes in length. > > Signed-off-by: Dave Chinner > --- The patch subject line should probably say 'xfsprogs:' or 'repair:,' otherwise this looks good to me: Reviewed-by: Brian Foster > repair/scan.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/repair/scan.c b/repair/scan.c > index ce8d7f5..12aa782 100644 > --- a/repair/scan.c > +++ b/repair/scan.c > @@ -1485,7 +1485,7 @@ scan_ag( > int status; > char *objname = NULL; > > - sb = (struct xfs_sb *)calloc(BBSIZE, 1); > + sb = (struct xfs_sb *)calloc(BBTOB(XFS_FSS_TO_BB(mp, 1)), 1); > if (!sb) { > do_error(_("can't allocate memory for superblock\n")); > return; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From harry@pythonanywhere.com Tue Feb 24 09:15:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4AE197F3F for ; Tue, 24 Feb 2015 09:15:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3924A8F80C9 for ; Tue, 24 Feb 2015 07:15:36 -0800 (PST) X-ASG-Debug-ID: 1424790933-04cb6c4bd276750001-NocioJ Received: from darcachon.resolversystems.com (darcachon.resolversystems.com [80.68.93.186]) by cuda.sgi.com with ESMTP id sCffsxjDgJZHS5tV (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 24 Feb 2015 07:15:34 -0800 (PST) X-Barracuda-Envelope-From: harry@pythonanywhere.com X-Barracuda-Apparent-Source-IP: 80.68.93.186 Received: from host81-136-198-183.in-addr.btopenworld.com ([81.136.198.183] helo=[192.168.0.109]) by darcachon.resolversystems.com with esmtpsa (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1YQHCt-0007gw-Rq for xfs@oss.sgi.com; Tue, 24 Feb 2015 15:15:32 +0000 Message-ID: <54EC958E.2000001@pythonanywhere.com> Date: Tue, 24 Feb 2015 15:15:26 +0000 From: Harry User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 81.136.198.183 X-SA-Exim-Mail-From: harry@pythonanywhere.com Subject: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:57:07 +0000) X-ASG-Orig-Subj: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Scanned: Yes (on darcachon.resolversystems.com) X-Barracuda-Connect: darcachon.resolversystems.com[80.68.93.186] X-Barracuda-Start-Time: 1424790934 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi there, We've got a moderately large disk (~2TB) into an inconsistent state, such that it's going to want a quotacheck the next time we mount it (it's currently mounted with quota accounting inactive). Our tests suggest this is going to take several hours, and cause an outage we can't afford. We're wondering whether there's a 'nuke the site from orbit' option that will let us avoid it. The plan would be to: - switch off quotas and delete them completely, using the commands: -- disable -- off -- remove - remount the drive with -o prjquota, hoping that there will not be a quotacheck, because we've deleted all the old quota data - run a script gradually restore all the quotas, one by one and in good time, from our own external backups (we've got the quotas in a database basically). So the questions are: - is there a way to remove all quota information from a mounted drive? (the current mount status seems to be that it tried to mount it with -o prjquota but that quota accounting is *not* active) - will it work and let us remount the drive with -o prjquota without causing a quotacheck? Answers on a postcard, received with the utmost gratitude. Rgds, Harry + the PythonAnywhere team. -- Harry Percival Developer harry@pythonanywhere.com PythonAnywhere - a fully browser-based Python development and hosting environment PythonAnywhere LLP 17a Clerkenwell Road, London EC1M 5RD, UK VAT No.: GB 893 5643 79 Registered in England and Wales as company number OC378414. Registered address: 28 Ely Place, 3rd Floor, London EC1N 6TD, UK From obamastudent.forgivness@studentguide.us Tue Feb 24 10:37:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=FROM_12LTRDOM,INVALID_DATE 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 29E4E7F3F for ; Tue, 24 Feb 2015 10:37:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3456AC001 for ; Tue, 24 Feb 2015 08:37:10 -0800 (PST) X-ASG-Debug-ID: 1424795828-04cb6c4bd379580001-NocioJ Received: from studentguide.us ([95.154.202.77]) by cuda.sgi.com with ESMTP id 4IB2PQLT0lESw5pM for ; Tue, 24 Feb 2015 08:37:08 -0800 (PST) X-Barracuda-Envelope-From: obamastudent.forgivness@studentguide.us X-Barracuda-Apparent-Source-IP: 95.154.202.77 From: "ObamaStudent.Forgivness" Date: Di, 24 Feb 2015 11:37:10 -0500 MIME-Version: 1.0 To: Subject: Open Enrollment February 24, 2015 : Forgiveness and Discharge Program Message-ID: X-ASG-Orig-Subj: Open Enrollment February 24, 2015 : Forgiveness and Discharge Program Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[95.154.202.77] X-Barracuda-Start-Time: 1424795828 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, INVALID_DATE, INVALID_DATE_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 INVALID_DATE Invalid Date: header (not RFC 2822) 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.76 INVALID_DATE_2 Invalid Date: header (not RFC 2822) 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ***************************** The Student Forgiveness Program ***************************** Open Enrollment February 24, 2015 Just enacted: Obama Student Loan Forgiveness Public Service Loan Forgiveness (PSLF) Program: Call Now! (888) 451 8776 ***************************** Find out more about the New Student Forgiveness Program ***************************** ( Former Students and Current Students ) From harry@pythonanywhere.com Tue Feb 24 10:39:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C57257F3F for ; Tue, 24 Feb 2015 10:39:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2401304039 for ; Tue, 24 Feb 2015 08:39:14 -0800 (PST) X-ASG-Debug-ID: 1424795951-04cb6c4bd179660001-NocioJ Received: from darcachon.resolversystems.com (darcachon.resolversystems.com [80.68.93.186]) by cuda.sgi.com with ESMTP id 68mgDEijAG2clQK6 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 24 Feb 2015 08:39:12 -0800 (PST) X-Barracuda-Envelope-From: harry@pythonanywhere.com X-Barracuda-Apparent-Source-IP: 80.68.93.186 Received: from host81-136-198-183.in-addr.btopenworld.com ([81.136.198.183] helo=[192.168.0.109]) by darcachon.resolversystems.com with esmtpsa (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1YQIVq-0008GD-54 for xfs@oss.sgi.com; Tue, 24 Feb 2015 16:39:10 +0000 Message-ID: <54ECA928.6030707@pythonanywhere.com> Date: Tue, 24 Feb 2015 16:39:04 +0000 From: Harry User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com References: <54EC958E.2000001@pythonanywhere.com> In-Reply-To: <54EC958E.2000001@pythonanywhere.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 81.136.198.183 X-SA-Exim-Mail-From: harry@pythonanywhere.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:57:07 +0000) X-ASG-Orig-Subj: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Scanned: Yes (on darcachon.resolversystems.com) X-Barracuda-Connect: darcachon.resolversystems.com[80.68.93.186] X-Barracuda-Start-Time: 1424795952 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi there, Initial experiments suggest that the disable/off/remove commands are not available when a drive is mounted without quota accounting switched on. So it looks like we won't be able to use them. Is there another way to clear all the old quota information from a drive? rgds, Harry On 24/02/15 15:15, Harry wrote: > Hi there, > > We've got a moderately large disk (~2TB) into an inconsistent state, > such that it's going to want a quotacheck the next time we mount it > (it's currently mounted with quota accounting inactive). Our tests > suggest this is going to take several hours, and cause an outage we > can't afford. > > We're wondering whether there's a 'nuke the site from orbit' option > that will let us avoid it. The plan would be to: > - switch off quotas and delete them completely, using the commands: > -- disable > -- off > -- remove > - remount the drive with -o prjquota, hoping that there will not be a > quotacheck, because we've deleted all the old quota data > - run a script gradually restore all the quotas, one by one and in > good time, from our own external backups (we've got the quotas in a > database basically). > > So the questions are: > - is there a way to remove all quota information from a mounted drive? > (the current mount status seems to be that it tried to mount it with > -o prjquota but that quota accounting is *not* active) > - will it work and let us remount the drive with -o prjquota without > causing a quotacheck? > > Answers on a postcard, received with the utmost gratitude. > > Rgds, > Harry + the PythonAnywhere team. > Rgds, Harry + the PythonAnywhere team. -- Harry Percival Developer harry@pythonanywhere.com PythonAnywhere - a fully browser-based Python development and hosting environment PythonAnywhere LLP 17a Clerkenwell Road, London EC1M 5RD, UK VAT No.: GB 893 5643 79 Registered in England and Wales as company number OC378414. Registered address: 28 Ely Place, 3rd Floor, London EC1N 6TD, UK From obamastudent.forgivness@studentguide.us Tue Feb 24 10:53:57 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=FROM_12LTRDOM,INVALID_DATE 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 A66667F3F for ; Tue, 24 Feb 2015 10:53:57 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9278B8F8039 for ; Tue, 24 Feb 2015 08:53:57 -0800 (PST) X-ASG-Debug-ID: 1424796836-04cb6c4bd079de0001-NocioJ Received: from studentguide.us ([95.154.202.77]) by cuda.sgi.com with ESMTP id A9VO6mi6z0Cb4E8v for ; Tue, 24 Feb 2015 08:53:56 -0800 (PST) X-Barracuda-Envelope-From: obamastudent.forgivness@studentguide.us X-Barracuda-Apparent-Source-IP: 95.154.202.77 From: "ObamaStudent.Forgivness" Date: Di, 24 Feb 2015 11:53:58 -0500 MIME-Version: 1.0 To: Subject: Open Enrollment February 24, 2015 : Forgiveness and Discharge Program Message-ID: X-ASG-Orig-Subj: Open Enrollment February 24, 2015 : Forgiveness and Discharge Program Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: UNKNOWN[95.154.202.77] X-Barracuda-Start-Time: 1424796836 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, INVALID_DATE, INVALID_DATE_2, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 INVALID_DATE Invalid Date: header (not RFC 2822) 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.76 INVALID_DATE_2 Invalid Date: header (not RFC 2822) 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ***************************** The Student Forgiveness Program ***************************** Open Enrollment February 24, 2015 Just enacted: Obama Student Loan Forgiveness Public Service Loan Forgiveness (PSLF) Program: Call Now! (888) 451 8776 ***************************** Find out more about the New Student Forgiveness Program ***************************** ( Former Students and Current Students ) From bpm@sgi.com Tue Feb 24 11:33:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF5827F3F for ; Tue, 24 Feb 2015 11:33:08 -0600 (CST) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BC268F80E3; Tue, 24 Feb 2015 09:33:05 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 471294266DC; Tue, 24 Feb 2015 11:33:05 -0600 (CST) Date: Tue, 24 Feb 2015 11:33:05 -0600 From: Ben Myers To: Harry Cc: xfs@oss.sgi.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data Message-ID: <20150224173305.GE4015@sgi.com> References: <54EC958E.2000001@pythonanywhere.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EC958E.2000001@pythonanywhere.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Harry, On Tue, Feb 24, 2015 at 03:15:26PM +0000, Harry wrote: > Hi there, > > We've got a moderately large disk (~2TB) into an inconsistent state, > such that it's going to want a quotacheck the next time we mount it > (it's currently mounted with quota accounting inactive). Our tests > suggest this is going to take several hours, and cause an outage we > can't afford. The 'noquota' mount option will disable quotacheck at mount time. That may do what you need. > We're wondering whether there's a 'nuke the site from orbit' option > that will let us avoid it. The plan would be to: > - switch off quotas and delete them completely, using the commands: > -- disable > -- off > -- remove > - remount the drive with -o prjquota, hoping that there will not be > a quotacheck, because we've deleted all the old quota data > - run a script gradually restore all the quotas, one by one and in > good time, from our own external backups (we've got the quotas in a > database basically). > > So the questions are: > - is there a way to remove all quota information from a mounted drive? > (the current mount status seems to be that it tried to mount it with > -o prjquota but that quota accounting is *not* active) > - will it work and let us remount the drive with -o prjquota without > causing a quotacheck? Quotacheck is implemented by truncating the quota inode and then rebuilding the dquots from scratch as it traverses all the inodes in the filesystem. Unfortunately the filesystem needs to be idle during this process or the accounting could be incorrect, so there is no gradual option for restoring quotas. Regards, Ben From harry@pythonanywhere.com Tue Feb 24 11:59:54 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CF5F7F3F for ; Tue, 24 Feb 2015 11:59:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 275F88F80D8 for ; Tue, 24 Feb 2015 09:59:54 -0800 (PST) X-ASG-Debug-ID: 1424800791-04cbb0610e89440001-NocioJ Received: from darcachon.resolversystems.com (darcachon.resolversystems.com [80.68.93.186]) by cuda.sgi.com with ESMTP id J8gSqRalaT3Ntyq1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Tue, 24 Feb 2015 09:59:52 -0800 (PST) X-Barracuda-Envelope-From: harry@pythonanywhere.com X-Barracuda-Apparent-Source-IP: 80.68.93.186 Received: from host81-136-198-183.in-addr.btopenworld.com ([81.136.198.183] helo=[192.168.0.105]) by darcachon.resolversystems.com with esmtpsa (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1YQJlt-0000OO-LI; Tue, 24 Feb 2015 17:59:50 +0000 Message-ID: <54ECBC10.2090001@pythonanywhere.com> Date: Tue, 24 Feb 2015 17:59:44 +0000 From: Harry Percival User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com References: <54EC958E.2000001@pythonanywhere.com> <20150224173305.GE4015@sgi.com> In-Reply-To: <20150224173305.GE4015@sgi.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 81.136.198.183 X-SA-Exim-Mail-From: harry@pythonanywhere.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:57:07 +0000) X-ASG-Orig-Subj: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Scanned: Yes (on darcachon.resolversystems.com) X-Barracuda-Connect: darcachon.resolversystems.com[80.68.93.186] X-Barracuda-Start-Time: 1424800791 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15782 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben, thanks for replying. We're using project quotas, and we'd be prepared to wipe the slate clean and start by saying there are no projects and no quotas at all, to start with. Is there still no way of starting from scratch and avoiding that quotacheck? HP On 24/02/15 17:33, Ben Myers wrote: > Hi Harry, > > On Tue, Feb 24, 2015 at 03:15:26PM +0000, Harry wrote: >> Hi there, >> >> We've got a moderately large disk (~2TB) into an inconsistent state, >> such that it's going to want a quotacheck the next time we mount it >> (it's currently mounted with quota accounting inactive). Our tests >> suggest this is going to take several hours, and cause an outage we >> can't afford. > The 'noquota' mount option will disable quotacheck at mount time. That > may do what you need. > >> We're wondering whether there's a 'nuke the site from orbit' option >> that will let us avoid it. The plan would be to: >> - switch off quotas and delete them completely, using the commands: >> -- disable >> -- off >> -- remove >> - remount the drive with -o prjquota, hoping that there will not be >> a quotacheck, because we've deleted all the old quota data >> - run a script gradually restore all the quotas, one by one and in >> good time, from our own external backups (we've got the quotas in a >> database basically). >> >> So the questions are: >> - is there a way to remove all quota information from a mounted drive? >> (the current mount status seems to be that it tried to mount it with >> -o prjquota but that quota accounting is *not* active) >> - will it work and let us remount the drive with -o prjquota without >> causing a quotacheck? > Quotacheck is implemented by truncating the quota inode and then > rebuilding the dquots from scratch as it traverses all the inodes in the > filesystem. Unfortunately the filesystem needs to be idle during this > process or the accounting could be incorrect, so there is no gradual > option for restoring quotas. > > Regards, > Ben -- Harry Percival Developer harry@pythonanywhere.com PythonAnywhere - a fully browser-based Python development and hosting environment PythonAnywhere LLP 17a Clerkenwell Road, London EC1M 5RD, UK VAT No.: GB 893 5643 79 Registered in England and Wales as company number OC378414. Registered address: 28 Ely Place, 3rd Floor, London EC1N 6TD, UK From bpm@sgi.com Tue Feb 24 12:12:28 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 51A287F3F for ; Tue, 24 Feb 2015 12:12:28 -0600 (CST) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id F37E1304032; Tue, 24 Feb 2015 10:12:27 -0800 (PST) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B5E2E4266DC; Tue, 24 Feb 2015 12:12:27 -0600 (CST) Date: Tue, 24 Feb 2015 12:12:27 -0600 From: Ben Myers To: Harry Percival Cc: xfs@oss.sgi.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data Message-ID: <20150224181227.GZ25168@sgi.com> References: <54EC958E.2000001@pythonanywhere.com> <20150224173305.GE4015@sgi.com> <54ECBC10.2090001@pythonanywhere.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ECBC10.2090001@pythonanywhere.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Harry, On Tue, Feb 24, 2015 at 05:59:44PM +0000, Harry Percival wrote: > Hi Ben, thanks for replying. > > We're using project quotas, and we'd be prepared to wipe the slate > clean and start by saying there are no projects and no quotas at > all, to start with. Is there still no way of starting from scratch > and avoiding that quotacheck? You can use 'noquota' mount option or turn off accounting entirely and delay the quotacheck until it's a more convenient time, but I'm afraid I don't know of a way to avoid running the quotacheck altogether. Regards, Ben From bfoster@redhat.com Tue Feb 24 14:50:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8FAC97F3F for ; Tue, 24 Feb 2015 14:50:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E593304039 for ; Tue, 24 Feb 2015 12:50:29 -0800 (PST) X-ASG-Debug-ID: 1424811027-04cb6c4bd381200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8YWH5Hin1GrZpn8J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 12:50:28 -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 (8.14.4/8.14.4) with ESMTP id t1OKoQIl021258 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 24 Feb 2015 15:50:27 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1OKoQlC030693 for ; Tue, 24 Feb 2015 15:50:26 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AACE1121479; Tue, 24 Feb 2015 15:50:24 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: avoid overflow of attr3 leaf block headers with 64k blocks Date: Tue, 24 Feb 2015 15:50:22 -0500 X-ASG-Orig-Subj: [PATCH 0/2] xfs: avoid overflow of attr3 leaf block headers with 64k blocks Message-Id: <1424811024-24839-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: 1424811028 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, As it turns out, some of the leaf block codepaths other than xattr addition look like they wouldn't work properly with an unaligned firstused value as demonstrated in my previous patch: http://oss.sgi.com/archives/xfs/2015-02/msg00479.html Here's an alternate approach that handles the overflow in the header conversion functions. It passes the basic tests so far, but more testing is needed to make sure I've made valid assumptions. Thoughts? FWIW, another approach could be to leak the last few bytes of the blocks (e.g., max firstused at the last valid aligned offset and update freemap size accordingly)... Brian Brian Foster (2): xfs: pass attr geometry to attr leaf header conversion functions xfs: use larger in-core attr firstused field and detect overflow fs/xfs/libxfs/xfs_attr_leaf.c | 99 +++++++++++++++++++++++++++++-------------- fs/xfs/libxfs/xfs_attr_leaf.h | 6 ++- fs/xfs/libxfs/xfs_da_format.h | 8 +++- fs/xfs/xfs_attr_inactive.c | 3 +- fs/xfs/xfs_attr_list.c | 9 ++-- 5 files changed, 86 insertions(+), 39 deletions(-) -- 1.9.3 From bfoster@redhat.com Tue Feb 24 14:50:32 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 011687F51 for ; Tue, 24 Feb 2015 14:50:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D46868F8094 for ; Tue, 24 Feb 2015 12:50:28 -0800 (PST) X-ASG-Debug-ID: 1424811026-04cbb0610f8f5d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PBEu83OmKBOB2ZqU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 12:50:27 -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 (8.14.4/8.14.4) with ESMTP id t1OKoQHW018652 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 24 Feb 2015 15:50:26 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1OKoQAZ030696 for ; Tue, 24 Feb 2015 15:50:26 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id BD36E124880; Tue, 24 Feb 2015 15:50:24 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: use larger in-core attr firstused field and detect overflow Date: Tue, 24 Feb 2015 15:50:24 -0500 X-ASG-Orig-Subj: [PATCH 2/2] xfs: use larger in-core attr firstused field and detect overflow Message-Id: <1424811024-24839-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1424811024-24839-1-git-send-email-bfoster@redhat.com> References: <1424811024-24839-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: 1424811027 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The on-disk xfs_attr3_leaf_hdr structure firstused field is 16-bit and subject to overflow when fs block size is 64k. The field is typically initialized to block size when an attr leaf block is initialized. This problem is demonstrated by assert failures when running xfstests generic/117 on an fs with 64k blocks. To support the existing attr leaf block algorithms for insertion, rebalance and entry movement, increase the size of the in-core firstused field to 32-bit and handle the potential overflow on conversion to/from the on-disk structure. If the overflow condition occurs, set a special value in the firstused field that is translated back on header read. The special value is only required in the case of an empty 64k attr block. A value of zero is used because firstused is initialized to the block size and grows backwards from there. Furthermore, the attribute block header occupies the first bytes of the block. Thus, a value of zero has no other legitimate meaning for this structure. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_attr_leaf.c | 36 +++++++++++++++++++++++++++++++++--- fs/xfs/libxfs/xfs_da_format.h | 8 +++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 3337516..3277b40 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -106,6 +106,12 @@ xfs_attr3_leaf_hdr_from_disk( to->count = be16_to_cpu(hdr3->count); to->usedbytes = be16_to_cpu(hdr3->usedbytes); to->firstused = be16_to_cpu(hdr3->firstused); + if (to->firstused == XFS_ATTR3_LEAF_NULLOFF) { + /* only empty blocks when size overflows firstused! */ + ASSERT(!to->count && !to->usedbytes && + geo->blksize > USHRT_MAX); + to->firstused = geo->blksize; + } to->holes = hdr3->holes; for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { @@ -120,6 +126,12 @@ xfs_attr3_leaf_hdr_from_disk( to->count = be16_to_cpu(from->hdr.count); to->usedbytes = be16_to_cpu(from->hdr.usedbytes); to->firstused = be16_to_cpu(from->hdr.firstused); + if (to->firstused == XFS_ATTR3_LEAF_NULLOFF) { + /* only empty blocks when size overflows firstused! */ + ASSERT(!to->count && !to->usedbytes && + geo->blksize > USHRT_MAX); + to->firstused = geo->blksize; + } to->holes = from->hdr.holes; for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { @@ -134,11 +146,29 @@ xfs_attr3_leaf_hdr_to_disk( struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from) { - int i; + int i; + uint16_t firstused; ASSERT(from->magic == XFS_ATTR_LEAF_MAGIC || from->magic == XFS_ATTR3_LEAF_MAGIC); + /* + * Handle overflow of the on-disk firstused field. firstused is + * typically initialized to block size, but we only have 2-bytes in the + * on-disk structure. This means a 64k block size overflows the field. + * + * firstused should only match block size for an empty attr block so set + * a special value that the from_disk() variant can convert back to + * blocksize in the in-core structure. + */ + if (from->firstused > USHRT_MAX) { + ASSERT(from->firstused == geo->blksize); + firstused = XFS_ATTR3_LEAF_NULLOFF; + } else { + ASSERT(from->firstused != 0); + firstused = from->firstused; + } + if (from->magic == XFS_ATTR3_LEAF_MAGIC) { struct xfs_attr3_leaf_hdr *hdr3 = (struct xfs_attr3_leaf_hdr *)to; @@ -147,7 +177,7 @@ xfs_attr3_leaf_hdr_to_disk( hdr3->info.hdr.magic = cpu_to_be16(from->magic); hdr3->count = cpu_to_be16(from->count); hdr3->usedbytes = cpu_to_be16(from->usedbytes); - hdr3->firstused = cpu_to_be16(from->firstused); + hdr3->firstused = cpu_to_be16(firstused); hdr3->holes = from->holes; hdr3->pad1 = 0; @@ -162,7 +192,7 @@ xfs_attr3_leaf_hdr_to_disk( to->hdr.info.magic = cpu_to_be16(from->magic); to->hdr.count = cpu_to_be16(from->count); to->hdr.usedbytes = cpu_to_be16(from->usedbytes); - to->hdr.firstused = cpu_to_be16(from->firstused); + to->hdr.firstused = cpu_to_be16(firstused); to->hdr.holes = from->holes; to->hdr.pad1 = 0; diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 0a49b02..d2d0498 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -725,7 +725,7 @@ struct xfs_attr3_icleaf_hdr { __uint16_t magic; __uint16_t count; __uint16_t usedbytes; - __uint16_t firstused; + __uint32_t firstused; __u8 holes; struct { __uint16_t base; @@ -734,6 +734,12 @@ struct xfs_attr3_icleaf_hdr { }; /* + * Special value to represent fs block size in the leaf header firstused field. + * Only used when block size overflows the 2-bytes available on disk. + */ +#define XFS_ATTR3_LEAF_NULLOFF 0 + +/* * Flags used in the leaf_entry[i].flags field. * NOTE: the INCOMPLETE bit must not collide with the flags bits specified * on the system call, they are "or"ed together for various operations. -- 1.9.3 From bfoster@redhat.com Tue Feb 24 14:50:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DF3E87F51 for ; Tue, 24 Feb 2015 14:50:32 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72A07AC001 for ; Tue, 24 Feb 2015 12:50:29 -0800 (PST) X-ASG-Debug-ID: 1424811027-04bdf05c0190dc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xDcyrEvGtU3qjseT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 12:50:28 -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 (8.14.4/8.14.4) with ESMTP id t1OKoQx9021259 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 24 Feb 2015 15:50:27 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1OKoQHj031178 for ; Tue, 24 Feb 2015 15:50:26 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B594D1201EB; Tue, 24 Feb 2015 15:50:24 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: pass attr geometry to attr leaf header conversion functions Date: Tue, 24 Feb 2015 15:50:23 -0500 X-ASG-Orig-Subj: [PATCH 1/2] xfs: pass attr geometry to attr leaf header conversion functions Message-Id: <1424811024-24839-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1424811024-24839-1-git-send-email-bfoster@redhat.com> References: <1424811024-24839-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: 1424811028 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The firstused field of the xfs_attr3_leaf_hdr structure is subject to an overflow when fs blocksize is 64k. In preparation to handle this overflow in the header conversion functions, pass the attribute geometry to the functions that convert the in-core structure to and from the on-disk structure. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_attr_leaf.c | 63 +++++++++++++++++++++++-------------------- fs/xfs/libxfs/xfs_attr_leaf.h | 6 +++-- fs/xfs/xfs_attr_inactive.c | 3 ++- fs/xfs/xfs_attr_list.c | 9 ++++--- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index 15105db..3337516 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -88,6 +88,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); void xfs_attr3_leaf_hdr_from_disk( + struct xfs_da_geometry *geo, struct xfs_attr3_icleaf_hdr *to, struct xfs_attr_leafblock *from) { @@ -129,6 +130,7 @@ xfs_attr3_leaf_hdr_from_disk( void xfs_attr3_leaf_hdr_to_disk( + struct xfs_da_geometry *geo, struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from) { @@ -178,7 +180,7 @@ xfs_attr3_leaf_verify( struct xfs_attr_leafblock *leaf = bp->b_addr; struct xfs_attr3_icleaf_hdr ichdr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_node_hdr *hdr3 = bp->b_addr; @@ -757,9 +759,10 @@ xfs_attr_shortform_allfit( struct xfs_attr3_icleaf_hdr leafhdr; int bytes; int i; + struct xfs_mount *mp = bp->b_target->bt_mount; leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf); entry = xfs_attr3_leaf_entryp(leaf); bytes = sizeof(struct xfs_attr_sf_hdr); @@ -812,7 +815,7 @@ xfs_attr3_leaf_to_shortform( memcpy(tmpbuffer, bp->b_addr, args->geo->blksize); leaf = (xfs_attr_leafblock_t *)tmpbuffer; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); entry = xfs_attr3_leaf_entryp(leaf); /* XXX (dgc): buffer is about to be marked stale - why zero it? */ @@ -923,7 +926,7 @@ xfs_attr3_leaf_to_node( btree = dp->d_ops->node_tree_p(node); leaf = bp2->b_addr; - xfs_attr3_leaf_hdr_from_disk(&icleafhdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &icleafhdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); /* both on-disk, don't endian-flip twice */ @@ -988,7 +991,7 @@ xfs_attr3_leaf_create( } ichdr.freemap[0].size = ichdr.firstused - ichdr.freemap[0].base; - xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, 0, args->geo->blksize - 1); *bpp = bp; @@ -1073,7 +1076,7 @@ xfs_attr3_leaf_add( trace_xfs_attr_leaf_add(args); leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); ASSERT(args->index >= 0 && args->index <= ichdr.count); entsize = xfs_attr_leaf_newentsize(args, NULL); @@ -1126,7 +1129,7 @@ xfs_attr3_leaf_add( tmp = xfs_attr3_leaf_add_work(bp, &ichdr, args, 0); out_log_hdr: - xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, &leaf->hdr, xfs_attr3_leaf_hdr_size(leaf))); @@ -1294,7 +1297,7 @@ xfs_attr3_leaf_compact( ichdr_dst->freemap[0].base; /* write the header back to initialise the underlying buffer */ - xfs_attr3_leaf_hdr_to_disk(leaf_dst, ichdr_dst); + xfs_attr3_leaf_hdr_to_disk(args->geo, leaf_dst, ichdr_dst); /* * Copy all entry's in the same (sorted) order, @@ -1344,9 +1347,10 @@ xfs_attr_leaf_order( { struct xfs_attr3_icleaf_hdr ichdr1; struct xfs_attr3_icleaf_hdr ichdr2; + struct xfs_mount *mp = leaf1_bp->b_target->bt_mount; - xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1_bp->b_addr); - xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2_bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr1, leaf1_bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr2, leaf2_bp->b_addr); return xfs_attr3_leaf_order(leaf1_bp, &ichdr1, leaf2_bp, &ichdr2); } @@ -1388,8 +1392,8 @@ xfs_attr3_leaf_rebalance( ASSERT(blk2->magic == XFS_ATTR_LEAF_MAGIC); leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); - xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr1, leaf1); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, leaf2); ASSERT(ichdr2.count == 0); args = state->args; @@ -1490,8 +1494,8 @@ xfs_attr3_leaf_rebalance( ichdr1.count, count); } - xfs_attr3_leaf_hdr_to_disk(leaf1, &ichdr1); - xfs_attr3_leaf_hdr_to_disk(leaf2, &ichdr2); + xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf1, &ichdr1); + xfs_attr3_leaf_hdr_to_disk(state->args->geo, leaf2, &ichdr2); xfs_trans_log_buf(args->trans, blk1->bp, 0, args->geo->blksize - 1); xfs_trans_log_buf(args->trans, blk2->bp, 0, args->geo->blksize - 1); @@ -1684,7 +1688,7 @@ xfs_attr3_leaf_toosmall( */ blk = &state->path.blk[ state->path.active-1 ]; leaf = blk->bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr, leaf); bytes = xfs_attr3_leaf_hdr_size(leaf) + ichdr.count * sizeof(xfs_attr_leaf_entry_t) + ichdr.usedbytes; @@ -1740,7 +1744,7 @@ xfs_attr3_leaf_toosmall( if (error) return error; - xfs_attr3_leaf_hdr_from_disk(&ichdr2, bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &ichdr2, bp->b_addr); bytes = state->args->geo->blksize - (state->args->geo->blksize >> 2) - @@ -1805,7 +1809,7 @@ xfs_attr3_leaf_remove( trace_xfs_attr_leaf_remove(args); leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); ASSERT(ichdr.count > 0 && ichdr.count < args->geo->blksize / 8); ASSERT(args->index >= 0 && args->index < ichdr.count); @@ -1923,7 +1927,7 @@ xfs_attr3_leaf_remove( } else { ichdr.holes = 1; /* mark as needing compaction */ } - xfs_attr3_leaf_hdr_to_disk(leaf, &ichdr); + xfs_attr3_leaf_hdr_to_disk(args->geo, leaf, &ichdr); xfs_trans_log_buf(args->trans, bp, XFS_DA_LOGRANGE(leaf, &leaf->hdr, xfs_attr3_leaf_hdr_size(leaf))); @@ -1957,8 +1961,8 @@ xfs_attr3_leaf_unbalance( drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&drophdr, drop_leaf); - xfs_attr3_leaf_hdr_from_disk(&savehdr, save_leaf); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &drophdr, drop_leaf); + xfs_attr3_leaf_hdr_from_disk(state->args->geo, &savehdr, save_leaf); entry = xfs_attr3_leaf_entryp(drop_leaf); /* @@ -2012,7 +2016,7 @@ xfs_attr3_leaf_unbalance( tmphdr.firstused = state->args->geo->blksize; /* write the header to the temp buffer to initialise it */ - xfs_attr3_leaf_hdr_to_disk(tmp_leaf, &tmphdr); + xfs_attr3_leaf_hdr_to_disk(state->args->geo, tmp_leaf, &tmphdr); if (xfs_attr3_leaf_order(save_blk->bp, &savehdr, drop_blk->bp, &drophdr)) { @@ -2039,7 +2043,7 @@ xfs_attr3_leaf_unbalance( kmem_free(tmp_leaf); } - xfs_attr3_leaf_hdr_to_disk(save_leaf, &savehdr); + xfs_attr3_leaf_hdr_to_disk(state->args->geo, save_leaf, &savehdr); xfs_trans_log_buf(state->args->trans, save_blk->bp, 0, state->args->geo->blksize - 1); @@ -2085,7 +2089,7 @@ xfs_attr3_leaf_lookup_int( trace_xfs_attr_leaf_lookup(args); leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); ASSERT(ichdr.count < args->geo->blksize / 8); @@ -2190,7 +2194,7 @@ xfs_attr3_leaf_getvalue( int valuelen; leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); ASSERT(ichdr.count < args->geo->blksize / 8); ASSERT(args->index < ichdr.count); @@ -2391,8 +2395,9 @@ xfs_attr_leaf_lasthash( { struct xfs_attr3_icleaf_hdr ichdr; struct xfs_attr_leaf_entry *entries; + struct xfs_mount *mp = bp->b_target->bt_mount; - xfs_attr3_leaf_hdr_from_disk(&ichdr, bp->b_addr); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, bp->b_addr); entries = xfs_attr3_leaf_entryp(bp->b_addr); if (count) *count = ichdr.count; @@ -2486,7 +2491,7 @@ xfs_attr3_leaf_clearflag( ASSERT(entry->flags & XFS_ATTR_INCOMPLETE); #ifdef DEBUG - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); ASSERT(args->index < ichdr.count); ASSERT(args->index >= 0); @@ -2550,7 +2555,7 @@ xfs_attr3_leaf_setflag( leaf = bp->b_addr; #ifdef DEBUG - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr, leaf); ASSERT(args->index < ichdr.count); ASSERT(args->index >= 0); #endif @@ -2629,11 +2634,11 @@ xfs_attr3_leaf_flipflags( entry2 = &xfs_attr3_leaf_entryp(leaf2)[args->index2]; #ifdef DEBUG - xfs_attr3_leaf_hdr_from_disk(&ichdr1, leaf1); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr1, leaf1); ASSERT(args->index < ichdr1.count); ASSERT(args->index >= 0); - xfs_attr3_leaf_hdr_from_disk(&ichdr2, leaf2); + xfs_attr3_leaf_hdr_from_disk(args->geo, &ichdr2, leaf2); ASSERT(args->index2 < ichdr2.count); ASSERT(args->index2 >= 0); diff --git a/fs/xfs/libxfs/xfs_attr_leaf.h b/fs/xfs/libxfs/xfs_attr_leaf.h index e2929da..025c4b8 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.h +++ b/fs/xfs/libxfs/xfs_attr_leaf.h @@ -100,9 +100,11 @@ int xfs_attr_leaf_newentsize(struct xfs_da_args *args, int *local); int xfs_attr3_leaf_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp); -void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, +void xfs_attr3_leaf_hdr_from_disk(struct xfs_da_geometry *geo, + struct xfs_attr3_icleaf_hdr *to, struct xfs_attr_leafblock *from); -void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, +void xfs_attr3_leaf_hdr_to_disk(struct xfs_da_geometry *geo, + struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from); #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 83af4c1..f9c1c64 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -132,9 +132,10 @@ xfs_attr3_leaf_inactive( int size; int tmp; int i; + struct xfs_mount *mp = bp->b_target->bt_mount; leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf); /* * Count the number of "remote" value extents. diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index a43d370..65fb37a 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -225,6 +225,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) int error, i; struct xfs_buf *bp; struct xfs_inode *dp = context->dp; + struct xfs_mount *mp = dp->i_mount; trace_xfs_attr_node_list(context); @@ -256,7 +257,8 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) case XFS_ATTR_LEAF_MAGIC: case XFS_ATTR3_LEAF_MAGIC: leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, + &leafhdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); if (cursor->hashval > be32_to_cpu( entries[leafhdr.count - 1].hashval)) { @@ -340,7 +342,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) xfs_trans_brelse(NULL, bp); return error; } - xfs_attr3_leaf_hdr_from_disk(&leafhdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &leafhdr, leaf); if (context->seen_enough || leafhdr.forw == 0) break; cursor->blkno = leafhdr.forw; @@ -368,11 +370,12 @@ xfs_attr3_leaf_list_int( struct xfs_attr_leaf_entry *entry; int retval; int i; + struct xfs_mount *mp = context->dp->i_mount; trace_xfs_attr_list_leaf(context); leaf = bp->b_addr; - xfs_attr3_leaf_hdr_from_disk(&ichdr, leaf); + xfs_attr3_leaf_hdr_from_disk(mp->m_attr_geo, &ichdr, leaf); entries = xfs_attr3_leaf_entryp(leaf); cursor = context->cursor; -- 1.9.3 From david@fromorbit.com Tue Feb 24 15:59:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 484AE7F3F for ; Tue, 24 Feb 2015 15:59:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3624A304032 for ; Tue, 24 Feb 2015 13:59:15 -0800 (PST) X-ASG-Debug-ID: 1424815148-04cbb0610f91b30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id AV84xW3N4M3lApCB for ; Tue, 24 Feb 2015 13:59:09 -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: A2CnCwBL8+xUPDkjLHlbgwaBLIY2qgwBAQEBAgaYPgQCAoEuRAEBAQEBAQUBAQEBODuEDwEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIJwfVGQEBAQEGAgEfGIVvhQyEAx4ESQeDF4EUBY1pizaTPIQkKjGBA4FAAQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 08:29:07 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQNVT-0004px-EA; Wed, 25 Feb 2015 08:59:07 +1100 Date: Wed, 25 Feb 2015 08:59:07 +1100 From: Dave Chinner To: Harry Cc: xfs@oss.sgi.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data Message-ID: <20150224215907.GA18360@dastard> X-ASG-Orig-Subj: Re: trying to avoid a lengthy quotacheck by deleting all quota data References: <54EC958E.2000001@pythonanywhere.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EC958E.2000001@pythonanywhere.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: 1424815148 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 24, 2015 at 03:15:26PM +0000, Harry wrote: > Hi there, > > We've got a moderately large disk (~2TB) into an inconsistent state, > such that it's going to want a quotacheck the next time we mount it > (it's currently mounted with quota accounting inactive). Our tests > suggest this is going to take several hours, and cause an outage we > can't afford. What tests are you performing to suggest a quotacheck of a small filesystem will take hours? (yes, 2TB is a *small* filesystem). (xfs_info, df -i, df -h, storage hardware, etc are all relevant here). > We're wondering whether there's a 'nuke the site from orbit' option > that will let us avoid it. The plan would be to: > - switch off quotas and delete them completely, using the commands: > -- disable > -- off > -- remove > - remount the drive with -o prjquota, hoping that there will not be > a quotacheck, because we've deleted all the old quota data Mounting with a quota enabled *forces* a quota check if quotas aren't currently enabled. You cannot avoid it; it's the way quota consistency is created. > - run a script gradually restore all the quotas, one by one and in > good time, from our own external backups (we've got the quotas in a > database basically). Can't be done - quotas need to be consistent with what is currently on disk, not what you have in a backup somewhere. > So the questions are: > - is there a way to remove all quota information from a mounted drive? > (the current mount status seems to be that it tried to mount it with mount with quotas on and turn them off via xfs_quota,i or mount without quota options at all. Then run the remove command in xfs_quota. > -o prjquota but that quota accounting is *not* active) Not possible. > - will it work and let us remount the drive with -o prjquota without > causing a quotacheck? No. Cheers, Dave. -- Dave Chinner david@fromorbit.com From kdhall@binghamton.edu Tue Feb 24 16:04:40 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2BD6B7F3F for ; Tue, 24 Feb 2015 16:04:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EDC438F80CE for ; Tue, 24 Feb 2015 14:04:39 -0800 (PST) X-ASG-Debug-ID: 1424815477-04bdf05c0093c10001-NocioJ Received: from mail-qg0-f54.google.com (mail-qg0-f54.google.com [209.85.192.54]) by cuda.sgi.com with ESMTP id LKSlYsiXW1jBWofZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 24 Feb 2015 14:04:37 -0800 (PST) X-Barracuda-Envelope-From: kdhall@binghamton.edu X-Barracuda-Apparent-Source-IP: 209.85.192.54 Received: by mail-qg0-f54.google.com with SMTP id z60so32571210qgd.13 for ; Tue, 24 Feb 2015 14:04:37 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=JjZXtEYXj88dHpddmT/PytMaIl4vToeeWg3BamvfSvs=; b=MlO5cagwsfjfdF1GQpo4+tqA3hydabhM/gTRXIsp7YfJwj5aN8qwtLWubIP8WohBYI g9n7iQuqpAA+QkWU/+eic/FmgmCLr1N+oSFOACVfpIonWkfd/0MnAeHpnPRkZG3WD4q0 Euhum4FVG4Y2vEWgpV6xCCQ/pR8LGDO9LHcWN7eAillBa+REBxXxsr7HiqPPU7mPRTQU DIrgfQN7JhN8JVdN4nE4VJFAIpKNHsg0LYt22xqb54YSNsdgbA3iFhJP9QxfLSZSGRRe oFPmPlPnkjIqG9EPPbad9jmad3MGToEzWtQgW57T8SEsbK1zmeodBoi2Zt7Xx50qZ6xg cIvQ== X-Gm-Message-State: ALoCoQkM1V63V0KKnDlzzezkHOQoMb7QDwFVuQzuijtZjGhs7qit4RafoPKFH6lRbqMUNoJ1qNht X-Received: by 10.140.84.20 with SMTP id k20mr36845qgd.45.1424815477025; Tue, 24 Feb 2015 14:04:37 -0800 (PST) Received: from [128.226.118.196] (omega.cs.binghamton.edu. [128.226.118.196]) by mx.google.com with ESMTPSA id o15sm22263148qaa.3.2015.02.24.14.04.35 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 24 Feb 2015 14:04:36 -0800 (PST) Message-ID: <54ECF573.9050106@binghamton.edu> Date: Tue, 24 Feb 2015 17:04:35 -0500 From: Dave Hall User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20121215 Icedove/3.0.11 MIME-Version: 1.0 To: Emmanuel Florac CC: Dave Chinner , stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: XFS/LVM/Multipath on a single RAID volume References: <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> <20150223121812.5077ff07@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume In-Reply-To: <20150223121812.5077ff07@harpe.intellique.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-qg0-f54.google.com[209.85.192.54] X-Barracuda-Start-Time: 1424815477 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave Hall Binghamton University kdhall@binghamton.edu 607-760-2328 (Cell) 607-777-4641 (Office) On 02/23/2015 06:18 AM, Emmanuel Florac wrote: > Le Sun, 22 Feb 2015 18:35:19 -0500 > Dave Hall écrivait: > > >> So since I have a fresh array that's not in production yet I was >> hoping to get some pointers on how to configure it to maximize XFS >> performance. In particular, I've seen a suggestion that a >> multipathed array should be sliced up into logical drives and pasted >> back together with LVM. Wondering also about putting the journal in >> a separate logical drive on the same array. >> > What's the hardware configuration like? before multipathing, you need > to know if your RAID controller and disks can actually saturate your > link. Generally SAS-attached enclosures are driven through a 4 way > SFF-8088 cable, with a bandwidth of 4x 6Gbps (maximum throughput per > link: 3 GB/s) or 4 x 12 Gbps (max thruput: 6 GB/s). > > The new hardware is an Infortrend with 16 x 2TB 6Gbps SAS drives. It has one controller with dual 6Gbps SAS ports. The server currently has two 3Gbps SAS HBAs. On an existing array based on similar but slightly slower hardware, I'm getting miserable performance. The bottleneck seems to be on the server side. For specifics, the array is laid out as a single 26TB volume and attached by a single 3Gbps SAS. The server is quad 8-core Xeon with 128GB RAM. The networking is all 10GB. The application is rsnapshot which is essentially a series of rsync copies where the unchanged files are hard-linked from one snapshot to the next. CPU utilization is very low and only a few cores seem to be active. Yet the operation is taking hours to complete. The premise that was presented to me by someone in the storage business is that with 'many' proccessor cores one should slice a large array up into segments, multipath the whole deal, and then mash the segments back together with LVM (or MD). Since the kernel would ultimately see a bunch of smaller storage segments that were all getting activity, it should dispatch a set of cores for each storage segment and get the job done faster. I think in theory this would even work to some extent on a single-path SAS connection. >> I am able to set up a 2-way multipath right now, and I might be able >> to justify adding a second controller to the array to get a 4-way >> multipath going. >> > A multipath can double the throughput, provided that you have enough > drives: you'll need about 24 7k RPM drives to saturate _one_ 4x6Gbps > SAS link. If you have only 12 drives, dual attachment probably won't > yield much. > > >> Even if the LVM approach is the wrong one, I clearly have a rare >> chance to set this array up the right way. Please let me know if you >> have any suggestions. >> > In my experience, software RAID-0 with md gives slightly better > performance than LVM, though not much. > > > MD RAID-0 seems as likely as LVM, so I'd probably try that first. The big question is how to size the slices of the array to make XFS happy and then how to make sure XFS knows about it. Secondly, there is the question of the log volume. Seems that with multipath there might be some possible advantage to putting this in it's on slice on the array so that log writes could be in an I/O stream that is managed separately from the rest. From david@fromorbit.com Tue Feb 24 16:33:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4FB6B7F3F for ; Tue, 24 Feb 2015 16:33:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D8C4304039 for ; Tue, 24 Feb 2015 14:33:49 -0800 (PST) X-ASG-Debug-ID: 1424817225-04cbb0610f92be0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id NdfmrPtyfVJRYDJx for ; Tue, 24 Feb 2015 14:33:46 -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: A2AxFgB6++xUPDkjLHlYAw6CeIEshjaqDQEBAQECBoxii1wCAgEBAoEuRAEBAQEBAQUBAQEBODuEDwEBAQMBMgEjIwULCAMOCgklDwUlAwcaE4gnB9UOAQEBAQEBBAEBAQEBARwYhW+FDIQWDzkQBxGDBoEUBZkfgRyDGYtJgz6CJByBE1EqMYECAR+BIQEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 09:03:45 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQO2y-0004u7-6O; Wed, 25 Feb 2015 09:33:44 +1100 Date: Wed, 25 Feb 2015 09:33:44 +1100 From: Dave Chinner To: Dave Hall Cc: Emmanuel Florac , stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: XFS/LVM/Multipath on a single RAID volume Message-ID: <20150224223344.GE4251@dastard> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume References: <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> <20150223121812.5077ff07@harpe.intellique.com> <54ECF573.9050106@binghamton.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <54ECF573.9050106@binghamton.edu> 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: 1424817225 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15793 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 24, 2015 at 05:04:35PM -0500, Dave Hall wrote: > > Dave Hall > Binghamton University > kdhall@binghamton.edu > 607-760-2328 (Cell) > 607-777-4641 (Office) > > > On 02/23/2015 06:18 AM, Emmanuel Florac wrote: > >Le Sun, 22 Feb 2015 18:35:19 -0500 > >Dave Hall crivait: > > > >>So since I have a fresh array that's not in production yet I was > >>hoping to get some pointers on how to configure it to maximize XFS > >>performance. In particular, I've seen a suggestion that a > >>multipathed array should be sliced up into logical drives and pasted > >>back together with LVM. Wondering also about putting the journal in > >>a separate logical drive on the same array. > >What's the hardware configuration like? before multipathing, you need > >to know if your RAID controller and disks can actually saturate your > >link. Generally SAS-attached enclosures are driven through a 4 way > >SFF-8088 cable, with a bandwidth of 4x 6Gbps (maximum throughput per > >link: 3 GB/s) or 4 x 12 Gbps (max thruput: 6 GB/s). > > > The new hardware is an Infortrend with 16 x 2TB 6Gbps SAS drives. > It has one controller with dual 6Gbps SAS ports. The server > currently has two 3Gbps SAS HBAs. > > On an existing array based on similar but slightly slower hardware, > I'm getting miserable performance. The bottleneck seems to be on > the server side. For specifics, the array is laid out as a single > 26TB volume and attached by a single 3Gbps SAS. So, 300MB/s max throughput. > The server is quad > 8-core Xeon with 128GB RAM. The networking is all 10GB. The > application is rsnapshot which is essentially a series of rsync > copies where the unchanged files are hard-linked from one snapshot > to the next. CPU utilization is very low and only a few cores seem > to be active. Yet the operation is taking hours to complete. rsync is likely limited by network throughput and round trip latency. Test your storage performance locally first, see it if performs as expected. > The premise that was presented to me by someone in the storage > business is that with 'many' proccessor cores one should slice a > large array up into segments, multipath the whole deal, and then > mash the segments back together with LVM (or MD). No, that's just a bad idea. CPU and memory locality is the least of your worries, and wont have any influence on performance at such low speeds. When you start getting up into the multiple-GB/s of throughput (note, GB/s not Gbps) locality matters more, but not for what you are doing. And multipathing should be ignored until you've characterised and understood single port lun performance. > Since the kernel > would ultimately see a bunch of smaller storage segments that were > all getting activity, it should dispatch a set of cores for each > storage segment and get the job done faster. I think in theory this > would even work to some extent on a single-path SAS connection. The kernel already does most of the necessary locality stuff for optimal performance for you. > >>I am able to set up a 2-way multipath right now, and I might be able > >>to justify adding a second controller to the array to get a 4-way > >>multipath going. > >A multipath can double the throughput, provided that you have enough > >drives: you'll need about 24 7k RPM drives to saturate _one_ 4x6Gbps > >SAS link. If you have only 12 drives, dual attachment probably won't > >yield much. > > > >>Even if the LVM approach is the wrong one, I clearly have a rare > >>chance to set this array up the right way. Please let me know if you > >>have any suggestions. > >In my experience, software RAID-0 with md gives slightly better > >performance than LVM, though not much. > > > > > MD RAID-0 seems as likely as LVM, so I'd probably try that first. > The big question is how to size the slices of the array Doesn't really matter for RAID 0. > to make XFS > happy and then how to make sure XFS knows about it. IF you are using MD, then mkfs.xfs will pick up the config automatically from the MD device. > Secondly, there > is the question of the log volume. Seems that with multipath there > might be some possible advantage to putting this in it's on slice on > the array so that log writes could be in an I/O stream that is > managed separately from the rest. There are very few workloads where an external log makes any sense these days. Log bandwidth is generally a minor part of any workload, and non-volatile write caches aggregrate the sequential writes to the point where they impose very little physical IO overhead on teh array... Cheers, Dave. -- Dave Chinner david@fromorbit.com From vika.serova@skatefaq.com Tue Feb 24 17:09:06 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3DC957F3F for ; Tue, 24 Feb 2015 17:09:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2A5CD304039 for ; Tue, 24 Feb 2015 15:09:02 -0800 (PST) X-ASG-Debug-ID: 1424819338-04cbb0610e93b70001-NocioJ Received: from cp155.agava.net (cp155.agava.net [89.108.67.129]) by cuda.sgi.com with ESMTP id 6rwBRxmI9tYj7ZQj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Feb 2015 15:08:59 -0800 (PST) X-Barracuda-Envelope-From: vika.serova@skatefaq.com X-Barracuda-Apparent-Source-IP: 89.108.67.129 Received: from [202.95.148.206] (helo=206.148.95.202.static.ckrg.pesat.net.id) by cp155.agava.net with esmtpa (Exim 4.74 (FreeBSD)) (envelope-from ) id 1YQOao-0007Ar-Bq; Wed, 25 Feb 2015 02:08:49 +0300 Message-ID: From: =?windows-1251?B?0fLw7ujy5ev87eD/IOru7fTl8OXt9uj/?= To: , , , , Subject: =?windows-1251?B?6Ofs5e3l7ej/IOIg7/Dg4u7i7uwg8OXj8+vo?= =?windows-1251?B?8O7i4O3o6CDu9O7w7Ovl7ej/IO/w4OIg7eAg?= =?windows-1251?B?7uH65ery+yDt5eTi6Obo7O7x8ug=?= Date: Wed, 25 Feb 2015 00:08:28 +0100 X-ASG-Orig-Subj: =?windows-1251?B?6Ofs5e3l7ej/IOIg7/Dg4u7i7uwg8OXj8+vo?= =?windows-1251?B?8O7i4O3o6CDu9O7w7Ovl7ej/IO/w4OIg7eAg?= =?windows-1251?B?7uH65ery+yDt5eTi6Obo7O7x8ug=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0834_01D0508F.2EAEAFD0" X-Priority: 3 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp155.agava.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [26 6] / [26 6] X-AntiAbuse: Sender Address Domain - skatefaq.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: cp155.agava.net[89.108.67.129] X-Barracuda-Start-Time: 1424819339 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.26 X-Barracuda-Spam-Status: No, SCORE=1.26 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15795 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. ------=_NextPart_000_0834_01D0508F.2EAEAFD0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0835_01D0508F.2EAEAFD0" ------=_NextPart_001_0835_01D0508F.2EAEAFD0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =E2=F1=FF =ED=E5=EE=E1=F5=EE=E4=E8=EC=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF= =E2 =EF=F0=E8=EA=F0=E5=EF=EB=E5=ED=ED=EE=EC =F4=E0=E9=EB=E5 ------=_NextPart_001_0835_01D0508F.2EAEAFD0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=E2=F1=FF =ED=E5=EE=E1=F5=EE=E4=E8=EC=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6= =E8=FF =E2 =EF=F0=E8=EA=F0=E5=EF=EB=E5=ED=ED=EE=EC =F4=E0=E9=EB=E5
<= /BODY> ------=_NextPart_001_0835_01D0508F.2EAEAFD0-- ------=_NextPart_000_0834_01D0508F.2EAEAFD0 Content-Type: application/octet-stream; name="spb_kad15.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="spb_kad15.docx" UEsDBBQABgAIAAAAIQDzw/lWjQEAAMEFAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 VEtPwkAQvpv4H5q9mnbBgzGGwkHxqCRiPC/baVnsPrKzKPx7Z0EbJEBR9NKknZ3vMd35eoOFrpM3 8KisyVk367AEjLSFMlXOnsf36TVLMAhTiNoayNkSkA3652e98dIBJtRtMGfTENwN5yinoAVm1oGh Smm9FoFefcWdkK+iAn7Z6VxxaU0AE9IQMVi/dwelmNchGS7o81qJhxpZcrs+GLlyJpyrlRSBlPI3 U2yxpJ8MGXWuzuBUObwgGYzvZIiV/QT7+2au2upTOjqbOagi1SNN06sCkpHw4UFoUs7frS94YeVc k+3sMPMOa7YslYSmP6I5byUg0m/SddZUtFDmy/JeHRiWNeDfq1jjHkn/osJ0WJYg6X60z0NjGk1n a4qN3nY2CIGGdAzJ91ubtg0dP5FbJbzD5OnfVGyAtwopaZvGYlLDERP/4TAa6FYRgSIC+OrZPVnH CuYQJW3GyFuHFDn+F7a/MiV2p7RyDnxQ0KTKrhVrGCmuTvYHMRALKHZw81UA9z8AAAD//wMAUEsD BBQABgAIAAAAIQAekRq38wAAAE4CAAALAAgCX3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9h yH032woi0tneSKF3IusDhJnsAXcOzKTavr2jILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99r eG23iwdQWchbmoJnDUfOsGlub9YvPJGUoTyMMaui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1 jKu6vsf0VwOamabaWQ1pZ+9AtcdYNl/WDl03Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDP JZ2RYqwKNuBpotX1RP9fi46FLAmhCYnP83x1nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD/ /wMAUEsDBBQABgAIAAAAIQB4LeSCOwEAAD0EAAAcAAgBd29yZC9fcmVscy9kb2N1bWVudC54bWwu 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 AQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAz/wAARCALZAfIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcI CQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAk M2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqD hIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgEC BAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcY GRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOU lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 +Pn6/9oADAMBAAIRAxEAPwD9APiZ/wAFEvjL4d+Avx0+JOmS/DGPS/hH4+uvB9ro914bvprjUIY7 y2gSZ7pdRRVfbcgkCHBKHGN3y+1fFX/gpx4T+EXjT4g6RfeEPH2o23wrXTZPFGrWFtYtY6bHfxo8 MoEl0k8igPhhHEzDa3ykDNX/ABH/AME2vA3if4G/E74f3Gq+LE0b4seKZfF2rzR3VuLq3u5LiCdk gYwlVi3W6AB1dsFvmzgjhPFP/BMa9+L/AO0X8bdY8WeL9Tsfh58UjoIOi6FcwxzarHp8Cq8V88tq 0kaGRBt+yzIWR3DHoB8tGlmtGnGFN3k4xu27pTUNb31UXPe2tvhsfcqtkWIcnVXKouTVlZuLnQSS tvJQ9s1frZydjr/2jv8Agp/8Pv2WvE9rZeKbTU1068js7mHUrXU9HlEttcsqrcJZG+GoSRKSdzJa twjkBgM1g6R/wV/+HGu/H0/Du10HxlLrK+MH8Fb0OmN/piyMjTfZhem8+yjaSZ/s+wAYJDfLV/4v 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 p0lOSsrWt20UeXy0STXZJeRcFz1HBPW979N3JS9Ltyv3be9zzvVP+CLH7O+sov2jw142aVbqa9Wd fiT4mS4SaZ0kuJFlXUA4M8sUU02G/fTRpLJvkUOO+vP+CeXwm1Hw/Bp1xoOszpA9rKbqTxRqrahc S219DfxTzXZuftE032m3gkaWSRpJPIiV2ZUVR8e/Fn/gs54u8DfDzwtbS+J/gn4U8dXOleHr67s/ EGn3iza4+t3SxWxh083sMun20EMsE1xczz3EMcshtg7lfOP2H+3v8dPGX7Pf7P0es/D7TdK13xvf 6/o+i6Vpd9avNFqb3d/BBJENs8PlsIXlcSNJsTy9zBgCDrZwmmt1PkTX8yajZdbq6Vt7dLNXzUoz i0+seZ37O8ru/pe+173d07c2f+CTfwJfxD4k1VvDPiR77xbp+raTqjv4211lms9UnNxe2yIbzbDF JOzShIgqxyO7xhGZiem/Zt/YJ+H37JfxJ8V+JfA6+J7CbxpDbjVbO98QXmp211cxZDXzm5kkle6l XYJJZJGLGPcAryzvL8afCn/gsb8Rvi78aPFXgPTNc+Bdx4t8H+N18PweHrC0vr/VvGMX2vyLm3s4 ReI9vHZiG6MuqypJEyKsjWduo2t7B8PP+Ch/iD41L4wvdE8e/BTRre4u59G8OaTcWN3qWreHr62u ZFmTUwl5DHcyizgmvJrSI201kmwSGVWErZxqKFONSOi5Xb/DpK3ZXctv5nrum7kuaU4S3Ule+/Nf lv3vaO/8qt3R9p14h+2V+yRqv7Xt14D0qfxf/wAI/wCBvD2vR67r2mWUWoWuqa68Ct9lSDUrK/tZ rHypmE+5FkZpIYeQqur/AAl+y7/wXk+Ivxy0i78QS2Hwy1LQvBvhuXVvEMWnRov25zaCWK4aaHVb ufRbdZ54o5DfWUkBhtrieO7dmS3WXQf2+/iF+xn8IPEnjDw/d/Dr4p/Dca5ealAPBmiPp2iS6faa JNdanPo732smIWkF6ttG80LyRO8s4hthLlWKtoWnNaRUZL/wK0W1205tdrK6u9KppzbpR3leP/kr ckn315bLVt+63Y+2bL/gl98DdPuLow+C5ktdQsXsb7T/AO3tSOnakzrIHvLm0Nx5Fxft50jG/lja 7LOWM27msqD/AIJ02NnrtvoB8T6vrXwcH2a/n8K+JNX17X9VGp27OY5oNXu9UeWG0ZDEklkYnhkW NgcLNKr+C2v/AAWR1Lw58fH8Aa7r/wAKNS1qTxDpmnQWegpPPc/Y18PHWNQlZTdHMlydsNio+87s o+0iF5D67/wSq/bb8bft4+CvE/jLxDb+ErLw281sNDtNFSG6ayZ1kee3k1G11C9sr/y8wp5kRtpQ yyedaW+Y1O0Iy55yjvGzb83Zxfnq7p9Gm9HZvD2kXCN/tLTv1TXl8NpLqmlqmdt8U/8Agmh8IfjN c6VceINL8Yz3mivNJaXdp481+wukeW8gvWdpre9SR2W4trZkLsTGLeJU2oiqPFz/AMESvDNj4o8U JpniFdO8Ff8ACPXOj+CvDG/W7ix8OT3U8l1dy38cmrtBrFrPdOjyWFxAlsVt4kCD940mjpf/AAUm 8Vaf+3f4o+GeraPpUvhLSzruq6XqtpaxC41ix0nT7Frqyt4xqEk819He3pVna2ijMcDKqs+9o/If g/8A8FjfiF8Xfhrb65dan8HPBMXxA1ePTfCeoapbnU9M0eZbaa5msWuNO1W4g1y7dvs9tBDazWdy 8jTvJaRGNIJcKMlyxnS25VJW7VHyq3m3dXXZ67X6JK0nCdvitr3h7z+S0uvOzW6Psj4cfsVeGNJ0 C6l8X6foniXxTrmrW3iDXb6ztruy0++1C3OYJIbOa6uPs8KH51gEjR+YXlIMjs5xtD/4JifB7wr8 OLvwxpWj+I7K1u7jT52v28V6rd6vCtgc2UEV/cXEl1Db2+X8mGORY4Gkd4ljkYvXgPwD/wCCoPxG k+CXjnxZ8SB8PBqPw90G+1c6Np+l3Okt4ttheyQWus2ksl9dNbaOqoFmmliklVmlZ44FiQXHO33/ AAVS+Il94T1i70D4n/s669baJ4r0XSf+EjtvDl6dD1S31O6s7RI4WOsDCxTTXRF8JHiuBZ3CpArQ vnWOslCD35Nu91GO38vKrW+HlS0aSMG4xi2/Na9bJyer6O97t683Nqm2ewad/wAEUfhBa+Obi6f/ AISyDwzb6fptnpGj6V4t1zSZdNayuZ7iEm7tr5JHhieSMwW67IoXjaXDyyGQdr4L/wCCUfwN+Htp pFvpHhvxJaW/h3URq2ixHxtrsqaFc/aXuXksle8ItPMkkfzVg2LMh8uQPGAg+eLL/gsJ418SeCfG OmaB4Zt/EXxD8G+O00UQ6VpNlfWmt2DavNbiyjgi1wzWWqixhknMeoNbEtE+ICudun/w9H8Y+JvG 3hnwx4W8X/BXxD4lv10vUYdKstLvri98bw393IsltpkAvFeCGwgikW51SUTRrLFN5lpb+UyGKEue MJU9rq3k2lP1v17+7p9m910oymqm6Tv6L3Pu6X21u/tW+/6/n+8Q/wDBJX48fsXeKdU1v9kTxVc/ 8IBeTfabj4e+PLhbrTb0k53W4kHGDt2s3ly7UB892O2v6Aa/NP4jaj8YviJf2mjaPLrM0N2kpafS IUtL2NQFVXO8BHRS43lXUksmFAyDSVwbPHfhP+0hJ8FtctNJ+Jaw/DzXd/2W0TU2/wCKav7pkAxb aoURopWwzC1vEgmKY3LtUSn2zQv+CgPhnwlrSWupXlzpGqBAymDE0FwMAkpIpKlck/MTsODhjzXP J/wTL8R/FHxBDpXxIvNPtbjxJbvaQwXJkvWulG5nMocvGqkKB5PmNG5OWViQB0PwZ/4Ij/C/4Faf eyeJNf8AGUnhdfKfy9Q1VNP0jS2+fdPbBys9odw24jmwAy7FVTTsguz1LwB/wVX0q51JbTVtE1Nd MBX/AE/aizKVKkEwZ5GOCSykbeFOc19Q/Cv48eDvjXaGXwv4g03VXRN8tvFKFuYBnGXiOHUZ4yRg 9jXyzfad+zP8BvhnLq2m+GPE/ivRrGUwC70LwxqmtxzurlWP2tIniIypLTPKEC/MzhTk4X7c/wDw Ti1j9uD4Ar4S8LWFv+z4unajYa9pfjWPW92t6Hc2srO7C0s/3MsRiZgpN+hDsHI/djenboCv1Pu+ WMOh3qHH0rza8i8PfEfXntLafVdP1O6tEeO31PSrq2hkRXckxpOiKz9nCHcF2EgDa1ZE37WHh7SL iwhsNd/4T9nXyLtvC2k3GrJDcBOA72oljt/McqAszjrwSORB+yF+118MP+CkH7Omk/E3wU39reFL /UJ4bV9UsxBcQXFndNGGMbZaNt8aypnDBWjbCk4CGZnxF/Yr0fxJaTeShtZZkKyNbExhsjBIGeOv Xr714trH7LfiP4crcrCW1O2aUyqfL2uuQN/A4O59z8YGXIAAFfc1eQfth/H2w+Afg3RVeONtX8Xa n/Y2m7gCI5fs81w8hB6hY4HxwfmKA8Gqi30A+SNRW70SQfa7a4t+duZIioJ9Mng9K+7Pht4jS1+E 3h671W6it5G0y3kledwnWNTk57+tfOfgHRLfxjYzrfM10b+MrK0h8xpMj3znnB+uK/Pv9rz/AIKP 6z44+MknwV/Z70y4+OPxpk3R38wuGm8PeDFU7ZJr2cN5eY2IUoGVEbCu28CFicmxJH6Gftx/8FcP 2b/2LdN0W8+I3jLS59Qa98zSLCxhbUL5pwrR+ZHFEGfADspcAhd+D94ZxPh9/wAFJvFnxZ8IQ61o Pw2v/D8N9I01tYeJbY2d2YSSQZVjldombO7DoHXOHjVsgfIf7J//AAQL8I6JpWteKfjzqbfGn4t+ M7GW11nWdQ3ix06OVSr29hENvlRhWKCTCsVyEWFGaM/a2g+G4PDXwksG0iDSob0WMdvp9vfXLQ25 nEYVYmfDMcFSCMFjtPuRBdjB8TftUfE7WTGuo7vC1tM+xm0+yDxRrg/MZ2L4BOFH3WJI+XvXP6j+ z9a/HLVdN1jVvEOp65c6RcPNFKNRaZVdo2iZWBJH3XbjHB6Yrd0H9oS48D+TafEPwxeeHLl3WEXt pFJd2E+5mAcMobapxuIDPsDpuYFsD0bTNK0e7tXufD94lod7B/sLqYS4JDK0RygbcCG4V8gjcDSu Fjwz4pfsreDfAWj6n4v1nV9M8PaZpNn513qWsSqbXToI/mZmknYokfQt0bI4ccY/KX4x/s3aL+3t 8eNM8feCfDPiH4cfDa0sjb2XijTNPOneKPidKY/+P1YGIeLT3G0q8wZ5FCltu8mP9arjwV4++J3i O/g+J+j+GNV8BtujXTLKNp2mBB3CaBwVkiO7acF3YIQAEeTzvizX/Bvhz4Y/tE+KPAfw3e18H+Db kyz2llp8Kx2NhcK7C8tVt2wEdi5YJjbCIpQF3ZCXB6ks+S/jjpHxD8A+B9ctLnxf4c+InhVFWzkv tStBa6zozGSPEETxbIriTOBKTbxtg8udm2vncj5iSO/oa+2f297W48P/AAVktp9NsIle4gt47u2O 4BFO5Yl35ZF+QkhdiljnBJOfibBDketflvGs+bMEu0V+bP6b8GqXLkk5d6j/ACiOQc/Sp1AUVFEM 1LivjXufr8UGKKKkt7WS8nSOJHkkkYKqqpYsT0AA6mk3YtK+iGAEtx/Ku20i2mi0m0M0UkfmRgrv UjcvIDDPUHHXvXtv7Of7Aur6zYWuu+IrLyoZSrW9pNkFwejEYw59Ezz1AbBA5Lxt8Pdc8IeKtU8K eIDLcatZSPdafcMNwuYzkmMEE9QCwHQFXUcYA4q0ZVqLrU7OMd+9urS7Lq/mY4PiDAUcxjl05/vJ 6afCpdIt/wAz2SV9dHZs4mL924bHHTpX7c/s7/tDXf7S37KfhVdFuzeeJ9d0dLS4/tFWvLGPUIj5 czXCh0nMeY3mbZKAVIQEM6KfxJMfy4OK/Rz/AIII+NP7WvvGvhp9TngvbKKHULKI5cLA7FLnywTt UmQWpPykHjIyoI+l4DzD2OYexb0qK3zWq/VfM+K8cMk+uZEsbBe9Qkn/ANuy91/jZ/I/SrwLoLeF fDNtYOih4AS8iymQ3DsSzysSq/O7s7HAxkn6DaD59Pyrz3xp401fwp4gRbpwmjrbLJ5tpbs13cym RgUVSsi7Y0Cs5O3IctuVUYFnhT4rf29fTvZanpt1psaR+WbuVY5ZJSW3R70URLjAIx5hbnkDkftV 0fx8j0fdRXGz/HvwpYzvDdaxbWlzCxSWCWN/MhccMjYBGQcg4JHHWikVoe/1HdWy3lrJC5kCSoUY o7RsARjhlIKn3BBHavzy+P37TH7QngDxh8RtW8Ft8Wde0fV9H0a60LTtX8BzrZ+HEv8AUrlLia2e x0K4vWubaxhtj5E0V9JDNfBp7Zo4JFrG1LxJ+2mkmkQ6H4m8dSzf2V4dt5P7e8LaSIrrVb3WbiS4 Mk1tpy7La20xY1uZzFEcCMLBb3EzCCoL2kUmt5crT6N30fTdWum1d2b0laJyVNuz2XMmuq93Vffe 2jsm7bX+7v2c/wBmrwj+yl8PJPC3gm21m00aXULrVXTU9ev9ana5uZTLcSGe9mmmzJKzyMN+C7u2 NzMT3leHf8E+fG/jn4g/Ae+1D4h33iC+8QjxNrNurax4Xk8OTx2kd9MlqEtnijPktAsbxt+8OyRV M0zK0re41cm3Zt3uk/vSt923bs2iY7tWtq/vu7v5vXv31Civzh/bZ/aA/aw+Dnjrxv4k8Enxtqfh OH4hWGk+FtEs/h+ddllso9Ljmv57pba0+0f2WZ1mRCkguJZnTbcwxpsl2PEXxj+OY/Zi+Js+ieKv 2gr7U4IbrX/Bus3Xw1tLPxBfQ2tlte3Nk2jmOKGfUGjjhtp7X+0TEJpctGFcZKd6XtLdE7dbNKXp 8Lu7vpLszTl/eKl369L3lH842+cb6NH6DUV8KXPiv9orxbbXml/Djx34h8WS6Re6H42s/EOuaZY6 TpfiTRJbOE3Wim4i0aYJJNIJ5FEMD3UIZDJIqvEsnLfFn9tX9oPwH8D/AIS+MYPDfxT1XxBrvw81 7W9Y8K6N8NL26L68yQiysbqQ2Pm2gtmmkZA6QtMlnIMXDyxpV1E48yWrTatt0b6235ZR9VrZOLcU f3nL05knr01S17WUov0el2ml+ilFfnhc/tFfHX4Y+KNfuZPEHxw8SaHqvh3w+9nPqXwlkvI9Ca+v bhLu/itdO0qK6kuILOCCQ2cjzPHNfgSxJHE4H0N/wTN8eePfiP8AAzX9S+IN78RrrUk8W6pZabH4 48NQaDrMGnQSiG2MsVvaW0Mnmonn+bEjIfPKhvk2JUY8zkl9m9/VNK3rqn2tdX5oySlzta63t9zi 5J+mjT6p2ukmm/omiivhv9sT47ftFeA/2svGMfgvQ/Hl98ILDwtpWmzXOj6JBeahYaxdz3btd6XA 9hIbwpHFbQTPJLLBam7SZreZY5UGU6ijbm2f+Tf42srdWjWMHJO3S3zu0tPS935Jn3JVO68Q2Fjr Vpps99Zw6jqCSS2tq8yrNcpHt8xkQncwTem4gHG9c4yK/Kvwp+3d+0BqHwc1X/hJ/FXxp8J+P/FW s+FrXSLe4+Ds1tFpzyrNqGux6ZazaS0+oW1vZrPCIWM14zacWBUTI71vhmP2sv2ov2w/AOjeO1+I umeGvAvjqz8ZeGNR1bwVZWDXWgsl008+rXkdotvDd+QyWUVhaSRXK/b3a5SQROy7Rpt1VTe17N9F 8Le29lJvTR8stbRbWU6ijTdTd8vMl1fxW3ta7Vu+q0baT/Wmivyd8b/tx/tWrffEXSdI0H9oSB7e z8dXXhi+k+Fiztc3630Vp4d09XGliFYkhSW8M8wKSx3KIZpWjfZta1+2t+1l4U+EWvWHiHw38TIv EsPjm80m7vvCnw9vNdudN0vTdFjeP+zXk0iC3vG1TUreQC7kt2toUunUbCISMI1E6ftenKpednJR a/xJu7XVax5ro2cLVPZ315pR9Gle78pJPlfk07NM/TnWfCul+Ir7TLrUNNsL650S5N7p01xbpLJY TmKSEzQswJjkMU0se5cHZK65wxBv1+dWm/Gn9oC8+JXwL1iPxd8dbvwz4iD2HiPTx8Lo7W3umsNE 3XFxcxz6NHeadJeaq6RxGaSGHZDIyDY6lfMvh7+23+2x4h/ZP+Gdz/wr34hzeP8Aw74hvZvEl9qf h59Mg8b6VaaNNfzrPbtoQuNPc3T29nAkFrvuZImEcjBjImlV+z9pfXketuzduZd0t2viS1sRT/ec jX2lpfTVJvl9d0unNpe9z9YqK/M7Tf2kf2s/ihqHwx8K6QfiLo3iBPC/ha7uNUk+HBsdO8TancSl tduNYuL+xWGws7SGB0Sxg+zX00s6lDsKEey/8E6/jJ8f/wBon9oz4jeJfiZbeIPBfgjTmutK0fwd deHJLK2hdL+RYLr7Td2NtcSSm0iQt9nnvbSRp2dZYCFt10lTaqOk3s5q/T3Ovo20otddHaztmqqc Odf3fX3tfvS1d+m1z7Moor5x/wCCi3xK8beFvC3hDQvhxqvxH0bxh4m160tYrrwx4L/4SCGK2a4i jnkupZrSWyt441kEjfaJ7UvGkwjlDgYzWsow6yaS+bt/wX2Wpo9IuXZN/crn0dRX5O+Mv2zP2u/i V471+x8L6d8ZfC/ijxBqaafoGhTfDGW08LaJnxFFbIZdXuNHuPkTSbWe4ubiWRonbUV+zKfLVV9A +PP7T/7T+uaLoOm+GtJ+MHhnXfGOn6zqTR6X4Ft7uXSdegnhsbHw9HeXNlLY2mmBvNu5tTv9xuo1 L20kausMcwlzU41Ir4r2XW6V7fds02m7JO7inUly1JU5O3La76a6f8P21b0jJr9Iqp674hsPC+mt eanfWenWavHEZ7qZYYw8jrGi7mIGWdlUDuzADkivzj/4J7ftL/td3XxcFh8Z9G8Waroy+GPE+v6Y G8KS2L6/cLqSw6bZ3DppcFvpsiW9pcPHDJcvLMl9E8nO1B4Z8WPjr+2X8f8A4fLoupaH8VtQ8AfF rwzLpviaH/hV0dnc6VrstrPKdE0m0utPM9rprtLbWcup60JYvknkjljwHonzcqcFdtX9NZRSfneL Wie8VvKKZT5XK03y2dvXSLbXTaSerWl3tGTX7N0V+bPwJ/aJ/aE8CftP+HPA/jkfFuLw34EtJtAu 00j4aXV7onieOw0KEi/k1Q2ErG5vdQnleLyZkhWOwWNx50uJPHbX9pz/AIKE+AfhhF4j8UQ+K9Qg 08+EI7yw0r4eG+1mZ7mWS/1KNYoNNPmFbF4raeeOMRwzqIUQSCW4q6jhF3i7x93Xyk3ZvqtrvtdJ 6uxlTcpQu1aVm7dbq3Mumzdr6J2dmz9iKK/M34DfH39qH4u/APxJrnjLXvi74Q8Wa5GPENppWgfD Zoh4cs7GxmmvbKzfU9DV5Jri6eC3jtrqCaYY3wXF4iySVF8Ef2x/2ovC3xp+G1h4l8N/GDx94W8Q fCixuPE1xL4GbRJNG1zyL66vtQQf2QqPOhggtEsHljd3lV1gkDAmaj5Obm6W873jKV01pb3XFvo9 7R94uLUrcvW/4SjG2ut/eUkt2tk3ofpvRX5TfBf9sr9tDwz8EvEUHxE0DxgnjC30fwbYRX0Hw9v9 aGmjUZpZtX1vybPSbdLq8tbe5toTp9t56wzWpL71EzHf1/43/tm3Nt8NfAVkfH2iHxvf6jqw8a3/ AIQtb3X9N03+0YY9Os9QjtdMk0eG6NmZ55op/wCzwA0KC5SWGVZ9VTbq+yXflv0b339NV3s0veTR EqijDnfZPzs1v9/uu2zafwNSf6dV45d6f4xn8QabqOk+FfCHguFP9GW71W4+338KSHaEa1tlWM5k MZyL3A2njk17Eo2qASSR3Pevmnxz+3T4Lv8AwxOmn6Z4g8SafOskFxdRxfZraxkA5E5cCaFhuyS0 IEeMvt4rMs6TWNMs/GOoxjxF8R/FuuXdhO0V5pvg6ymsLe2lUlTG5s0kvoASM7JLvDlc8gACV/Cu h+Ab2z1qP4eabp+pJOLaLXPFmorcaiC/QpdL9rnIwM4kkjAAPIrz+z/ak8f+LDb20GnaH4ZlvVHk XEMRuheE5YNFKxKHduZgjLuwWIDAFqzPGPgrXfHBVPE+varrLuPPWyabEeAcGTyxhEUE8uQAM9e1 AHon7QDeF/G/w/17wp8RPiRa22la3bSWV9YeHA1teS28gAlhd9886hlG3dD5JwW9sfMP7Sv7ZHhj 4KaLoUHws/Zx8aftGaq0yW2nzeIvEgmisimxVlFzqstzchBuBaVIyoIJd1JBPe+Hv2VIZYlbS47e 3tDgiGSMvpu3a4/dIcGRsMh3Y8g4VlRmDZ9D8MeC9L0W4NtLZHT9Snwz+ed7XRBIykv/AC0A5wBh kUrlEBAoA+a/E/7Vv7VnxMl0+z1DTPh14JiS5humh0u1luJoMMWWK2nuJBHeSKFUklLXBH+rlXhq /wAD/DHhrwR4di8I288/h6ys7uQR6XeH7IjTSEys4iJCq7k7tu1T2CgLgfWt74Otri3aKSCKSJh8 ysoZW5zyDx1xXF+L/gjZa3arEbeG6gVBEkNwzbok7rHMMuqnglG3xtsVdgBJoGjqPhp41134fWcV tBeyXFnGAFt7gmVFHYLk5UewIFeGf8Fa/iNoXj/4EaR4tk1vSvDF38I9cj1q6utUv47TTZlZWgkt BcyFUFw/mDbGTngr950Dc38RfiH8QPhaIrKHSWl8O6cshe1knaLVLmAMv7yedCyqv+t2i0MkzgDE S4ZR4b/wUA/4Jr+FP+CtngTQ7DUvH2u+ANT8MLLa6HEscsOnT3JKk79JmaMRhA5jX7l0QwDkeX5Z LhY2vCvxn1L/AIKM/AXX/Avwl8XWejaJqUTaZ4t8dW06umg2TpmeCxO7FxeSxZQSIfJgR5HaUSrH E/dfs3f8E6vgr8HNL8JeCvhz8ObaDS/BWopqsniiaUrrL3gTBne6GJS7/L8pAXaQY44kWJ6+HdK+ PH7QH/BHTxvpuo/tJfArwv8AF/wPodhDoNj8U/BmlwJqem6ZE4MNrNIscamBG2lILpIMyAMJXKqR +nv7Fn/BRX4Nft7eFf7S+F/jbS9euIYvNvNKcm21bThxnzrWTEqqDx5gDRsQdrt1qRpI97towF98 elea/Ez4V+IdT1ie70u7spbOQvJ9kW2SKdZGQISC2YZONxzJGWLFQX2rtPpEDZTjHt3FSGQgdv8A IpN9hnh/gPwv4n8L+HPLutOvB4faVmeyEEbzSweZt2S2shkHKbQFjZQqIMKrMyiSD4R+GvFerx69 4H1e78P6xpvmBbUS3Is1kzjE9oJImZA64ChljOHGCGbPst1MsMTMxUBRkk9AAOa4nWdVg163mupH jttFAMkrn5Dfoo+87doMc/8ATQAZPlkq6Adb3t1rGnw2a39xc21ugjuNQwqSXzjhthQKFXOcsoHP C4wTXwJ+1r4Oh8S3EOuW4tNPvNBvTqVpcuzwCO3DnzUV4wXRWjDJ8g6ZHesz9uD/AIOBPA37Kf7S Hh/wRa2moeILZ50h1hNMRXl023fCrKynkyEEMkC4YqMtjcit9D/tW+HLe2+E2kRoiTRaU4s3BXIe N02tkHqCUXOf71UnYl6n5oftr/Ee58V/DeyhGoJcWh1Jf3TwqZ42WOTAZ1YEADPyvErHIOTjFfMD Dc59RX03/wAFAdGtNJ03QGgWXzZ7iUEvK8h2qo4BYk4yw46DtivmRBk+/wCNfkvFk75lNdkvyP6s 8J6PLw9TfeUn+Nv0JIRjFSZpgOK0bbR0g0KfWdSnOm6FaSpDNfPGzL5j52RIBy0jYOFHoSSACa+X vrbqz9Lc4wg5zaUVq23ZJd23ol5k/g3wTqnxA8QW+l6RZz3t7dOESOJCxyTj/D86+7P2U/2D7f4S fZta8SWUOqanLGJI0CLNGilTll/eKAAeNxDA4PGDkfK/7CH7QWuXH7W/gXwp4OTR9N03XvEX9n3r P/Z2oz3VnGy75y0sZljLKZc+SV27cZ4Jr7F/ba/bE1r9lDwv4Su9K06yk1jxRrk8RtLy2e9NtYQQ +ZdgKlxbuWBubciUPIMA8Encez+x8T7aNKsl7yuo39d/u21R+S8QeJNGdOpSyttQi7Opazf+Dql5 uzflrf1bWxqv9oTxJp00KvkbGIRJ2/jzE0ZyGXk8EHAIx9+vH/2xPhRL44+H0d7p0M0viTQ2Nxbz wxylnXg4O7qoIHLFdrAZwCWrkP2IP+Cinj39qT4tad4X1vwl4d0bS20Se/1K+tbHVLJ7VIhJ5Q2z XVxASx8nqGwJCw24Jrrf22P+Ch+jfsdeKPD+hXejR65LqujXGsTbdUksUsrdJHgiClbSYM0s0Myk kxlCEIX5jntWCxEK6oqmnLsnuvM/O6ebUfZ/WeZxSe/VPpa3Y+Q9VKa1YRaxBF5KXTFLmHGPs1wP vrjsD94ex9q9o/4Jm/G3/hRH7Z3g3UpphDp2q3X9jX5Jwvk3OItzH+6khjkP/XOvHo/j9oPxz8de LNasPD1/oGhG2s21UHUINRitbyc5X5o0jKMMuxDKMlJgFA4FC9s5tC1RonYpNbvwyHHuGU+h4II9 q+cr0auWY6MlG3K1KP4O1/Lb0t3P6RyDOMNxZkFSlUd5Si4T9WmuZL+9v6prof0g3FpBqlqYbmCK eJsZjlQMpIORwe4P5VmJ8NNKhvXuIluIZpUZHdZSZHDBQ2ZDlxkKo4YdOK8L+GX7Y3iHxB+xx4X+ ImlfD3xN8R9Qv7BWu9N8M3Nj9sM0YMc7bLye3BPnRyAJG0jn5cBs4HMfBj9vL41ftMfDSTxL4L/Z xTSbdyfs1n438fQaJqMwDFSzWtvZ3bw8g4E/llhyBtIY/wBCYevCtSjWhtJJr5n8QY3CVMLiJ4as rSg3F+qdmfTFt8HfCdpbRxJ4d0QpEoRd9jFI2AMcswLMfckk9zRXwtrn/BUL9q/Q9avLJv2OvC9w 1nO8Bli+OOiqkpViu5Q8KuAcZAZQfUA8UVucuh+sdFfk7+ztpP7Rvx2+CmtfGj4O6x8R5X1fQ/EW seFf7b+IUWuaZ4gm1W6Y6ba2VjcXstvEum2/LNftBILqPyVUQeZXYfB74H/tGQ694csV8EftEaHL onjG/wBdXUvFnxgtr7TJdPhsgthbXLQavdT3InmtojPavZ+SDf3OyWPyo5C23HSpFppJtW1vezjb T3lu07bel5dmm4O+rS7NJXUv8MujV9d7dP0yor8nvhF8Bf23vCfwN8Oa94n0Xx94s+J1x8SB4h1K 1b4knTIvsEGkTNHDc2qaxNYxWk2qyhHgs2eI2yI/2SN1WJXab+x7+2t8To/hl/xWPxU+HB0zQ/CW ieJJNR8W2+oSXl9DfXV/rOpTJb6m6NCPKt7ZUhYTzpdRo7CGOVDpy+9yv+aKb6WlG/Mu6T92W3K9 XZXtMpJRcl2bW+tpNW8m17yXVaK73/V+ggMCCAQeor8k/FfwV/bd0r4F6BB4e8M/GDUvHlppvjuO 7vtT+J1lGn2vUr2NdKYomq+TKltZSzvblkBjuIIl220ZLD0vQtJ/am8H/tH+Ivib4i8MfEzVPD/g WxWx8A+Cn8TrbWniTz7S1tYLfUX0+81BLi4+0Pcyy3F3YRJbyt5hvntkAjmCU7J9Vf8AFrlS3ve1 k0m079NaldO0dXe35WbeyTTbvfS1nZn338Jvgt4N+AfhIaB4F8JeGfBegieS5Gm6DpcGm2glkOXk 8qFVTcx5LYye9dNUVlJLNZwvPEsM7IpkjV94jbHKhsDIB4zgZr4c/Z/8E/H7xP8At2eFvFHjrwl8 WtA0CAeIJNevZ/HllJ4dllLCPSrWDR7TUGj+xpbSSlbh7f7VLOqtPGgCOru3UVN9nr00W19vTXXp d2Tly9x1O9vXV7tb+umnWyu190UV4n/wUA+Fnjr42/s8/wDCLfDvU9Y0DxFq+vaQra1putTaVPot ml/BJd3O+KSOSUC3SVfIVv3u8IcKSR8T6r8Bv2uvhb4v8M3VqPjz4z0XWLzXm1e20rxroz3Xh3Tb rVYXgtx/aGpQx3F61lFNicbo7VrlFthbiJ1lzjJuXLa120u17Rav2WrvJ6e60m5e6XP3Vffr8tfv eiSW+qbSj7x+olFfmh+xL+y7+0l4f+PGra78RtK+L+mfDzUfE6W0Hhe4+Ll3rN/p9vBcXMllfpeP q7h9PETWyXNvtS6uHjBZZYhJFNB8WPgt+2LqPxo1Pxn8M7T4heEPAep30Wpaj4O8R+MrfWfEF+0L NDd/ZJG1ZtP0w3UOpXL29rE72qPo9tI5tnZY6tapdG1d+W2javffXl5tdr+9yiV5SS6Oy/vbrS9u q+1ZW16x5v0I8c/s/eAvih458OeKPEvgjwh4i8S+D5TPoOrano9vd32iSEqxe1mkQvAxKISYypyo 9BXXV8AeF/2avjxqH7W3w7tY5vi/o/wW8MxWes2sWu+Nmm1Gzle4mu7uz1G/t9allv5FZobYW91Z ahbtbwKI7yCSSWU/Wf7ZPg7xP8RP2WfHfh/wXLqVt4s13SZtP0m60/UZNPuLC4lHlpcrPHNBInkl vNOyVGIjIBJIBJe7Sbj0ctPTr297vqvNijaVW0nbRa6/8Poulk91bv6ZRXwWvgT9pOz/AGetL0vx XoHxG8YX19451o+KbXwj4qtPD2p6jpcYli0hrO5m1V5LCwkSK1kmWC+F6j7uJN82/wAGsfhZ8c/g v4q1Sx/aW+K/ifwxod7p934W8FeJLf4gX2g6TNfPYltNsY7mHW/Pv7gMk7G4vtOtbqWWLm7lVo7d pc0r2u7K+2+ifKl1k21FLq1K9rJNxi3ZS01s+ySk05Nr7KScm9rWtdNtfrbRX5+/HH4NftReJL7w j468NjxpolzPYF/GPhXTvFKXF/cQXM+lW8tnYJcamml2+oRWtteT/aCTFG1zIkLGRvPP03+wj8MP Fnwr+Bslr4vl8RQ3Wp6td6np+ka74ln8S6j4bsZXBgsJ9RnklkuZUUFnJllVHleKOWWKON21UNHd rS6+adtPJ7qWzSe3u82SqXUXbe3yur6+mzXS668yj7PRX5xf8FkdH+I3wu0X4w/F1vGvj/wn8NPD /hLQtNt9O0Hx3/YT6jdf2lM97fQu97brbyw28sYjiiMUt7MkURaSPMMmL+zv8Gf2kfDH7PGkeJbN Pj1qtxqehaRousWWpfEnS9c8RavHLcJcX2oab5uoNpVskduBbW1wbpbuWO4llmzLDE0uVJuabtaz s/Ju9r9bOybaTspXfwyS0q+55pq687cvNb/DzW1au1ZXTTP03or80f2JP2XP2kdA+POq658RtL+L 2l/DvUfE8dtD4XuPi5d61f6fbwXFzJZX6Xj6u4fT1ia2W5t9qXVw8YLLLEJIpqfxG/Yx/aslsfGW saP4s+K8U2p2fjHUrTQrLx+ZXD31+iaPpVvNPeosLRwIbiSfcnkowgtpIHLykb0i7atN+jST5X52 vtdXXKm5NRHpzNX0Ukr66ptpyXW11668ztH3j9OqK/KNvgF+2X4zvvCfhTTdI+MXhnT7PxRqmvTe LfFnxHtbnZN/aNs9lHewaXrCTT6adPglRrWI7ftF5JiGOOJGf2n9juW/+KHxflt/Bmv+Or7Tl+z2 /wAR4Nb+KFx4gu/BXiLStTmM9q0S6hIIGvMFRBaxxWrQIWkjVfKt5NIRUmknv+Fldt+W8b9ZcqXx aZyk4xba1X462ST2vb3rb2Ur25dfvOmzSiCF3YMVQFiFUsePQDkn2FcF+1PL45h/Z28YN8NIjP47 /s2QaMiPbpL5xGMxG5/0fzgu4xif9yZAgkwm41+dP7aesfFP9jb9jbxH441dfi1oHgO71me//wCE e1b4vRDxJYyx6d5Vit5q82pgwwXOogTS2el3kmFjhSONhNcxjnq1HGMnFXatbzbdrLv9/bpdreEO ZxV97/Kyvr29dt+tk/0t+DHxk8P/ALQHw00vxf4Vury80HWBIbWW60+50+c+XI8Th4LmOOaMh0YY dFPHTGK6ivzH+C37NHx0+CX7POiaZZeGvjNe/Dm+msra98KWfxNs4vFUdtaaU0f2k6i2peRp9rdX 2JJI9Lvg6Qw25Rd0t1GeO/YKsPi38ZLq78baF4j+MnxP0Hwl4tiaLVtI+LFvfeGtXttKto7W60/T YZtQWa9nurqN42fVBBbNbgXiN9okzP1Sh+/lSjtHr0teN3/5NpZcz5WuVPQ51N+xVW297LztJpdU m+Xq7JaqTR+tNFfm/ovwB/ar8FeItE8JLH8Q9Q+H0PxFvrue8h+IC3+oyaVc6V5cBnvbu+S+XT7W /lMgjjeW4dY2/dDZGsnL+O/2Yv2qrnwjo/hDQLP4x2nhMa54jvrkXHxGkn1gg6gV0vOtf8JCl7bw jTkTylK38RnnmNxZLsiZcOayTa3V/T3VJp2vZ6tK17yVtHe2sktXHWza/GSTXk7J36KSZ+pFFfnL 4P8A2ff2pPCn7IPjnwz4pvPid4q8W2GseFLDRb3wz4oh06+1bRbZLKTUJIJr3WJXW6Er36zSTXNu 10YouPKYQjn9T+Af7V/xX1Ww8c6/o3xS8L3th47jutR8LaV8RC8l1pras8zNpwttctLBLVNOjtYX GoC4eZ2n8uztfmkuNuT96qd9G0r+vLb/ANK16Lld3o7ZuTVJ1Otr2/8AAvK/2dFa75lofp1Xzpcf ATT7m9W/tWk0vWI1CJfWwAdlGcJIpBWVOThXB27iVKN8w+i68/Fr61BZ47/wiZ8FNJBc2+maOt62 yRJIjJ4d1gucFWVsmzlcnGD8rNIP+PluB0vg5LSfUv7P1a1/srV2bz/7LmJYXBRYx5qzH/j8K7Af M4ZFKB442Fd9NZRXFvJFIiSxSKyOjruV1IwQQeCCDgj3rifEPw3k07TzbabFBqejqyudFu5CqwFT lXs5/vW7r1VSdikKEMHLUAdYYFPbms7WdNgvrOSKeBLmI4JjZchiDlTz3BAIPYgHI61y/h3xlfac 08UP27W7axwLuzuECa5pQOcb04FzHwcOp3MEJVrknNdXo+v2PinTVu7C5iurdmKbkzlHBwyMDyjq eGRgGU8EA0AeQ6H8UtW8PaxcWGuabNpeyeRIYZ52uYmhWSNRIlztBIInT74KgrhpVOQO30TxFY+J 7cPbSYcxLK0L8SIrchsZ5U84ZSVO07SQK2/EfhLTvFNk1tqVhY6jbnI8q5gWVDkYOVYEc968r8Yf CjxP4c12bUdL1V9W0hRJLDpc0CpLZP5LKPJljKOi5yNsW1j5p4cLtYGjuta8KWWvWwhvbW3u4lYS Ks0YcKw6MMjhh2I5HauO8Z/D6DTnGp73kktVCxz+YRfxAY2rHMQ3nDIYiKcOHdx8wAAq/wCAPiTf eKTeRQ2F9qA0+f7LcM0aQSwy5VWUtkQyhG8zeyFWUIB5TMTXTab4YZ7lL7UPLmvwAVVWZobQ7SCI gcc4ZgZCodgcHC4ULUdjyXS7rxN4daSAk+ItPnbfeW1+j/bbGB9ysrQKHkdWYONyGZH52LHGoz8k ftdf8G9Pwb/aQ1eP4i/BfWrv4E/Ei2la6sdc8HSGLTmuBxua2idBC4wRutnhKksWVzxX6Mav4atd ahVbiIN5bFo2VmSSJiMFkdSGQ4JGVIOCR3rzL4lfAS88XeI47qbVdTbTRGEuYdNdLK71F96bftbY EV3CqgjynVPlLg+ZuxU3GfEf7Gn7Tv7W37H813pH7TNho3xI+HFkFg0j4geG7eW/vL7nCvIltH5k sOFYb2tRNu2u7GFjOn2b/wANQaD8Wvhxput+B/FGlz2Ops5/tG3VdQihiWOTMi+UWSWNZljjd42d F3MCwIyJfEfxL1vwnbX95qdpZeItASFYriGztGjlhZguElt5CZYmcPkqwdcBclAxrwvxT+xx4M+N fiC/8Y+A9XvfhX41u5Y7to9OeLybySIEpPdQES2t22NqpNtnSAR/6O0cgMlK9wPUfB3xC13xL4jg t9YAutHWTzJSs8N3auvkSSLcmSLaY1LqCsMytgSRtlGVUX8+f+C5H/BaW3+BOgXHgPwHeQXXirUY 8hvvpZoc4uZQeo7xxn75G9htAB4X/go1/wAFn/iZ+yX4d1H4b67D4b1zxLNAw07UtOmk+zX6ZKC4 kid2mihVgcRvLO0xUkzIMoPmz/ght+xf4f8A26P2gdb+K3xR8TaR4r1PQ743kXhu4vI5r7UbvKn7 bdwZyLVCQETbtd1wcJHskpK2otz2r/giT/wSWv016z+P3xhtbq+8T6lJ/afhzTdRzJLbvId/9p3I bk3DZ3RK33AfMPzlPL/Uj4x+HG1v4Q6zb4y0VsZ09jGQ/wD7Lj8a7bQvDKwwhtoJPcnP41h/HaZN G+EuvuWC5s3j+pYbf61k273KsrH5Ff8ABQ26zqPhm3ycot1IR9TEB/I184JHuAGBmvdv24tZTxb8 UtOsLDfdS2UDQMsaMR5pk5Qf3iMAHGcHIPIIGNp/7Pmq+DfBHibUr/TdRg8QaZpUd3pcc9mTbm4k uYI0TDgCZhE80ny5QGIZ3ZOPx7iObqZpUhHVtr8ktey/rc/rHgXE4fL+FsPiMVLljZ+rbk9Eur/4 d2WpQ+DHwCPi66ivtea8sNHVkLGK0mmkkDMFUHykbywxOFLY3fw+td/+27rdp4O+BXhTwr4fgjjV vEv2+5jsre9RgLC1dgHMZDgst7nawx8u7b/EfTvF/wAc/FnhDwl8R/7MTw5Pe6HP4b0HTI20GwnE l0sDm9ZR5WHMjafIdxzzcMQVJBXe8c/EKL4hePvFei6t8M/hp4vks/ilH4O8NSahps8RvLWaO4tr ht0M8YJ3rp2W4IX5W3DaBx4GhKhVWImlJrz8ltdeZ8HxZxjXzak8LCLp0n077ay7vy2XTXV/Lf8A wS3tJLX9pAavfXk/neFvDN3LGk99MI3nuM26lVu4wNyG7BPzsd0X3SOmr/wVl+LKeP8A41aPpSXF heN4a8NhSGnsZB9sv5WLALcLuBa0aA4zjC9OMn6H+GHjv4e6Z470CDwt8HfCuj2/jf4j3PhOzuYL y+Ty9Oh8grdujSMu9YtQtuRlcrJ3GVzLLwD8B/jbr/gnV9S8B/ELQLnx3rN7ZNJaeMt8OnW+nx2x lu3jeADywkkzFeARZyEk5GfZWO/2z61Om9tNr/ntufAuklhPYR3vd/18jl/+CPvgmy8Kab4/8aGG xle6ntvDmnyi1t0W7t7fEsiK0DmMtmK1yTtPJ4APHgX/AAUI8c3Hxe/bF8c3MSXsemWl9D4Xglji 1GJWstMjWO5kQwkphpIhKrKoz5h45avsz9naH4J+HfBfgSDQLT4i6Da+I7fU9WtmuUt7iewtrTbL NfyGGSPzNpt5kAHzf6KwAJbFeLWf/BOz4J+PotOk0/4pa1p8/iHSr3WIDq/hGOLyLKCS4+030slv Nwm2zvFOCSywMQCSmXhsfCOLqYmqmum17fdft+YsRRvhoYeHS7f4/wDBOg/Yc+G+l2n7GV8/ihZL m8+KmqT6pMZDPP5MMRe3tmj8xQ0YWY3hCsP4lPzcA+S6xplxZ3t7oV9Hs1bw8uI22kC8tOquM/3Q Qcf3T/skD6m0Twp4ZtNB8NaPoHxStbG1m0NrrR7e50udhHpdgs6Xc8gltHKo/wBjvGAbB3KPlbeA /mHxw/Z6k8Y3ejeJNA8d+FNS1uO0u9X0k3lxHpZutKtUuGuZJt8cHyIbS9ILIFZI2xuDqa8bG04Y tT57qUneLd9H06bW0f39D9A4N4hWR4mnUi7wtyzXeL3fqn7y81bZs+kP+CRX7U+teD/ht4l8LRzW tzZ6Fcf2wttc28rhIJF2zbZIgzR/vEjGWVkBmJOOh+zPEmpeSllILy50VYLINEQqXFlpTzN5jKk7 BI2KnChmki2K21d+4KPyq/YW8VaR4L/af8I3l/cPH4V8Ws+nvc6dqJ/ceaTErQ3Nu/PlXKoQ6MRh PrX6u3PwavryPUdT8Oa3b62L6LyHYmOG78xSxKtPGPLl+8AyTxMAqBSGHy193wPj3Xy5UZ/FTbi+ /l/l8j57xhymGFz54yhrTxEVUi1s7qzt6/F8xlnp2r6laRXC6h4edbhBIGXRbq5VgRnIlCsJBz9/ c27rk5zRXJ6/+zbavrt6ZfC91fSGdy9zH4Usylwdxy4ORw3UfWivstD8q1PrvUP22PgzpAkN38XP hjaiEaiZPN8U2KbP7P8A+QhnMvH2X/lt/wA8v49tNn/bf+C1r4c1TWZfi/8AC+PSNE1CHSdRvm8V WAtrC8mG6G2mk83bHNIOVjYhmHQGvjP9rb/glz428FeCHuPhco8Y+J/HWpeIIfFc/wDY9r9oaTX7 kiXVjLc6raiOLTrKW9hhtYvNMn2uVQIjNJMu74x/4Ix+MtXvdW1XQvi74I8K+IPEPgu48DzSWHwx VdO8M2LReTDHoNmNRVbCNY8q4na7kcSzBJYQyhKvNwTS1t/5Mk2135X7qi0npK71jKClJc9ntd+v LdJP13bXlZXTUj7G0j9p/wCGniDx5ofhWw+Ifga98T+J9LXXNH0e3161kv8AVtPZWdby3gWQySwF VYiVFKEKTng10HxA+I/h74TeFLjXvFWvaN4Z0O0aNJ9R1W9isrSFpJFijDSyMqKXkdEUE8s6gZJA r5i/ZG/4Ji3/AOy/+01rnj2fx7b61pmroZ10WGw1OGOG8Npa2nmhbjVLm0jSOG3MURgtIZ1hKRSX Eyq2/wBe/bS/Zwv/ANqj4HP4V0vWNB0HUF1bTtVhvNY0FtaswbS7iuDE9utxbuyyrG0TFJkO2Rue SDvU5Vy8mt7X8rvX7lu1v0XQxpObT51a23np+r27Lfuej+H/ABfpPiyXUY9K1TTtTfSLttPv1tLl JjZXKqrNBKFJ2SBXQlGwwDqccisH4m/tCeAfgpqmlWPjLxx4Q8JXuvJcSaZb61rNtYS6itvH5tw0 KyupkEUZDuVB2Kctgc1yn7Fv7Omu/sv/AAbufDniXxjD4+1q813VNcutdGk/2ZNeve3kt0fOj86U F0MuwMpRdiIFjQKBXD/Gb4D+LvAfx88RfF3RNOtvibZ3lvo8R8E2+j2MeuzPZzOqG21S/u47WKCE XM94IDHHI1wmRcqHMZzenKr72v1s7a2+ei/HS7NY683q7dL62jd7LTV/cbv7SH/BQn4bfs9/By38 cv41+HGo6I6WV8Wn8Z6fp5vbC6jmkgmspJnENxJMkEzQxmSNZxDLtk+TB7C//a7+Feka5pOk33xG 8FafrWvaIfEmnaVd6zb2+o3umCN5TeR2zsJmhEccjFwmAI3zjacfMfh7/glT4tafRNXj+KCaTdy+ GrrwjeQ3/hgX19oGh3NwJTZ6VL9uaCyvRETFPeOl2s7KjCNEjjjWLxJ/wRbh1/xH8WZF+IcsOhfE GxnttL0uWxv7uHSmksIbBRcRTai1rNHHbQrbqbS2sbhrctDJcSKzblHmtLmVnZtdbNXSi2rJ392S kv70X9lhK148uq0T6b2bkuqt7yaf91r7SPT/ANmj/grH8Hv2ntR8QR6b4h0TQbLRI5Lq3u9V8WeH 2/tW2ix59wltbahPd2ywq8LSrfQW0kX2iMOituVfZfF37Rfw++H/AMRtN8Ha9478G6J4u1m0lv7D RL/Wra21K+told5Zord3EjxosUjM6qQojckgKcfInj3/AII1a18WfH0fjjxJ8WYpPHK3WmzZ0jQ7 /SPD0MFnfWM32FNMg1QB7R7awji8q5luMSTTTbj+5ih6T42/8EvvGHxY8TePZbL4uaZoWj+LPEQ8 W2kSeDjJqX9oLbxWscd/erexvdWcMCSJDHbraTRboiLgmIEuV7Ll8/waSfrJNyttePK3FSUklvLm 8rfc/nZOyu7PW6TtZ+6L+3b8EG+Eg8fj4yfCo+A2v/7KHiQeLbD+yDeY3fZvtXm+T52OfL3bsdq9 UjkWWNXRgysMgg5BHrXxha/8EtfF9vbeHmj+KegWmopo2p+HvEepp4Vv9R1C+tr+eFp7ixu9T1e8 ubW/e3git3ubqW+DRwwARosSpX2F4X8N2Xg3w1p2j6bAtrp2lWsdnawqSRFFGgRFGeeFAH4Vdo8t +v8Aw6/RNerTS5byi8rpet/wtb8U/RNXvZWrq6isbWSeeSOGGFC8kjsFVFAySSeAAO9eX6V+3T8E dd0TVtTsvjH8K7zTdB02LWtTu4PFlhJBp1jKQIruZxKVjgckBZGIViRgmtb9qLxX4w8Ffs++LdQ+ H/hPUPG/jaPTZo9E0ezu7S0e5u3UpEWlupoYkjRyHcmQNsVtodsKfjb4U/8ABG/xn4P0j4Ta5b/E nwToviv4aaebLTrRfhpGuk6es0RM959jj1N92stO7TSXstzcQNKiMtsCGZ8k5PmdtFb1balsrq9n yt6pWb1voaySSjbd39FZx3etrpu2ju12Tv8AVGu/8FBvgH4XttMm1P43/CDTodbtJ7/TpLrxlp0K 39vA0iTTQlpgJI42hlV3XIUxOCQVONX/AIbN+D58F+JPEn/C1/hr/wAI74Nmittf1T/hJ7L7Focs pURx3U3m7IGcugUSFS25cZyK+Cf2l/8Aglh8dNH/AGZPA3gbSvF2m/E210Kzj8Li10LwxJpAeK4D R3GsapDfeJBY3bQGWW7jEFstyLlYVilgjaU1614+/wCCN+oeOPD/AIWli+JGneHvEeh6nDczN4c0 C/8AD2iWdlBYzWNrZ6ZZ6dqltPZrbw3FyYzNd3SFry6EkckbpFFbT5ZNdHZel/Oz0i09km7pO6cS E/ejfZq79bbdbe8rdbKzs0z6x8J/tJ/Drx74cXWNC8feCta0h47mZb6w1y1ubZkt1R7hxIjldsSy IznOEDqWwCKz/iP+2D8JPg54jh0fxf8AFL4deFdXuNMbW4rHWPEllY3MlgoctdrHLIrGACOQmUDY Njc8Gvi7wj/wRE+IPw98H3Xh3Qfjp4Q03QTpuq6LZWsXwuWBbWyv9UXUbiHZBqUUAE/lw2s4iiiR rW3hjhW1Kl27ub/gkbrnijx/8T9f8SfFYX8vxPglW8isdL1K3it5bmyhsLt0hm1We3hItI3ggktI ba5iiZUkuLlVYSG+2nut/wDbyukvR6O/RaavVNO3xa6padtNdeqV1a+rt03+p/8AhpD4d/23baZ/ wnvgv+0rwXJt7T+27bz5/s0EdzcbE37m8qCaGV8D5I5UZsKwJzV/bD+EbfEnQ/Bo+Kfw5PjDxPax X2j6EPEtl/aWrW8qGSKa3t/M8yWN0VmVkUhlBIJAr5F8X/8ABFnxddfDxvD/AIZ+NWm6DI8Hi2wb Wb7wneazrItNcu1nRfttxqxnea3iD2pmleRpIZpCvkyHzB6d4c/4JyeJ7T41+AviLqvxF0S88TeG daOo6vYWHh7UNO8N39uun/2fDHa6UmqmGC6jgzi9ujez5IUFYEigjqFm05aLS/fdprtpo09dL9bI mXMlJLVrmt2drcu+uut/O3nb6X+I/wATPDfwd8FX/iXxd4g0Twr4c0pBJe6rrF9FY2VmpYKGkmlZ UQFmUZYjkgd64qX9t74LQT6XE/xe+F6S63okniXTkbxVYhr/AEqNJHk1CEeb+8tVSGZmmXMYETkt hTib9qv4U+MfjV8Jrnw54M8V6F4PutRcR3l9qOmaleP9n2nIt30/U9OubeYPsZZo7jK7SAuSGHy/ +zf/AMEc/EH7MvxB1HW9H+L4v/7TuEuLh7/Qr2e4uZZbWK0vrt0bUzYpfSQpIIry3s4JkMh89rxT IkkU7ynKMtF0fn/lfV+SaSbatcrKKa17r5r9L/NrzPrOL9pr4b3HgfTfE8fxB8EP4a1mwudV0/Vl 121NjfWdtGZLi5im37JIYowXeRSVRQSxA5rn4/28vgbKPDOz4zfChv8AhNI3m8PY8Xaef7eRJGjd 7T97+/VXR0Jj3AMrA8g18ZfED/ggNrXieXwo+nfGi1th4TF/HaxXXhrUI1ihn1uLV4YIX07WLGeB IZoYm3RyiVpFD+YqhYl980z/AIJ5+KdN0/4fWg+J1jJB4C1xtTR28MsZ72E2N7AA7m8O67FzqFxc m6lEpd0gMkbyI80k3bpuaVnf4fK/fa9rP5NdhdeV9t+l7J272vdX9Hbc9zi/aT+HVxoPhbVY/H3g p9L8ckjw3eLrlqbfxARE0pFm+/bcfu0d/wB2W+VWboCapW37W3wpvfB/iLxDD8Tfh7LoHhBIpNd1 NPEVm1noqyxrLE11KJNkAeN0dTIV3K6kZBBr5Dk/4Ij61rP7LD/DXVPjh4mdbcXUmlz2Vx4gjttG nbS5dOtZIEn1ue5SKNJ53ltRdi2mLKoiiQOsmv48/wCCQvi/xV4y+IOrab8a7jw9F450n+znsbTT 9YNg5bT4NPdLuyOs/YZ4Ft43EQitre4jJiLXMvlt5ukl704ra3uvzts9nvp0VtfIF9h+dpd97XWt rW13burW2Z9VeFv2qfhf448QQaTonxI8BaxqtzfNpcNlY+ILS4uJbtbc3TW6xpIWMotwZigG4Rjf jbzXXeKPFGmeB/DWoa1rWo2Gj6PpFtJe31/e3CW9tZQRqXkllkchURVBZmYgAAknArwv4Jfsd+LP hl+1LqHxN1nx54e8Qzax4di8MXtlB4PTT3FraTySWBhmW5YxuqzSi43K6zuUZFtkjSJey/a5+Aer /tFfDPT9I0LX9H8P6npWu6frsEmsaK+taZdPaTrOkVzaJcWzypvVJF2zoVkijb5gpVlO1o8vVpPy XNZvpfT3rJ7e7e4oXu+fovvdr2XbX3btbrm2dks37bvwXt9ITUJPi98L47CSwtNUW5bxVYiFrS7m 8i1uQ/m4MU8oMcb52yONqknirE/7Y/whtr3xJbSfFT4bx3Pg2+t9L1+JvE1kH0O7uJTDBbXQ8zME ssoKIkm1nYFQCeK+ef2oP+CQdt+0Lp/iq6s/G1noPinXPDel+FtO1Z/DSTR6Law3k11qUkdtBPbx /aNQNzcJJKnlsiTOq5DuG80+Ln/BNf4m6d4A8B/Du0j8LePYtSk0nw5qOrR+CrKz8GeEvDelyi9W 3udFm1hLq+e9vEgFx5U7K8YYhItgSYjrJRf81vk29V6K178urlZe6lUHflbXa/3JN6d27qKTd7K7 958v2Va/tt/Bi+tNAng+Lvwwmg8V6q+haJInimxZNY1BHVHs7YiXE1wruimJMuC6gjJFdHoHx68D eK/iprPgXS/GnhPUvG/hyBLnVvD1rq9vNqulxOEKST2yuZYlYOhDOoB3rjqK+VfBH/BIvUfC/wAW fFGuX3xNtNX0n4m3Gnah48hfwnHFqmrzWchkSysrtbjy7DSSRChtPs80vlxH/STJI0p6n9ib/gnP 4k/Yx8W+Ir+1+I9l4jtNb1SW5SC/0rU7mSC2uLy4u7sb7rVbhIrqeSWNnltI7a3Zoy72rsVMbhbm ipdnd+elvk3d33to0nupN2k4rW6t5q7v80rK213e/Q+ra4Vj1/H1ruq4Vj/XuaRQjHr17+tRE5ya lbnP4+tRdCR6UkBjeKvBtl4oMTziWG7tMm0vLeQxXNoTjJRxyAcDKnKOBhlZeK4jxFpt74X1J9Q1 OaW0nVQv/CS6bDwyLwq6jbDIZAOPMAKKN7A2owa9PcbxjnIqIjGOcEdCO1CGcdp3xDOnfZotfS2s luwn2XU7eTzNLv8AfjZskP8AqmbK4SThiwEby8mumkhByMcjqOhFc7q3w5fS2uZvD0lrZi73m60u 5Qvpl/uzv3RgHyXbJzJGMMWLSRynAHPeHtSu/D2pjT9JSSyu40MjeF9UnwDGv3n0+45BjHGE+aNQ UUra5NAJnfm3VegwT39f8imGHHb8RVLw141sfFUk0ERmttQswDdWN0nlXVpnIBdOcqSCFkQtG+07 GYc1qMOCRQMqSQ4HFZ2uaxbaJbI87HfM3lwxRrvluHwTsRerHAJPoFYnCgkWNe8QQ6MYogBNeXRx b2ytiSbDKGbHZF3qXbBCg56kA49tYvbM19qEizahMgUhXLQ268ny4hgcAscuVDvxu4Cqq3GYt/4V i1m9h1TWIov7StsfYxBK4/s0fKWWOQEEliCHYBQ6nYV25DfmX/wWc/4KX6b+xn4amt/DN9YXPjLV w0FvJAgSTUyNgl+1RJiN4iQ2+dBG5PlxpkbifY/+Cv3/AAVc8O/sWfCi8SO6W81q+32tnZQS7ZtR nA5iQ/wxrkGWTooOBlmCt+Pf/BPn9hDx5/wWb/aY1X4h/Ea9v4vAtjdBdW1CLMX2t1G5NMss5CKq sNzDPlq2STI4JErasl9jU/4JefsD6x/wUQ+OFz8a/jc9/d+AftzSy3NxGfK8QXcZUCBiv+osoxwz 4WPCeUGB3bfu39o7/g3w+GPxn8Tz+K/gT4ul+DPxL0eRbmJ9EuW/s5JnTejeVGwktCykFXt2Cqpy ImzX158Nf2Ztf+Bekafp3hSysZdH02GKzsorS5+wPZQpCsSqBIsibIyu4K/mqN7bYwdu3pY7Pwz4 n1mSLSNW0/TtZEk9qkulhl2vnzJv9EYh8KGi3z2rguzEvtUEVN2x2Pzd0j/gqN+1b/wSX1m18Oft W/Dm5+IPgXzRa2njrQthldeQp89QsE7EDiK4W3nPLOxr6Pj/AG1/h3/wUz8F6r/wq7xpFfjQ7P8A tGeLy5LHUNGTYDJut5Dullf540kVTFHtkJLfuxN9W67r8GlfDaPSvF9gPEOkajF5F3f3rQXumX9s 0ZJLMI1Rt3yqI5o03tJhS4Ga/M39qz/ggh8L/H+t6frP7OPifWvhx8R4pXuBFHcTCwt03OHmlwBN Z8kxIYdwYjasRAkkROwzBufiT4I8Mftq/D3wBp1lBqHibU43MiIysmkWFtDPdM7hyQWkMZG08sCz MfuhvsuxOiy+LNIj1W+uY7W3uYZZUBJUw7181CqZBATtgEjjkA1+WX/BOv8AY58afCL9pfxx8SPi JeJq3izw5pmqnTVW+FxHrEnkPDJcfaOVMeGMYU/MuSWVAF3fQ9z+3nb/AGiE6t8Pr4Nlh50eprM5 RSVPUcEEEcEfe9xX5jxPhY/2g1Qja6TbVrtu+uvlY/Scgx9evgYxxE21H3Yp7JK2iW2+vm9WP8Yf s8ftcwHWLq2+Kvw81e11O9+0R20lykUKRuzs0ahIAQCzRAAN/D19et/ZM+F3x88PfHWyn+IOl+AJ /BWj2Fzc/wBoWlus0tteLaYgeNzlo2NyqEMo42gZxxUSftv+FZ57ey1XRfGFg8wGHVY1CuRu4cv8 uFIJwcEHPpXoGg/tA+GJ9Mj2ahqthDMx8pzaZuSR97JUlgQeMZxwRxtrxq2Lq+zcZQSvpfl/y6nX Ty2KmpRqS06X/wAz0bwV+y5e/EHxEml+HrfwtDrFvZ376I8rS2tlaXD2xKlxbnMcZdI1kMahmXjl lBHLeOP+Cd37SPgHQotQbwH8Dr+HQtLn09JNB8VajbstncQ3IvQqXcb5LfaZ1GDvImbDKQuPVP2G P2ivh54D8U32s3viWIWz2YtrYPbSRlGd1JOWUDG0L1OfnAx1r3742ftqeBvF3wxu7Xw/4p0O+vJZ IyYkv4VlUIwkHy7s4ZlRD6CTPQGvKljpwnyWvbumRjKNaVVKnomfHOq/s/aP4fX+ztG0zWrqC106 68O2EyTRoLe0uJp2kVEETA+cbibczYJ85+mM18g+Jf2yPgl4U8e+KdIfWtYgsdB0VvAMd5DpTzxr aR3MQdoAG+9P5FyWbJDLdXDBRv2r9pDxhqsesw3ml3+lq8JWSHyZld9yYYbiMBsbQQckHHoOc3xX oWm+IrFUvPB+g64sjJ5kd5YxiPJPylwMbgckA5J5PfJruw2JhFt1fev2dvzTNsXg6jt7Cyt3V7ny dovxX+F/7QXjuTwr4K8VTP4h8a+GdM8G6XDeWE1o9nbxC2fzCGJBkn+zFnKk4W6m4O/j1T4wfs0y eIdI8bW2iazYf2pr2jad4S09R9oP9mWdoIixB8oBpJvsttvYAB99xkASYb0jwr8O/AvgrxJD4k07 4a+DtI8T6Zn7Lc6ZpojubNguwfvAPvKuMYJHyjgjAN6H4y6f/wAJhpGgXkEkF9rMywwxJCnmJGoZ pJSxIfYihiWyemBk7q2lWvUXsYuy7tN/8NojOjh3GDde3yufOfin9h74paf8TNe17Q9IcfD20srS DT7YXcX23Rreyto4LO6MAberPHEDOVBUyM7hmI5/T74BfHSw8Rfs1aZ43MFzDqOn6UZb++E32iJ7 iKMvNbXLoN0ag7h+8QRxBhsbAGfTtO8KaVqOh2FsbSCS2so0+xsQQ9sAoAaNx8yNgD5lIPvUXw5/ Z58M+A7BrKytriTTzqL6nDZ3F1LNb20rMH+WMtsO1xvUsCQ3IOQCP0LK8mlg8V7elK8ZxSl6q1mv VXT+XmeDm3EyzDKYZfiI+9Qm3Tf9yXxRfo1Fr/t5dj0azuzeWkUqxbVlQOBINrgEZwR2NFTpF8g6 dKK+mPitDC+NH7ffh74aftjeBPgvpzWes+J9etL3W/EFvbzi4vdC0uCyuZ45RaRFriV55YQiBI2U YIYhpIFlju/+Cp/wQ0/QdD1a58SeIbbSPEcllBY6hN4M1uO0eW8tnu7eF5mtAkUrW8ZlaORleNXi LhfNj3QXX/BO2O+8ReF9Wn+L/wAWZtQ8OQaqtxORoaya7c6ijxz3l0y6aGE6xNHHH9nMKRpBEqoF DBqnhL/glb8O/AWheHND0TVPFeleFfBeotrXhvw9bS2cemaBqLWU1q17BGLfJl3Ty3QEjPGty3mq inINXkovra1vPV39Fy2UX31aV7KXZvTrf5aaX7vmvdLpom7XlqfDT/gqZ8DvjF8R/DvhPw14s1TV tb8UWq3dlHF4W1dYIw0csohuJ2tRDa3BSFz9nuHjmztGzLqGv+NP+Ckfwf8AAGraTYaj4g1xrzWI 7R44rLwpq9+1o90gktoLryLV/slxJGd629x5cxQM2zapI8Y03/gk3/whfxt0rTPDV9Lo3wesPDOg abB9j1m3tdY0i60mW/YCCEaW25Lpb6bzpzeJIGurl0RZGjlj7HxL/wAEmvDHiP4nWGur8Sfippui 6X4s/wCEvtfCljNpMOhx3DWhs5YGX7AZ5IHtj5QEkzSQKqi3eDArS2tr6XeveKkle3RtXa1l8Kv8 Xuy21fTotP7zi3v1Sdk9t3vy2fpHwR/bz+Gv7Q/ifT9G8L3vit9T1MaiYYNU8Ga1o5U2DwR3ayG8 tIhE0b3MK7ZCrMX+UNg4v+D/ANtb4ZeNv7XNt4kawj8P2mpX+qS6vpt3pEWm2+n3T2l3NO91FGsU aTxyqHchXEUjIWVHYeNeK/8AgjX8NviBrfhW88SeIPFviQeE/EGqeIraPU7LRLkvNqGpf2nMizNp 3n2uLnJWazkt7kq215nCptv6B/wSE+GPhOT4ly6VqHiXSrr4taNDpniK5sYtMtri7uor26vV1VpI 7NWkvfOu33NMZImRIkaIqgFQm+WLe9pXXnb3fk3ute17e8NrWSTvqrPb3ea0r7621T/DodRH/wAF Q/gobJJZPEmv2lw96tl9gu/B+tW2pKhWN/trWklotwunhZos35jFovmKDMCRWfrX/BXH9n3w5qmt 2WoeObuxvPDs2pWt/DP4a1aOSOewlWK5gUG2zJLvYLHHHuefDeSJNrYk+Hn/AATd0b4d/Gy1+IkX xI+KWpeMLpdnibUby808SeM0WRJII7zyrNPIihMUYWLT/skbKpWVJQzhsPxZ/wAEg/hj4t8O6vZy ap4vt73WNM8Qae+qLNZT30EuuXQuNUvUea2kX7TMipbFmVlW2QRKgXOW72XpK/XVfDa/LdO3k1zL +V3ate3mvud797NXXdOz11SXu3wE/aA8LftNfDuPxX4Nu9QvtDmuriySa90m80yUywStDKPJuoop cLIjLu24ODgkc1wvij/gon8IPBvxgvPAGoeJr+Lxhp+sWmhXGmJ4e1OaSO5uo4pIDlLcqYXE8C/a AfJEk0cZkEjqhxv2OP8Agmt4E/Yq+IXi7xX4fvtW1nxH4zyNQ1DULDSbS4kUzPOwkfT7K1N05kkZ vOu/PmHRZFUsDyf7Wn/BOzUPE/hjxZ4m+E2qHT/i5rXidfGEN5q+owWlhf3yaY+l28N7KNPu5Xsr W3ld4oY0V/MAImjZvMVVZNWcV01W+vNFWvZfZbd+XRq2q1ZSi5XjJ2d3Z+VnZtetlvtrpst7wV/w V3/Z++IuiQ6honjTVNQgvbX7Xp6R+E9ZE+tYm8h4LGI2gkvbqOX5JLW2WSeJgQ8a4NdF4X/4KP8A wf8AG1z4Sh0jxDrOpSeNJEj08W/hbVpPs3mXUlpC97i2/wCJfHLPDNHFJeeSkxhk8tnCMR5V4J/4 I+aTomkeAtQuviz8YIPG/gXR49Csdct9R0iS4sNMFqbdtMtx/ZiW8UQVpB9qhtob19wLT/KgSD4W /wDBDb4U/C3xz4a1+PxB411i+8OeHU8NedfwaMt7qFulpNaK0uoQafFfxt5E211t7mKKUoryRyO0 jPdVOMmoa2fpde8/Oz+FX1V23rFJvOEnKN2rXWnWz93fa+vM+miWqbaXpcv/AAVK+B6m8WHxVq99 JDsaxjsfCmsXkniWNvM/faOsVqzavCqwyu8uni4jjRC7sqfNXQ6b+3r8MdX+Gnjfxfb6p4hk0D4c 20F5r83/AAieriW0hmtI7yORIDbebOv2eaOQ+Sj7Fb5tpBA8H+JP/BCX4ZfGbS/DreMvGfj/AMX+ IfCkCadpmv67ZeHtSurPTEh8pNPit59KexhjX7/nQ2yXRkAY3BIGNf4p/wDBE74W/Ff4reMfGl1r vi/T/EPi+yey+32lrop1DTFkt47WUpfS6fJe3KyW6NGYb6e5gCyvtiUiMopbSS7Plfn0uvPZpPRp 6tWZd/ei7aXV1fps7O3TVr3dVbRO6PUdJ/4KQ/BvVdK8T3beKr3TF8Iapp+janDq3h/U9Mulu79w llFDBc28ctx57ECNoFdX5wSAa7345/tCeE/2cfCsGr+LL69t4b24FpZ2mnaXd6tqOozbGkMdtZWk UtzcOscckjCKNikcUjthEZh4FrP/AASA8Da94mtNduvHHxPuPEFrPoF62pXN9YXclzd6RcPcxXck c1m8JnmldjK4jBAJSLyUZlPcft1f8E7vBH/BQLSvC9t4wur+yfwjdzXVjNbabpOo/wCujEcimLUr O7hUkBSsscaTRlQUkTLZKq0fs9+a2u3L7uv/AKU7dkhUnr+82t0766df7vzuRfEL/gqF8EvhfbLc av4q1YWg0yPVbi5svC2r39vpsUln9tiiu5be1dLW6ktsSR2s5S4kDptjYuoOff8A/BWz4AadAs0n je8a2l1Kx0eG4i8M6tLBdXd7FPJawxSJalZWkNrcRDYWHnwtAcTDy6yviD/wSc8D/FJ/FdjrvjL4 mah4S8VT3V8fDEmqWx03T7y5tVtLi7jf7P8AappXg8xMXU88cfnu0aRsEZON8e/8EyvGGp/tk6dr 3hLx3q3gT4ZRsdadtG1DTE1XSNSj0uPR7a0sLObRZoYtPSxWVSHuGkElxvi8ko3mtWem17W8v5k3 6XSa8na75Be9pfZJ3830a8r2unqtr2vNew/D3/gpT8Gvir4o0LR9B8T6lf3mv3H2KNv+Ea1WK306 8w5FlfzvbLFp143ltttbxoZ2ym1DvTdY07/gor8H9Y8I6zrln4ovbzT9HvodOUwaBqUs2szTh2t/ 7MhW3MuqJMscjRSWKzpKsblGYKxHE/Db/gkj8N/hZLeafpuuePpfBElxeajY+ELnVY5NL0vUbu2N tcais3ki+uLp0aVt93dThZJ5JFVX2supef8ABOSG88A+CNHHxi+MUGpeBJp2s9dhuNIS/mgmtBZt b7P7P+y26LbARrJaQQTLl2EvmSSO8Sb5G18Vlb57p+ndXumnZNOJS+JJ7df8166adGmrtNSVnwN/ wVU+BHxAsPEl3aeM73TrLwnoEvijUrrW/Deq6LbppkcphkuopLy2iSdFlGw+SXIbC4yQK9d8WfGP RfBnwqPjO6TXrnRPs0N2qaboN9qWoSpKVCBLG3hkunc71yixFxzkDBx8q3P/AAQy+GWpfCLTPCF/ 42+Keow6X4SufBq39zfac1xc2cskLLJNGLIW0s0S28SIzwlSV811ecmavoL9oz9mP/hpD4IDwHe+ M/EWi6ZcxLb6pPa6ToWoNrkAjKPBc2+o6fdWjRuSHYJAnzKANq5Uk21SvHWX4fFL/wBt5b9tbc17 RUNaiUvh/HaP/t3Nbyte1rvlfD3/AAU1+Dfi+/sLXR9d8S6vPqFtdXCLY+DNbufIltreW5nsZylo Rb6gkMLubCbZdkbMQnem6xaf8FJfg1qfgrwzr1j4p1DVLfxjpV3rWj2WneHdUvdWvLS1mW3uJP7P it2u02TOsRV4gxc7QC3FeZ/BX/gi58Nf2evHN5r3hLxP460m7v7W20+d410n7VcWUccMU1nNe/YP t1zBPHAqstxcSeTndbG2ZUZNT4af8EjPA3wj+J+jeKtC8Z/Ee2vdHt9VtTBJdafPFdx3979uKO72 ZmjSC5WGWKOCSJA0I3rJvl8yqmiXJ2fydnb1TfKumzva6sRu3r/w+q+7Tmdtd46uzv29l/wUj+EG p6R4MvbXXfEN3D49EDaWlv4Q1mWaJbi5a1t3vIltS9gk86SRxNeLCsrRSBC2xsc/4f8A+CvP7Pni y3sX0rxxf6lNq1gt/p1pa+FtYmvdTBZVNtbW62pmnvFDq72cSNcpEyytEsZD1zXwx/4I0/Dj4W/E zwp4utfEnjS917wd4ZtPDGnX1xBo0d9HFa2720Ey3kOnx3cTLC+1oIZo7WXbmS3kZnLRT/8ABGrw VoXj3wR4h8E/ET4pfDW5+HvhOLwdo1v4bk0dbeCzX7QZpMXOnzsLi4NzI0sysrM21gVYBqbS5mlt d2/w+9Zvs7qLdk9JaaoHe2nZffePN+DlbXeOrs7nc/FX/gqX8Fvgv4I8N+JNe1vxauheLLH+0NPv bDwHr+pxLHiQlJzbWUn2WZfKm3QXHlyr5Um5BsbHpvxe/aH8N/A/4cW/ivXYvFM2kXJQING8Lapr d6AyNIGa0srea4RQqkszRgJj5iprxL4wf8EmfBHxh+GWk+D5/F/j/SPD2g3DPp1pZyabOlvbf2dc aetkwurKYTQiO8u3Jn8yWV7mTzZJVOwZ2qf8EdvAN5+zJpXwgs/FPinRvAVrez6jqmmWGi+GooNd uZZFk85ojpRisXQr+7bTEs2jZjIpEuJBNm7q9tVZ9k7bryV7tPWWijZ8yd7OLfZ3Xmuz83smtnq0 1aXar/wVL+BM1wVg8cPeWsluZbTULXQ9SuNO1eUNGv2Kxu47cwXt/vljT7DbSSXW8lPJ3Kyh/jT/ AIKd/Bj4feAdL8Sar4g8RQ2Gq2st6ttF4N1u41Oygjne2aW7sY7RrqzQ3Ebwq1zFGHlGxdzkKfMP iX/wQ/8Ahn8YvB0GheKfFvxA8SadoV/Je+FLfWo9F1W28HCW4eeaK2trrTpba5EpfY0moxXc2wAL KpyTa+IX/BGjwt468Jf2Ba/Fn4y+GdCew0OzmsNIudGSG4fR3V7OV/N02RtqkNm1BFn87bbdTgiZ OTheKtK608rb37p6W77XTuiK95KW1tWu+my7bvpp2as/Uz/wUc+DifCa48bv4qvI/Ddpb6Xcyzya BqSTqup/8eS/ZzbicyOuHMYTfHGyvIqIQxi8Z/8ABSX4QeA/G9z4evdb8SXGpWOqx6Jetpvg7WtS tdOupLhbWNbm5trSSC3R528pJJXWN3SVVYmOQLxXg7/gkT8PPhV8GvGHgXwLr3irwDofi/xBpHiY poNpo0H9lXmmpZLG0Eb2DwusrWEMkwuI5vMkaRsguaxfD/8AwRV+HeheHdHgm8Z/ETW9e8L+Jv8A hKPDniTWho+p6t4bmN9LqE0Vo0+nvEiz3U0kk0zRtczfu1edkiiVNrR9qtfcur97Plu/Nq8lsr2T 02cNy9k2vjtp2uub7r+7be13fy+xK4Vjn9e5ruq4Un+vc1BYHqfx7mkZQ4/+vSnqfx7mg8j/AOv7 VNgIW+XPqKbKmeR0NTSIHPv9faowcfQ0eYEI5XB4P1rO8S+FbDxdpxtNQtY7mAOJUBLI0Mi52yRu pDRyLn5XQhlPIINakiYz1pjEHJqhnm/izwrfaUsDajFf+I9PsiWtNRsyU17R89SpjwbhMDDeWBIw AVo7jcxqg3xkuvDemwuXg8XWNyrG21XTlb9yFLAm+jiRzCoKspmjQruVwYotuK7rxD4jf7XJpume TNqhQM5fDx6erq5jmmTerFCyEBUO5j/dGWXltV+FUGnahc6xo9/PpPiK7O+6vyPPXUSCxVbqIlRM i5Kpgo8a/LG8akigLmnoH2ZtOXUY9Qj1V9RQS/bUcNFcIR8vlgEqseMYCnB+8SzEsfkD/gqj/wAF OPDH7E/wi1O8u78m9ObaKC3kAuLycg4tof8AbPVn6RqCevTnf+CiH/BQLRf2IPAmuardXTeD/EMa s9xHaZvNK12ZgSI4F+Ui8k7n9zKuCzmaOPdX4b+CtA+Kf/BdT9uix02S8g0eykc4aWQyWPhbTslm 2A7TPcMFYhRh5nXnZGhMT21Yr9jof2UP2Yvid/wXV/bKvdd8SXt1pvhLTJEOtanCpNvolnuLR2Fm Gypncbtuc4y8r56N/RJ+z5+zf4X+AHw10Xwl4Q0a10Pw7oNuLWys4AdsSDJJJPLuzEszsSzszMxJ JNZP7HH7HXg/9jz4LaL4E8E6aLDRdHTJZ8NcX0zY8y5ncAeZNIQCzYGMBVCqqqPeNK0gIo4x61m3 cpIqafpAjUDHGOlcz41/Z88O+L/ER1xrKK118Ikf9oRKPNdFJwjA8MMMy5I3bWIBFejJaBAOKSW2 ytIZ4DF4F8XeHvGMWmARS6bJFM8uteYfPlO4KizocpcyeUkas8secHCNne4+fvij+ztr3wb8M6oN L8Qah4esr3Tp5vEGrpPJcWd0Q7FIIUnmdtPURgrv4hgjLZklkcyL92X9nv4Azntya8f1XTf+Fya6 txw3hPSLjfb85XWruNuJve3hcfJ2klXePlijaSGB8C+FfhzGfh98U/F/jRPE+l2+k6QiWFtpUVvq Ey2N01oVuEgRbeMyNI4ADeXsiTGyNvM3eXal+zR4En8Ytolr8RriG6l8SQ+Fo7fUvC9xCZb6/SRk gVonkXCvGyu+MKzAdDmv0fl/Z7sJPFXjDVml8Q6fYz6RZl49F1mfSXmuI7oqh3xHKja5JCgbtq7s 4Fef6hoMEU0s13qnxJ0q4t7gS28w1221phIFRhMDdWocMr7gNzFsKDuGQB8BneCxdbGzqYeLaVlu t7J9U+59RlWPp0KCpynbV9GfA2s/s1aZ4p0zQ7/SviZ8OdSW5sX1VDdS32nSXNtYpKLycebbgBRH G/JI3GNsZPXS+I3wu1P4NQWOn6v/AGfPFqFlBrGnzWlws8FxbyoGjlRl+UqduVxjjB4AG32D49fF HwFpl7qHglNYv/8AhIJtI/s+y/tvwJpH2S4gnlZ3hWe2kWRBl5WIKgMxPI3GvXP2o/2Jbn4m3Hgq S01Wy0+00vwbo2nraPaOIwI7RBldrMoHPCnOMY3HivlsU62HcY4pcvr/AMMj6bB4+NSXuyTTPibw Vq8NnY3a2yuLdSN6u+WXOCRlupDFhgeo9SrT6RqkNh4kLQzyuHBieLJZgoVQrAZyTjIPPJHJz81e 2x/8E6vFWhzzmz1Pw5PDcqQ5+0TI4YnkkNFgjv8Ae9s1haj+wZ490jVIr630y3u2QgGOPUYSerHI ywzye3Tr6Bc3WwspStJao9JV3ZaniHxJ0g6vZTrBdCK48tlAGQd42hSDxwNuT+Y9F4+8iutT0iO9 0fXNc04XNsk/lxanMm0gqJ4zz0UcDg9+oXDe8+Ov2O/iBOxI8Lax8pBHkwicMMNtGELjdluRk46E YyW6L/gm/wDs832q/F34nWfiTTdPgbw54a1G40vT9f0x5oTqEtvLLbyMjo2Y4xE7OADnKjB3AV1Q r040lNO9jDEVlFOT2PnT/hL/ABvZ6fbpZePfFUNwkphZZLwyqC2GRsNnIIwme7ceuJf2Ofij4k8M ftqeDtU8W6pf6sNbc6bJIyK8sSuDGURBhd6EgoOF3AEjtX2DeeD9G1TVb/Tl0n9nS5t7jWdM0+yu WmbTmTTURxdX00SzQ/vWk8qWOGPhN8q9ApOZpn7OOg+Mdf0a6vPglp6xSavqOpySeHfG8txPptpa xLNagYlkEl5O4uECgKm7ySceadqhjKajOLja/pf9DhrV+ZK6Z+i/wh1NtR8F2HmNE0sCG3kaKQyR lkO0lWwNy8cHvXfaceB/jXn3wihA8F6ddtZ32mT6lCt1NYXeBJYsw/1eAqhQAMgAABSvA6D0HTOc d6/UMnqSngqUpb2X/AfzPz/GWVaVu5rKF2jOPzopyAbBwOlFeqch866z/wAFh/FdhbeKLqD4NWMm m+G5fGSRX0/i+SGDV08Ps0fn23+gM7wSz+RBJLtCxS3cKxm6xMYq1/8A8FnvEHw8+J3ibRPiB8It I8JaZ4M8OXfiHXb+Hx5DqcmjyQ2lvMmmTRxWuz7eZbuzheKOWRF+3WrRyTGRkT3f9q3/AIJtfDL9 rbwh4e0XVtKsvD9t4cvRcQyaToOjySzWzTrcXGnsbuzuAlncyohuIohGZwpR2ZGdW6TV/wBgT4E+ IPDGhaJf/BX4S32jeFre5s9FsLjwhp8trpEFySbiK3jaErCkpJ3qgAfJ3A1UYvks3ra3Tez99aWu 21dWa00SS95XSnfpzN28rr3e+lmr763vd2j8s/tG/wDBR3xR8L/ip4P8bReF5NN8MaVq8fhDxLZr 4wa5udfvfsj3F7ZaZpH2Yx3RtJWWMXrT2UjSxshR4du/T8Xf8FjvEHgB/GGk6r8KNOufFnh/XI9B tLLw/wCIdS8RWS3C2Rv73+0JrDSJprMWlu9qkzRW9yqXF3GjMsQa4H1DP+xX8G7rVdevpfhL8MpL 3xVpiaJrVw3hexMusWCLGiWlyxizNAqxRKInJQCNABhRjLtP+CevwCsNOhs4Pgd8H4bS3vbbUYoI /BunLHHdW0Zitp1UQ4EsMZKRuPmRSVUgcVTT5XFO19dtm3Hmtd7aSaTvrLV6OUs43TUpa6W9bJ2b 8/hTtZWjdJJqMfj7wl/wXk8Xa78PzrVz8BLNydN8S38b6P47Gq6fINFeGOaYXaWCo1oZJTG1wgbM irHBHdSMUT9FfDl/dar4esLq9szp15c28ctxaGQSG1kZQWj3AANtJIyBziuT139mT4beKPD95pOp /D3wPqOlajYNpd1ZXWhWs1vc2bTG4a2eNkKtCZiZShBUuS2M812Gk6Ta6BpVtYWFtb2VjZRJBb28 EYjigjUBVRFXAVQAAABgAVd1y7a6fnLbbdct731vay3XLLmvfTX8bW+7Velr3e3wL4q/4La+JfDW peJoovgiurWeiP4vFnf2PixpbW/i0C5jt3umf7CPKtndyjv87LKBDCl3LuRdX4k/8FivEvhaBb7R vhR4f1DS7vwzrPiaxj1DxvJbard2+l4imm+x2+nXJFtPePHbWsoctOz58pBtDfWuu/syfDbxR4fv NJ1P4e+B9R0rUbBtLurK60K1mt7mzaY3DWzxshVoTMTKUIKlyWxnmuU8G/8ABO79n74dXtvc+Hvg X8HNCuLR3kgl07wXptq8LPs3spSEFS3lRZI6+WmfujGUYy5FFvW1m/O0kmlpb7Le6vdJJGkmufmS 0ve3ldO1/JcyXfRt3PGPiz/wVS1v4NfA3wv8WNX+Hvh5vhn4j1yDT1uLfxTdy+IHtJZFj8+DSRpn mzXMYS8nlsy8csVvalmxL5tvDj+Fv+CxWreLv2fLD4qWvwc1uTwbrif2LpccN3e3OuyeJVuI7aTT ZtKisHu1to3NyzXMSTTeXYXDC0JMKzfS8/7GHwduvGereJJfhP8ADSTxFr1vd2ep6o3hiyN7qMF1 uF1FNN5W+RJtzeYrEh9x3A5qHX/2H/gt4rHioap8IPhdqQ8dTQ3HiQXXhWwm/wCEhkhbfC95uiP2 ho2+ZTLuKnkYNWm9brdp+i0uvPS7UtLO14taBokurW/nvZ+V3a6u9Fo03dXP2TvjVqf7RP7Pvh3x nrGiab4dv9cSaR7Cw1R9SghVJ5I0Imkgt5MsqKxjlgiljLGOREdGUfPn7bn/AAVR1n9jz4oeLNNj +Heh+JfDHgvTtDvtS1VvF7WN40up3c8CWUNobKTzroR28syRpKd6Ll2hBDH7A0nSbXQNKtrCwtre ysbKJILe3gjEcUEagKqIq4CqAAAAMACvDvhZ/wAE8PAvgL43+NPiLrz3HxJ8Y+MdRlvo9T8WaTpF zdeH45LVLOSzsJoLKGWK1a2iiiaNnfcI8sSzyM6rXlNulotWr6+ST69b3vpbrs5p6U7VNW7K66d2 unS2z3+a+X7/AP4L0TX3wwvfEUvwe1DR9H1qdW8NtrXiCfRbq50pNMm1S/1C/ilslmsFt7OJSjRL cxXMs0aQTuuZV5f9gn/gp34x+C37MOhfDPxj4U1bxL8WtFvbfRzf+JfHUlxZzzS6Udd1GfVtWnhl azi061kCyhReOge1QFnZ1j+rf2lv+CTnwX/aN/ZjtfhLb+FNC+HfhLT9Yi12xj8I+G9Gtm0+7R9x kgjuLKeCJ5Puu6RB2UspbazA+h3f7Efwc1X4b6L4Q1D4U/DXUvDHh6+bVdO0q68LWD2NlesWZ7uK DyRFFOzO7GREUkux7mnZfvOXS/La+rVrXfRNO8tNHfZpWsnze43Z25r221vbe7X2e+2uz5vlGw/4 LS+Ltb8O6DrGn/BTS59P1XRPDOqSxzeOGt7w3Gt3s1tb2NtC+nj7RNJHA1zCN0ZkhZGlW1zxh6z/ AMHDOj+CZJrTX/hXrH9p6L4o8QaP4gg0XWU1GPTLDTLT7TFeRu0MRmmvPMtkhtise0zr5kkeY/M+ kPDf/BL34WyfE3x54u8eaZafGTW/HuovfSTeO9A0XUm0WNreO2azs2jsYnjtTBBAhjdpN3lBiSzS M/ffFL9ij4NfHGysrbxr8JPhl4wttNmmubSLW/C1jqCWsswQTSRiaJgjSCOPcwwW8tc52jEtO9+j T07NuLSvbXlSlG9le+uq5nXW3p+EWm7f3pNS30ttZuJj/sS/tL+Iv2ovh94g1fxJ4R0bwfe6Fr9x oP2fS/ER122uHt44hORcfZrcborhp7d1CsBJbSYY15R/wWY1/Vr79n7wN8P/AAv4l8S+FPGfxa+I OieFdH1Pw/rd7pOoWKvOZ7ydJLSRJGWOyguiVYmP7pYHAr6K+Df7Ovw+/Z00y/svh94E8G+BLLVb j7Xe2/h7RbbS4rybaF82RYEQO+0AbmycADNR/E79mj4cfGzxX4f17xn8P/BHi7XPCc32jQ9R1rQr W/u9Gk3o++2llRnhbfHG2UIOUU9QK0moSnTbWicHLz5WnL/wJp9dL+VhRclGeurUkvK91H/wG69b eZ8beMv2ir//AIJz/tCeNPCfgvwr4s+I+heT4Wa4l8VfGTVdWuor3Ur25tIbGxg1KG6k+1yLG83l Jc7HWNC/kD5jc8Qf8Fsw1143vND8E+EG8MaDpOq6noOo+IvH0ehz68NPuZbdjJbtaSG3iuPsOrS2 zK80ksWnM5ijVmMf0D8G/wBgHwb8Kvj/AOLPijqd1feP/HfifVX1S11rxNpmkzX3hkPbR2jWunXF vZwzQW5t4oYyjO+4RZJLPIz2n/4Jv/s7yeL4vELfAX4Ltr8F4dRj1M+CdMN5HdGXzTOJfJ3iXzCX 3g7t3zZzzWVpuMby1s79bXXurpfke2yaVmn8Ra5IuVlppZenxPr8XzavfTY+a/2aP+C3mrftkfE3 TfCfw4+BPizUNUOpRnWjrd5NoEWj6On9nRX18r3doi3Fxb3V7NH9kjO50sncyRtJFE/GeHP+Cw2v D9qTxtrek+FtT1z4deJNHsLLwbpD65vuNS1mXWZdIsLiRHtwNLtb4w3Uv+tnAttNe5MSSO0cn3l/ wyr8L/8AhLdE1/8A4Vv4C/t7wzeXeoaPqX/CP2n2vSrm7cyXc9vL5e+KSd2ZpHQhpGJLEk1Qk/Yr +DcvgrWPDTfCX4Zt4c8Rap/bmq6UfC9ibLU9Q3Bvtk8PlbJbjcqnzXBfIBzxWja5oSSta910d7LT tZXave0tXdcqhnZqE4Xve1n10d9fV2TtZ8uia15vkL4xf8F0dQ+Cfw6+H+u3/wAJYdcl8f8AhbxB 4ktbXw7r97q+0WF5Faafh4dLIFpqElxbbLyYQxRCYbtx2h+8/aA/4Kq+IPhRN8QtV0L4Z6Drvgn4 X2mqQ67rWpeOYtKuG1TT9LbULi2trIWs009ujNbWzzjEiyzkiBo0Mh90tf2CPgXY+Drnw7B8FvhN D4fvbQ2FxpieENPWzntjci6MLxCLY0f2lVm2EY8wB8bhmtK1/Y5+EVlqOvXkPwr+HEN34qtYLLWp 08NWSyaxBAEEENywjzNHGI49ivkL5a4A2jCavFrZ2l8m23Hf+VaebSfRqVp2adrpNX81ZX16O6dt HZNrVtOHyH41/wCC501h4Pm1Tw/8M9NunsPC9z4m1NPEHiifQV0MWJSHUba8R9PkuYZ/ts8FnaQm Dz7qXzi0VvEsUk/ceM/+CsOpeHNZvJdN+GA8S6Dt0/QrGXTPEiS6gfFt7PbwR+HrmL7P9lglikkn NxIl3M9slm7Swp5kAl+iNc/ZG+FHif4n2njfUvhj8PNQ8aafejU7XX7nw5Zy6pbXYSKMXCXLRmVZ dkEK7wwbbDGM4VcZWrfsGfAzX28Vm/8Agx8J70+O7hbvxKZ/COnyHxDMspmWW83RH7Q4lJkDS7iH JbOead9U2vVfPp12fXaSUtU3AjlaVr3a6230W68mulrxk1o0pFT9hr9qa9/a++C114qvtA0vQpbP XdR0MNpOstrOk6p9juGt2u7K8e3t3nt3dGCu0EeSj4DLtdvO/jb/AMFKJfhV+25N8DrHwfaavrmo eHdP1DQtQn1a4s7G51O9uLqOHT7yb7FJBZKYrO4mV/NlllWF1it5ZAEb6c0HQbHwrodlpel2Vppu mabAlraWlrCsMFrCihUjjRQFRFUABQAAAAKwtb+CPgvxLqGpXepeEPC+oXWsz2V1qE1zpUEsl9NZ OHs5JWZSZHt3AaJmyYyAVwad17SD+yrXXdWs/R397R76bDV+SS6vby1ul0ure70dtdz4P+Mf/BdJ Lfxto/hTR/hdd61pnxUutU8OeC7q18XNp+rajcW10LBtQuYktW/szSXuBciK/M7zlbV3W14wD4Y/ 8Fd/Gnw//ZE+B1rqPga8+Jvxh8f6I+quq301lpU2lx6gllBqdxqUdi0VuLtZYZonuILaBwZN0kDG ON/sS7/YW+COoeHvEmkT/Bz4Vz6V4y1BNW1+yk8J2DW+uXiuzrc3UZi2zzB3dhJIGYFmOck10fij 9nb4feN/HPhvxRrXgXwdq/ibwaCNA1e90W2uL7QwcZFrM6F4M4H+rK9Kih7qj7TXVX84pPT15nv1 S2jfQq3d+Ts7X7tr8LLbpLdyWh8e6N/wWzk8VXevaPo3w1t9R8WaT42vPB1npr+IpbKHW8X8umWF 1aXFzYxrOk99FKkxjVorWO2uS0skyw20+5oH/BWPxNrXxY8IeBG+Fnh5fFN/qdhpviVbfx5Hd6fp jX17dR2w064is2/tKT7DY3eoSoUtvJhRFY72ZY/ozxl+xd8HPiL4UstB8Q/Cb4aa7oemxTQWmnaj 4Xsbq0tY5p0uJkjieIoiyTxxysAAGkjVjllBqLxX+xF8F/Hni/TvEGufCH4X6zr2jx2sNhqV94Vs bi8sUtTm2WKV4i6CE/6sKQE/hxTouyh7TVprm/vRS19G3du1t1ayXvFS7c+TRNO3k23bXqkrLZPT W99PUK4Vj/XvXdVwrH39e9AwPU/j3o6j/wCv7UE8nn170hPX/H2pWAXPP/1/amyJuJPf607PPX9f ajOD/wDX9qTAgY4XB/Cue1vWrjUb+fS9JkVLuL5Lu7ZQ6aaSgZflOBJKwKkJ0UMGfgoskl5rk/iW /e20idYre2kMd1qC7ZAsscih7ZFJ5fAdWflYyMfM4YJf0rRrfw/pkFnaxiG3tk2RruZsDqSWOWYk 5JJJJJJJJJNNDKllpcGgWIggV1Te8h3ytIxZ2LMxZiWJJJPJ9hxxXg37f/7Xug/scfADVfGHiDVY dIs7Vdn2hxuce0afxyE7VVRklnWvfdVYqG9c9zXyl+1b+yN4W/bn16/0L4h+HrXxH4P0qI2sFtKc OLhlPmTxSD5oZVBCLIpDKQ49RXk5vm0cBQVZwc22koxV22+3orv5Hdl+AeKqOHMopJtt7L/h3ofz r/FX4jfFv/gtp+1/BpHhvS7+7hhWebS9JV2kg0WyXBmu7hhkGQjbvbqzGONASUU/tP8A8E+P2R/D H7GfwWTwDoukQ6/aXd0DrMWoWpiuNavkt45Tcw3UkUUe/bylrcFWTaTHMFAL+v8A/BMv/glj4I/4 JtfCa50Hw55msa9rM3n634gu4lS71IqW8qPA4SGJWwqDjJdz8zmvobxF+zr4T8e3K3GsaFYXdzuV mmKbJZNuMBmXBccAbWJBAwQRxXp83NqcdrOxz3w91O+0yyll0ae88V6RZyeVd6fdsY9d0h8A+W3n bWlwCDsn2S7csJJtyqfUfCHiTTfF2lm6026S5ijcwyrtaOW3lGMxSxsA8cgyMo6qwzyBXzvd2/jr wR8XLe11/T4Bb3OxNM1rRXFp/ZUJkMcVhbuYz9pLMQTbXCshPkkD5pJYPQ7vxLps+rT3esapp+na ppm20bxdoE6G2jGSVgv4yXEC53YS48yAE5SVJGCqxHrotxj/AOvTJYdv/wCvrXMRfES58GOsHjCG 2sYSQsetW+4aZPngeZuJa0cntKWj5ULM7NtE3xB8UX0N/b+HtCaP/hItTjMolkTfHpNsDte8lU8N g/LHGf8AWyYHCJK6A0c/44eX4k69c+FtOlmh0602jX7yByjIrKGWxiccrLIjBpGB3RxMMbXljdNi XQoLGzjt7eCK3ggjEcUUSBEiRQAqqoGAoAwAOABW14V8HWXgrw9Bptisgt4NzF5XMk08jMXklkc8 vI7szu55ZmYnrU11Zh6hgcHq+jO1rPCrOsU2PMQMQr46ZHfHbNec+NPh/HNE3yc17be6bkHoa57W tDE0bAgEVi0lqjRM/Mv9sn4V6fo/x80TUL3Skv473TXtkDHb5UiOzCToQSA2MEYwfavq340+AdM0 n4x6Jcjwlp0Vxp+labB/akaxC8sgllCFUHarttHy/eGMDgdBh/tw/DS+vdD07VNLW4guNInklku7 Zyk1vEYyGwwIOG4BA613n7RUkdt8c5oXtvE0I0+O1MN1HOotlK2UQ+ZUmDsTyMGIjcQeg3V+bcZv 9/FX+z+vqv67n0WTf5/p5M8abwNpNmALfT/iXoyj7wtPEV5FFj0CW18wI9ilS29jBZ5Fv44+JWkq Onm2E1wgPoXubKUfm1b0vjbSbbb5154rsn7mbRLq5x9XEMo/U0wfEzw9bud/jTSbdh21NUsz+TrE a+WUZSXf7/8AKR7LcV/X/DGLZ+LvJtdYT/hZGmahNZ26yPLrFtaQ/YV8+JPMZYltgykuI+cDMo74 rtf2RxqSfGzxU4NpLPLoUrjULMtHbzMLSTa8C732PnGfmbhG+Zc4ajpfiCXxFc3Uljq/hbWrRbX9 1FY72khl3qPMeRJ5AY8MV2hFO51+b+FtL9jiygi/at120k0me01OTRnluTG4+yLm3ZfOUEBtxyI8 EZ+Zjzjgw8ffaaW67eXkn/WxniH+6evR9/8ANmj4e8T+I9TZRf3NtqYAx/p+n293x6ZkjY1oaL8K 9J8c/FDT9M1vwD4G1bQruAXdxcyeHbYHTo7Y75uY1UgyIyRp6O46gYrsvDXhFAqnZjOK7HSdC8hc AYz74zX67WyjC1abioRTfWyufJLF1ovST+8PDOlQaZaQ21pAtraW6CKCBGJWGNRhUUnJwoAA9gK6 3Sos7eT07GqOnab5eK2rC32AZ4x7169OKilGOyOOTbdy2G2gD5ePein8DsfzorUjlPzI+Fn7I9n/ AMFXf2q/jZ8VfhtafAmHw/N8YNNNv8StO1P7V4s0iDQILUlNOjtrXYhv7iPLXZvxvgmLeRIFQN5R 8Orf46ftxf8ABXi81N5oH+P/AMEdFgsbu5VPA76B4UvLnUGe5Tav2rU5tMt7QeTHtM1/59y6vLp3 msD+9NNmhS4heORFkjcFWVhkMD1BHpWlH9y6Thqqa2fWXIoOXldLVJfO925rfvI1IvTne/aPO5Je dr9X8tkuV+DHxr8O/H7wW+v+GLu8vNNh1C80qV7rTbnTpY7qzuZLW5jaG5jjlUpPFIhyuCVOCRzW Z+1P8dY/2Zf2dvGHj6XTxqieFdNkv/szzm3ikKjAMswR/JhBIaSXY3lxh3KsFwew8K+FNL8CeGdP 0TQ9N0/RtG0i2js7GwsbdLe1soI1CpFFGgCoiqAAqgAAAAVfoqK6ai7ef62/T8RwaUrtaX28u1/T r13stj88vhz/AMFQPiR8SPi/Z+AdK8afAPVLjWrsXnhvxemkajDovjmBDBHcaXo9ul9NLfSQyyTe bqkMrwQrCS1qQHZOn+Iv/BRX4kfDjwXraSXXwvuNc8EeMP8AhE/FOoX1jc6XpOnCfVLZbW6Ob2Ux ldLkluZYZJOECzmSNTHDP9n/ABA8CaZ8UfAeteGdbhmudG8Q2E+m38UVzLbSSwTRtHIqyxMskZKs QGRlZeoIIBqp4K+Fei+Avh/p3hi0ivr7SNLCiEaxqNzrFy5WTzFeW4u5JZpnD4bfI7NkA54FVF2c W+n4+8vmrQTit7t8795PmUtYtd/wsn995Pme1uVRWj9388vi5/wcCaZ4N8E2t7pMvgafUNZe7Wzi v9Qt9NS0S41Mw6SZpL+8s7cXC6dFcX9zay3EDj/R4i9v54lHo3wO/wCCiPxE+JvjTwx4Z1XxD8Id A1/T9Fj8R+JbG+0PULfUta06c3MourGzW8lazt7W2hhMlzJJd21xcStBFMgEc0v2Lo3wi8O+H/iR qXi2005YvEGrWUWnXFz50jL5Ecs0wRIyxjj3Szyu5jVTIxBcsVXHSVnyv2XLf3r7+VnZW9Wm+rtZ u/vFN3qN/Z7dbu138tVFWdr38j8p77/gs/8AtAfDv4Ox+LPGPhr4T6dZwaH4Y1S/mks7vT/s0+rX 0ix2Qimvi32qexRZ1hZl+zIRJI8rstpXQ/Dj/gsr49+LP7HvxI+Itt4o+Ceg694dspdf0/SGsYte j0+xtrN7m6hnnsNeeC7AkksrZboTWrLLN++s4S6If03oq5aqa735e61vr0etlslyqySu25hdSi30 tddHpay1ulu9W3zO7bSSX5e/tQ/8Fi/in4AvdF1DwF4l+B+veEdctJNP0rxAmjnUtG8Ua3BpDXMt lp92Ndt5biaS+MVrHBb2txEpkCve+essEU2v/wDBZ/4n3uqaZdaMnwdsI11s+H/F3hrVvOfUvhj5 WpR2Ml9rN/b3r2cLSFLqRLBgjLDHJOtzcJbyK36eVBqOmW2sWvkXdvBdQ70k8uaMOu5GDq2DxlWU MD2IB6iquua9tLp2/Nej1XkmrWcbuOV8ijfVK1+/m/uT0tre907HwbpP/BcPwvPoOqaxNf8Ag422 maHrWvrYzXp0+e6QXzR6NaGWZtsNxJZRyXd2roWtImR3RFya8X8cf8FrPi7/AGV8UrjwP4s+Anj6 y+GQS4v9W0Lw3cT2FpC9rBMs08l1r1pCLFpLuKGO9WcvcG3me3s51Ev2X9PdG+EXh3w/8SNS8W2m nLF4g1ayi064ufOkZfIjlmmCJGWMce6WeV3MaqZGILliq46SslF6Xeyt87tp+luVNbu3xayvrze8 3bS9/lbVffe3S1rp2VvgD4a/8FVfE/xu+EuseLPB3jH4HeI5/ELRaR4L8OaLFc6rq7ar9p8swyFb yOC9mktUkvDaLJaGzjMf2i4WAter79/wTO/ag1/9rv8AZcg8XeKNQ8I3uvprWp6XeR+H4ooI7I21 3JCkNxDFf36Q3Plqjui3cqjzFwxBBP0DRWqklfTdf5P/AD+TS6a5tOyV9n+lrfk/W766eBf8FKf2 xb39hz9mG58aabplhqGoXGp2ej28uo3tnZadpjXMmw3dzLd3Vpb+XGMkRyXVuJX8uLzojIJF7L9j r4m6/wDGf9mLwX4t8TXGj3Ws+I9OXUJZtKsHsbSWORmaFkhe4uduYjHnbcTRlsmOWRCrn0uiphpG Slq2015K1rffd387dEVPWUWtEk7+bb3+6yt6vqzxj9u349eJ/wBnX4KWeueDdPsta8R3fiDS9Nt9 Knt4ppNThmukF1FD515ZxJMtqJ5FeWdY18olgVzXxR4v/wCC7Gqat8IfCWr6F4q+CXhTX9d07Q9U /s/xAJb6fUv7bvfJtYIoIb6L7PBZwyQm61CSV4DNuhCRtnZ+n1FKmrP3tVzJ/K1nH5vVPZbOLTdy eq93R8rXzvv92ltH/eWlvzp8Sf8ABUz4reMPHGi3nw81X4Jan4b1bxVd6Jf6Hc6bqVzqnhG1sob6 W6l1O/iultoJlhtFuJYGhWW1E0UJS4aWORuL8K/8FuPiLbeJvDvhj4h6r8CPhRrHijwnpOt/2j4h +0JFoLXUd7cedcWYvg0slxDbQ+Tpyzo6/aFJupH3W6fqVRUwi1FRbvt+TT87PRrqtbuT5XFzd5cy 0/SzTXlto7p38teb81f2gP8Agrl8V/hh4B8E63Zt8KNKjtE0ix8f3Ovae9tpmganeXBH2a+uJtVt 5NIkNoon+zJDql1D5yieKNfKkuLHhn/gu3b6b8MbbUvFmo/D2z1iHTNEk1KOzMpis72Yz3msIQ03 yxWOnpBG0hfZ9um+zs4cGMfpFXKa98D/AAp4k1bw1e3WjW/m+ELpL3Skhd4IbaVIpooyYoyqSCNL ibYsisqM+9QrAMG0+VpPVyTT7Lquzv02srJa6hp2+zb5rZ+Xnve732PzYsf+C5vxM1L4FweMP7J+ HtvH4812DSfC8kX9m3dnoLC2mubiCW7/AOEhSw1qfIt7eOK2vLK7ZmuHazQxJby/pl8JtS1vWfhZ 4avPEv2AeIrvS7abVBZWs9rbC6aJTL5UNx++jTeW2pL+8UYDfMDXQUVq5R95RVk2reSSta/W71b+ +5naTabfe/m2738rLRLbTTd3+UP+Crv/AAUD1f8AYN8AeD30Ky0RNS8aanNYrrGtzWI07SEhgaYk w3eo6at3PKQscdvHdxykGSRBKYvJk+a/jP8A8Fn/AIq/B3XvH5spfgp4/m+Gmpafa6l4R0W2vbbx BNB/ZttPqd3dyT3fk6NYW9xMwW/vFKHBgaJJFDy/qDNEJ4XRiwVwVJVip59COQfcVxfwB/Z68Lfs x+AX8M+EINYt9Jl1C61SQanrl9rNxJc3UzT3ErXF7NNMxkld3OXxudj1JzlTi05cz0eq9dNH5aO9 tXe11uazaajyrVaP0d9fXVJdFa++/wAK+Df+CtnxCf4e+A/E+o698LNct7/xpaab4k0rR/DU8uow aJfywW1lcQtZ6xf26zPP9qMTwy3kF3HEfLaN4pkXnof+C0fxP8b2+h+ItHb4Q6F4QfxyPC2vXF1H HqVp4bEmtzWMNvf6k2sWcUF21nAbkLbQ3r/v4zJBbxGGW4/UGitIySlGTV7Sv8vcvH58snd3s5dl Z5SjJwcb6tWv53k7/wDky0VtIrUK+Iv21f8AgqZd/ssftV6n8PG134Y6e15pHh2LQbTVGlfUW1LV tXay+13IE8Srp8EMcjSYUbW8kedunSIfbtFTHScZPZPVd1Zpry3un0aTLlrCUVu1o+zunf8ACzWl 03qgrhWPv6967quFJ9x370ABPJ59e9ITgdf19qVmwTyO/eoL/UrfSrOa4uZ4ba3t0aWWWWQJHEij LOzHhVABJJOAAaAJy2CO+Tjg+1cvdahJ8Q0e3spHTQ3XbNdxSEf2nHJFkfZZopAyKCwzLjkrhO7D K8E+O9L/AGjvC+na/wCHtUtdV8DapGl1p9/Y3HmRa/F+8VtwKf8AHsSFIKt+9A5/dnEncQQJZwqi BVCgKAvAAxwAOwFICOG2S0jWONVVEUKoAwFUdAPYCiToPan9SfrQcEc0MCjdQ+Z0wayrXwpaadC0 VtbwW0TSPMyRRhFLu5d3IAxuZ2ZiepLEnJJroWiBHBHNJ5O4dfpUNIq5jQ6QsZHygVaisgvbFXWj IyOfzpMgjrVJAypf6NbaravBdwQXVvJgtFMgkjfBDDKkEHBAI9CAa8v8T/s/atpniHS73wfr8ukp arFZyw3ckk6papL5vlqSWLxjBQRfJ8ssn70A7T65jP8AFRwD1p2EcBP8NNS8C2ZbwfJZLblCr6Bf O0WlzEjkQsiu1nnuqJJFjd+5DMXFv4N/CKz+E3hh7aJbdr6+k+0X00MflQtJziKGPJ8m2iB2RRA4 RB3YuzdmPrQAQOo/Ok4hqV2jyeoqKWHIx7Vd27sdx160wx8dfzqWmNGXcWoYnisu/wBL3A4HIrpH t9w6cfWoJLPd0yM+9Q4lJnkvxV+Gtz4y8N3NlaXH2OadSvm7mXaCpHYc9eh4OMHiuP8AiX4N8V+I fG+o6rFPC4u5WZIykJVUxtQfOvZQvfqvOea+gZtLDdh+dUbvQg4wRXgZnkNHGzVSpJp2to/80ehh cfOgrRS+Z8rXvg3xtYyZMFtdj0ktkkY/9+Shqk9v4ns2LT+HrVgOyQXEGR65Zn/lX1PL4ZVmPyrz 61Xk8KIc4QfUV4s+Dab+Cpb1jF/5HfHOpdY/iz5VZ9O1n7Qmp+FrUNLHsb/SEuTKd6nYytEvy8bu p5ReO46v9mPw34f8I/tCWd9Z2U+jxPpVwjxxQxwwHBADNsY8fvNuNuSzR+le/f8ACL+YNrs7gdix I/Wp7XwdaQFmFpa73AVm8ldxAZWxnGcblU/VQeorlXCNeEvdqJr0a/VoqebQnBxcWvmn+hiaHowi RcryOue1btpYYI9u9XodMCAbR+tW4bIAj09M199FHgtor21ptA/nV2GDaP8A6/WpYrcgf3fSpo4O OCPqTWsVbchkXkk9qKs+QPaiquI+IvEHw1/aU8Q/tAeKvEUHw/8Aj9Y/DnxdfbLrw5B8SbLT9VdC k0gTe3iG8h0+2Wf7ODdaTLZ3HlNLGLJ8JNWL4N/Yq/av8ZeC/CtxceKPix4D1saF4b0y/hv/AIiy 6oLbUTrNxe6tfzJHqDpLDbW2yCNEk33QeFJAsUckTfqJRWkIqHLb7Ljb0Sat6O7vfVN3g4vUzqLn cm/tXv6tp31vqrLya0kmtD8YfgVpnx2/af8AiT8btD8G698d9T8ReCtTn0CK9uvjLY/8I9ouqLqN 3fia7Sx1Ka4adbKWzhjt4II7R5/tEFxHDHAq2/rkfw6/ata58U34+Hnx6e48SeFNP066m1L4kWE7 S6pLdSSanewabaeIrS3stqw20UEVleWu2CeWQTpMHik/UKud+LHj24+GHw91LXbXw9rPiu409FaP SdJls4r2+ZnVQkTXc8EG75s4eVM4wCSQDHKoxin0SX4NS0XSV9VrtHW8Uy3705Nbt3/FNb9remst LSZ+cvwW+C37V3wt8URaLYaB8b9U0a/8R22sTa34y+IdjepYwQ6LLJb2aQrrFzOtr/a8oiuYzLM7 W9vCDJes8s44jw98Ef21LL4beKINe8J/HLxNrOtaJcXdm1n8SrPw6bnxEkQMM90q+Ibs2FqHeZlg 0ydbW5cxrLZ2cMS+Z+jP7K37Vc/7UK+LPM+G/j74fN4Q1VtFuB4ll0iUXd0ihpkgbT767VhFuVXY lRuYqCzJIE9aq5w5k3LVTSe/RxVmn0uuWV1bWMWrWIg1FxUfsO33Sej72vKNn0bTPzP179l79p2w 13U9MCfF7xF4C8WWYi0rTbf4lPpWreHtWh03TLS3vtW1b+1muY7Fphf3ElvpazN5isZI7nzFWrvx I8V/tHfsmeI/F/iLUoPiB448N+Er+XW59c1bxBYafpF7FaeHVtra3aISp5VnJevc3ty0cW4eTaxg XM7yBf0jop1G5Jrq1Zv5pp+TW11bTTpHlKUVDlT1Sv8Ac1Zr0fn113cr/ldrPw7/AGsvirp/hA/8 IP8AtDWOoWGq29j/AGuPihpeh2kOkx6eyx3D20GoyNcSXGoLHcXUl5bST28Mnlw28wV4W+sP+CZn wR+JXwBs/idoXxHu/F+ryf8ACSLLomranrt5qWnahYC1hjDWS32sapfQL5qSs6XEseWkBVAMqv1D RVRko83KtJf/AGuvk/d6WV5Sdru5Li5KPM9Y/j8X/wAl62UVeyPFv2+fhf48+NH7P6eGfhxrGqeG /Eup6/o+dbsNSkspdFtI7+CW6uD5c0TzL9njlQwB8S+ZtYFSa/Nz9mHwV8W/2nf2rvjv4f8AD3jL 4/3Vr4b8WJ4d/td/jPbXHh/w3cRXbzS3s0NpqMt155svIeOyt7eKzNzPc208cUcCiD9jKKmjanU9 pvv975PyUelpXd+bRIqsvaU/ZvTb8Ob/AOS9NNtZX/L3xr8Dv2vfH3xJ07w7pmlfFnwzoVv421rx GfFmpePLe6twx1a3kso5bOy1q2nm0ptNhmRbMGMefdsDDbxxq7bHx4uv2kfhD+zR8J/EtxbePV+I Vr4E1ix1qzn8V28Olp4s1SS3gtkuRHdus4Wa4mFoiyShXW0ii8ndIy/dXj79p3wj8OPiZpHg69fx Hf8AiLWWhC2uieGdT1tbBJpDHFLeyWdvLHYwuyuFlumijYRSkMRG5X0CohTSoqm9Y7X6u0eVq/o1 53SvfVPSU37Z1Nnv6XlzX17u+jurNpLU/Lvwd8EP2u5vh/r3gy+8O/GC1caL4xay8Q3/AMVLW5kn 1u7aK10lluIL6O4FjDa+ZOn7mFluGYiC22IXz/iD8Av2wfg7+0J4zvvB2n/Hj4lRWXhW60rQdTvf iLplt4c1fU30y2iTUG0+XU0kgKyyXoWMw432dk5fzJ7q6P6K/G/9pnwl+z42nReIJPEV3f6tva00 3w94a1LxHqUsabRJN9k063nnECF41aYoI1aWNSwZ1B76NxLGrDIDDIyCD+R5FXJc6u9muV+drpXf dKTWlr6cybSZEF7OSa3T5l5X5b273a63tdpWTaPzg+Knwi/aR8e/F7wtY2/g/wCO1toul+JLLTP7 Zh+KNnpthY+HUsNqySwWuqLPf3D3qrLeT3CNOilktvPUndN8O/gl+1D8HPiD4FvfCGk+PpLaDX/E tnqVv458ZzeKtPTTLjVoPsEtw0viFZECadCDFOsV/MkktwGtowV3fo1RTptwmprfVvzbSTv62vpZ Xcn9pkSppw9n20Xlbmt93NZXvZKPZH55+Hf2ef2no/DHx20vVrvxrNaa94Q1KbwAbTxRLFd6Rf3+ qX0zWjXDa08st5a266eIJQ1pbqpaFZIx5kj8L8Y/AX7cnjbR/B11Z+H/ABJYajp2j3Gl6hc6LrcV i9xp8l1ZxiO40pvE5gk1Xyorv/SI9TUrDdmWO9huoo4T+o1FZwgo8q3UUlZ9Uubf/wACa81o+t9Z ycpOezbvp3ain5fZTtsndq2lvMv2N/hpr/wh/Zo8KeH/ABTe6tqHiKztnk1CXUtbudZuBLLK8pQ3 NzJLM6pvCKrzTFFVU86bb5r+Cf8ABRf4V/Hr4vftD/DTTPAb+KIvhcibtdfw7q/9j3EN4bqJTPcX kWrWN1HHFbeYY1jt9Ridnk820crCR9kUVrKblWjWe6d7dG9d/S915pPoZRglSdFbNWv1/wCHez8m z89dd+A37SvxOsPibqj2nxK8M+Mrvw94h0hLib4iiHSdau7uUxaSdHsrK88mxtrOJUlN3LHa6g5C q3mGSVq+fT4K+Lvin/gpZ8QvhXpPjP4+ePtR8F+E7WC+Om/GS30fSLm4u7S3S1v9QtotSN3ptus6 3ZdbG1+2rHBZSN5xupWuP2MorKnTjFpS1XLytd9Gk7rb4ne1uZ6vVJrWUm7yW97ry1jfTrpGyvfl 6aaH5zfFT4H/ALV663fDw9J8SrvxZ4GaOPR/FY8ZWUOh61pEWnxwNBbaQ12IbvVrmZ5pml1m3EUU oOy42LEtbPiz4IftG/Czxr8J9Z+EVl8QfJFtqq6npXj/AMYyeLbTTGu57byo9UZtctj+6jjldZbd dVaF55o41eNIS36AUVrGbUlPdr8dLO/ru0rLmu7XlLmycE4OHS1vS233Xdm7tfJW8R/4J/8Agvxn 4I+A93F48sPE+la7qPiTV9RSx1/xM3iC8srSW9la2h+0Ge4AjSHy1RFmcBQpIRmaNPPv+Crvgz46 fEDwB4P0r4NRa3PYz6nM3ieHRLpbPUbiFYG+zILkavpM1vB5+GkktrvzQUjHlTRNLG30F4O+Mdh4 t+IOv+FpbHVtG17QNszW2oQKgv7R2ZY7y2kRmSWFmVgcN5kZAEiRllB62spQU4RXS0bf9u2/ys16 rQ1jNxnJrduV/wDt697ffdP0aPzS+JH7Nn7VuvePfiTdjWfiRp1h4W8MXGleCLnS/FbRJdD+zUto GbbqMq6nP5zT3E0l3pVndrKcwXjiOGKsn4s+KP2jPH+pXXwrg8N/FXw7rXjRtTv9IceNraLU9Ksb fTLTS7GVpbXUIn8mOW4GpXrrMpNy6QQtdMGx+odFabv3tVyqL87Nu/8Aiu3drWzfe6mN4r3dGndP tola2zjZLR31S/vKX5uaP8Mf2z/CPjnwVr9lDqepeJrXV/Edhqp1S9Nz4Vu7WS9t4dNuZtP/AOEl VrWAWMCyI6LqNzHJNcb4S5DS2vDvwE+PF/8A8If9u8HfH7TYF8V6nL4rRfjIJJLvw9qF5drFZW2d UfZLa/6JMZlkinjt49lvKZJpIIf0Zooi2uRvXl/FXTafk7WdraN9yXFe8o6c2vo/es15rm0ve1o9 kJGgijVRkhRgZJJ/M8mloopDSSVkFFcj8bPjBB8DfBH9v3egeLvEVol3BazW/hvRptXvoVlkEfnf ZoQ0zxoWBcxo7KuW27VYjptJvZNS0q2uJbW4sZbiJZHtpyhltyQCUfYzLuXODtZhkcEjmhaptdHb 9RvRpPqWKKKKACiiuX+L3xTt/gz4Nk1++0rXNT0uzkU376XbC6l063wS908QYSPFGBlhCskmDkIQ CQm0tX/X9d+nUaV9jqKKhsL+DVbCC6tZ4bm1uY1lhmicPHKjDKsrDgggggjgg1NVNNOzJTTV0FFF FIYUUUUAFFFFABRRRQAUUUUAFFFFABRRXI/H34xWH7PPwP8AF/j3VLLUdS0vwXo91rd7bWBhFzNB bRNNII/Okji3bEbG+RF9SKipUjCLnN2S1ZUISnJQirt6I66isH4WePofit8MvDvii3sNT0q38SaZ bapFZajEsV5aJPEsqxzIrMqyKGAYBmAIIyetb1bVIShJwmrNaMyhOM4qcXdPVBRRRUFhRRRQAUUU UAfkr+2N/wAEz/EXwM8Dz6vY+DNE+IGt/ETUfGNndw2Fhql+uhXviW58q38i3tNMuFg0yC0mupLy WURtJIsTkzvDbxVt+OP+CMPxSfSPFSeGfCH7P1tY+MPDTafB4X1PxFq13ovhjVYIfJs9WneSweTX tQC7yL66W2kgMqlUmaIM/wBiH/grD8A28R+K9Hj8bXdxq3ge21m81uyg8N6rNcWUOkTpBqD7Etiz iKRwvyBt+HKbwjlbOn/8FS/gZqfgzVddi8Y3otNIvrHTZLaTw3qsWo3VxexGa1S1smthc3fmRLJI Gt45F2QzMSBFIVx5abpJP4eVJduR3jFdmr35X0a920k29LyjVulaXNJ+fPo5fOyXMuzal7tkvAf2 T/8AgmX8S/gL+2vYfETWrH4ea9omkWkWl6M9xry3F/4Y08WUFotlYbdDhuIoYEWZfKe+e3uGkeby LaaVmX6J/aT1740az8U9H0b4b+AfBOv+HNEW31fVb3xP4wvPD0d/cb5vJtbc2+m3pcRPHFNIxCjJ iUZy4Gp8Nf2/PhT8Yvidofg7wx4ivta1/wAQaNBr9vFb6DqJgtrWe3W6h+1TmAQ2czwOkot7l45i ksZ8vDpmW2/bu+Ft18bbr4cjxFeR+MrPxBH4WksJtE1CENqL6dLqawpK8AicfYoXmMiOYwu0FgXU HqqubcYz3jr56O2t9dJPffmer6HPShCEZOOzX3K19PLlXoo6q258l6//AME+/il+0J+ydpWi+Nvh j8EdT8ZeHfFs3iKKHW9euLq3vruXxI19qE0V0+kvLZpNbQiGF0hkkMV2wYoY1L95+zp/wTi8UfCn /goFB8ctY0v4dy3/AIo0fVl8Rf2fNEl1ol7eXMUqR2tx/Za3uqRLHCkRkvr1Au5jBbW0QS2X3/4G /tufDT9pS48Tp4G1688RJ4RhS5vri30W/W2nhke4SOa0meFY76J2tZwklq0qvsypIZScL4cf8FKP gp8WfBd14h0PxoZ9KtND0/xHJJcaPf2chs7+5ntbErFNAkjy3E9tLHFAqmaRtgVD5ke6INU5c0Va 136KceW3o1G6vty6aJmk4uacJd1fvdSuvO95Wffm1u3c+evjJ/wR+1P4sftUeJPiZJd+GrS513xn /wAJKUsLu406c21poX9n2dsZo4S6S3E7u1zcxssqQARwnLyM3lHw1/4I8fHHwr8K9E0650v4DQeM PBcEQ0TxQmuX95qCWwsks30S0MmlomkWTCS6lZ4I545XcCSzZZJK+k/F3/BYP4bS+NvgtD4N1VvF GlfFPWE0y6gOgarbX2kwXFxLY217Nvtwtohv4HtxHeLC02ZGiY+Q6v6H4v8A+CmvwY8Eax40s7vx LrN2fh5LFb6/c6Z4U1fU7KymkuY7XyVuba1khmlSeVY5I4ndoWDiQJsfbnSpLl5YbfCvWCim15r3 eZ9Xo95JupNczlLtd/4ZuVk/J+9ZPpZraLXyJ8Dv+CMHi/wlq+n6drfhL4N6foDajYazHqNrq327 UPBd1bXBluJNHsbbRdM06C8vFhtVa+t4bOSIKAY7gxB5Pujxt8L/APhr/wDZS1jwj8RvD0vhZfH2 iT6fq2kx3dtqE+lLOjKF8wxvbvNGCrH5ZIhIuAZVG5ue1z/go18G/DmoWNve+LpYf7Q8SXnhGOf+ xdQa2h1S0kMU8E04gMUAEiuiySssbujKjMVIHJX/APwWK/Z1sLryV8eX19MNAs/E7pp/hbWL9obC 7e0WF5BDav5ch+32TNA2Jo0uondFRg1aRftocsNU+3mr6W2vGzSXRXXVuUvZTctmu/k2tf8At66d +unkeU33/BLbxx8Qvg54L8OeONV8LeJtS8JfEjWfHV3qt3eE3uuIYLyHS4vMtrG2js2KTWsVwLeE COO3YQkllKeTeFf+CLXxO+D3ibw7b6XpPwh+JHg+w8J6ToWtaR4s8TahY2niKe3jvWZbi0g0yWFt OguLqNoLA/uGFujFYpt0r/cuof8ABQP4R6XrHh+xn8VSRzeKPGV18PtMf+yL4wT67bF1msTKIfLj YNHIod2VGMbBWYqQOf1H/gqp8BLL4V2HjS38errPh/V7/U9P059E0bUNXudTbTWdb+a2trWCSee2 t9jGS5jjaBV2sZNrKTmnG3MrW919OkElZra8JQ2a05LWViuRuVra6r5ucpW87SjPe+0072dvmX4E f8EXPEnwu+Jdh/acPws1W18Oaour6b46njlu/EMsEelJZQ6Db6e9sIdL0pX3bkhvJhJBGITGPMMk eh+yd/wS/wDjF8KpvgfpnjPUfhzrfhD4Qa8NQ0vTri4ttQufDEMen3EA/s+4ttE00yefLcBmimVT CbeJ/PucmKve9T/4K9fs8aZcayo+IL31roNrHeXWoad4f1S/01omuLS2Jhu4LZ7e4aOe+tY5Vhkd oWlxIE2ttTSv+CwH7OfiCz1K4034jR6pBpGj6z4gu3sdE1K6EWn6TN5N/cjy7dt0cb/dK584fNF5 i81pGXIr9LJ/+Aa83qratdm3rdkOCqaLX7P/AIGn7vmnzXSfkl7qSPMP26P+CZPif9r/APaO1rVp tK+F2paBrml6RY6f4j8RyTX+r+BfsU9xcTDTdMa1a3M1y0iobs3cUkYc/u5RGqPw37O3/BLT41fD jw/8INF8UXfws8R+G/hNqkl7ouk6pcW+oHw4iabc26CzuLXQ9OaSO4muQZIpUDQ/Z438+6yYq/Qj wJ42034l+CNH8R6NNNcaRr9lDqNjLLbyWzywTIJI2aOVVkQlWB2uqsM4IB4rwzU/+CrHwJ0jUtYs 5vF+qG88Pvq8WpwReFdYllsH0tJpLxZFW1JVgltcNGCM3C28ph80IxGU6cacZ0Z6btp9OV3cvLlb 1ennq7u1P2jjVjre0V58yaS8+ZbLXbTRWPjWL/ggH4g8G/C6z0nR3+H+t3VlpHhbSHsNRvrmy0jU jZahJqGpXE8SWkpZd8hgtLYho44y8pKXDeav1R/wT/8A2TPi9+zN+x9q3w98S+MtLivrLTf7K8HR WUlpqFv4XjjtfKjZZ4NL0wSr5uJBHJbM6bSDPNuyu94D/wCCsvwB+JfjSHw/o3ji6uNTuNIl8QQr L4c1W3hn02O2a5N8k0tssT2zRJI0cysUlMUixs7Iyjd8X/8ABRH4XeBtV02zv7jx08usafHqVi1n 8P8AxBfQ3aSW/wBpWFJILJ0a68n5zahvtAHWMVdVc0atOWildtbct+Z6fy7Tt/2920im4qUKkdWr W87JLXvvC/8A273189/4JO/sJ+JP2Jfht4nj8aR+G5vF/ii9gmv9S06+h1K81YQw7ftF7exaZpn2 q4eWSdzJLbPOd+Zbm4JBT541f/gnhcfBTWLfw7qvgDwb4w8Y+LdRufFfgHxHZ+E557L4da4mspqL 6at1a6XImmWMxm3i+l2zt5csbecIoFT6x8Z/8FV/gT8PvhJpHjjV/GGpWnhvWNMfWkm/4RbV5Lix sFlaE3l5bLameytzKjRrLdRxI7japYkCuu8F/ty/Cz4h+FrPWtH8VLeadqFjpupQP/Z93G8lvqN7 JYWT+W0QcefcxSRoCoJ2Fsbfmq5zc6yqdV7un3WXZ3jdW6ra10EYqNNweqfva+b0b7p81vPm3u0z 4A8Xf8E5/EH7bXx8+LEOn+CvC/hiKxsLXwsnjvxHoGqaVdW+oLc3Oq3mpaRpEtjFaXqte3jw29+9 y0lsYZJUEwlPn938R/8Agkr8RfG37OPh7w1pmm/DPwrqes64mofETTbPX31Gy8XtHaNBHf6jcalo 13Hq1y0zSXMqT2MDSSNAftKyWkc7fVOm/wDBSf4M6zrWt2Nr4qvrh9CsTqL3CeHtTNnqMH2mO0Rr C5+z+TqBluZUgiSzeZppiY4w7gqLHgr/AIKH/Cbx54p8L6Naa5rljfeMrC/1LSf7Y8K6to8M0dhJ NHeJJNd20UcM0LW8xeCVklVU3bNpDHKKg6X912b7Ozcnbsm0+ZLe2uqbNG5KpzXtJaeeqSV+7Skr X25tLKVjC/ah/YVi+Of7Fvhj4K6XLo+jaJpV34ehnuIoGQ2Fjpt1bTMbJZROUn22wSMyM+zfkuxG T8zan/wSO+IGp6Tq/hifwv8AA/U/BXiLWvEN22m6xq+oanY6LLfXMK2mvfYJLLy9S1SOxiVGW5kj ZbgTTi7ZrqbH2Vqv7cHwy0r4E+HviQPEF3qHhTxdtOgyaZot/qN9ru5XkH2Sxt4Xu7j91HJN+6ib EMby/wCrUuMDRf8Agpj8Etf8UWel2/jOQfbbKfUE1GfRNRg0eKK3tTd3Il1CSBbSGS3gG6eOSVZI CVWRUZlU3J3qTqT1d5OX/byV7/KN12d5Kz1URXLCEYaJW5flzJWf/b1n0londXT8T+B//BNnxN4W 8J67p3jjwZ8IvGer+KN2k+JfEmra1fatqPjXToZmubd9SSeyEcpdktrdbVg6WUKyeVPMrCEeZfC3 /gjj8UNJ8W/CU63e/DOx0P4WeF9Ot9GtbaSPVLHw5rdt5sst3ZWcmkwTI8946XD3EF9aKwSOCa1u IoVDfZr/ALfPwut/gJd/E251nW9P8HadqkWj3lzfeF9VtLqyuZZooI1ms5bZbmJS88J8x4gmyRX3 bDurFuf+CnfwUh8Fy69D4p1XUrSPULrTlt9N8L6tqGo3LW0UM09xDZQWr3M1mkVxbyG7jja22XEL +btkQlSXNo3tZ+mjs12u582llzNNLXVwSXuxW9423va11rvZQ5X1snfa6+JvGn/BCvx/43Nt4y0i 0+Enws+K+iaNeWthrXh+9/tbU9V1J7G5iOo6lrF9pDXFzLd3F2WmfyBNCkA8uaR5N8Xp/wC1T/wT X+Kfj3x75/gfwr8Frjw3f+DPDHg/VLHX/E2oQtdaZp2oG6v9GVU0yeNLS5jWGMTBeFSX/Rw0xkT6 f0//AIKGfB7V7rxHHZeLxfReGLZLm5u7XSr2eyvt0yW4hsbhITDqFx9okjtzb2bzTCeRISglYIeU uP8Agrn8AtPns4r7xdrmlzX1rHeRRaj4N1uylWJ7+XT8uk1mrRlLqCZJFcAxCNnkCRjfVN2s9k3d Kys3ad1bqmnO8drcyso8yE/eTctdLX66uDWu901Bp73ad22mP/4Jy/sb6h+x74P8T6ZrOhfD60vb zVZTp2qeHGn8ybSjJJPa6e8c0Ya3t7E3E0FvAkssaxKGGxpHWvlbxj/wSv8AjdrOt65p7+DfgHr3 grUdU8V6rHYX/i24a4lv9WvoZYdWlF94e1C2knjs4RbmCaCZCzSyNJKZAqfWvg7/AIKo/Af4g3Hi KLRfHMmpN4VtDfak0GhakyRRC8FmpRvs+JWeZkEaxlmlSWORA0bo5pa1/wAFcf2ffDmqa3Zah45u 7G88Ozala38M/hrVo5I57CVYrmBQbbMku9gscce558N5Ik2tjKpyu05PeDW+8dE35q6WvSVn8STT g7Xit1NP0lq0vLRuy/l0tynyNaf8EY/jH4f+E+oxeFZfg98PfFniz4XXHgbxMfDOpX1nHf3Qlg+z vFdrYq8cJWOY/wDHufs8UwtIYxEiSrb+GX/BEf4g6lpuu33jq+8Ax+MNX1WweLX7KWy1bU9Os7XU otQjFrcT6FCFWM2tpbw217FfiCGMLFPHGpgk/Rj4NfGLw7+0B8JfDvjrwnfSal4W8WafDqulXklp NaG6tZUDxy+VMiSIGUhgHUHBHFea2v8AwUc+D+peENY1yy8SarqNhpF7HYKtj4a1W6udYkkjkljf TbeO2abU4XihnlWexSeJooJpA5SN2XWq3Cbcvdcb+XLebk/xk1rsm0rNttU4KpH3feTt5p+6kv8A yWCfd8t3dI+V/HP/AASb+Kvxi+GXwB8HeMNW8Dax4c8FaM8fjXTbm+S907UNZluFmudVW3m0lnu5 Zv322SGbTLm2NxOY7g+a4ORrf/BHf4lwaf49tY0+HHinSPFM9jqunaBqOtNpGnaRcP4nm1jVrKI2 WjhhbTRfZAks4uJfOt1JVVSLy/r6z/4KR/Bi4bWzceLp9Jh8O+EYPHd7c6voeo6XbDRZo45EvI5r mCOOZcSorLEzujtsZVfK1Usf+CnvwT1X4cT+LbTxVql5oVvLqcTzW/hfVppT/ZsC3F66wrbGVo44 nRvMVCjbgFZiQKObklz7ODlL0UpWfpFSXL0tbl20Brnj7N6qXLFLu0uaNvNp82m6d7a3PlHxv/wT N/aM8R6DDrVufgknxSu7fxyLzxG2v6mkNpda3LEttdW1v/Z7DKWMf2RlYgxhYJC115IjPvH7fP7G vjT9pH9lTwr8KfDnhf4UapZ2dvbpd33iO4ja00We3iWKKS30670nUoruPa0oKNJbTKoAS4jdvNT0 7xt/wUB+E/w98MT6tqXiS98i3v7jTWt7TQdRvb5pbeKOW6ZbWCB53it0lQzzLGYoDuEjoVYDC8L/ APBUj4IeMviLa+E9O8U6xNr93Pplv9mfwnrEQtm1OCOfTzPI9qEt0uEkURvKyI0m6MHzFZBEYwcV SSTS5NO6V3BNdvefKuzstBupZute3xu/m7c7+VlftbU+NvEf/BF34nfEzUorTxN4Z+BFzb/8I/rv h268SXWuX+t+IL77YY4LO6Zr3TXxFaWRuIYLJ5JFgcq/nzFnz3/j7/glT498YaFa+F7zw38DPFGg XcOo2Wq3uuyTt9qvZpIUg8VXGmR2Itb7VEtEMSWzvFFaeWot50ik8qP798L+I7fxf4bsNVtI7+G1 1K3S5hS9sZrG5RHUMBJBOiSxPg8pIiupyCAQRV+m4WkubVrR366y36/adrWs7NWcYtEfd0hpbby0 S0/8BV73vqndOSf55/AX/glV8Wv2dPDXxQsfD/jLRFl8T+EZ7HwzMdVNrL4e1K81W7vdRhimtNOg mihuEe0H20yTXSSwmQKQkSLzms/8EavF3iG61KGXwJ+zxbeFPGaTi48Fedd3PhnwDevHFbDW7ezN iseu6obdHJuLpbF1dsK+GZj+l9FJxUrc2tlbyabk2mlb+Zu+6eqad2yPutuGjbv87JX+5a9HqpXW h+W/7bX/AARp+LH7T0dz4ft9C+BGt6JaailnpPiHxbrF/favY6FHpjWlrZwW39nNFaCCcRXckUcz LezJuaS3IXCfF7/ghv8AETQ7K7m+FOueHdM1VvEv2zT7m58UXelTaNYwaD/ZUF1BLFp1xjVJWZ5H uDGfs6rFFCfKDxSfqTRTS0eurtd9W1y+9/i934lZ6yd7u4uVXWmiTSXRJ309NdF0tFLRWPzh0j/g jnrkX7NumeCtR+H3wE1GbS/FWn+KIxMYkVpWvrKTUSHt9Ggt4Z/sVitsk1pZW4nFw7PHC6mSXa8M /wDBO749eCvAfxD8M2+r/D/VfA3iLxbJrUXgWbV007SNdtbnVJr29ilubPRI7mxinSRUktZf7TWV A8TTLG7bv0EopvWSl2+77GnmkoJJO6+drEVaPL8/O/vap7p3k3dW+5u/56fGH/giNF8TPHNnd6cv gnwlpVho/hjw5ZRaFDLavpVpY6pNqd/NbrKkwEgdkhs4mYx26lnzuSIJ4g//AARA/aDt/H+q6vZX /wALbZLfVb7VvDKy+Lbi7Xw4815dXJktHk0E31pfy+bFv1CC+Dl4o3nivvKCv+vVFJKzuu7fzk0/ mlJcyTuuZttMJLmTi+qSfyVum2mmltEj5V/4JtfsW6/+yn4w+LOsa/4N+FHgtfHWo6fPpdj4Gvri 7htrSC0CGG5eezt3lnFw9zK1ycm4a4Z2SJshuM/ZK/YN+Kfwb/a2g8ReItN+F0Hw/sNX8Xa9Aml6 /f3urT6nq93E0GoyLPZIvmCxQ2rp5xILyyebMZNsf27RVRdpqa6R5flZLXvsnr9pKW6TScU4OD/m 5vmr7dt2vR2Py3/bM/YM8e/Av9pnxZ+0/F4a0v4jyL4o1HXj4W0hdU1C9u4F8Oro2kww2Fpp0xuJ 3kkna485liRCuJVVpTVb4Sf8EZfHvhv9m2IeGLL4c+GdR1jSfDfhu/0K21HU9Jg8XeHrS5F3qA1W 5awW4huL4sYmtBZ7LaAy24dhNIw/VGis6cFCKXblt5KK5fndNqXSSeqbs1dRubv/AIr/ADfMrduV pONtns97/l/+zZ/wRl+KXgXxnZ+IfE9p8FNMtLfStO8Lav4K0GaS48PeMtKfVb7UdW+1yPpkFxCD Ndxvb2a+bAVtzBOZYpSU474p/wDBvZ8RPiJb/EnV/wDhLPDMWv8AjXS/Epg0yDWZ7PR1vtb1kTzQ sEsCY7aKwt7X94iNJPc7vNUwxoh/XGirbu0+q5v/ACde9v3fveUtV2F/nF9tYfDt5e6+63u9T8k9 D/4Iv/tA/wBkeLNNuNM/Z10jR/FGheN7G307TtWvZLbRdQ8Q3EOL/YdJRLvybKCC18t1jOY3l3sZ dkfqnxI/4JQfFWz8GeCtP8KT/CHxJ4l+HvjKDVNJ8Z+LYmXWLnSrHSbm30aOZILExI9jdXOfItvJ hlSFnBhkup6/RiilJXjyeUV5+7LmjrvdNuz6J2XSyikm9Lp82nT31aWm1nZNra6vvc+UfAv7I3xU 8Af8EhLP4L+Htb0Hwd8WtP8ABh8Pwazpmt3U1ol7tKPdpem1jniebLyeYtuWgklJVZPLBb86/wBs H/gjz4/+Gfi/wqLTwZ4X1Xw38WdWXRL7wR4St9cuvD/w/ZzZ2z6qZ7bTZTPdTafBc28+r3UdtMsm pSSLHIEwv7hUVU5c1f6x1bTfZq92rba30006W1uRvGn7NN6J2d9U9LO+91b56p3Py28W/wDBE/4k 6j8MdI8J3F58LNQ8H6rF4j1LXNBuzeXeh+DNW1a6jZdQ0zS/spTVpbKyWWG2+1NbH7RJJdEb5mQc 98D/APgnf4m/ac+Jdx8RdI+GPhfQ9CHj1rk3vj6DWdB8YXlhY2K6NbhrW50sZSa3T7dLI7u16bg2 0rQKrsP1qoqYKKequkkkvSSkr31drWXW2jbWgTV1Zaat/wDgSalZbLmvdq1rq6Sd2/zH+AP/AAR+ +Mv7NXjnwjDa6p8PfHXhTw/8PtU+H1gmp+Ir/Tl8I2uo6lJNLLa2BsbuK9dLUQKTNNAZmUoxSNYw nEwf8EB/HVz+0jrunnRPg1oP7PGq+KJNYXwvouryQJcQp9iitJbrT/7HCNPHb2TAG3vbeZZL25Zb rEkqy/rdRTpN05xqJ3aurvW95Ofvd7Sbab1Tb1FUipwcHotNtLe6oadrxSTWzttuflX4d/4IqfGj wanxOkt7/wCE+rN8R/BvjWwt9NvbzydE8L6x4h1M3DmC1j0jfcWwt7ewRpLmZ3V43CRCPCGl41/4 IzftAfFP4O+Mvh/qr/A/SNI8Q+JLDxFa6lbarc6mIrPStFSw0rQn0260k2jQo8UZe7kMvV5VtN5R E/WGis/ZR9mqX2VFRXkoyc4/+Ayenlps2nq6kvae06tyb8+aKjL5SS1XfVWaTXxZ+zj/AME4X+Dn 7PXgPwhqnwe+Dupan4V8O6fo93dr4ru3W6mt7aOF5AW0oMQzITkgE55or7Tor6f/AFpx38z/APAq i/BTSXolY+WfCWXt3cV/4DB/i4tv56n58ftGf8EXb3TdA/4s5rlxLqHieG80LxjD4m1u10+21jS9 S1canq1w8kGj3M0t/cBVtlbdFGsSRbg4j2P6d8Sv+COvg34peG7JL/4j/Fu38WxajqOqX/jG1v8A TU1zVpr7Tn0yXeWsTbQKlm3kxC0gg8lV+TaWct9c0V80oR9n7Lp+jd7f4b622b36H093z+0W+/zt a/rayv5d73+Uf2QP+CP/AMOP2N/2lNZ+LOka94x8SeNdb0ttJnu9YTS4QInW0En/AB42Vs0m77FA VSUvFDhhCkQdgavib/gjN8MPEv7SWo/Fo614vtPHmtanq19qeqwx6W93fQahYQ6e1gZ5LJ547SC3 h2wJDJG6GWVi7s5NfXFFOa50oy1Si4/9ut3a9G+goe424aXd/mlZP1S2+/c+bP2Vf+Camlfsk+CP Fnh/RPif8UdZsPFWh2egodVfSBJocNpZCyt3smttPh8to4VXCNviDhn8vfJIz+R2v/BvR8EdC+G+ u+D9D1TxVoHhjxAfD89zpltpnh6e1kutHiEcF1NHcaXKt3JMd7zi7E8crzO2xTjH3fRVTbnJzlq3 a7/wttfc3ddvkhRioxUI7K6t6pJ/elb7+7v8zfD/AP4JT/Dn4d/H/SfH9vqnjC9k0WDTvs2h3l3b vpIvNPs5bKzviqwLMZIbeeZY4vO+yxmQukCOqMvn3hP/AIIOfCXwD4Z+IOn6F4n+Iujz/EfxDpni LUr+0m0xLlJNO1OXU7WDH2Hy7hFuZWLSXaT3DoERpiqKB9tUUX97m63v87p/ml8kltoCilHl6WS+ SvZfK7frrvqfCn/DgP4Z6r8LZvAfiD4l/Gzxd4AEN79j8M63rGnXOl2F5czXs/8AaIjFipnvI5b+ 5dZbkzbmMTSCVoYSnV6T/wAEXfh34N+EXib4e+E/F3j3wT4B8ReIdK8UxeHtDi0WCy0i/sJLWVJI N2ns7LLJZ27SpcPMjFSVCbjn7AopQ9x3j5X87NNX7tNJ3d3ouyHP3/i13+V1Z27aN7d33Z8gfD// AIIv/Dzwl8LNK8C6z41+KPjjwX4d1/8A4SPR9J1zUbFRpt015LeTD7TaWkF1cLNNKTJ9qmmZguNw DOHy/Dn/AAQ4+Hmg+GvD2iS/EP4s6houi6RqPhq7s3utJtRrujX97Fe3WmXMttp8UywyTxku9u8M 8qyOkksiYVftOilFKLuvXvq1ytu+7cdHfdaMJa7/ANWblp29582nXXdI+VtC/wCCRngDTvgrF8Nt R8U+P/Efw7s/ENtrtj4a1O5sH0yyhg1E6kum+THaIJrRrkgsZ/NnZFEZm2ZU81b/APBDj4WaVocm n6V4l8eaLBf+ENW8Iau1mNIEmupqdyLq8vrpnsGLXckyxMzLtjdYI43ieMbD9nUUW/X/AMmjyy/8 CWj77vXUEkrW6W/8lfNG3o9u222h4X+xR+w5p/7CfhKPwl4S8R6jdeB7eGe4TTbyxtUuJ9Uubye5 u7+WWCOOMbxJFHHBbwwQxCNztcuvl+I/tZ/8Enb/AMR/DbTtJ+EmtT6Zf6jfa1D4lk1TV7ayTUrX XryG41i+dhpV20+omOAQ27HykjV8OZI1MUn3FRVNttPtp8u3p0t0VkrWVlFKN7evzta/r37tvmvz Sv8AHnxh/wCCNHhX45WV82u/Fj40NrPiDSr/AEbxHrMN9pKXviS3u1tkKTA6eYbdI0tIFSKyjt4i PNEkcnnz+Z1Hgv8A4Jf6F4L+P2sfEVfiJ491DXNdRkvTd6b4c8+dflaKNr9NKXUWhhlSOWK3N0YE aKNRH5SiMfTdFS0mrPs18nvbtv026D6W+f5f5K/fqfGOuf8ABFfw5q3w7s/C1t8aPjjo+i2mm6Dp zQ2FxoURuv7FdW0+WVjpZL7NuDB/x7OWZzCZCZKy9L/4IW+F9F8Iw6PafHL4/wBtDbQ6ZDBLFfaE ksP9nWr2dmRjStpEVtIyKjKYw5M4QXJM5+4qKJpT5ubXmfM/NrZvvbp20tshxbVrdFb5dV8+vfqf FHiT/gh34J8d6He2Pib4n/FPxZHdaTo+ixJrdn4avrSyt9Lmlks1isZNINkFVZnjaNoGicbZGQzI ky9rrH/BJ7wN4i0fwvp9/wCLfiLdWXgsyxaLAb6zjisbR7GSzFiES1VXtVE00gjcMCZPLYtbpHbp 9RUU5+9GUJaqTu/Nvd+r6vcmMVGSkt1ZLyS2XorKy2VkfKXxi/4JCfDv45fs6/Cn4b69rniO60/4 P2osdF1C40vQb66lgFutvsliutNltFcRpHtmgt4pkMYKSKSxbCtf+CLPhWG3sLaf4vfG6/0/RdJ1 TRtJs7y/0ieHS4L+4iundd2nFprhLiFJftFw0s0xLrcPcRuyH7KopyblKU3vJtvzbVm/W2nld23Y lCKUYpaRSS9E729L2v3sr7HlXjr9kbQfi18EdG8B+NNX8ReM9K0/VLLWNQm1eWCWbxDPa3a3ireI sKwmFp0RmhiijiAVURUQBB5fdf8ABKfw5d6/qV63xN+LccfiG71d9ftob3TYV16x1K++2z6bNIli J47cSl1R7eSK5ET+WZ2VIwn1LRS05ua3d/8AgSSem2qSTW1tNrlPWPK9tPwu0/VNtp7p672PlTxH /wAEjfA3iz9me6+E2o+LfG+oeEU1WDUtHtb630W+t/D0UE0k0VnBZ3GnyWU8AaaTJvLe4mfcpaVm iiZNS6/4JQfCnU0tIr5Ne1OytbPQdL+xXtzFc2smn6PdPeW9h5bxFUtZLp1llhjCqxhhQBIo0jH0 vRTi3F3jvdS/7eSST9bJXfXrcmUU1ZrSzj8m729L7dulj40H/BFzw43iz+1ZPjL8bZAdbtfEJtDN oK28l3bazc61EX26WHkQXl3cMUdmVt6lgXjidNzx7/wR1+FvxA8Ha9pNzqnjO2uPEGkeIdLm1WG6 tW1G3fXrkT6pexSyW77bqaNUtvMIIS3RYlVRyfq+io5Fyez6e9/5MuWV+91o7mnPLn9pfW6fzi7r 7n/lsfPP7Iv/AATO+Hf7GfwR8V+BfDLahPp/jVGi1a6+xaZpE06G3+zriLS7S0tlcR5/fCESuSC7 uVXHMfFH/gkb4J+OHwg8DeEPGnjHxv4ui8BXzXdnf61Z6Ffy3EZgW2Fu1tLprWUCLDHGqSWttBOh Uusokkld/q2irk+aTlLVvlv58usb+l397M4xUYqMdEr28ubf79PuXZHyf8Z/+CQfgb4/2V2vinxx 8UNTvr7w/e+G5r6XULKSWW1uJoXUyI9o0MrwJbwxRGWNxhBI4kuMznO0X/gjX4Tttf1O+1n4pfF3 xXDrOm6zo17YatJojWdxZatfRX1/AY4dNjAEs0WC4w5jbyyxRIlj+waKSdvua/8AAr8333d+97Da X4p/da33WVlsrHxfqX/BErwPZ/DbVfCXhf4ifFLwN4c1XT9d0mXTPDb6Jptutjqt697NZwldMZra GOd/kEGwmNI45TMiKgd+yr/wTX8ZaNpeq6z8VPiBr0Pii88QXGu6fpXhzU9PvND0S6W3SysdQj36 PaNPdw2UUKeXcxy2izIZo7eNvLEX2dRTpN03ePa3/k3N/wCla+vvb6hUSqfF3b9W1yv71o+6ST00 EUbVAJJI7nvS0UUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQB4XF/wUC8GzfDz4xeJRpnif7B8EdRu9M12M28HnXctsgdzbDzsOpB4MhjPqBXWy/tbf DrRPh54S8S+JPGHhzwXY+NtPi1LSo/EWq2umzXEbxxyFQJJAGZRKgYIWALDnkZ+Odc/4JweM/FHw v/awe80fxND4j8eeI9Uv/B9nZeM57Ky1eGWMeU81tDdpatubIIukzgAMMYFS69+x18Uvh94m/t2L wFL8QI/E3wMi+HbafBqlhFN4b1GOBEaOX7VOkTWsjMxLwGQ5V/kPBf5KjmmZxpKVSjd8kHs93Gq5 dN24wjbXk5k3daH6NLIMhqT5KWIS957yirrlp2SbbVrym+Z2vyuKVz7P+JX7Tvw1+DOtw6Z4w+If gbwpqVxALqK01nXrWxnlhLMokVJXVihZWAYDGVI7Gr3jL47eB/hz4MsPEniHxl4U0Hw7qpjWy1TU dWt7WyvDIhkjEczuEfcisw2k5UEjgV+c/wAVP+Ccvxn8Maz4e07T7LxX4ltLL4GH4e3up+GdS0aM XN+007fZJBqkiyCzCuimSJVk2hdhU7lHr1j+yr8T/hz4h/Za8bT+DbXxS/wo8MXHh/XPCui6hbxz aZLNZiNLm2a8uI4JCuxY5SZg2cFfMHK9UM1xjlUjKi0lJJPlk9OaavZXctIxen83ZXfNW4bymFOl OGMjJyUm1zRV2ocyWvwc0vd96/36H114q+O3gfwL4EsPFOt+MvCmj+GNUERstXvtWt7ewuxKheMx zu4jfegLLtJ3AZGRW54Z8VaX418O2esaNqVhq2kahCLi1vrK4Se2uYyMh0kQlWUjoQSK/N3wL/wT f+Mvwe0L4C+IoW1ea78E3OvTaloHhi+0ptR8NJqjGRFszqaNYSmMfu5RlRlv3RYfPX2D+wJ8Bl/Z 0/Zsj8K2+i+LdAtodRvp7ax8Sahp95fxpLMzgsbD/Ro1YksI4yQu7GSa2wWZYus5+1oOFo3s9dbR 9260l8T1X8rtfVx8/O8ky7B0PaYTFKq+ZrS2ylUV7XutIxaeqfP0STn1/gP9rP4V/FPxRDofhj4m fD7xHrVwGaLT9L8RWd5dShVLMVjjkZjhQScDgAmtL4oftBeAvgfJZJ418b+EPCD6iHa0XW9Yt9PN 0ExvMYldd23cucZxuGetfnd+wl+wf8bfhP8AEj9nyTxF4S120tvhrd662qHW9T0WbRtKgvg2GsBZ TG7kncH5vtAdFYjbtUcfUf7VH7PPjD4kft+/s9+NtF0f7b4Y8DJrY1u9+1wR/YjcWqxw/u3cSPuY EfIrY74FRSzLGTwkavsmpuSTTi9E0ne29le2+6OvMuH8pw2ZvDUsUp0lCpLmUou8oe05YqS0vNRj ZWbvOy5tG/ZLr9p/4aWPgXT/ABTP8Q/A0PhnV7g2ljq769arYXsw3ZiinMnlu42PlVJPyNxwajuf 2qvhfZfD638WzfEjwFF4Vu7o2MGsv4gtF0+a4AYmFZzJ5bSAKx2hs4U8cGvzW+JnwQ8XfsufsA/s reFfGXhq4i8T6P8AGG2nm0aC6tLiWffc3cscaSCXyCzqy43SBQW+Yrzj1PTv2Wf2g/D+g+Ltb0jS Nb8N6d8R/i4fE2v+FNB16zstfGhZyyx3iXKQQzysitIIblWIIHmYLLWCznFyqShGlso9JOzaovX0 9pK6XvJQcrPY9CvwhllNc/1pcrnNRblFKcYTnG8d91FNS+BtqN1dM+2b/wDag+GmlfDuy8X3XxE8 C23hPUrg2lprcuvWqaddTDfmKO4Mnlu48t/lDE/I3HBqSx/aW+HOqfDe88ZW3j/wTceENPmFvda5 Frlq+m20hZFCPcB/LVt0iDBYHLqO4r89dQ/YA+MFl+zzJp2meCvENjqMP7QjePra0h8Qabe6rb6M ICEuFuLu4eGW4BwMTuzM4y4YEk3/AAn+wN8ZNM8PW/iC58KXGpDQPjafiGPD+qapp/8Ab3iazkCq 9xO8Ew04XSZ3JGHjTAl5UlQ5TzjHSmoyoNJqD+GWjl7Lm9eXnneKSf7u297TPhXJlHmWNi3zNW5o XaXNbrZXtFc13Fc12rI++dS/ab+G2jfDqw8YXnxC8D2nhLVZzbWWtza7ax6deSguDHHcF/LdwY5P lVif3bf3Th1j+0t8OdU+G954ytvH/gm48IafMLe61yLXLV9NtpCyKEe4D+WrbpEGCwOXUdxXwR8V f2DPjF4j8B6hr+meGdVsdQ8RfHaH4iJ4dsNS0v8AtLQNOjjnja43TzGxa7kJR/LV5EyU3M/zhY/C f7A3xk0zw9b+ILnwpcakNA+Np+IY8P6pqmn/ANveJrOQKr3E7wTDThdJnckYeNMCXlSVDqnnGPlP llh2laPRu1/ZXfnyqc20rP3Lb3tL4Wyb2fOsbG/M1bmhsuay8r2S578uvNblP0Dk/aB8BRfDBfG7 eN/CK+C3OF186xbjS2PmeVgXO/yv9YNn3vvcdeKvwfFbwtdeN4fDMXiXQJPElzYjU4dJXUITfS2h OBcLDu3mLPG8DbnvXwd8S/2C/id8Qv2PPj3YL4ZNtq/xf+IcXibTvCTanarNp1mL6AyPNKs32ZZ5 I4mkZYpG4CjezcDpv2YP+CbHiX9lj/gofo/iy2vdZ8V+EU8F3Wlz69qV7GZbaQXKpZWCxNK0m2Gz ihTeq7WKsx2lto6KGZY6danCdC0Zct3r7t4OTT072Se26dnyp8NbIMohhq1RYxOpFz5Y6Pm5VBrW 9uslp8TV4XV7fX3xL+PfgX4LTWcfjHxp4T8Jyagkklqus6vb2BuVjx5jIJXXcF3LkjOMjPWo9d/a F8AeF/h7Y+LtT8ceD9O8KaoyrZ61dazbQ6ddlgxURzs4jckKxG1jnafSvkj/AIKLa3d+G/8AgpZ+ ytfWHh7UPFV7bJ4iaHS7GS2juLpvssYAVrmWKIYzuJaReFOMnAPlnwx/4JwfGr4Q+GvgP4k8nVRf +C7zX5tU0DwxfaQ2peHl1Ni6fYzqSvYSbANko3DG4eWW5YYSznFurOFOi5RjJxuk3azgl2vdSb0f u8t5OzVt8Nwtl8sHQxGIxKhKpHmtJxV/4yst3FXpRXM003Usk3Gz+/fFP7VXwv8AA2haNqmt/Ejw Fo+meI4Tc6Td33iC0t4NUiG3MkDvIFlUbl5QkfMPWrGhftJ/DrxT4P1XxDpnj/wVqOgaCAdT1O11 y1ms9OBUMDNKrlI8qQfmI4INfFvwb/YF8WfDX48/s4X+geDvFul+Dfh7qXie41QeJNa0m5v9NS9Q eSWSzYRbZH3ER24cR5+Y1z/7aX7Pmq+Nf+Cm8Hwx8NXtgvhL4+6fpmv/ABBsFZvtEFvpNwd0w52x rcIiRA4O5w2QOSbea41U4TlSSdSXIk76NxUk23ZuN7p6Jq17b2uHDWU1K7oU8S2owlUck4tcsKso uNle0vZx54+8024x2ab+5vGX7Wvwq+HM1hH4h+Jvw+0GTVbOPUbJdR8RWdqby1kz5c8YeQb4m2th 1ypwcHitVPj14FlSVl8aeE2WHRh4jkI1e3Ij0sjIvz8/FsQCfO+5/tV8nftK/skfED43+Nv2gdf0 /wAJtp8Wp/DdPh94PsZdRtFk1crLLO8yhZTHBCWZVQSsjYBLIteQ/EH/AIJlfFz4oaloNlPpz6V4 cs/gXp3hjV4YdUt1n1TV7ON5ItMDLL8qfahA7yHEbLGVD/MajEZvj4KcqdBy3to1p++tf/wXBu2t qiSV7XnB8OZNVhF1sYoOy5vei+lOTS2/nlHe3NF3aSdvvfxH+198JvB6Wbav8Ufh3pa6jZR6laG8 8SWcAurWQkR3Ee6QbonIIVxlTjg1u+PfjZ4M+FfhW013xR4u8MeG9E1B0itdQ1TVILO0uXdC6Kks jKjFkVmABOQpI4Ffl0vwx8a+Af2n9G8AxeALzxV43P7MyeGZdGhvdPVLS5d3gZpZZ50iMSsdrGNn YhvlVhkj6B0T9i/4lfAnW/2XPE39jP8AEkfCHw5eaBrei6ff28VzazXFsVW6tTeTQwSKpCxNl0ba EKhhkJdPN8VUdTlp+6pct7SaVp1IvRay0gm+Xbm1NMbwpluH9nzYlXlFys5RXN7nNGz2ipP3U5aO /u3as/rPxn+038Nvhzoei6n4h+IXgfQdN8SQfadJu9R121tYNUi2o3mQO7hZU2yIdyEjDqe4qtrv 7Wvwq8L+GNH1vU/ib8PtO0bxCsraVf3XiKzhtdTETBZDBI0gWUIxAbYTtJAOK+BtF/4J6/Gf4W+H f2cJ7bSfEUlx4JvvE+qa1D4S1LRzfeF01MRtBaW51J1tZSuXVyqlAfM2k/I7bfwT/ZK+P/ws+Bnw S8Gal4d12PwNoMutP4n8O+EPFUOk6tO8rymxku71buIum6ZmkS2nK9PkYqqjFZzj2pXw7i7Kys2k /dum1vZyavFNe63qtVdXhbJoQjOGNjP3pX9+EW1F1krJ3s2qdNxu7S9olePuuX3xB8bPBlzeeHbe Pxd4YkuPGELXOgxLqkBfW4lQO0lqN2Z1CEMWj3AAg9Kh0z4/eBNa0DRdVs/GvhK70vxJe/2bpF5D rFvJb6pdZYfZ4HD7ZZco42IS2Vbjg1+e/wADP+Cc/wAZNA0n9kyzu7DVPB0/w2TxOviPUtN1DSri 50M3k0r2+wTefFN5isAdscm0Mc7SMiTRf+CfnxysP+CfHwC8D6TpMHh/x94L8fyazqE89/aTJoVu 0t6VvCUlKylBNG4SMsxJA28HHRHNcY3L/Z3o1bzTlBP7lKTu7L3b7J2itwrk8JKMcfF+843urWTx C5tL6P2VNq13+8XeHN+gcXx/8B3F39nj8beEXn/tg+HfLXWLcv8A2mASbHG/P2kYP7n7/H3a1vCX xD0Dx9JqaaFrmj60+i3smm6gthex3JsLqP79vLsJ8uVcjKNhhnkV+aU3/BMH4v8AgX4dHwx4E0x9 Kl0743nxLo+r6hqttcyWukiyMCanJ+93O4f5jHjzC38GK+pP+CX/AOyVrP7Hvh74p+H9R067sdJ1 Dxxd3+gS3V/HeT39gYYUjuJGR2IdyjEh9rZzlRkVrluY4yvVUK9FwXLe+u/LTdtV0cprW3w91K3D nOQ5VhsJKvhcWqkr6R929uZq7s30s0lfreytf3TxX8fPAvgPx1pvhfXPGvhLRvE2seX9g0i+1e3t r6+8xzHH5ULuHfe6lV2g5YEDkV5b+35/wUG8K/sJ/CnUNXurjw9rniy2S2mtPCsuvw6fqOoQy3Ah MyIVeQov7xtwjI/dsMjBI+dP2lf2Hvij4h8VftJ6DpXhCLxZbfH2fRJtH8TtqdpDb+H1t5FWSO9S aUXAW3Cb0+zRTbhsA2t8q+Qf8FNv2fvHf7P3wv8A2iNX13Rb3xXoPxCj8JCy8XxXtt/of2KSGGS2 uYJZhcKWkG4NEsqnepYj5tvl5hnWPhh5SVNw/vWbt8V426tWXvaQfNaN2rP2+H+FcnxGOw9OpiFU UnC8OZJyu6N9U7x/iTXL8b9m7Wu+X9M/AP7R/gL4mfD++8UaJ408IaroWjwmXVL+x1m3ubTS9sYk cTzI5SPanzHcRgcnApmn/tP/AA01b4eXni61+Ifga58J6fcC0utai161fTraY7MRPcCTy1c+Ynyl gfnXjkV8FfFf9gD4sftL6R8ePF1p4bXwg3jlfDb6P4W1PU7RpvEaaWkby/aHtpZIIjKV2xh5D8w+ fYMOOV/4KUfBPxjB8C/2k/ivr/hq58B6N40TwrpVj4euru1uLy4ezuLZXu5vskssCjLGOMeYzlVY kIMA9GKzvGUYSqToWSvvdae9aV/O0VyfGnJN6JnPl/CGV4rEUsPDFq85QVk4tpy9inHR+817Sfvx 9390+75f0bsv2qvhfqXgzU/Edt8SPAVx4e0SZLbUdUj8QWj2VhK5ASOWYSbI2YkAKxBJIreg+K3h a68bw+GYvEugSeJLmxGpw6SuoQm+ltCcC4WHdvMWeN4G3Pevzp+Of7C/xY/aS0T45+I7TwDNoNv8 Q7bwppukeHrrVNPS81GKwktmnu5mhuHt48Rq6oDKXKjGBwD6F+zz/wAE5vFX7In7fFj410//AISL x74XtPA17p8mp3V/bi781Z1Wx0yOKacH93aRQxCQ7Y2ZSzMm4gb0szxzrRhUoNQbacrO6S59eWzf vWi0ul3GXvWT4q/D2TxwsqscYvact1C8XryU5W5k7aSlOF/tON4rSVvrAftd/Cc+Ov8AhF/+Fn/D z/hJvt39mf2R/wAJHZ/bvte/y/s/k+Zv83f8uzG7dxjNat3+0D4C0/4mx+Cp/G3hGDxlMVEegyax brqblk8wAWxfzTlPmHy/d56V8NT/ALBfxUu/CPwj1GXwzGNcb45y/ErxPZLqts50OznuS5DO0gWV 0jCblhMmTnbu61R0H/gnj490DxZ4n0LxTo/xM8T6VP8AFH/hPdG1Hw1q/hq10uaR5kdLq6ku0GpR zxIzrIkW9WwQmc7jFHNce/ZqpQau1fR6JxpSa8muea5tVzU2rK+m0+G8ltJwxi0T05o6tSlG62TW ily6NqV1Kyu/u8ftFfD5oy48deDSi6yPDpb+2rbA1M5xYff/AOPng/ufv8fdqR/j/wCA47RLhvG3 hFYJNY/4R1JDrFuEbU8kfYQd+Dc8H9z9/g/LX53Qf8E3/jOmuzagdP1UWjftEJ41Gi/2hpP2JtID Ox1Td/r/ADQCE8nzs7T/AKnd8whT/gmD8X9S+Ip8T6lpjyxaV8b/APhJdD0iLVbZY7bSZr0z3mpy /vdru6R2qpHnzFWN/ky1Rh84x8/Z82Ga5uW+j92/sbv5c8/P3NbWlbapwrkkeZ/X4u3Zxd/ist/J Xe1npd2T/Qbx9+1d8LfhT4nk0TxR8SvAHhvWolR3sNV8Q2lndIrDKkxySKwBHIOORXTeO/iL4f8A hb4Wn1zxNrujeHNFtSgm1DVL2OztYizBV3SyMFGWIAyeSQK/O39uT/gn18X/AI7eMP2idX8H6Jf6 RpfjSXw9FY6KNR0xv+EzmspU8y9keVma1iiTdsjWSFnIUsDyh+mv+CrPwD8W/tKfsJ+JvBvgrSf7 a8SahPp729n9qhtvMEV3DJJ88zogwiMeWGccZNdNPMsY8PVqui+aL91Weqvbbd6a9H3Udjzp5Bla r4KlHFK1ZpVHzR/d+7Sbb6KznNatr3HrfmUfVvCX7Uvwx8f6JrOp6D8RvAmt6b4dg+1atd2Gv2lz BpkOGPmTukhWJMIx3OQPlPoaPCv7Unwy8d2er3Gh/EbwJrNv4ftDqGqS2Ov2lwmm2wUsZ5ykhEce ATvbC4BOa+N/jf8As9eMPhtaftteMta0j7F4b8Z+AbCHR7z7VBJ9se10d4bgbEcumx+PnVc9Rkc1 xH7MnwH+NHxF8MeBPiN8P9Ai8DTeFvgXH4a0DUdTubGR/EOoygyxMkUUsoWBeHU3QTDuMx/exz1M 5xcKns1ScmottJO//L62m2vs42Td5c1k9jsp8K5bUwzxKxCjF8iTlKNk5U6U3Fu124ynKDaXu8rb jo0foB4O/ag+GnxE0bWdR8P/ABE8C67p/hy3+16tdafr1rdQ6XDhm82d0kIiTCOdzkDCtzwak+Gf 7S3w5+NWrz6f4N8f+CfFt/aw/aJrbRtctb+aGPIXeyROxC5IGSMZI9a+CvB/7Dvxc1LxL441a98H eNUvPEHwCvfBk134o8Y22sXureIZGyyq7Xs/kwyHlAGSJRyRGzEV1f8AwTs/ZG+LPwm/aa8G+I/F nhvXbLStB+GEPhC/u/El/pE0lpPFOsi22mppsrZt8877pTIQGy2SAd8NmeMniKdKrSaTvd2lZWdR Xu7WvyQaTW015XjHcN5RSw1atRxacopOMeaF3pFtaN82ra0ta2z1PtvX/jP4P8KeIb3SNU8V+GtN 1XTdMfWruyutTghuLWwQkPdyRswZYFIOZCAgwcmsrxf+1B8NPh/oOi6rr3xE8C6JpfiSE3Gk3moa 9a21vqkQCkvA7yBZVAdDlCRh19RXyN+3H+xD8UPjh+2F488U+F49VsNB1T4N33hm1u7G70xf7W1F 5JWXTpEug7pFKHXdIqxkdpkOavaj+z38atD+FX7N/hYaV4quvBXhfw19i8b+H/C/iaDRtSe/SyEV uJLtbqBntlkZtywTHO3JWTCARPNcao1LUWnF2WjafvzjfTW3LGL0T+K9uVpmFPh7K3To1HiotyV5 R5opq1Pmtd6XcvdSdk3o2mfbHhzxHp3jDQbPVdIv7LVNL1GFbi0vLOdZ7e6iYZV0dSVZSCCCCQRX O+Gv2g/AXjTxlqvhzRvG/hHV/EOhCVtS0uy1i3uL3TxE4jlM0KOXj2OQrbgNrEA4NeNf8E3v2dfF /wAEf+Cc3hv4eeKreTwr4ttbTU7eZY7mO5ewee7uXikWSFyrELIjja+e2Qc4+ff2fv2Bvifb23wA 8Gaz4Tj8G2vwTm8QtrHiiLUrSe216O73xxrZJFK1yfPV98n2iOEKqnIY4SunF4/FwlFUKV+ZJ9d2 0mm9lyJ8zvrJK0dTmo5HlrqYqFTFK1Kc4xd170Yqo1NK/vKbhGKUb25072SUvoH9mH/gofafta/E BIPDFp4ItfDVzLO1mNU8YLB4ovrSJdpvU0dbZysDShgpkuEYoN5VchD7L8Mf2hfAHxturyDwZ448 H+Lp9OVXu49F1m2v3tVYkKXETsVBIIGcZwfSvhf9lr9hP4n+DNe/Zw8O6n4Fi8MwfA3VtdvNY8Ur f2DW2uQ3EjiBLVIZnuWMysC/nxxBQvOThad+1p+yL8adY/as+OHizwF4b8dQ3/jTTNDtfCXiHQPG UGjW1nPbrGtw95EL2KSSMKHUK8EuTnaozurz6WaY6lRhOpSlO7afutSaVPnTSsrXnemlJK8tbpNW 9nG8P5LWx1TD4bERpx5bxfPFxuq3s/eblq3TtVfK01G/uM+6PG/7QPgL4Z+LNP0HxJ428I+H9d1Y IbHTtS1i3tLu93uUTyopHDvucFRtByRgc1Nqvxw8FaFc+IoL3xh4Ws5vCEUc+uxz6rBG2iRyLuje 6BYGBXXlTJtBHIzXwR8Vv+CfPxM1f4ofGRfFlj498d+Hfi3YaRPcS+Cb/wAOWn2q5tIFU291/ayL NAqTxh4ntWICEEjcNq5Px7/4J0/GLxj8b/ir4n0rQn1fw7eXfg6/g8Manqti9r4/h060jjubO5l3 CSN45FyGcxxSENlHBQrbzfH62oPe20tPi1295LlT93WV7JK8XLGhwvk8+VTxsVeKlvHVt0Vy6tcr 9+atLRcnNKSXOofc5/bZ+DK69/ZR+LnwxGp+f9l+x/8ACU2Pn+du2+Xs83dv3cbcZzxXV6X8YPCW ufDl/GFl4p8OXnhGKGW4fW4NShk05IoiyyObgMYwqFWDHdhSpzjBr51X9nfxhqH/AAVF8L/E238K PpHgW1+Ff/CPyM91aK2nXpu5JRZmGOVjlUZRujDRcYDmvkf4b/sDftF+HP2cdC8DaX4Y8a+HVt/C PivT/FVlqPjW1u9E1+e8WX+zYbO0W+lihkVpAWk8qBQdxZmJO5182x1JT/cOTXPayl9ltR76Stff Zq1+sYXhvKMRGLWLVN/u2+aUNpRqSmujvFxjHZ+9NcyS1X6seHPEeneMNBs9V0i/stU0vUYVuLS8 s51nt7qJhlXR1JVlIIIIJBFXa8z/AGMPh9rHwm/ZJ+G3hjxBZ/2frmgeG7Gwv7bzUl8ieOBVdN6F kbDAjKkg9jXplfTM+HxNONOtKEHdJtJ90nuFFFFBiFFFFABRRRQBxo/aK+HzRlx468GlF1keHS39 tW2BqZziw+//AMfPB/c/f4+7Unjf9oHwF8M/Fmn6D4k8beEfD+u6sENjp2paxb2l3e73KJ5UUjh3 3OCo2g5IwOa/O6D/AIJv/GdNdm1A6fqotG/aITxqNF/tDSfsTaQGdjqm7/X+aAQnk+dnaf8AU7vm HY/tDfsB+OfEnx++PMup6R8RPF/gX4wx6bdQr4P1Hw5byu1rGAlpeHVkE0IjkjRo5LVmG3BILfKP llnOPdCNR4dqT6Wf/PuMul2rybjeztazTl7p+hvhfJliPZ/XouNr3vH+eMbXel1FuVr+9ayaV5L7 W+Jf7Tnw1+C+uxaX4x+IXgfwnqc8AuYrTWddtbCeSIsyiQJK6sULKw3AYypHY1m61+2b8H/Dmsx6 dqPxX+GthqEscMqWtz4nsopnSZFkiYI0oJDo6MpxhldSMgivg34p6b4s+PnjH9paXw58OvF2vDTP BEHwptL3+0dJAtbm2ja4u3uXmu4ZGXfLHh4o33gE4U/LXk+g/sifFr9pP4P+Mte8I+EPGF74a+KP hfwbHoyQaloUGmao+mWlrHMNRE84vI4kkhcp9nKMxHzZGKxnxBivaONGk5R3Voy1jzVEn2fNGEZJ rT30rOx24LgnLZUlPGYlU3aPNecFaUvZO2uzSnN8r1fs3qldr9aNd+PXgXwvBr8up+NPCenReFHg j1t7rV7eFdHafHkrclnHkmTcuwPjduGM5qXUPjX4N0jWNT0678W+GLXUNE006zqNrLqkCTWFiBk3 UyFsxwY58xgF96/N/wDaw/4Ji/Gf48+L/j7qZ0y2bTtdGiah4d0nT9Tggi1/VILa3t5JSXlGyC3j +2BUmKFmkQ/NtGfYf+CgH7JnxU/ai+ImnweGNFuPD+leDfh7rliusxX9ktx4nvb+y8hdIVHkYLAW Cb5Jo0wdxjdGCyV01M3x0aU5rDttfCrP3tJ39LOK9U0l70oo8yHDWUSnQi8bH303N3jaDUKUkt7u 8pyjps4u/wAEz61vv2ifh9pn2f7T468HW/2zSDr8Hm61bJ5+mhdxvVy/zW4UE+aPkxzmn3vx/wDA emy+XceNvCNvJ/Y//CRbZNYt0P8AZn/P9gv/AMe3/Tb7n+1XwP8ADP8AYV+NHwr+FfxQ8L3nhy48 Wv8AEz4Rado1pqUup6elz4f1K001rYaM482NDBvZtksSMDlTJI5LSVgeGv8AgmD8X/Cya/qF9pj6 /wCIfFfwQvvDV/ONVtlgg1ZikVppkKvKNqRW0UKeZ/qyyuxf5qVfOMdBy5MO3ZSez3XtbR0vdvkh qtPf0esb70+Fsmbaljo2vFLWOt1Bt7rlUXKcddW4p2s3b9G7b46+CLy58Nww+MvCss3jKNptAjTV rdm1xFUMzWoD5nUKQSY9wAINM/4X54FPxR/4Qf8A4TXwl/wmo/5l/wDte3/tT/Ved/x7b/N/1Xz/ AHfu/N05r4J+C/8AwSe8YfAf4/8A7OXiuybWdbs/DDytrdrealCYfBkD2ALWsIaY+crX012+6IHh 1XooZrNt+wN8V4rGb4dnw4MyfGtfiMPiKNTtfsxsQPO8wxmb7b9tz+52CIJuJPnbPnO1PM8dzclS hZ87jpdq37qzT22nN83w/u3Hd3XPU4dyW7dLGqUeTmu+WLT5qi1TetlCPuL3pc6cdN/uLxp+038N vhv4yi8O+IviF4H0HxBP5fl6ZqOu2treSeYcR4hkcOdx4GBz2rCtv27fgheTGOH4yfCqWRVZyqeL bBmCqpZjgS9AoJJ7AE14b8APgv48/Zc8V/GDRtW+FV38VLT4i+NJfEtn4gt9R0pbee2nZNlvfJdz xzqbYoWHlxTL8x2AHrzvxM/Y4+JHiH44ftlaxZ+HPO074reDbLSvC039oWq/2pcx6b5Lx7TIGixJ 8u6UIp6g45rKpmmPVOFSFK7ak2uWV4uMHJRv1ba5FJaNu6T0TihkWUutOlVr+6lFxlzwtK86cX7u rjZTc7PVKDv1cfsjSfi34U1/xJZ6NYeJ/D17rGo6aus2ljBqMMlzdWLHat2kasWaAngSAFSe9dDX wH+wl+wP8S/2dv2rPDHjvxTaPqtzc/DE6Xrl4NRhaC01FJ4VttOhj3lgkVrBEm9VKMyu247sV9mf Arxn4s8ffDGx1Xxt4LPgDxJO0oudD/teHVfsoWRlQ/aIgEfegVuBxuweRXsYPFTqwvVg4y97Sz2U mlra12rOy73V1qeHneV4fC1P9jrKrBKN2nG/M072jfmsrPW2mnNZySPOE/b003RfHngzRPFnw/8A iR4Ei+IF+2l6FqWuWtiLa7ugCUhdLe7lngaQD5RNEnvjBwfFr9vPTfgTdSXfi74ffEjQ/CMWuJoD +KZ7WxOmiV5PKSbyluzefZ2bgSfZ8HII4Iz4XP8AD74xftE/t3aF48+KPwo8baZ4A+Ht5u8E6Bpm q6DcQrO52HVNTc6iHMiDDiKFH24UKzFX89/7Ynw6+MP7V/7TGjaP4i+FnjQfATwRqCamtnoeq6E9 942vYWzG1wLjUIvIsweVTBkZclgjuvkeJDH4z2UZWldzsrwa9xct5T93T7dkrOzgviUkfTxyXK/r MKdSVNR9nzVLVU0pXlaNN83vTtyJ3vFS5n8KuvobxP8AtveEvCv7WXhb4Nz6b4ubxR4sjupbW7Oj SQaWgt7czv8A6RNsE2UGM24lCt8rFTXreqapa6Hplze3tzBZ2dnE08888gjigjUFmdmOAqgAkk8A Cvj/APaS8AfEfxZ/wUb+DXxE0b4VeLNU8KfDaz1O21G5i1LRY3uWvbTy0MEcl8jERs2H3hD8rbQ4 wT7L8fP2LPDnx78NeLrW61rxzp174t0y606R4/Fuqvp9t50DQ7xpxufsZChs7PKCkjPDfNXoUsVj HQqyjDmnFzSTvG6Xw2utb9728zwsZl+W05YX95yxnTi5uLjUanzyUrpNOPu8rtZvybueey/8Fifg lD8VG8NtqPif7Aul/wBrnxKPD12dD8j7T9m3iYJvMPmcfafL+zf9Ns8V3vxm/bNg+EOiazrlv8Pf H/jDwloOipr934j0H+zH0xrRo3lLwvcXsLz7Y0LHyUcAMvPzCvjhv+Ce/wC0I3xxOm/2R8OxoR+E X/Crv+Ep/tV/sf2XzvL+0/YfK877X9m58j/Ub/8Al4x8les/Gz9mfxF4b/ZKX4KaL8OfiX42h8Me Ejo2geINJ8Y2mkafqV1JbFGN9avqEBaNJQp8qWK5j2kgAgsD5Tx+ZPD1ZuLur8rUGm2pVLJxfM7c qhJPRO/LzXu19JXyXIIYmhGjUUlK3OnUi0ovlvLmvTSldtct72vLltGz+uPhh8R9J+MHw50PxVoU 73Oi+IrGHUbGV42iaSGVA6EqwBU4I4NXR4s0o3M0P9p6f51vdLYyx/aE3RXDIsiwsM5EhR0YKeSr KcYIrivgn8M/Eej/ALLXh/wj4v1aCPxNF4fTS9R1Dw/GlglvN5Pll7URoqRbP4CsagFQQoHFeC/s +f8ABMrVfgL8VfCniL/hKNJ8RQ+Ebq8git9R093F/b3JErao434TW97PDJdjeJoI4xtjOQPoq9ev HERhTp3g7Xd1peST08ldnx1HBYGcazqV+VxvyqzfNZO3vWW7SWy3vZWaPR/FP7fWi2Xinxvpvhfw R8QfiLF8NlK+Jb7w5a2RttNnCu72q/arqB7idETcyWySkb0X75216r8Lfi54c+NXw00rxj4Y1a21 bw3rVsLu0vo8okkfOSQwDIVIIZWAKkEEAgivlv4U/Cr4ofsS6x8btJ8O/DfUPibpvj/X7vxd4c1H TtV0yzjiuLxCJLO+W7nikQRvGhDxJMrJJnAYFK9T/YX/AGU9Q/ZE/Yo0D4cX1/bavrOnWdy13NbZ EDXFxJJKyRlgpKK0m0MwBIGSBnA87BYvGShKVWLuoKTVrWnreC/mXZ67bvmVvUzjLsspUb4aavzx UbSUnKDheUpK/uOMrJK0fias3Bs7Hwp+118J/Hn9pf2H8T/h5rP9jWUmp6h9h8R2dz9htY8eZcS7 JD5cSZG52woyMkVueA/jZ4M+KfhS717wx4u8MeI9DsHeO61HS9UgvLS2ZEDuryxsyKVRlYgkYDAn g18LeGP+CfHxSvv+CLen/CS50q20zx7pepPqsuhXOowtDqscepPdC0aeJ2iHmptKlm2hwgYpyyyf G79gf4qftTwftEa9ZaW3wyf4k6doWn6T4e1HULZ5tTbThE8r3TWck0EaOA0MfzuxAJYIvByqZnjo L+DzPlT0TVrwcvO9pWg4q823zWtoeh/q5k0qs4LGKMY1JQUm4u8VUpwUrKzalGUqia91KFm3duP2 Bo/7aXwc8QqTp/xZ+Gd8BNFbE2/iixlxLKSIo/llPzOQQq9WIOM4rc8YftC+APh5qOp2ev8Ajjwf od3otrHe6hBqGs21tJYW8kixxzSq7gxxtI6IrNgFmUA5IFfOX7S3gSX9pb9kLx3oXiz4S3Hwlh0n wZ59trerahpTx6bc2mLiGGFrGeZxbRPEGLMIxtGAnJA+Q9F0/wAXfF79m/wpr/i3w7deJfiX+1Z4 y0y7kg077NCU0HRVimEaG5mjRZJI4HkVWlVW8wZZTgHPEZzXpVfY8t/hd7SWkpunFcvxc3NZ26xu 03uVl3CmCxVL28qjglLla5oStaKm2pr3bKmqjb+y4xT+LT9ONI/a1+FXiDwhq3iCw+Jvw+vdA0Fo l1PUrfxFZyWenGVtsQmlWQpGXbhdxG48DNTad+1J8MtX8AXviy0+IvgS68LaZOtreazDr9o+n2kz FQsck4k8tHJdMKWBO9fUV8CPY/GXW/jJ+1loXgDQtf8AA/xG8b/2D4h0+0uL7TkvxpWHtZ1iuIri WCC5YLJsbzAVAyGR9pHAfto/s3eK/g9+zH+1b4n1nwr4l8N+HPG934ObRB4h8RRa5qdz9nmWO48+ YXVy+8SMOHkKgMAhKrxzz4hxMaPt/Ze7yu+kkuZNxavrs0007ST6M7sLwTl9XExwssSlKUqSilKD bVT2N9NLtKrKUZRumoSuon6l+BPjr4I+KOjalqPhnxl4V8RafozFNQutL1a3vIbEhdxErxuVjIUE /MRwM1x//DfXwJ/6LV8Jf/Cv0/8A+PV8cfEj9gb4r/tT6d+0BrtnpA+G0fxE0bw/p2h6RqN/atNr A09YXka5NnLNFGsgQxJl2bBG4Kuc+i/tv/DH4h/tcfsR+MPBWgfAbUvCPiafRdLtLH7dquhr5vk6 hayvZW7wXTgQRpG7gyGIHaoCZOB0V80x8KU5RovminZcsves5rp8N1FPlfvLms1e3N5tDh3KHXow niVyzlCMnz017JSjSbbb+NRc5puNkvZttq+n0nf/ALZXwg0rw3p2s3XxV+G1to+rvNFY30viayS2 vXiKiVYpDJtcoXTcFJ27lzjIrV1T9pD4d6H8ObLxhe+PfBdn4R1KTybTW59bto9Ounyw2x3BcRu2 UfgMT8jehr5h/be/Zs+JHjb4v/s4+I/CejeK7i3+HlnqsWuXPhq90ePVNOa4s7aGMQrqTi3csyOC cNhQxGDtNeL/AAq/4J6/Gz4X+BP2eNYOk6lYXfwwk16zvtG8NahpEmuWMN9I7R3aNqPm6fLM3Kyj eMK0fl4IbbpiM0xtOvUoqi5KLspKLs1eK5lrqnd6J6JNttJseF4dyitg6WJliownNNuDnG6t7a0X peN+Sn7zTv7T4fhUv0RtPjj4K1C58OwweMPC083jCF7jQY49VgZtbjRd7vagPmdVUhiY9wAOTxVb Qf2ivh94qk0JNL8deDdSfxQZxoy2utW0x1cwZ84W4Vz53l4O/ZnbjnFfCXhj/gnF440H4mfs+jwj pXxC8D+GPA2oeJp9Q1DUtX0C81jREvFUwsI40ktNsrBv3cUUojDnJBwRz/7Pn/BN/wCM/hmy/Zat b7T9V8HT/DyTxQfEOp6dqGk3F1oovJGa3KLL58UvmA4O2OTaGOdpwRlDOMe7N4Z9Oj68ve213ult tulrU4XyZU5Tjjo3SlZNxvosRa6Te/sqekXJ/vF3hzfoiP2gPAZ+GL+Nh428InwZGdra/wD2xb/2 Wp8zysG53+UD5hCfe+8cdeKjX9or4fP4T0XX18d+DToXiO7FhpOojWrb7JqlyWZBBBLv2Sybkddi EtlWGMg18J/DH9gX4seCv2Hf2fdPvfDC33iP4R+PW8Tax4ROp2nmapbG8mKtDL5wtWmjSQSKskij Bcbg3ytn/Ef/AIJmfET45aLcnWPDtzpOkePfjY/jG/0OLVrVbvw1pLQTQPdSPHMYTcuSkhS3eUj5 Pmc7gulTNMetIYdt+73W/sr67aOc13j7NuWj0X+rOSqrOMsauWM5q6cXeMXNRsr3fMoxkpL3HzKK 94/RLRfib4b8SeMNW8Pad4h0O/8AEGgiNtT0y2vopbzThIN0ZmiVi8e4cjcBkdKTUfij4Z0jxbJo F34i0K116HT21eTTZr+JLtLJWKtdGItvEIYEGTG0EEZr5Q/4J7fsL+L/ANkn9rr4t6trVxqPiDRf FGlaT5Xii+uonn8Qagqu97M0IleSL965wrAADAUtjNcj/wAFF/2Dfit+0x+1V4k17wXLLpGjXvwn bw8l6Lq1WHVbwai876XMjN56RzQnBlj2AFhl9u9G0q5njIYGGIVBuo3NOKvpy+05Xte0uWLva7Ul yptpPgoZDldTM5YN4tKlyQkqjtZuSg2rd4uUlbdONnazt9Za9+2R8IfCsWmyap8VfhvpqaxaLf2D XXiayhF9bszKs0RaQb4yyOA65BKsM8Gtn4mftBeAvgtFp8njHxv4Q8JpqwdrFtZ1m3sBeBNu8xGV 137d6Z25xuXPUV8O/Hz9nL42/FfwqdCt/hx4j0LwHcfC640fRvBXhrxVY6RYaB4hkBR/t3k3kQvL fCAxjM0ZVwHjRmlrP8J6f4uk/aF+Gvg+P4ceJvEOr/AP4PwaLq1vpt5pSta6rqllDEBuuLyFHiSO CVS8bOd3RSCGOFfOcTBziqbvzWh7svet7VvTrpTumntJN22O+jwrl9SnGosQtFJzSnT91e6o+9sr ykou6av8Las39wa7+1r8KvC/hjR9b1P4m/D7TtG8QrK2lX914is4bXUxEwWQwSNIFlCMQG2E7SQD itnX/jh4K8J/D228Xar4w8Lab4UvVje31q61WCHTp1kGYyk7MI2Dj7pDc9s1+c/7IXgf4r+NP2XP gb4f0nS/GV54D8DXev6H460Pw54jg0PUZ9SinnSAtdrdQO9oryncsM3JQkpJhK6T4A/sJ/Fj4MfC j9lvXNT8Htr1/wDBu91w674Lj1SxNwft1xOYLy3kklFq8sKukmGmU9AGDZxVLN8TU96FN8j5Gpcs tpW1sr8ys7qz/wAXKrtPF8KZbh3KFTFLnjOceXmhdqKrcq1tyNunGLck4r2kWm/hPsL/AIb6+BP/ AEWr4S/+Ffp//wAerY8P/tcfCjxb4pttC0r4nfD3U9bvZ2trfT7TxHZzXU8q/ejSJZCzOO6gZFfO /wAVvgb49+Nn7YP7PPj6x+F1z4N0XwZr2v3fiCK61HTDcwJcW9ukV1MtvO6u8rI4IiaVgFBYjOK+ W/gb8EvGn7Sl38QfCfhLwtN5Gm/tIXHiTUvFc93aRWujw2rEsqL532p5zkBQkWzEn3x82Ijm+MVW FOVO/NK1uWSbinRvLXZfvXq0kuRp6tpVQ4XyuthnXVfl5Y3l78JKLc6sUm1a7tTUkk7yU1y9G/1A 8b/tA+Avhn4s0/QfEnjbwj4f13VghsdO1LWLe0u73e5RPKikcO+5wVG0HJGBzWt47+IWgfC3wzPr XifXNH8OaNalVmv9UvI7O1hLMFUNJIQoJYgDJ5JAr4J/aG/YD8c+JPj98eZdT0j4ieL/AAL8YY9N uoV8H6j4ct5Xa1jAS0vDqyCaERyRo0clqzDbgkFvlHtn/BS79nLxh8f/APgnRqngLwdpNzrHii4i 0pIbOfUIFmfyLiB5N88rJGzBUYlsjcRwOQK6KeZ4uWHq1XRalG1o2d3dyTXnayd1vfZKzl5ryHLF icHR+tJxquKnK8bQTUG29fds5STUv5b3u3GPv6fGHwjJqGvWi+KfDjXXhW3S71qEalCZNHheMypL cruzCjRguGfAKjIOOapeEf2hvAHxA8Har4i0Hxz4P1vw/oSu2panYazbXNnp4RPMczTI5SMKnzHc RheTxX5//F7/AIJkfGHx9/w0nZQXl7qreNIfCtzoep6ze6dFJ4kOnRI1xayLbRrHFtZRGhkgRGZI yxYFpKZ+0h4A8Q/B34Q/FrXbjwf8XT41+OWm6V4Cjl8Uap4Y8m+vpy1tEqQ6UUjQRwgr50pUnco2 gbmHNWzvF01KUqDWjtdPWXv8qvteUlGNv7yd9YqXoUOE8trckKOLjKUnTVk46c0aLlo7O0eepd7x 9naSvzcn3Ppn7anwb1vTdRvLL4tfDO7s9IhW4v54fFFjJHZRtIsSvKwlwimR0QFsAs6jqQKuaJ+1 l8K/E3hjUdb034mfD/UNG0iSGG+v7bxFZy2tlJM22JJZFkKoztwoYgseBmvzG/bD+Afj34k/GTX/ AAHoXw08TaPq3jP4U6X4f8M6dqeoaOkt3/ZGq2M9w7NDeywxqIVyu+QEnjFdp8Qv2Dvjp478CfH9 7PwlrF3qPj9/C0uly+LNT0Zdav5tPli80P8AYJhZR28SI2AAsjAJ95s1nHPcY5yUaLkk5K6jLXll NX12uop2ezktTt/1NyhUqdSpi1BzcdHOGkZOim9N0uep72y9m9H7zj+jmqfHHwVodz4ihvfGHhaz m8IxRT66k+qwRtoscq7o3ugXBgV15UybQRyM0p+OHgoXRg/4S/wv540b/hIvL/tWDf8A2Z0+343Z +zf9Nvuf7VfIv7Kv7IvxG/ZB+J3x+8Ry+Hbv4gXvi7RNKnsppNStR/wler+RM16MSzL5EP2iYgCT YBHgLvIwfnT/AIdCfHYeF/7M/tS7JHwmGmeT9vs/7PN6Na+3/wDCOZz9p+zeV8vneZ9/jz/J/dVr VzfHwhF/V221Juydote0tr9q/LFqyvZ7XlBPgwvDGTVasoTx0YxXs7SbXvc0ISm7XuuRyas93pdO Ej9PNP8A2ifh9q9rLPaeOvB11BBpB1+SSLWrZ1j00Eg3pIfAtwVYeafkyp54qzH8cPBUt54bt08Y eF2uPGURn0CIarAX1yMKHL2o3ZnUKQ2Y9wwQehr4M/aa/YX+Lv7XHxqvvEFx4Wm8F+G9X+EyaTqu kx6tZia71WCSeaDS0eKZgsP2n7PIZCQjRptLKSwF34gf8E2viB8ZNF/ZW0e5S/8ACM3w18HXVpqm u2V9bvP4X1ZbW2NpIqLMDPieHkRllIBywBBrb+08dzTUaDajKy3XMueom1fRe7GLV3a8tbRabzjw 5k/LTdXGqLlFuVnGXI1T5ktH7z5/d91aqyV5Oy+59L+NngzXNH8QajZeLvDF5p/hOSaHXLqDVIJI dGeFS0qXLhiIWRQSwcgqAScUeA/jZ4M+KfhS717wx4u8MeI9DsHeO61HS9UgvLS2ZEDuryxsyKVR lYgkYDAng1+e2m/8EsviL4d/Y3+PHw70bTvKbU/H0Wv+HLbUdVjk/wCEr0+2MLiOWVZG2PN5ZI87 b+8C7tg+dek+N37A/wAVP2p4P2iNestLb4ZP8SdO0LT9J8PajqFs82ptpwieV7prOSaCNHAaGP53 YgEsEXg5RzfH+zUnh3flTatLR8jk3td2klDkS57u9rFf6tZM6jisalHnS5ny7c1JX5U7vSc5XXur 2bTercfrL/hvr4E/9Fq+Ev8A4V+n/wDx6t3wx+1T8L/G1pfT6L8SPAWrwaZYSareSWXiC0uEtLOM lZLmQpIQkKkENI2FBBya+YP23/hj8Q/2uP2I/GHgrQPgNqXhHxNPoul2lj9u1XQ183ydQtZXsrd4 LpwII0jdwZDEDtUBMnA479r7/gnj8Tv2hf2hNTu7O1e08FXPwli0S98nUYYp9Z1K3aaa304fvAyI bn7O7uwEbLGV3/MaWIzTMKfO6dHnS2tGUb3jUd9buycIpqzb51b7PMsFw/k9anF18R7KTcrpzpzs o+ya+Gybl7SSjqlem7v4uX750TxvovibTdLvNN1fS9QtNbh+0adPbXUcsd/FtDeZCykiRdpByuRg g1d0zU7bW9Nt7yyuILu0uo1mgnhkEkcyMMqysOCpBBBHBr5Ui/YV8QfFr9in4H/D7W9R/wCEG1Pw Ta6ZPq2oWBV9c0qe2gVSmn3UblIJWYFGmG8bCwCtuyNr4TfAPxp+w58EfGOp+FNJf4oeLvEmrDVU 8IWWqR6FoemGWb97FYG43rCiq7O7MczMmdqFto9iWKrQryjOm/Zq/vLVv4Le6k3reXpy+aPCqZVg 3TtQxCdVy5VF2StzNJubailZJ3bSV9WfTFFR2kkk1rE8sfkysgLx7g2w45GR1x60V6DVnY+fPJZ/ 28fhTB4e8Uan/wAJS8lt4O8RjwjqiRaVey3C6sZBELOGFYTLcyFyAPIWQEAkHAJHrNjeJqNlDcRi VY50WRRLE0TgEZG5GAZT6hgCOhANfkjo3wC+Lfwo/aW8V/FWXwD4y8WeCPDPxx1TWJ/CKaPOtzex Tkpb63ZKEEl15W44A3p90gAGRxr/APBQ/wCHnjj43+P/AIs+INP+HHivTPEGmP4fu/AN14a+G5a/ 11BJE817daqbJruK4hj2IIUngePylUxsFfPyGC4ixEqEalel7zcVZXVk4Rk5a3vduXKlraLvqpcv 6fW4FwVTFww+FxKUGrubakk3OMeSy5XePNzSk9OVq2ibf6uUV+WX7cg8OftJfHj9o3UX8HeIfGF7 4R8Bw+CPD08HgvUNYig1lGmubgxzx20kdtJF5iL5jvHw5IJUlqxPjb4T1X9pj4OeEYoPAl/qfheD 4Hw/8I1r2g/D2LXdT1vWUhCLYS3stnO9lFE6ylRGYHJkZllJZALqcT2jOUKfNba0t1er5aXVNNb3 54patX4sLwIqsaMqtfk57c3ND4bwpy0973vjs9FZxleyjJr9aKK/PCw+F/iC8+K3wQ1345eCvFvx A+Gdv8KbKx/s648OXniP+x/Evlxm4mv9PjjlmMzRb082SFsMQCVIyMvw3+xj4Lvv+CivhzWtB+Bz 6J8Lj8Lbm5RdW8HtBa22qC/nKPMJoyI7zYEZRIRMqFOFAAHZis5q0pNRpp2lKPxNNKKk1JrldlJR vHXVOL66cMOFcPyt1MQ9Ic11BOLd7cik5q8l1VtNfJv9I6K/H7/glj8ObzxQ/wCy/rHgPwfrdnq2 g6h4hm8b+KU0W4s7K4055WSK1kvXjWK7JOAkaPIYyrcIQxHdW37PnxFX4hTxt4N8W/8ADQJ+Na6y vjk6VObQ+HfK+8NW8v7OLL7L+6+x+YTkiPyN3yjOhn06kacvYu0nundf8utnZX/iPt/Dqa2Vzuxv A1HD4mrhpYpXpqW8UnpOpG8lzvlj+7Uua7aVSHuu5+o9Ffj237Nvja0/ao1bWIPht4hu9Xh/aEk8 QWpj8B39pfXul/aHIuB4gZTbR2GTuMJHzH59+MY9G+GafGz4QfGPxnpvg7TfibA/i/46atdapot3 4NYeHrzw7OD5mpDUJLPKudgCbLrDBV2xkt8/Ph+JpThGdSg030Tvr+6t0XWo72vKPI3y72rFcB04 J+xxcZNLm1XKvtX6votG0otu10foX8a/jRH8ENGsNRufDPjPxHaXl19lmPhvR5NVmsf3buskkEWZ jGSoTdGj4Z13BVyw2vh34vk8f+BdJ1uXRtZ8PPqtql0dN1eJIb6y3jIjmRHdUkAPK7jg8HBBFfk7 +z9+zF8arb4f/sr6RoXhfxb4R1q1g8XabrGrXmlT2z+FLe8uQrXL+Yg2TeQZGhV9u99mM19u/wDB Hr4aa18Iv2B/C3h7xBo+saHqVhfamr2eq2kltdKhv52RmR1VhuQqwOMEEEcGu7K8yrYmvKM4OMeX mV+jXLeOyv8AEnf1Wtnbk4i4ZwmXYL2lKvGpONRwdt2uatFStzNL+En1vzLayc/p6ivy80T9nzWt R/by1D9mBNMjl+EOleMB8W7iQTBkisXi3R6Y0SgBYjenAUnO0ZwRydL4j/sSfFf4IeMfh7oyaLpn i3wjdftB2/jmPVNDa8nv9OtppCW+2Wv2by4YowCWm88qDtGOdwyw2eVqqhN0Goykot3ekuanCS+H aMpVFfS/sntzIupwfhYTVJ4xc0o+0iuVK8HGUov49JNJXhuuZb2Z+mNFflfp37MXju6+O/iO/wDH beJ9F8fad8Uhr+k+ItM+GOqa/qWqaeXWO3hh1uG5FrBp5gco1tKqiJVIYZG0eifDn4KeD/2Rf28f 2mPifrvwqs9G8AeCNE0nV/DV5b+GIYLaOSOxBuRpjsiRCdpMq3lOuXbDEZNRhc/qVPZyq0uSMua7 cr8qjDnbkktHo4uLs00u5OI4Pw8FONHE+0nGClFKGk5OcIKMW5K6fOmpRvdKWitr+hlFc1oviiT4 i/CODWF0nVtHk1rS/tSadqEaLe23mRbhHKsbuokGQCqs2DxmvyK+Hv8AwT/+NHhb9mL4GX14PGN3 oGn+O9N1dfBh0e4+36HcyXkq3lzcx+Vujt0igidCxwpu5icAgt25hmdXDVo0o0XJPlu72teSjqrb JXel9bJpJuS87IuHaGPpVJ18TGk4ySSavzXjN6WfRxS7Wbd9En+zVFfmH+17+zL4z+IX7VXxok8a pr9tp+sx6Xd+BfEunfDfVfGV7pcFsPM8nTLixuFGmTidDvWRF80sXJ2tluP1/wCBHxd8ZePtO1fw V4T8ReGvAMvxl8Najpun6x4Ou0nivYLOSO916SyVoWtbF5Njyo2N7NkTRFTu8+PENVzUfq73Ssmm 9Z8t2uluqbWrja6blH2KXBOGnSVT65FXipO8Xy3cYy5VK/vP3mtFpyS5rO0X+tlFflVf/A34pXP7 HOhaLceBvEkfibQfikb74sfaPD1zqY8bQNcSuuoeTGYG1eyDMmbeF2O1E4woaqHxq/Zd1uy/Z007 SfDum+K/Fvh//hdWneIn0pvhFq+naRoNpJa3D3Qt9Hmd7qWwV3G5F2ISxRTls0f6w1bX9jpaD+JL 4vZ9Gk+Vc7vJpWcGmovaocEYZz9m8Yr80o6QbVotq91Jq8rKUY31jJNN7H6yUV+Ruk/AXxz4f+Am nWtr4M+IGkaZpv7R1v4mg1HRPBl3azQaZ5Mpe+s9Fkt5pbS3hATYkkcqkkLhsba9B+Fen/G74wft xfArxP458P8AjfVdD8LeK/F9rp2van4ZbTLn+xzbRJZT30UcESWzyMHC744i+OF6E7YTP3WnTpOk 05cvolJU229L6Odlok+VtPos8TwPClCpVjiouMFUe1m3CM5JJXa97ks1fmjzL3WfpjRX5YaZ+zH4 7uPjz4jv/HT+KNF8fab8Uhr+keI9L+GOqa/qWqWBdUt4YdbhuRawaeYHKNbSqoiVTuGRtH0j/wAF c/g7qvxq0f4H6dYeFdQ8W6fbfE7S7jWbWDTHv4YrELKs0lwiqyiDDYYuNuGwetaYbOKtXC+3dG0n KC5eb+ZxWtk+VxcnzRauuXz04sRwvhqWNpYRYpSjNSblytJcsXL3btKalpaSa3Pr6ivy1t/2bfEy fs5fGz4SaX8OfE+mx/Eb44SLo9tD4cmt9Mt9FhvbSY3XmGMW8VoIocISyq+NqbsECbxP8A/GnwR1 D9sq38A/Bm0u9F1zUPDcGg6bceDhd6VPbKsonubKyMXk3b27sJAiK6iQBmVsbThHP6jgqjou3Ld6 7PljJx+G2nMk22ratpHauCsO3KCxa5lJJXSScXOnDmvz6azk7JP4Hrrp+olFfj/8Sf2ZPGVp+zl+ 1Z4Z8G+EfibqfhrWNQ8I3vhi2uPBkmkNqbhkN7Nb6db2lvGhUoocRwIwWNPM+YZO5+0Z+zh8WdW8 O/thR6h4Y13xHq/iWz8ELpt1ofhW8trfWfs72xlFpCz3DSNCi4k2yPhkYkKPlCXEFTrQdrX38m7b eVr7a9Njop8B4aU4weNirygvh1tJ4dXtzacqrttNp3ptdW4frJRX5a/Gi2+N/wAc/ij4ZtLnSvib 42+H3hH4u+GL3w9rGt+DW0nVBbC1la/lmgjs7Yi3ilKjzpIUUZxuPOP0K+GH7RWl/Fr4s+PPCela XrgPw8u4NP1DVZo4Rp1zcywJMYIGWQyM8auu/dGoUkDJr08BmccS2uVx1sr7tKMZN9kvetu07Kz1 SPm824bq4KlCpzqbceaXLtC7SSd7O+qunFNO6a0bPQKK/Mj9sH4CeNfEPxj/AGgpNS8D+MvFHxE8 Rz+H2+EPiPTtKuLuHRYY5wdlvfxp5WltDLveUySQ5BZzvD7nwP2lfAvjbwz8S/2wItZ8I+PNVvfH /gzQdP0rUdL8J6lfWGr3kFhALkpcQW7QoquGyzlFBBHBBA8evxLOlCU5UXopPfS8YTko7aSbgotd OeNnK9j3cJwPSruEY4pXkov4U/ilQTa97WKVaTvprSmmlZuP6rUV+UXif4Sa9+0G3ww1TVbafW/h DrnwatND0a/fwBqfjO10PUdiR3Tx2VnNHNaXhABS7KEEIqgnb8rPiD+zn8W9T+IeoTaJb+MdbhH7 ON1oM+t+IfBN8bnW5N8w+wiITqYNQkQptV3lderROTga4niCrSdTloOSi5JWkrvlVR3a3SfJFx7q aavazqjwPh58sZ4xRbV3eDsndK3Nezau1Jbxas1bVfrBRX5o/EX4E/F+78L/ALFS+BtB1HSvFvhP wZrFtcXep6LcyWmgXj6RbpEl5jb9nZnVkUyEbXGdj7Sh5/Qvg9far8EvgP4P1D4Q+MtF8NbtXl8c arqngD/hKfEllrRjHmCEXtndRxW95P5cn2lISjBUG+PY9aYjPalKdSPsX7rstbc2qWmm2uvZuKSk 5aYU+DKMqVOqsUve5m0ldxUXVWq5rvm9knFJa8zvayc/1Oor5h/4JZ+FvFfhb/gmh4L0bxfp3iLT vEdjYahayWOswTQ31vGt3crBGY5AHVRF5YRcYCbccYr4t/Yw/Zo+M/ha5/ZMOoeHdX0228PS+Mds U/hS8tJ/C8k8bCKTUJpHZSs0hVo8xQ8Aj95nI6MTm06VWEI0nJSSd10u0rW76/8ADbnNh+FaNSWL hPFRj7Cc4q60nyQqyutdE3SS6/Fe7aUZfrhRX5XfscfBDxD8HvF/w88YfEGTxZ4Q8deBdQ1iXxfP b/DDVprrXoJPNkuJNT8QC4ezvbfbGrxuoZgSoRSea8/8N/8ACNLb/Bz4pT+DvEGm614i+Nsni7Wf EF14K1CBYNKvLxxaIdRe2EUsb7oWVI5XGZM4znHFS4jcnTjKmk5NJ++nZSlSinov+nknZ8r/AHc/ U9OfAcPaVI0sQ5qN7NU3ZytVdtZLRqmrSi5J88UvP9kaK/Htv2bfG1p+1Rq2sQfDbxDd6vD+0JJ4 gtTH4Dv7S+vdL+0ORcDxAym2jsMncYSPmPz78Yxo/wDDLXxl1vx0uoXfhvxdZeEdB/aI/tjT9Lh0 yYvqiXF6zzarMmzcLWGGKJY5cbD9omO7HWMLxHVrezvQa5mlvdK/stW7dPaPTdOFna7cbrcB4aF/ 9tjZK+sbNv3tEua71itdrNu/us/XOivyn+K3wJ+KvjP44zax8PvBus+EvhtL8ctA1HR9Kv8Awpdu ba6gt5o7vXPsymBoNPd9jOGA81mBEsRBDRX3wf8AivYfs3/Diw0j4ZeJJPjb4Z+Mraj4k1O90mc2 2uXTfbGj1aS7EKpLZDzEXfkqiqFyMqTdLiKpNXdB7rrvd0leOivpUbV+VtJaK8uTJ8DUOWLWMjd2 urJct4zl73vWVnFRk1dKTt2v+rtFflPrf7IHj/RP+Cdf7R/gW50Xx34n1rVvipFNb3cukztqHiKD 7VYmXUI0CEyI+2R96hlGG5OCa774D/sffGL4Of8ABRq01PxBrereL7yT4Z3+k2HidrCT+y9O8qcQ 6fbvL5WwTmKNJpVOSZJZCNw5NQz6u3C+HdpKLunezcHNrZO97RWlnq24tJS56vB+DhSq1FjY3g5p JxtzKKg093ZPmd76qyspXfL+jVFfmD+yH8AfHugePvgYNF8FeLvCPxS8P3XiNvit4l1bSbi3h1eO WU7Rcag6eVqglmMbxCN59u3eCgUvXZ/sffs7eCJ/h3pfhr46/BPX/Ffxsl8SXT65r2q+CbrVIdRm aaRorptWMTWz2ggMS7DNtyhHlE9bhndWaVqSXrJpS+DSD5Xf4mtVF80WrNJtZ47hLD4ZTl9Yc+Xp GKcrc1VczXPZQtTUubmelSDtZpv9C6K/Jj4f/se+IvCn/BEDU7Wy+EurW/xV1HXYDc2a+HHg17UI ItZjkjWUeWJ2jWMbgWBVVGeAK9x/Yx8HfET9l/8AaN/aG8b/ABC8P+OPFup65p3h7UZ5NK0l7n+0 LqSOTz7TT87UmjtDKsWFYlUhBOOlaYbOalSpThUpOKlFSbvdRvT50tld6NO2z33V6x3B9CjSxE6O KU5UpyhGNknPlqU4XXvOyftLp9o6Xu3H72ooByAeRmivePhgooooAKKKKACiiigAooooAKKKKACi iigDI0b4faB4c/tf+ztD0ew/t+4e81T7PZxxf2lO6hXlm2geY7KACzZJAAJqfwp4S0rwH4cs9H0P TNP0bSNPjENrY2NsltbWyDoqRoAqr7AAVoUVMYRj8Kt0+RpKrOWkm2FNliS4iaORVdHBVlYZDA9Q RTqKbSaszNMx/Anw90D4W+GYNE8MaHo/hzRrUs0NhpdnHZ2sJZizFY4wFGWJJwOSSa2KKKEklZFT nKcnObu3q33YUUUUyQooooAxdJ+G/h3QPGWq+IrDQNFsvEGurEmpanBYxR3morEu2MTTKoeQIoAU MTtHAxW1RRSjFRXLFWX9Mqc5Td5u70XySsvuWi8grP8AFPhLSvHGhy6ZremafrGm3BRpbS+t0uIJ Cjh0LI4KkqyqwyOCoPUVoUUNJqzCMnFqUXZoKKKKZIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVn +HvCWleEkvF0rTNP0xdQupL66FpbpCLm4kOZJn2gbpGIBZjknua0KKVle/X+v8ilJpcqegUy6tYr 62khmjjmhmUpJG6hldSMEEHggjtT6KGk1ZiTad0Z/hTwlpXgPw5Z6Poemafo2kafGIbWxsbZLa2t kHRUjQBVX2AArQoophKTk7vcKKKKBBRRRQBBqml2uuaZc2V7bQXlneRNBPBPGJIp42BVkZTkMpBI IPBBrFvPhJ4U1DwXY+G7jwz4en8O6WYDZ6XJp0LWVp5BDQ+XCV2J5ZVSm0DaVGMYroaKlwi3dr+l t9xpGrOPwtrr8woooqjMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPgH xL438d+Ef+DizwV4Pl+JfjnVvAviL4U6prw8L3V1BDpGn3C3scS+XDbxReaQFJElyZpVLsBIFwo+ UdT/AGpPicPE2qfFn/hZHj+P4oWf7XCfDG38GjxFeDQ30DK2o006R5n2M7rUm4+0eT528eZ5m7mv 1Z1L9hj4Jaz8YB8Qrz4O/Cy68fC8j1EeJZvCdg+sC6TGyf7WYvO81dq4fduG0YPFakn7KHwtl+OK /E5/hr4Ab4lIML4sPh60OuD9z5HF75fn/wCp/d/f+58vTilhV7N0nLXlvfzvVjU+d4p0m39lt63c R1/fVVR05tv/AAU6fyXM1U0+1FLopLGs/iL4w+M1/wCKvCcngP4r/COOGCeKw8ay3Hhm5imZZAiy 2cS3d8+5l/eKLuzC7QQ6hsJXyz/wQa8b+O/2lP8AglXc3Pif4l+Ob3xbe+J/EVgniu5uoNQ1i1WP UZkjaM3kU0HyKAFRoWiUcBAAAPujx34C0L4o+D9R8O+JtF0nxF4f1iBra/0zVLOO8s72JvvRyxSA o6nurAg1wXgj9hj4JfDPwR4i8M+G/g78LPD/AIb8YRLBr2lab4TsLSx1uNQwVLqGOIJOoDNgSBgN x9TUKDTm+8OVevMnfy0VtP0HJ3UUuk1L5crVvPe+vbz0+a/+Ddz4seL/AI0f8E3rXW/HHizxH421 /wD4S/xBayarrl895eTRxajMkal26KqgBUUBVAwqqABXy58Wf+C9/wC034Q+Fn7RWtaH8F/B+rWX wu8baxo+h+LPsl43h+y07SrlYrqLVVFyJRfOs1r5HlOiTGaU7UFuwb9Tfgd+yr8L/wBmKHUY/hr8 N/AXw8j1ho2v08M+H7TSVvjHuCGUW8abyu5sbs43HHU1M37M/wAN38D+JPDDfD/wQfDXjK8m1HX9 JOhWv2HXLqZlaWe6h2bJ5XZVLPIGZioJJwKuSfu2e0FH1klBKT8vdd152HCUbvmW83LzUW5NxXn7 yV/K+9j85v8AgoR/wXE+JX7M2r/EPWPhtpWg+PPDnwaj8OP45srnwa9nb6RNqbRf6H/a8uuRSPO6 OXQ22lXSR+ZEJCfnIvftj/8ABYP41/BD4o/taTeHIvhFbeDf2YdO8KarHZa1ot/PqPiRdXt0eS2+ 1R38UUEgcsI3FvJklFKMTmvuv4l/sGfA340eK317xj8GPhP4s1yW2js31HWfCOn3928EYAjiMssT OUUABVzgYGBXB2n/AASY+CF1+2J47+OHiHwdpHjjxp45bSJFHibSbDU7bw5JpsAggk03fb+bbOwV GdvMYlo0I27QKrRpx2+LXezfJbTra0mk9k+VuVruadlH39Wkl2vaUOvR8qmnJb3uknovmj4Of8FR /jJdftJftEaL8SPFXwh8LfD79n3wjpfizUtSg+HerSahLFqWlPeorxprMu02r7BIqLIZwjhfJLBl 2v8Agm5/wVW+LX7SH7cMPwo+I3hLTbHRvE3wut/id4b1b/hH4/DmoSWsl2kCiWyj1nVxskWVHUyT QSoY3DQ4ZWH3ND8CvBFv4p8Ua5H4N8Kprfje2js/EWoLpNuLrX4I4zFHFdy7N1wixkoqyFgFJAGO K5z4N/sVfBv9nTxI2s/D34S/DLwJq72r2LX3h7wvY6Xctbu6yNCZIIkby2dFYrnBZQcZAq6coqac lpy2tvraev3uDT7Raad1aaibhZPX3ddtuS+3e09P7ys1y2fxF/wWOu77Q/iroPhL4J+PvjDdftW/ EnW9K1Dw1omjeONSGieFNLtJ7Zbq+1DSkmFgmmNHFKHa5gdp5Z3VSwUqnh3/AAUT/aP+Itl8R/24 fF0nxS8feDPFH7OEXgv/AIVvo+keIrzT9LcXBjneWfT4pFt9Q+2Tu8LC5jlG3CDAUAfp78VP+CfP wE+Onji88T+N/gh8IfGPiXUQgutW1zwdp2oX1yERY0DzTQs7bUVVGScKoA4ArZ8Y/sg/CX4i+PvD /ivxB8Lvh1rvijwnHBFoesah4bs7q/0ZIJDJAttO8ZkhEchLoEYbWJIweaxpRcYKLdndu6+zfl1j fS6Uet03OTfRGs5pzUrXSS0/ms7tS8nfpquVdHK/xn+3f8SviP4O/wCCkX7DUlv8QvHOiaF8R9bv rbxB4MtrqC10dnh0vzT5giiSefLycpcTSxgxqURDknz/AP4KSL47/Zm/aJ+MX7QvinxHrfxH+AGi jQNGfwh4S+OviPwlrXhG6Jtorp49PsPLtbi4kFzFKLeS5iZ1KnIMlff3xZ/Ya+Cfx78cp4n8dfB7 4WeNPEscccKatr3hSw1G+WOMkogmmiZwqkkgZwMnFSa3+xJ8GPEvxhj+IepfCL4Yah4/huIbyPxN c+FrGXWEnhCrFKLtojMHQIgVt2VCrgjAqqdo1FNq1pyl6KXKuXu7JO2qcW009DNXUeV6+5GL6XcZ OV/K7avvdJ3TueOf8FTf20fHX7I/w1+DE3w3i8LR6x8VfidoXgJ7jxRpd1qEGnW+orODceRDc20j yoyIdrSgH5gcEhh7P4O+Mll8OrdfCvxM+Jnw0vfiLpmjT+JNVj09F0BV0tJmU3/2C4vbqaG2jGEe Z5mj3qxyudg6zx98KfC3xWj0lfFHhrQPEi6BqUOs6WNV0+G8Gm30OfJu4fMVvLnj3NtkXDLk4IzX D/tL/sW+AP2qPCXiqw8QaPbWOr+MfDcvhC/8SabaW0WvDSJn3zWMd48TusDncSn3csWADYYF2oSS 3cpPXtyJRXykm33T7pFRUfcUtkknbq+Z8z/8BaSXdIyP2xf2h9S8K/8ABPf4k/FD4SXemeLNU0/w Vf6/4Xu9OdNRtNQkS0eWCaIoWSZCQGG0kMB3BrwL9jP/AIV/8F/2QPhx+0N4m+N3xL8SapqHgSfx Trc2r/Ea+1LTfEjGx+133l6XPO1nGbdlk2JaQwmIJtPy7gft3wv4Z0/wV4a07RtJs7fT9K0m1jsr K1gQJFbQxoEjjQDoqqoAHYCvJrL/AIJxfs86bf6zdW3wG+DFvdeIoJbXVpo/BOmJJqcUrh5Y52EO ZUd1VmV8hioJyRU1Yte19i7cySi3vG3N0/vcy5v8K+LS0wd1T9qvhb5ktnfl6/3eV8t19p7dfxJ/ ZV/4KRfHHwXbfF3WfiN4/wDi01p+1D8JPF/jTwXFrVprml2vgXVrOK+vLW00a5u1SGWI2EkUyy2D bFJgXqis30/+zf8AtP8Ax+8RftAf8EyLHxpqQ0rw1478Iavc3k+meP8AUdWuPHWzw3BMlxrFtLZ2 6CZXKygGW7xJJIQ4Khn/AFG+JH7Mvw2+MnhrSNF8X/D7wP4q0fw+MaXY6xoVrfW2m/ujD+4jlRli /dEp8oHykr04qxafs9+AbC88G3EHgfwfDcfDq3e08KSx6NbK/hiF4RA8ViQmbVGiVYysW0FFCkYG K6aU4U5aL3VZJb+6lVtd73XtIrVu6gm23axOUppt7yU7/wCKcYx08ly39W7WPxT/AGUv25vid46/ 4KKXvws+JnxE8feHfgxqv7RPi6xtPEp8TX4l1q/tY7ddN8JpcRyJJp9oGkEyosnl3BbyQgAfd9aa j8HFP/BwLa/Db/hOvjcvgO4+Dsnj19DX4s+KFszrA14QCcKNQ4j8o7Ps4/cbePLr7e1n9jP4P+I/ C+p6HqHwo+Gt/outa23ibUNPuPDFlLa3+qtw2oSxtEVkuj3mYGQ/3q6r/hU/hX/hZqeNf+Ea8P8A /CZR6Z/Yqa9/Z0P9prYeZ5v2QXO3zRB5nz+Xu2bucZ5rHDtU1R5tXBNN/wA37pQT9VKz9IxfxXbq vJVJVmtp7f3f3vPb0cW13vJq/LZL4N/4Lm/tb/Erwl/wTC+Ot3oXgj4wfB/UfDaaf/ZfjRdc0i0W 7zrVlAfskmm6nNexebE7kebDF+7LBtrHYfLvjRc6/wDsu/8ABR34l+DPCHxB+LieGB+yhrfjCOw1 n4h67ryW2sLfNEl9C1/dztFMqIoVoyu3nGCxz+ovxM+Fnhj40+Cb3wz4y8OaD4t8N6lsF5pWs6fF f2N1sdZE8yGVWR9rqrDIOGUEcgVR174C+BvFPi658Qan4L8J6jr17osnhq41K60i3mu59KkYu+nv KyF2tWYljCT5ZJyVzWE6bdKUE7N8+v8AipOCv6SfN2001N6daMXG62d//J6UvyhJa/zdrnwj/wAE cPgL45+Mf7JfgDxZ8SF8XT2HjrwBbSz+JIv2jPGuratqktxHCxlbTZVhttPlcb2821uWeFhtjJDF h8leKdb8XeCP+Ca37f3j3Tvip8cx4t+E3xU1rwd4Rv7j4p+I7k6LpcN3pyxQokt60bOqyyATOrTY c/PX69fB39hL4Ifs7+MP+Eh+H/wb+FXgXX/Ie1/tPw94SsNMvPKfBePzYIlfY21crnBwPStu8/Zd +GeoeDfFPhy4+HXgWfw945v5NV8SaXJoFo1n4gvJGRpLm8hMey4mZo0LSSBmJRSTwK6cXJVZ1JwV uaLSXZucZLy0ipR0S+J6Wbvz4NqlGEamvLOMn5qMWmvm2nq38K10VvzR/wCCg+g/Ff8AZH/4Ix/G 3xwlx4o+H3imXTPDx0rWdH+P/i7xrfNv1S1WZlOpxW/9nuUk2k2zMZFkdWIVRu8//bv039or9mT9 hX9qz4j6Zq/xu+Efw8n0TwtbeDtK8U/EyXX/ABPZ6kNTtFvr+C9i1C+ktIJUlMXlreZf5iY1GBX6 i+Gv+Cdn7P3gzwvruh6P8Cvg5pWi+KY4YdZ0+z8F6bBa6ukMgliW4jWELMqSAOocEKwBGDzXofxK +E/hX4z+A73wr4x8M+H/ABZ4Y1FUS70fWdOhv7C6COroJIJVaNgrorDKnBUEcgUpyTlzxX2r26W0 VvPZuzXKm7qN0VhZKn7JT15Hd938H/yLT1bs2r2bR+bPg7wz4m/aC1H4/fsuWVx8Ufg78YtI8H6T 4r0jxfovx58V+NbOKaXzvsw+035t5bQmQ4lgVNs0bMSW8qMj4g+JP7a37Uv7Yv8AwT2+O37Q3ibx l45+FS/A3QdJ+G+n2fhDxXc6faeIfEa6xaJqurt9leNGbynEQALovntsb5a/dLwv+wx8EvA/w113 wZovwd+Fmj+D/FLI+taFZeE7C30zV2TBQ3FukQjmK4GC6nGBjpW1N+zF8Nbn4Jr8NJPh54Gk+HKR rEvhVtBtToiosomVRZ7PJwJQJANmA43deaUf4nPLXb703qk7pfu24NaqXuy93lSIwz9m6fPqoyTf dpcrt53nFSvvFXj7yk2fkh+3Zpv7RP7Mv7C/7VfxH03WPjf8I/h3Povha28H6V4o+JkviDxRZ6kN TtFvr+C9i1C+ktIJY5Wi8pbzL/MTGowK/WL9nf8AZ20D4B6HcHRNS8e6i2sRwyXDeJvHGteJ2VlU 48o6ld3BhB3HIi2huM52jHT/ABI+FPhb4yeBbzwv4v8ADWgeKvDOoBFutI1jT4b6wuQjq6B4JVZG CuisMg4KgjkCt6ONYo1RFCqowABgAelVGdoOPVtu/W1lo35O9lslZJJIzjC0KcXvG9+zbUEn/wCS tvq3JvdsWiiioNAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAor4L/AGOfib8Zv+CjHiL4w+MrX4z678K9K8BfErUfBGheFNG8PaPe2LW+ lzIskuoteWst3LJc7jkQXFuEXbt5+asO8/4Lpa5oviTxXqWo/BzTofht4M+NrfBPUtZt/GUk+sG7 MqRR38WnDTwjxEyJuT7UHXPy+Ziin77glvNRkl5ScFFt7K7nFb7vUJ+6pye0G035x5nJd9FCT26H 6IUV+d+lf8F39X8f/tAa3oPgT9n34g+PfA3hv4gv8P8AU9c0bT9butQt3hdYrrUPKi0l9NFtFKT8 r6ok5jxIYU3baoeKP+C73izw1q/hvVj8EdDm+HPjD4u3/wAJdG1kePJl1K7ltJ54m1E2R0vyhAxt 5AFF0zblI6fNUKcXCM+kkmvR8lvv54/f5O1Sg1Jxe60fr7z/AAUJX7W81f8AR+ivzr/4Jr/8HA+l f8FIPj74A8DaR8M7vQl8W+D7/wARalqh1w3dtpF/azxrJpkebaP7S6wz20rygoEM4TaWVseq/tnf 8FEviV+zF+2j8I/hFoHwo8DeLE+Ns1/beHNX1D4gXWkmCSxtUuLn7XAmkXPlLh9sZjklL4ywjrZ0 5KcKbWsm0vNptPXa14uz2a1TaaZnTmpxlKO0Vd+S5VL/ANJabW666pn1/RX5y/8AD/DWfFXxl8Sa Z4G/Z5+IHj/wR4S8dzeBdU1nRLLW7u/gktyI7q+8uLSH04W0cpI2vqaXBjxIYU3bK4H4Q/8ABz3B 8XPA/wAM7qH4CeJdP8Q+OfFlhoupWU+uEafouk3199htNWjvvsgS7Etws0Yt1RJA9rcbiqorvFH9 64qnrzctvPmty2v3vfySbekZWqp+7UnP7N7+Vr3v6Wa9bLeST/ViiuB8A/ELx14h+Onj3QNd+Hf/ AAjvgnw+mnnwz4q/t63u/wDhLDNCz3Q+xoBLafZ5AseZSfN3blwBXfUdE++v9dvTddQeja/ra/8A XnpumFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAeBe M/8AgmL8F/HPxP1/xfc+Hdf07VvFl5b6hr8Gi+MNa0bTPEFxBt8ua9sLS7itLp/lXcZoXLgYbcK8 p/Z8/wCCInw3+Gnxh8deNvG9/qfxJ1PxJ8Vb/wCKei2V1fajZ6N4evJwPJB0xbx7G6uIP3m27kgE nzLgLsXH2nRRT/dyUoaNKy8tYy07O8Yu610HJuUXGWqbu/PSS17q0pabanzB8cP+CRPwc+L6+P72 wsPFHgnXviI73+qXHhnxjrmiafdaptHlajcafY3sFrcXCyLHIXePdIyAsxPNeD63/wAG53gK+/ZD +HHw/tPH/j618YfDvUdN1i38UTeJdfurI3sNwJb25t9Ik1Q2tpLdq1wpaLmM3DspJ6/ovRUxhGOy /l/8lba+Wuq2eid0lYlJy3ff/wAmVn8+z3WtrXZ4V8AP+CaXwQ/Za1PwPeeAfAtv4cufhvpF/oXh 54tSvJfsNnfTrcXSMJJmEzSSqrGSUO4xgMBxXZfFD9lTwD8ZvjN8PfiF4l0H+0vF/wAKpryfwtf/ AG25h/st7uJYbg+XHIscu+NVGJVcLjK4PNeh0Vo5yclJvVXa8m22382235t9yYxUU1FWurPzVrW9 Laemmx88eLv+CVXwN8Y+PPEfiKXwxr2lXfjDU4ta1+y0LxjreiaTrt9GyOLm70+zu4rO4lLIjO8k LGQjLljk1r6L/wAE4Pgv4e/Z38GfCiz8G+T4A+H2tW/iHQNL/ta+b7BfW9013DN5xmM0m2d2fbI7 Ic4KlcCvcKKmK5UlHSzT+cdYv1i9V26Dk+Zty1vf8dH960fc4HwD+y/4F+GHx08e/ErQtD+w+Nvi cmnp4m1H7ZcS/wBpCxhaG1HlPIYovLjZl/dIm7OW3Hmu+ooo6JdtPktkDd25Pd/5W/JJegUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4T8Zf2m/iD8Gf izp0d78OPDknwy1DxDpfhqLXW8ZeXrl1cX7wwpNb6X9jMUkKTzhH33kcuyGaRYmVUEnoXw2/Zv8A h38GvFviHX/CHgLwX4U13xdP9p13UtH0S2sbvWpd7v5l1LEivO2+R23SFjl2PUmvJPHX7KXxa8S/ thRfEi1+KHw/uPDelmGPQvDmveAbzUJPDkZjEd49rcQ6xbxfarhTIv2mW2keNJDGn7tpFkIfxIOW 11zdvNd9drrbeztZqfwT5d7ad/Xtp2d09ut1sw/tN/EHw3+0h4e8J+Lvhx4c0Pwr421bUdI8O6pZ +Mvt+sztawT3K3F1p32OOOG3lhtnYNFdzuhlgV0Uu3l9F+zr+0lffHbxr8StF1HwRrfgi4+HmvR6 KI9VvbO4n1JHs4LpboC1lljjjcTjapkL7QC6xsTGvCfDP9lL4teD/wBrLXPiLrnxQ+H/AIr0zWLq aCC0u/AN5Hq+i6Ozbo9Ms7wawbaBQ6xPJKLIvcNGpk3bIvK6H9nX9nr4i/Cj48fEnxV4o8eeCvEm i/EG+j1BNM0vwbdaTdadLDbwWsINzJqdysqi3t1DDyULSMWBRf3dFPWMeb+V39bpq9utrrT3b38p Nz+KVtr6enlfp111tbrdLnv2zf8AgohH+ytrkOiaD8NvGvxT8QQ3Gipqltoc1jZW+ixapqcenWhm uL2eGNpppGm8qGLeSYczG3icTVzvxp/4KWXvg74U6F400Dw/8O9G0C7uLzStZl+KvxAXwNJous28 hjOjhUsr77ReFo7ggRnynWDfFLKkiMei/bN/4J3x/tU65Dreg/Enxr8LPEE1xor6pc6HDY3tvrUW l6nHqNoJre9gmjWaGRZvKmi2EGbEwuIkENTD9kv4l/CXw9p+jfCX4p+HNI0ySG7m19vHfg2XxVea /qVzO08+pPNb6hYeXK7O+YwpgUFVjiiRFQQub2WvxXl91ly/L4vPm5fs8xq+TS3l93X53t5cl/tW O8T9qbQ/DH7L+j/FLxzY6z8P9O1DTLO+udK1Wzkl1WwnuRGI7E20KvLLdmWRYlgiRpXkZUVCxC1r fAz9onwp+0ZoN/f+F7rVGOk3f2HUbHVtGvdE1PTZ9iSCO4sr2KG5gLRyRyL5ka70kR1yrAngdT/Y es9O/Y78H/Cnwz4jvNFn+Hw0m58P6zPZRXXlXumzRXFvJPbL5aSQtLEPMhiMI8tmSNoflZd/9mX4 A+IfhHqPjLxB4z8Wab4w8Z+O9RhvtSu9L0RtF0y3SC2jtoILa1e4uZEURx7maS4lZndyCq7UXony upUtorvl3tb3bb69ZaNLRJ3vo+ePMoQvq7K/rrfTa22qb1bVkld8/P8A8FJPhJaN4sebU/GFvY+C 7q50/UdSm8C69Hpk15b3osJLO0vGsxb310bs+SlvaSSyyyArGjkHFof8FDfhQPh3J4kfWfEMSRas ugnRZfCWsR+JWv2iE62q6K1qNSaU2588KLYkwZm/1QL1maj+w7NJ+zvqXg2x8XvY60PHV98QNH1n +y1lisL+XXptZt45rYyfv4Y5JFikUSRtKisVaFmBTk5P2A/H8+r/APCdv8V/Dx+MyeJ08Rx6wvgp x4aRF0xtL+xHS/t5uDEbWR23/wBoeZ55D7vLHk1lHbXfT0+zr+MtOiV7t+69qiSnLk1jeVu9k5cv TqlF+bdmopcx6d4Y/bt+Fnivwn4m1qLxLPp9j4N0P/hI9bGr6RfaTcaZYb7qNppYLqGOUbZLK6jd Nm9HgZGVWwDm69/wUT+FXhv4p23g271Hxcut3F1pli7xeCNcm0+xuNREZsoLq9SzNrayy+dFiOeV GUyKGCk1578cv2MfF/xw+LPwUHifV7jXItDN9P4+1vTbO10vSfENmlxBe2ukPZPLLcLEb6G0ePDy lYLS4jlmY3LeZwWvf8E/P2lPFPw+1yO++K/wUXWfFfjOw8d6tBa+BNVima8tLm0eG2j1L+1jtiig sreBJPsO7bEpK7izUL41fa+vpzJeusW3fl0cWrNSiyGvc03t+LX6Naq+qlGzvGSPcNU/4Kc/B7w4 dUXXNU8Z+GJtJWF2g8QeAfEGjT3qy3sFir2kd1ZRveKLm6to2a2EgQ3ERYqHUnQj/wCCifwnk+H1 x4ibWPEcK22sL4fbRZvB+sw+JW1BoVuFtU0VrUak8ht2E4VbY5hBl/1alx8e+Lf+CJfi74Y22meJ PA+r/Ci78baQ+k6bDeab8ORpV/rSr4l0HUZtW168k1RptWuoo9LllkPmwtO0023Y7jP0LcfsAeO7 nXz8QD8UPDMfxqHiSLX11qPwTIPDnlx6Y+liybSzqBuTEbaWV939oBxO+8MI/wBxVRS9mpN+9dp9 OsfX7Lflo7NtcrrTf169LadO/wB+zsveOk0T/gqR8I/EfjvRvDVkPitNrXiDzTYwf8Km8WKJRDNH BcMXOmhEWCaaOOdnZRA7hZSh4rRn/wCClHwesPiFe+G77XvEGkzaffahpk+qan4Q1mw0AXNhDcT3 kS6tNapp7tFFa3LsFuDxBJjO01teFP2dvEP/AAtzwB458WeMbPxB4i8IeHdc0O+az0T+z7bUZNSu 9PuPMij8+QwRQCwEaRs0zsrqWlZlZn+Y/Hn/AAQ4034qfETxxd63r3w5stD8datrepahqOg/DmOw 8b3cOpJcg2Nzrcl7MlxaRtcKTC1mFkFvErDaCDEm1ayvpK/qpWj98fef3aDSjyX63WnlZ3fXry/e 9+n0n4S/b6+GPi/S766XUfE+inTrzTLGa18Q+DtZ0C9L6leJZWTpbX1rDNJDLcuIhMiNEGDbnAVi Oof9pzwPH4/PhY63jXR4kXwibX7Hcf8AIUbSv7XFvv2bP+PH99vzs/g3b/kr5a8E/wDBGjTLT4a+ JPCuvwfs+WukeJLnw+99aeCPgraeF7bV4NN1WHUJotRT7ZcG7+0LD5O3dHDGJJG8qTO0dQ//AARw +Ff26TSk8NfD5PhrJ8SE+ILeBR4Ms/7DO3w3/Y32Q22fI5m/0zzfK+/8uzP72tYxhrd9/wA4eXZz fySdvtTC3LLm3s7evLeP/k2j2736nqnjX/goB8LPA1hYSzaxr+r3Gp6lqmlWuneH/Cmr69qc02mX L2l+wsrG2mufJguEMbzmPydzx4c+Ym7O0v8A4KafAvXdOvruw+IWnX9vp+q6Nosr2tpdT7rrV0jk 09YwsRMqTLKp82PdGgWTey+VJt4TwR/wTY1r9nXTNCl+DPjfwn4F1Xw/ceJba0tr7wT9v0GHStY1 dtUFnHY295aNFJausEcUiTiMokm6E71EeL8Nv+CM/hH4cfD6504eIJtV8QjW9O1ax1+8sMXFslv/ AGQ08TxRypFI8z6UxEm1TCLuVUUK0glmkouXv7fj8Wy3veOrbtyvZTtZlXSUlDa7S9NbN6Ly0W6/ lbsvq/4jfEnRfhL4XOteIL3+z9MW6tbIzeTJL++ubiO2hXais3zSyxrnGBuySACR5Vqn/BRP4Z6f pd7f20fxL13TbDUbjSpL7QPhl4m1uzkmt2KzGKazsJY5YldWTzo2aIsjKHLKQOs/aw/Zz079rD4G 6j4D1d7IaTq95p897FeWC31vdw219BdPbyQswV0lWExkNkASEkNjafmv4pf8Eh7vxrPomkQ+LfAX iT4d+ElubXw14Q+I/gF/GGm6Ba3DRMVijbUIInnt/LMVpPLG729vLJCRKrZGE3PXlXp+H/B/PSyU muW13/X9dfutrde8/Er9vL4YfCzwt4M1m81jXNasfiHZPqXh3/hGPDGq+JptUtUijme4SHTraeQQ rHLExkZQo3rzk4qlF/wUR+Fb6n4YifUPF1rYeModPn0jXLrwPrlvoFyt+iNaK2qSWa2MTy+bGgSS ZX8x1jIEhCV4n8NP+CePxx+EN/4TsvDnxW+EtroXw2+H9l8OvDbax8Pb/VbqS1Fva/brxxDq9nHB LcT2sQ8tRKqx20OGBMgPm/gn/ghJrWqeH/CEfjrxZ8J9Z1Xw9deH7iTWm+Hsuo+JLKLR5LMR2Wm6 tcX+6wsporLLQR252SXl0wd953dElH2klF+7zK3+HmktfPlUZXtpdrldrkrRJPtrbvZP8HdW62ve x9H6/wD8Fa/gh4c0G/1ebU/iDcaHp9pNqLatY/DPxPfabdWMP+tv7e6h094bmyQFS11C7wBZIyZM SIW6DXP+CjPww8N6N4bu73/hY8Nx4vhvbjSNK/4Vp4lbWryKzkgjuZBpwsDeKiG5gO5oQGV9ykqG I5HQf2GfiLL+yv4s+DXiP4t6Dq/gu+8C3fgTw61n4KNlqGnwS232WG6v5TfSJezxQhR+4js43LSk p8yCPR/aT+Bnxa8UftU/CvxH8Mda8IeG7fwz4S8RaTqmseI/D8mu2qNdXGivDAtpDqFlL5kn2OZh IJHRBCysuXQ0pJXSi73v07KTV1e2tkvie+jvoVBJ8t9Pivr2UbWdle7b6L4dle50ni//AIKIfCTw bouhalJ4h1bV9N8Q6PD4hgu9A8NaprtvZabNu8q+vZLK2mWxt32S4lujEh8ibn91Jt9K8UfFfw94 N1TwrZ6hqSQz+N9ROlaIEjeZb+5FpcXmwMilVH2e1nfc5CnZjO5lB+L/AIjf8EOvD+qyeH7nQpfg 7reo6f4UtvC9/c/E/wCE9n42MjQSzzJfWY+02n2Sd5LqcyJmWF/3X7tSjF/or9o/9iHwp+1J4f8A hjoPjGw8PeIvC/w+11NZutF1nQbbULDXQml3tikLwMBDGFe7SYERsqmABUGQyllZv+93+zd63t2s 9le+y1STtfy5W/8At7lTS9HLT5b7N2fF/wC3Z8NPB2hWt++peIdZN7qep6RBY+H/AApq2vanLPpt 01pfsLKytprnyYLhfLefy/JDSRDf+9j3M+JP7enwx+FvhbwbrF7qviDVrP4gWkl/oCeHPCureIrq /t4o0kkm+z6fbTzJGiyx7mkRQpYAkHivnzxr/wAESfCd54T8IWOhWvwcuG8E6n4lk0zSvGfwttvE vhm207WdUfUfskWnC6tzBLbN5Ucc0M6AosgaIh1WPX8NfsGfHPwX470y78PfEf4F6Bo3hHwing3w /af8KsupYbaCYQTahNFbWmrWUNmJbiGNUhUTBIbWAeYXMpfKblyPl+LX0slK3Xq+VeV27SS1tqPt Gl8Ovq/eSXT+W787fZb5V6b8Ff8AgqF8GP2hfE3h/S/CeteLL7/hK7iWz0fUbnwLr1hpGpXEVvLc SQRahcWUdo0qxQTMYxLu/dOMZUgbEX/BQv4Q3r6PDY+KbnV7/X/BLfEXT9O0vQ9Q1DUrrQQ8MYvV tIIHnwzzxhYyglch9qHy5Nvyz/wT0/4IneIv2RtS8Fan4h8T/ByfV/C+oXN9eax4V+G76Z4p1pHS aOOzudakv5Hls9skbPB9mGfKRA+F3H0z9nn/AIJU337LnhLwg3hP4mSSeOPC3grVPCj+JdW8Ppdv eTXQ0mO3ufIWeNEis4NKjiit8sCGDO7P5jTbSUdbPpp68sn5fa5F6X73jFOzbUu6t6Xd316JLybv raz9l8J/t4/Cnx/r2k6Z4f8AFD+ILzXLyOysl0rSr2+SQyafa6isxeKFlS2Fre2jtcuRApuI0aQS MErN1D/gpF8FNM0yyupfHNuV1DwFN8T4YotOvJbk+HIjEG1BoViMiKTKgWNlErkOFRij7fLP2aP+ CQXhz9jf4y3njb4a6/b6Jq2saqsmtSXGjLPL4g0t9Psre5tbx0lj825kvLRr5LvA8qa6nAiZJZA+ J4E/4IvWHgL4HaZ4Vi+Id9qOsRfDvW/Aepa9e6Ojz6ib+PS4YJxGkqrFDaQaXHFHbgncrbmkMnmS StKL6209deSTt0ulPlV9N2rWtMqHK7c3l/8Abd9eiV3a6ld2cT3bVP8Agob8G9JtdcmfxrbTx+Ht G0vX7s2thd3Re11NiuniARxMbme4YBY7eDfOxkiAjzIm6Mf8FDfhQPh3J4kfWfEMSRasugnRZfCW sR+JWv2iE62q6K1qNSaU2588KLYkwZm/1QL1xPjH/gmBoLa/ruqeCdaTwRd3selX2miPTjfRWWrW Gr3Gqx3UyySgzW7yzrE1spi2QxiOKSICPy60n7Afj+fV/wDhO3+K/h4/GZPE6eI49YXwU48NIi6Y 2l/Yjpf283BiNrI7b/7Q8zzyH3eWPJqE003s77eXMra9Xa99Ftff3CNVLurLyd+W701t72i1fbRL nfR6N/wVL+EXiDxxo/hu0HxWl1nXhK1jB/wqbxYolWGWOC4YudNCIsEs0cc7OwEDuFlKHiu3+HP7 aPww+LXjnwn4Z8O+LLTUvEHjfwiPHmjWC288c9zohkhjW9dXQeSrPPGqrLsdjvwp8t9tLw1+zl4h l+K3gLxv4s8ZWev+IvCXhvXNCvms9D/s+21GTU7vT7jzIo/PkMEUAsBGkbNM7K6lpWZWZ/Nv2Lv+ CYVh+x1qfw41GLxjfeKdY8FeFdR8NalqF7p6RT66bk6SsDjY+23htoNJjhjgAfKvuZzJ5jy3TUL2 m++3/cS35U3f+81bdxdlyXW+ny7+vZLo3e7tZ+o/G39tf4dfs+eMItA8Sanrb6ubMajc2+jeGtT1 3+ybRnZFur5rG3mWxt2ZJNs1yYo28mUhiI3K9v4y+J+hfD7W/DOnaxfCzvPGOpto+kR+TI/2u6W1 uLsx5VSExBazvucqv7vGdzKD5V8Tv2ZviBN8f9U8cfDj4k6H4NHizSrHR/Edpq/hM647x2clw0E9 hIt5bi2uAt1OpM8d1ESIj5XyuJL37Zn7Hlv+2PpvgTTr3xLqfhzTfCfib+3L9NPjUza1atp99Yz6 f5pOYEmivXV5EBcJuCFHZZEzXwru39yvo3vpbXS7a6J6D0vLsou3nLlbS6fasnord2veMe6/4Kd/ BtfhRp3juw1rxX4j8E6o+orFr/h3wNruu6bEthcPbXUk1xZ2cscESSRyYllZEdUZ0ZkG6trXv+Cg Xwf8M63r+m3vjO3jv/DOuaT4b1G3WxupJIr7VFjawjULETIkqyA+bHujULJvdfLk2+QfE7/gmHrv iv4RxeBNI8SfCFPDkPiLXfEtrL4j+F763qOgXeo6leXkU+lTDU4I7K4tY7sxxTeTIQ0YcBQfLHQe I/8Agl14b8Tar4k1i61mW88T6v4j07W7HWbu2ea5sIbYaMJIJAJlS4kl/sj/AF7KrR/a5goAaQS1 T5XN8+kfx3Xy2v189X7rVXSTUO7s/LXlfR7WbVlfbTc9M0j9tr4c678Yv+EGtdT1t9Ya9n0uK8bw 1qiaHdXsCuZrSHVWtxp81zH5UytDHcNIrwSoVDRuq29N/bF+GuqeGfDWtL4rs7fSPFvhW68b6Ze3 cE1rBLo1stq9xeSPKiiFEW8tiVlKNiQnb8r7fAPhR/wSM0n4M/tQf8JvosfwTXSh4lv/ABKt3P8A CSzk8cq9408slv8A8JB9p/1Qnnba/wBk88QgRGUn96c/wR/wQv8AhT4I+HGjeHrDT/C2jSP8L9U+ G/ivVdB8J2emah4ve9XTs6lcSDdvljaxkcJOJwzXTbmIDB4pt+z5pr3rbefLJ27fFyrfq91qtEoe 1cW/dutfK7v0vtZ7dfke7fDv9vr4Y/EzxZpmgWeo+J9K17Wb9NOsdM8Q+D9Z8P3t3I9td3SOkN/a wu0LRWN2ROB5RaBk378KdYftm/DJfPaXxXaWkVrbeIL2ee6t57eC3g0K7Sz1aR5HQIi288iqSxAc Esm9QWHy54B/4IeeGP8AhI/DsnjjRv2bNU8OaHq9vql3oHhT4G2Phyy8R+VYalagagr3d157h76O ZCAscbW7Yi3SB4+28H/8EivDPhLxD8OY7fXksfBfw71HxXexeFNJ0aHT9N1GHWNag1a2snVWIS2s pbaDEcYUTGGPdsj3wvVRJR9x62f32du28radnutyVyppvXa/TpNtLfqoK/S7dpLbufGX/BUj4K+B /AWi+KLjXvFGpaBrvheDxrFe6L4I13WY7LRp0d4b68+x2cpsonWOUqboRE+TLx+7fb0HiL9v/wCE XhTXvEGl6h4xht9S8La7pXhrU7X+z7tpoL/U1RrGIKsRMiyiQHzE3RoFk3svlybfAfG3/BGCH4lf BfS/BmrfE3XrC28P/CqP4bWNx4abUdAbUpFtjCt5qyW2oKupQQsXeCyk2xR/abtXaYTZT0Txn/wT G8N+NvEfirxBdalCfE+veJ7DX7HUzYuW0qG3/sfzLXyxMElMn9k/LMwDRC6lCjDSCXZql7VpP3by 9bc6Ufm43bey0drrkc1FZJQd/wDPlWtu3NzaXvZWuviPS/H37anwv+F2oXNp4g8W2ml3Vr4v07wG 0U1tPvk1vUIbee0sowEJlZ4rqByybkRS5dlEcm3qvAnxm8NfEzxZ4v0PRNS+26p4D1KPSNdg+zyx /YbqS1hukj3OoWTMFxC+6Mso34J3AgfP3jz/AIJfWHxA+OPjzx3e+Mr6W/8AFnizw74m0uzl09Ht PDY0yTRnuUiUOGkmvBo0CNOzfuk2hE4l872n4LWHjtfGHxEv/GN9u0m/8RY8J6aI7cf2bpcVpbxZ Z4hudprlLmf947MqSxrhMFBlSs4Lm+K1322p9er5nPTsr39283UUVrHbRfOzbfkunqt/eSXoFFFF SSFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFclqnx98CaHPqkV7418JWcmh6la6NqST6xbxtp99 deX9ltJgXHlzzedD5cbYZ/NTaDuGRauy3/pfm0vmHS51tFcB46/av+Fvwu+Jdh4L8TfErwB4d8Y6 rB9qstB1PxDaWmp3kPz/ALyO3kkErp+7k+ZVI+RvQ0h/az+FY8KQa8fiZ8Pxod1bWN5DqP8AwkVn 9kmgvZngspVl8zYUuJo5I4mBxI6MqliCKI66rvb59vUJab9r/Lv6anoFFed6h+178JtJ+Jmr+Crr 4ofDu28ZeH7OTUNU0GXxJZpqem20cQmknntjJ5sUaxESF3UKEIYnBzVf4Y/tqfBv42aPf6j4M+LX wy8Xafpd1aWN7c6L4osb+G0uLqUQ2sMjxSsEkmlISNWILsQqgniiPvfDr/wXZfe9PUHpv6fPc9Mo rOv/ABhpGleILbSbrVNOttVvbWe9t7KW5RLie3gaNZpkjJ3NHGZoQ7AYUyoCRuGeZ+Cf7THw3/aW 02/vPhx8QPBHxAs9KmFvez+G9dtdVis5SMiORoHcIxHIDYOKFrt/Wtvz09QemrO3orzDw/8Att/B jxb8Y5Ph1pXxd+GGp/EGG5nsn8MWnimxm1lJ4A5mhNospmEkYjcuu3KhGyBg07w9+2r8G/FvjHxH 4d0r4tfDLU/EHg63ubvX9MtPFFjNeaHDbMEuJbqFZS8CRMQrtIFCE4Yg0rqyfRq/yW79F3Hyu9uu 3zey+Z6bRXnXwq/a++Evx2soLnwP8Ufh14yt7rUP7Ihl0PxJZ6ik175D3H2VTDIwM3kRyS+WPm2R s2Nqkjp7X4qeF7/7D5HiTQZv7U1O40Wz2ahE32u/t/O8+0jw3zzxfZrjfGuXT7PLkDY2KcWtxdL/ ANdf8n9z7G9RVCDxVpd14nutEi1Kwk1mxtob25sFuEN1bwTNKkUzxg7ljdoZlViMMYpACSpxz/xV +NWj/B3UPClvq6XePF+sjRLWWIJ5VtL9luboyTMzLtjEdrJkjccleMZIltLf+r6D5Xr5K/ySv+Wp 19FeH+Ef+Cgvw71T4QyfEXxPqNv8Mvhtd3UcGgeK/GeraZpOl+KoZVZobqzdrpnEUiqWQXCQyOuG VCp3VJb/APBSv9nK78R6fo8Xx/8AgnLq+rG3FjYp450xrm9NwFMHlRifc/mh0KbQd4dcZyKaV3yr ft19LdH5bib0v0/Ta/p57HtlFecax+2N8IvDvxF1vwfqHxU+HFj4t8NWMup6volx4lsotR0q0ihE 8lxcW7SCSKJISJGd1ChCGJA5rCf/AIKK/s+R/DhPGLfHb4Nr4Rk1E6OmuHxppo01r4RCU2ouPO8s ziMh/L3btpDYxzSTVr9N/k3Zfjp6js72/ra/5a+h7JRXnPxD/bB+Enwi1vStM8WfFL4c+GNS11Le TTbTVvEllZT6glwzrA0KSyK0glaOQIVB3mNgM7TXR6v8Y/COgNeC/wDFXhuyOnapbaHdC41OGP7N qFyITbWb7mG24mFxb+XEcO/nxbQd65rld7ddvnpp+K+9dxX/ACv8u/p5nR0VzkPxj8I3F3pkEfir w28+t6ldaNp0a6nCXv761877TaQjdmSeH7PceZGuWTyJdwGxsYXxp/az+Ff7N2paVZ/ET4mfD/wD ea7vOmweI/EVnpUuobCofyVnkQybS6A7c4LL6il1S77A9L36b/l+eh6BRXB+Lf2pvhj4A+KmleBd d+I3gPRPG+uRLPpvh6/1+0ttV1CNi4V4bZ5BLIpMb4KqQdjehrR8KfHjwP47udBh0Pxn4U1mbxTp 0mr6LHY6vb3DavZRsiyXVsEcmaFGliDSJlQZEBI3DItdv63/AMn9zB6b/wBX2+86uivNdH/bN+D3 iHUfF9np/wAV/hrfXfw+imn8UwW/ieylk8NRwsyyveqspNsqMrBjLtClSDjBq38Lv2rvhb8cdBt9 V8FfErwB4w0u71I6LBeaJ4htNQt5r4RGY2ivDIytOIgZPLB3bBuxjmiPvarXr8m7L73p6g9N/P8A BXf3LV+R39FFeU+Mv28Pgd8OvimfA3iD4zfCnQvGy3ENofD+o+LdPtdVE0wUxR/ZnlEu9w6FV25b euM5FC1ait2D2cuiPVqK841b9sT4R6B8Rta8HX/xT+HFl4u8N2Umpatoc/iWyj1LS7WOITyXE9u0 gkiiSIiRndQoQhiQOaZ4c/bO+D3jDwhrniHSPiv8NdV0Dwxdx6frOpWfieyns9JuZHEccFxKspSG RnZVVHIYswAGTSurX6b/ACva/wB+nqPld7db2+e9vWx6VRXEfDn9pn4b/GHw3pGs+EfiD4I8U6Pr 9/JpWl32ka7a31tqV5HFJLJbQyROyyTLHFK7IpLBY3YjCkjkfHH/AAUY/Z7+GWoR2niT47/Brw9d zebsh1PxrptpI/lTy28uFkmBOyeGaJv7skUinDKQG9NGJaq6/rp+af3HstFcBqX7V/ws0b4p6P4G vPiV4AtPG3iK3S80rw/N4htI9V1OB1ZklgtjJ5sqMEchkUghGIPBqj4K/bX+DXxJXXz4d+Lfwy18 eFNP/tbWzpvimxuv7Hs9m/7Tc+XKfJh2fN5j4XHOcU0m3Zef4b/d1Ba7eX47ff07nptFcd42/aI+ H/w1tden8R+OvB2gQ+FrK31HWpNS1q2tF0i1uHeO3nuTI4EMUrxyKjvhXKMFJINZVv8Ath/CO7+C cvxLi+Kfw5l+HEEnkyeKk8S2TaJG/mCLYbwSeQG8whMF87iB14qbrXy/4YFra3X/ACv+WvoejUVy Hwo/aC8BfHjS4L7wN438IeM7K5tvtkNxoWs2+oxSwedLB5qtC7Ap5sM0e4cb4pFzlSBo3vxU8L6b /aP2nxJoNv8A2PqNtpF/5moRJ9ivbnyPs9rLlvkml+022yNsM/2iLaDvXNcrvy21/wCDb89PXQFr sb1FYT/FHwzF4N1XxE3iLQl8P6GbsalqZv4hZ6ebR3S6E027ZH5LxSLJuI8sxuGwVOMLS/2ovhnr fxmufhxZfEXwLefEOzh+0T+F4NftJNagj8tZN7Wgk85V2Oj5KY2sp6EUlq7IGrav0/T8zuqKzNU8 a6NomuW+mXuraZZ6ld2k9/BaT3SRzzW8BjE8yoTuMcZmhDuBhTKmSNwzHofj/QfE/ga18UaZreka j4avrJdSttWtryOaxuLVk8xbhJlJRoihDBwdpXnOKTaScnsv+D/k/ufYdndLua9FfOP7OX/BVD4K ftMfFrx34R8PfE34W3974T1H7Pp39neM7C/l8QWa6Za309/DGj58mJp5oXZS6qbSQlgdyr7Hq/x3 8D+H7Hw7dX/jPwpY23i8xDQprjV7eKPWvNMaxfZWZwJ95mhC+Xu3GVMZ3DNcrsn3Sa/7e2+/tve6 3Qrq9uv/AA3+a+9HV0VhXnxS8MacmqNceI9BgXQ72DTNSMl/Eo0+6nELQ282W/dyyC4tyiNhmE8W Ad65yvCX7RXw+8f+OtS8L6D468G634m0a4mtdQ0iw1q2ub6xmh2ebHLCjl43TzI9ysAV3rnGRSWu nz+Wmv4r70Nq2p2VFcdc/tD/AA/stJ12/m8c+DorDwvavfazcvrNssOk26TTwPNcOXxDGs1rcxln IAe3mUnMbAVtc/ai+Gfhj4v6X8PdT+IvgTTvH2uRLPp3hq51+0h1jUI2DlXhtGkE0ikRyYKqQdje hotql3E9L36f8D/NfejuqKwLX4q+F74WPk+JNAm/tPU7jRbPZqELfa7+3877RaR4b554vs1xvjXL p9nlyBsbHG+Cv24vgp8SbHxPdeHPjB8LdftvBVs174im03xXYXUegwLu3S3bRykW6DY+Wk2gbG54 NJtfr8h8r2t5fO9vzTXqeo0VwHwu/au+Fvxx0G31XwV8SvAHjDS7vUjosF5oniG01C3mvhEZjaK8 MjK04iBk8sHdsG7GOa6LX/ij4Z8KSa0mqeItC01vDemrrOrC6v4oTpdi3nbbufcw8qA/Z58SPhT5 MnPyNinFrf8Arr+Wolrt/Wtvz09dDdorO0bxfpPiO91O207VNOv7jRZ1tdQit7lJXsJmhjnWOUKS Y3MMsUgVsEpKjdGBPEeNP2x/hD8N7Lwrc+Ivip8N9Bt/HaLL4al1HxNZWqeIUbZtazLyAXAPmx4M W7PmJ/eGVbVLvb8dvv6B05uh6RRXN/Fj4x+EPgL4IufE3jnxV4b8F+G7J0S41bXdTh06xgZ2CIHm mZUUsxCgE8kgDk1xlz+3h8DrLTfCd5N8ZvhRFZ+PXaPwzO/i3T1j8RMsohZbJjLi5IlZYyIt2GIX qcULV2Xe3z7eoPRXfr8j1eisG9+KnhfTf7R+0+JNBt/7H1G20i/8zUIk+xXtz5H2e1ly3yTS/abb ZG2Gf7RFtB3rlX+KPhmLwbqviJvEWhL4f0M3Y1LUzfxCz082jul0Jpt2yPyXikWTcR5ZjcNgqcFt L/13/VfeNRfY3aKSORZY1dGDKwyCDkEetLQSmmroKKKKBhRRRQBxfw2+Auh/Crxb4h1rS77xpdXn ief7ReR6x4w1fWbSFt7vi1try5lgs1y5+S2SNcBVxhVA+afiv/wS3m+JPxQ+IHjb7fYReIPEXjfR /EOmxfa5EspbWy/sgB7tBCWN1CtrqSwbSUA1B9xywMXsfh39v/4YeKfjRH4BtL/xWNen1i88PwT3 HgvWrbR7rULSOeS4tYtTktFsZZUS2uDtSdifJfGSDWt8Ov20vhh8WfHHhTw14e8W2mpa/wCNvCI8 eaPYLbzxz3OiGSGNb11dB5KM88aqsux2O/Cny32ulpKNSn2svT4tPlBv0Un0Y5396M+/vX735dfm 7a9bLc+Y/jj/AME2/HGt/tP+NfFWiaVoXjHQvHPiPS/FBbWfi/4u8NRaRcWkVlD5cmi6eslhqIT7 DFLE8jQNkrG4ZYlZsb4Zf8EnPiF8KP2kpfjTZ6/4Zv8AxxPJYaxNoD6vfweFpL6W91mTVLWK2MUk dtEkGqI1tdpEZzcpcSuii6uFl+gvBX/BUn4KeP8AVLe1sNf8Twi+MH2G51HwRrum2WqrNqNrpsb2 lzcWccN0hu721j3wu6jzlYkJlh7NqfxO0PR/iXo/g+5vvL8R6/p15qthaeTIfPtrSS2juJN4XYux 7y2G1mDN5nyghWwULxjCVPVLSL8opXS6OyirvV2Wr3uVbzU6cvtfEvPf1T1dtrJ6W0t+f/jP/gkb 4/vtQ8ZaJZ2nh3WNI1nVvEus6V4k1f4veLwbObVotQdd3hpVfS0mSW+eFrhJSrIXm8jexiqwP+CY Hxa1f4LeONLks/DGj6lrUXhOO10+X4xeKPEU+pNo+tJqErt4gvLNdR0xDEJI4YbSN0ikleVdrsTX 1h4p/b/+Ffgz4w3vgXUdb1qHXdK1Wz0TUZk8MarNpWl3t3HbyWsF1qKWxsrdplu7cR+bModpVQEt lRoQ/tpeA2+M/wDwgFy3jPS/Ecs9xa2n9qeCdb07T9VmgieaSGzvp7RLS8k8qOSRUt5pGdI3ZQwV iM6SUYxcNtGuz5EtezsmrppraVuazNKkpympy3Tv975vXVq+990nZtP5jX/gmH8Sfid4L1bSPF3i m20iy13wb4x8Kw2jeMtY8Y3Ph1NYGjLBEmp36Q3l9CG067lkMrQun2pYY8oocemfsD/sleL/AIFf ETxF4h8X+G9E0S81LRrLSVubf4ueKviFdX3kyzSEF9aSMWcCGQlIolkJMrlpBtAben/4KnfBuwkF vfXvxD0nU5bqCzt9I1L4Z+JrHV7+WeG7miFvYzaetzcBksbvDRRuu6ErncVU719/wUH+Ftp4A0Px FBqfijV7fxFNeQWem6P4N1rVdcV7OXybwTaXbWkl9b/Z5isUxmgQRSSRo+1nQNspuNn/ACrlXkve 67ttSe973vvqZyTlFUn3b/FSena8V9xw2lfsdeN/CeheBZLGbwrf6n4M+K/iv4gm3n1C4t4Lu21N fEP2SDzRbuySBtVtRIfLKoEmKmTaofm9J/YG+J3hfwd4Yl0HxloXh/xppvgrxrZXOrWzSTix13X9 TsNSSS2E0TB7eGWC4TzJFDY8pvKYllX3aD9tL4Y3WmpeQ+KYZ7WWDQrlJYrO5kRo9auzZaYQRGf9 dcKY8dY8Zk2Dmuc+LH7e/hDwFoGk3+jteeKW1DWNW0eSx03RNa1HUlbTJJ7W8kis9P0+7uZI4b5I YJJTGkKidXErFoo5oneKblpa69PdcWrd+WS0d+nz1UpzqKut9fTVyqfrJq2trnyv4J/4JBeOPFf7 Q2n+K/GMx8N6B/aGjXF7aaX8bfGHiPXdljYeJbdmh1q6S2vIt8msWhEMLxR7I7gHO4iTtPHn/BNP xtpn7MfgHwb4bkstduvA/wAVde8aCG8+JniDw7d3um30mueQh121hn1JbpU1O3MrHcZDHMrSOG3N 9IaV+2n8PZvh7qviG88RWMdt4b8F2vj3WpLKK6u7ey0qdLpluEfyVaZc2V2AqoJf3PzRqWUHZ1P9 qPwJo8Gvy3Ou+WnhjX9N8L6mfsVwfs2o6iLI2cHEfzeZ/aNn865RfO+Zl2Pt2qKbl7JrW60800l3 62S83ZdDNTcrN9Vb5cjXr8NS766xb6Hzb8I/gH8bf2ZviV4c1VrrSPFWpeNbbw/4R1G5u73UvEDe HrCz1DxBqd3513MIprhY7O7t7KC8uHDyz7ZJY8t5b+0/tofsj6V+2LpXgLQvEWi+GPEnhTQvFUet a5pOu24uba/tlsb2AIsbI6vIJZ4nG7aBsLBgyrmx4Z/bx+F3jD4vv4I0/XdUl1f+0LjR4bx/D2pR aJfX9urtPZW+qvbiwuLqMRTboIZ3kUwTArmKQLzWg/8ABUf4O+Jfh5b+KbS++IDaNqM1rBpLyfDb xLDP4je5SSWIaZA9gJtSzFFJKxs0mCRIZH2p81ZSaqJNq6upd92uVeabWl73beuo3zKcpLR8vK+l rRcW/J8qt0ty7KxxPxN/ZM+NqfCHTfAmgeK08SeFvCmsxPp6XXj7VfCet+JNH+zSqljf6xYWs15B JaXBgdZ7cmS8jhCTlSZWmT9h39gfxh+zbr3w5vdcvPD7ReE7Px3DeQWutX+rShtd1+z1O0Vbq8Tz 7kxw27pLNOwkaQqfn3Mw950v9qrwHq/7PmrfFKHW5F8E6DZXt/ql3Np91Bc6Yll5n2uOe0eMXMU8 JikV4HiEqshUoGGKx/FP7dvwm8GeI/HOj6h4zsU1b4bWmmXniKzht57iewGpFxYQqkcbNNc3BjIj tog87l4gI8yx7rjOcJOT38/OPLr3unu7u/UhR92KitE9O27Wna3PaysleKtsfF/xY/4I9/ELxRp3 xA8Mada+GtW0zxFfeKdU0fxNrXxd8XgWU+rwagylvDSo+lpMkt+0LXCSlWjLzeR5jGKvqz4//BL4 iWnxs8FfEr4c6X8P/FGu+GvDmo+F59I8Varc6PbrFeS2cxuoLyC0u3V1eyVGiNviVJc+YhjCuX// AAU2+E+nW+l7j8TZr/WJL2ODSLf4XeKLjWYvsa2rXDT6fHp7XduirfWhDzRIrC4jKlgal13/AIKa /Bfw/ofhzU5PEus3mneJvD9v4rhudO8KavqEWm6RcDdDf6i0Fq40y3ZQ58y+8hQIZiSBFJtzjF+z jCOy2+cHH01gmtOibWquXUbqPnkr7/jNNv8A8DS+emzsfMWk/sSfFv4feJ/EXwv8M+Ffh94j0jWf gboPgLVvFevXd7pOn2DNd6+twthbR2Vyt4sS3KObR7m3wgt1MgEgdOs8V/8ABKDxV4r+JXiLVdQ8 UaFq2jWXjnwf4s8IaddefvtJdLj0KDUL+7kKvvvHttKnht1UYQXU2+Q+efJ+ifif+3t8MPg98WNN 8Fa5qviBdb1T+zPLksPCmr6lptv/AGldNaWBuL+2tpLS2E9wpjTzpkyR6c12Vt8ePDWo+APEHiax n1TVdL8L3V9Y366bo95fXYuLOV4biKK1hiaed1kjdQsMblyPk3ZGbhUcJuvHdPXt7s1P092TXndq +tmicpTld9VFffGK/wDJ1TT7NJpKzlf5Y+Ff/BMfxX4Z/aA8JfEDxHr/AIb1m+8IfFLxN4n0iCJZ kTQ9A1Vdcka3hLIfMvZ7nUrZ7hj5aeXaxIpYwB5vS/8AgoP8EfiP+0T4Oh8L+DvD3he/02e3laTU dS+JeteGGsrlkeJfNsdPspotVtQr7ntbuVYZcbHQg7hsr/wUe+E3/CB3HiCTUvF9stvrSeHf7Huf A2u2/iKbUHgW5W3i0d7MajMxt287Mduw8pXfOxGYY/ib/gq38EfCelJe3GueMLm1TTJdYvn0/wAA eIdQ/sK2inmt5m1IQWLnTmiltrhJEvPJeMwyb1XacZyhzxjSey0stOl+mt38V007vmvrccqknUdf 7Tvr6zk+uj96TjrdfZtoeFfFX/glp451f42+KtQs4NC8aaH431fSNbur/U/ip4r8LxaVcWltY2zl vD+mhtN1AJ9hjmh3yW/LJE+ViV27j9k7/glq/wCzN4h+Gep2+qQrc6B4JvfDuveReuy2lzcQaeCN NBhXbA11DfXTGQhzLeM2NpCR+5+Ov20fAXwz+KVh4R16Xxdpd9qdza2dvqU3gzWRoDz3JVbeI6uL X+z1eR3SNVa4BMjrHjewUtvv24Phdpvw70jxZP4n2aBr3g29+IFjdf2bdnz9Es47aW5u9gi3rsS7 tz5bKJW8zCoSrAUo+0hKKV0/dduyi9NNFaN721srt6E04ycoqmrvRpb77PW7d7afgfEPg/8A4JEf FTwv4A0zwFHpfgkaVZ+HJ/A0/i6++MnjPWroaROYIZ57LQbyJ7GwmkggDGCO4eNXCIsioua9m/ab /YC8d/EXUfF2o+HxoOpNrHxT0/xxZ2J8cav4Pneyg8M2+kPEdT063kurWfz4mceSGDR4DMN7KPdP Ff7dfwp8G+IPHWkXniyOXV/hta6VdeIrCysLq+urD+1HZNPhWKCJ3muLhlxHbxB5mLxfJ+9j3U/D f/BQL4WeJfh7q3icat4h0nS9C8R2PhLUI9c8Javo19Z6netaLa272d3axXK+Z9utSHMfl7ZgxYKG Ip89SV95afjOElptrNRtZat26oUHy8zjtJNfJx113+Fp3vtZ+ZyX7Ofhr4xfAtvhn4D1iW31yy1C 513WPEWoXmoaj4jGgaerA2Okw6rdGOe6nEl1EFubtDJJFazjywQGT0jxd8GdU1/9rzwH4/hnsF0b wv4W1/Q7qF3cXMk9/c6RLCyKFKlFWwmDEsCC0eA2SV9MopKTUoz6q/4px66t2erbbb1buyYrl2/r rtsvJLRKyWiSPy2/ap/4JX/ELw98I/jDFp3h208caZLH4x8S6PqLfFPxfc6hNPqVpqUqwQ+FFVtL a8Mt61uJUm2urNL5HmOY69G/aU/Zk+MHjTwFqvjjVvh98P4vFLt4E8OaP4O8Oa7f6tY3ltYeKrW+ ee+u20yB4YUWRwVWymFvFHPJucOUX9A6Kml+75OX7Li16rS/bWPu7W62vqa1KnPJSl5387yjP1+K Ke/ltofEPjf9gH4vfGbxXD4wvNd8F/DXxTr3xDtfEmtw+HtRu9WTStLh8OXeiSfY7qS3tTNqMqXA ZZnt4lh/d5E32dRL2PwR/wCCfmo/BDwX8IvDmjL4X0vQ/hl8U/EfjBLKzklWGHSb9NfS0toB5Y/f RrqlqHVsKPLlw7YXf9W0VUZ8qtHTb8Ekvutp2u7bsmc5Tjyy7NfJqa/KpL8Ox8ffGD9iz4l+I/Gf xC0DRLf4bT+Avip4y0nxnqniG/vbqLxBor2Q0/NrDYpbPDdt/wASyMxXD3cHlGc/un8keb4v8EP2 EfjJ8fv2DfA3h7xL4X8A/DO58N/BPVvBegQDWL+41G9vNW0y3t86pC+n239nrG0IeWBDdlpWB3Aw gyfpTRUQXLBw6WivRRi4L7ouy9Lu71NKdeVOftIaO/N873f3vf8ACx8Pv/wTb+Jfgmf4j694b8Za XN41+JGg+GYPEOqw6ldeH7rxLe2OoahNqMH2uGGefTbaWyuoLO2mgMtxbRQqFIeNZWr/AAG/4J2/ EvwdZXulayvhbTNC8UfFbTfiJqw/4T7XfFmo2Fvp1lpYgtEvdRgW4vZJbzT/AJ5JnjWKEqERuET7 oorWNRxn7SO+lvLllGSS8k4RtH4VZ2S5pX5nBOPK9muX5cvJf15bpvd31btG350eOf8Agl38Y4Pi V4g1jw3e6IsuvjXEtNU0/wCLHiTwhceH5L3xHrGqW901rp1qYtUMcWowk2906x+ZDIgYo5c+h+P/ APglrrHj34heMvGF74o1K68T6x8Q/CPiqwaLxdrOn6PcWelJoK3Zu9JgkFhJcyHTbsx74Jcb7fMi bB5f2pRUUH7JqUN1qvL3lPTtqtWtWtHeyttUm51Z1Zbz3872/wAlZPRa2td3/OrV/wDgl98ZtUt/ i/otlqui6FpXjxvHMkV5/wALQ8RanZa1HrZ1FrO1n8PzWq6dp3lSXkEklzatLKWtWAVvPc11HwF/ 4JneMvg1+0dpV/d6fo3iDwxpHjTU/F1t4hvPi34taeA3r3c7BPDBB0kXKvdyQmcThGQvL5IdzHX3 bRThJwcWvspJfJpp/JpbWXdau6rzdVSU/tOT+c9Jfh3vbp0t85/tefsX61+1H+0J8O9UOtaZYfD/ AEjQtc0Pxhp0kbve+ILS9n0uZLKMj5EglbTylwzEloXeJVzKZIq9l+xb4gH/AASk0v4DNqPh+38T 2Hw+tPCrXPlyXOkSXUFpHEVdcRySWjsm1l2qzRswwCcV9KUVKbVN0o6J/fvJ/nOWm2vrelUfNGXb b8/+He7sl0Vvgr4D/Af45/Fr9qLxrceP/Anw88CeGdM+Kem+Mpr/AE7xHqGrXF5Ja+GdOtY4NNWf S7RJLd2ULJclwVK3VuIWI86sTwn/AME2dd+N/g/x3p15cXem+H/Dvi/T/DXw6trqK/8ADl3ofhWx 8SWerX6wSxEXEckjwNbW08Pl74NM051ddzSn9EKKqDUXFpfCl96UI83ryw5e3K5Lq25cnZW6cv3R 5ml6c0ub1S7K3x7e/wDBM2+0/wCDHxp8DaVreoyaR8R/Hmi+JNOudU8Y6zqGrQWVrDoiXKy6lPJJ epcFtOufKZJmKBodrx4wlHw3+yZ8cf2dvHPgc+B9L+FXjrw78NbfW9L0Z9f8U3nh3UL6y1KW1nDX Zt9KvEe6hkt2V5hzdeZ5r7JC+/7QoqbvTXZJfJRUVf5K199XbcV1pptf8d/8/NpX2Py/tP8Agkn8 Zfj/AOD/AIw6b8RV8B+GNO8XeG9V0uy8P2esT6tZ6xq76rr2o6deT3RtomWxt31pHCG38557SOQr GIgkvvfxD/Yk+JmqeK/G3hvR4PhpP4D+JvjDRvGOreIr6+u4tf0V7EacGtobJbV4rtv+JZGYrh7u Axef/qn8keb9i0VUZ8tuXpv56xevm3GN2raJJWjoFWTqPmnvdteTaUdPRKyv3b3dz4v8Ff8ABLnV PBvxP8J+NbbxJqUPiTSfih4p8ZXyyeMNavNGisNTTXVtRbaTLIbCO7T+0bQyFII+UuMSvuJk8huv +CWHx58ZeK47jXtQ8Lzy634O1PwL4o17U/ix4k8R3eoxajdaZLdapaWFzZR2enyFLO4xYWnlQBp4 183y4lWv0uoopycJKUeisvSzTXkmm07WvdN6xi060nVk5y3d/wAZOX4Sd1fa1lo5J/GH7Tf7AXjv 4i6j4u1Hw+NB1JtY+Ken+OLOxPjjV/B872UHhm30h4jqenW8l1az+fEzjyQwaPAZhvZR5xrH/BHX x58WPh/8Uh438a6tN4g8VfDx/C/hiCz+J3iZoNIuDd63PFa6jdK0MusWkK6haxia+ild1SYGFVOJ P0WopU3yfD5fK0YxT9bRWu61SaUpJ2q0k4tdEl8oy50vS+62el07K3xNc/sG/Fax/bg8SeONHv7H SfD3iPxRpGuHV7X4na/bSQ2lrpen2dzZTeGktxpV20/2OaP7RNN5iJcI4G6BErzjxF/wSO+IWleC /CFtbWvh7xzcJ8KdF+Hmv6dN8XvFngXT4JtOjuELr/ZMTLqNpN9rlzDcwxMuwkPiZlT9IKKStyez 6afhFxX4N7W113u3FOTgrR7RX/gOq/FL/htDzP40+DvFjfs7Hw34R0XRdf1aayi0ya3uvGWp+EYx B5eySSHUbOC7vIJAB8hQb+/mgjJ+QfB3/BOL42/Dbwd8RbHTbH4N6vL8a/D03hnW49Z1/U7qTwbb G41FkMd69i9x4gJj1F3lN59jllmiLPM3mlo/0KopTXPKcp6810/NPdfPv8Su0mk2nNJunGEaenJZ rya2fy7fC9Lp2R8S+LP+CUF7r/jHxV4iHiTV5Nau/H/g/wAR6Qo8Z63aaVLp+jx6Clz9t0yGQWM1 0/8AZl2UaSGXl7fMibR5fCav/wAEvvjNqlv8X9FstV0XQtK8eN45kivP+FoeItTstaj1s6i1naz+ H5rVdO07ypLyCSS5tWllLWrAK3nua/RWitfay6+f4xjF/hFeTd7p3NKVR04xjD7Li1/26mo/cm/z Wup5z8JvFHjTWvi7480zV9Ls9O8G+Gf7N03QpzaTJdarcG0We8uPNZ9kluDNDCgSMESQXG52JCp6 NRRUN31ZhTgoRUI7Ky+5WCiiikWFFFFAHxx8Nv8AglNL8P8A9ri6+JceufDK2S58V6n4plvtI+HI 0/xnfreGdv7Ou9c+3SefZq0y5j+ypvWCIZXGaxvAX/BJ/wAV/s1fCHwzF8MfiXYy/Ezw94Nv/B7e JvEmjNItz9sk0eJbsRQyr5a2Vnpfl29sCVZihkkLGWSX7goqIwjGn7JfDa3y5XG3/gLa/HdJmiqy VR1ftN83z11tt1flqfnr8Wf+CRvxb+LvhvwT4T1f4i/Am+8E+EfD0HhmDTf+FXaglqlnbahpN/DF PbTa3cLexSPpEMEkbSQ5imlO5mwK9o/ZE/4Jup+y78Q9B8SJrfhSE6Va69A+heFPCX/COeHrY6nJ pDYsLL7VP9jjQaSHdPMl82a7mk3JnZX1FRW8as4yck9Xzf8Ak3xfeZJWio9Fqvu5fyVj4+1b9ij4 m/Ff47/Gm21fxJ4Z8O/B/wAdeNtH12TTT4dN7reuw2elaMrGG+F+IbWJ7iwaFo5bF5NscpVl8yN0 yvDX/BI668KftW6T8UrbxN8NpNY8PeJNV8SWWs3Hw6afxfqTXtnqFulpqWtNqBlurWD7agjijigA is4IhgKrL9rUVnH3VFR+yuW/W1lHf0S8k72tcucnJNPZ7r5Nfk3958A+IP8Agmj8XfA3xm8F+M/B viT4N6b4ibxsNa1Q+HPhnJofhq0B0jW4bjVb7TRrJn1C+nlvYITMl0jqChKuqPXQ/FH/AII32PxN tfDmt6pqHwn8X+PrC/1rUNYuPHfwwh8S+G9Tk1WeK4uDBpj3kUtq0TwQpA63jusQdJTOWDr9u0Uk krWW10vJPdLsnbVdeoTk5O77L52cmm/Nczt26a6nxH4z/wCCWnxDbTdMsvBvxS+GXhWxi0rwna39 o3wsdrQ3Xh/VJdTt3s4LTVbWK0tXmkCG32SMsagCXcS9VvGv/BG8/EHwn4QuvEGsfBzxt458O6n4 lv7yfxn8KU8QeGb5Nc1R9TnWLS5tQE1tLDMUWOVb1js8wOJN42fctFU5N793L5tWf3rS21tBXfLy dNNOmisvuW3nrvqfFPxA/wCCJ/w/+MfgLW9P8Y6f8NNd1m7+GFn8PtDvz8O7CG38H3MLak7ajpts GItVL6hGUgiZCgtI8zOx3L03xB/4JJeAPiT8UfE/jzUtO8HXfj7WfG3hzxbpnie58KW1xrGgwaQu kKbCG6ZvOCTjTJfmV0CfbX+R9p3/AFhRVxqyU1UW6d/nzKV/vSfnttdA23v2t8rRVvS0Y/dfdu/z L4R/YK8T+HfH2gWlx8SbC8+FfhHxVfeMtG8Pr4Y8rWhfXT3UpiudT+1GKW1jmvbh0RLOKXCwq8z7 HMt23/YY1vwd+zn8E/DHhLx3ZaX4z+Bdpa2+j65qPh83+m6iY9OfTpvtVgtzFIY5IZZGCx3UbJII zvZVZH+jaKzj7sXCOibTfm0rJvu7aO+60d7A3d3fp8tXoulm21bZu6PAYf2Jb29/Yn+JPws1XxkL /wARfFOz14az4kj0gQQRXurLMJZoLLzTshiMoCQtO7bY1DSuxLniJf8AgldDotrq9z4f8e31l4iv NO8OSW+sahpUd9PNrekatf6r/ad6qvGtytzcXuJYI/ICxoVieMFPK+taKcXytOOluW1unL8Nu1tN rbLsrEm5QdOWqfNe+t+Zpyv3u4q9/NbN38R8Afs1eNm+M3hfx94/8f6H4n8QeHtH1zRjDo3hd9G0 8xajLpUieTHJeXMsYi/swlvMllaR7pyGjVFjryiw/wCCYvjDwD8J7Dwj4J+Lem6JZap8PdK+HXi6 bUPB/wDaMuo2lhBNAl3p2LyIWNy0d1cAmcXkWTCfL+R/M+xaKUrSh7Jq8bWt0a97fv8AHK99767K 1QqSj8L2+9ddH0+XpsfNV7/wT1fWE8US3vi6Br3W9c8J3NjLBo3lpp2k+HdRgvbOwZTOzTTOUuBJ cllBNwGWFQgRvMP+HQusaH+0HrPxD8PeJfgxo+u3PifVPFNjrB+E7v4jme9M4NhqWpJqsb32nhLh 0aBY4C4jh+dQhDfclFErylzS1ev48t/v5I/d5u8RtGn7KOkb3t5q6X4N6bfcj49+Gn/BMfxH8I/C en3Hhnxz4B8KeL/DniZvEPh+18PfDw6Z4H0hZLB7Ce2XQ11AyBZo5p5ZHjvo2adkfO1WjfgfiJ/w RK1H4g+Kp/EV/wCMvhL4h8T63YXMeq6v4p+E66xdabf3F9dXkl9obf2lF/ZboboLFu+0sv2aFmeR gS36AUUnFOSm91pfyslb0aSutm1ffUFpB01s9fne9/XXftptofEvxf8A+CPK/FX9oCDxlceKfBWo /ZvEWg+IbfV/EngX+3PGunf2XNZS/YbPWpL1Ra2cxs3LRRWoIe8uX3MZGBh8Nf8ABDrwB8O/hDa+ H/CP/CH+ENeuPhHrfww1/wAQ6R4MtrO78Sz6jDYx/wBq3RjkVpXia0kfy5Hcsblv3q4Jb7goq4zl GLjF2vf8YuL13+Ftfjuky6VSVOSnDdNP5rVb9j5F1r/glPD/AMIl4u0nSPHU9tJ458PaLomravfa W0+sG6stR1HUJ9ZhuIbiAQ6lJNf+bBKqeXaTW0TLFIirCuz4V/Yv8V/st+FPE+l/Cnxf4kurn4h/ EHRtcvdU1/Updc1DRdMht9NttQSS61Oa4lunmt9PmRCQTGbxFREWIOv1DRTVSSlzLra/ZpOLtb+X 3UrK2mitczsrW8renuqKfqklq77a31uUUUVAwooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAori/ht8Ltc8DeLfEOpa p8SPGnjKz1qfzbPStYtdIitNAXe7eVatZ2NvOy4YLm5lnbEa/NnczfL3ib9nm80T9srxb4u8Sfs3 Xnxf1258R2Wu+D/iBb6noom8MafBbWw/s6KS8u4b60dJ4Lp1gtojbTteDzZUE1wyEWnJKWiav6ap W9bNvdLR6jkrJtau9vwevp02bu1pa7X2rRX5w6L/AMEu/GGhaS/iDwt4O8M+CPid8QPAHj6LxPr9 nPbWF/Hq2tatp99p9nd31ovnytDELmETxCVYvKYq3zJuzB+wBr3jPxxCfhv+zfbfs26PI+jRaddr c+H4LnwjqVpPcT3fiC3ttOuLmB53tmjsUJLPdeYUu4xbR4eZNxina76pdLOS+d+Vctv5lflj7wO3 Jzr5d+ltNWnq212Xu80tD9MaK/MD4If8E2vi34D/AGTLTwNrGg38/wAQL61+H00PxAgn0Q6v4dtN N1LSnu9FJfdCw0/7Nc3UBSCS3mVz5gluNzXHU/FX9i/42eAdV1LU9J1P4weO9Rt/jXb+LofEmjTe DofFV3pf/CFDSmnjivYrbSRsu2NuUkgVzErOFZsSHeUIpyV9r/PWC/8Abm3091uLktVagnza7KXz tG6/8Ceitd66q+h+i1FfnP8AEv8AZA/aD+N3wq8fz+II9bbXvEvg7wrp84F5oUWr+ILXT/EWs3l1 pc6+XLpYvZNMubaOYNCdOmlmkiyYGcr7f/wSt/Zsu/2aPhh4x0keEfiD4I0jUdaW7sNJ8VnwpbyJ /o0SSSW9l4ZiTTrWFmXkAmSSRZHcLuBbNqyn/d289tvvfnptbUidlJKOqdvleKf4N27ed7pfVNFf kj+yZ/wSz+Jvw18P+Jbfw78PPEPw48Z638Odb8Oal4h12TwnpNtPfXLW7QrYXXhwHUZg8kRZrnVP NmiQZjIkeTd6DoX/AATWt/i1+0D4Emj/AGWPDnwr+B+m61Yy+IfAesxeH7ix1W4g0nXozqsmn2U9 xZybZbywhErMbmQqpeNUgRqILm5V3V35fFv9yta7u9Uo+83NKPO735b2/vWSat63e+mmjb0X6W0V +Xeufsm6N8IPit8IvAPiX9m2H4q+HrRfirf6X4D0q18PyWNjYXHijTLmwuBb6hd21ksS200W2MMZ IzKgEalW2aHjL/gn149sPh3pmm+MfgzF8cvEz/DWw8MeENXbXdOn/wCFWaxEbvzLgT6hLDPbqpns SL7T0mu3/s4Fk3Rw7037iqJXve3fRzXVpXvHvyq9nJOydulabg31evTSXLfvZr3lZN9la8l+mlFf EHhz9lLVNH/axvtV8ffAj/hbHie61zStQ8PfFd9R0tl8KWUFpaRyW4kuLhNStfLuILyX7PZ28kE5 u/3jjzp9nk/7Nf7MX7Str+zf4G+HviDSPiUmieEE8GC80zxjeeEDb2tzpuv6RcSHR5dIfzntIrO2 vWf+0XM7hbYRh3MgOtKmpzUG7XcVfok9W9bO8dtrN/a6mMXeLk1bbTrq7X7W673S3Seh+m9FfKX/ AAUqtPEngjXvhx4x+Gdzo9n8VtZ1GX4e6al9ctCL6z1SMmWQKAfNaxkt4dR2sOYrK5QFDKWHKah/ wR/+F3h79pH4X6lovwh+Ht/p3hPwNrGm3fiXU9D0+61GTWVl0YaXe3EkiGee7Vbe8dbjDMhMnzKZ AGwjJuLlbbmT9VFysvVcq1suaXKr2bNeRc6g3a6v6K9tfVqVrX0jra6R9sUV+b/wQ/4Ju634j0df Bsnwkb4IT3Pw81fwl8QfHVtfaXdyfEbVLuKCKPUV+zzSXOobZo7m68/VEgnXz9oTM023p/jH+xV+ 0B8RfF3xCfX/ABF4e1u+1+2+HFrpHiPwfoUPh42CaV4pur++dbXUL7UFee2t5ROHkHlSblRYpGVl bbkXMo30bSv0+Llur2ei195R08tXEVeLk9Hpp2u4rpdPSTb5XL4X6r75or82/wBoT/gnJ8VvEfg/ x5pmo6n8QfijoGpfFe08TajCy+D21vxtpI8MWVgubW9sk0SX7NfRhhBd28IZbMSq3mpC78boH/BL j4vXvwP+Mml+G7/4w/DXTda+Fknhzw/4bv7zwRLceIbj7Z4hlGm3aWlk9nY24W9g8uOweCOOK72+ duQiGacVLd20T++MW130btot09LppaqnG8bve3brLl79F72tvOy1P1Wor8/PjH+wt8XPin8a/Hl9 JYJbeCrb4q+CfHGg2dprEcdx4hls08OwXtxcrvVVt7OCwvSkLszTyvvEYMEBlpfDX/gnh49sv28/ C/xcm8B/DnS9JtPihrOsy6heeHLM/ERtNutK1WPzb/WYb6SKWzF3cxw29nFE8i2osjI0bQyItU4K STk7X/D3YP8AFya/7db7qOP/AC59ot7J28+WUmvlZR7uTator/ohRXzr+09+xh4e/am/a6+GGq+O /h34R+IPgPwt4X8R29xH4i02z1O1stRubnRmtWW3uAx8xora7xIiHaFYFl3gN8tfsr/s8Xfjj4yj xH4L+CzeGfFXhv4xeNNQ1H4r3j6RDBrGmpq+tQnSkaG5k1OWJ5JYYzbzW0UA8qSVW3pEXyT92LfW 9/JKXLd/L3rb22Um7Gk6dqftE+qXzcZS/wDbber1slc/S+ivx98I/wDBLr4xSeP7a/0TwF4o+Gd5 rlvpx8XXmm2HgHQ9MTU4PFPh7UPtel22mI8lzDbwW+qSwNrBuZlVQhVnmcS/QHiL9iT48eE/HVzP 4a1u+8WazN8a4fEkHjHxXNpUVxBpMngj+x5dSe3sYIIZHtrl2jjt1t42laGPeQjNONIQvTUm9XfT zUoxSvpa/M3d2SSb2u1KSak09lJrztG6+9+6rXd+h+gVFfA/wP8A2c/iH+xEfhnLpPws8e/ETTfC WrfEO3lttM1/R59VW11TXlu9Pu5ptS1C2WYzQR73PmtKGf51DZA7r/gmv8aPFr63q3wx174XeJvB F3o9zr/inV5dfurdLiz/ALR8QXk2nwxJbNPBcLLCbhmmjuNqNb7QJNxZUkpS5Iu718tvXy/Fpbk1 fcTk9lK34uKeney+Tve2p9fV5Lrn7WMf/C75/AvhfwF478eXWi3ltZeJdU0ZNPt9M8KPcRxTRi5l vbu2aZvIlWZo7JbmREKlkUyRK/zp/wAFBP2SNb+LPxr8WazL8EIvjTL4h8HW+ieBNXbUtMiPwz1Z Hu/Nvs308Utlveezl+1aas9zmywUBih3cp4r/wCCf3iG3+Puvy/8Kb03X/HfiPxboXiXSPjZBdaZ DceGYILfTo7+CWV5U1RHJsrsLBbQywTreqsrxiSbZND3qi59F+fvWt06XbvyrZKTV2OsuWL5dX+W id+t7vRJXe7aVrH6IUV+T+hfsx+KPjBY+MNV+FXwH0qy+JGl/E3x7cz/ABK8Rx6NJpniax/tPXIG 0V1S7bULmCV5oomtbmGC1/dvJ5gKxs+1+z9/wT41X4W+BfjZoepfAT4l6v8ADvx7pGgW+n+GLzRv hdHfpqsE+pG51CLTLXydADRI1gwkuVmlcqgIcRKiTFtwcmrNJO3e9tvv62d07pKzd1oKFSUE72bX 3Scf/ttL2XnofqNRX5r+E/2ENZ8IfC/4aQ+Mv2a1+LHw+8Lx+I7e1+GlxL4bku9JuLy+instTubG W4g0IT+Sl0jixkVLc3m23i2PKE8x8I/8EsvidpHx+8PeIfEnwz8Q+JPGulX/AIRutO8S+d4RvtAs FsIbATC61K6x4mHkNBMuLNkSfy03KyyyhtIJOUU9m1fyu2tfkr6XWvvOLMW7RlK2ybXntt9/Wz0d k1qfrtRX5ufDn9h34kaf/wAFLvD3xRm+HWo+HdSj8Za1P4o13SNN8G6T4d1TRp7DUorQxy2oPiG9 keQ6c8y38vlmfzJBGFSLy8rSP+Canxs8Nfsu+HtGutb8YeNNVX9nLxR4GPh/V7nw/BaeGNZvLXSE ttOtZbS3t5JEdraZPNuJrhVFupaUFt0ipWlFSm7aX9Pdm7d73iltvJdbKXTTpRlW9k5WV0r+TbV+ i0td67NH6cUV+dPxF/YP+LmvWXxo1XV9ATxf4u+L3hTwhC9uNRtrrw7DqdjqmpznSp4LmeFn0S3g exhuxGiyXcMt06RNNK6D3L/gmd+yF4h/ZA0b4vaNrWg/DnQbbxD4vj1fSYvAnhxPDmgzwHRNLgd7 fTxc3DW+LiCdG8yTdI6NJtVZFFE1yxqPrGN0u7Tj7q+96q97OxzptqPnb5Xin+DbjbfTVLZfUlFf A/8AwTo/Yg+LPwg+JnwM8Y/EmyS11Lwt8J9Q8DX2nWmrpc2PhmOOTQxZWwUMFluJza30800SMoOy HzHSGF32f+Cgf/BOS1/a28c/HfXdU+Fng7xzqmo/By18PeAb/WbHT7q5s9bSTXndLWS4+a0kDXNg 3m5jUkod+Yzt1qU4xaSlf4r+VpSS9bpJ/PRtWb6IUoynKLlZJpJ97yjFvySu5dfdV9LtL7for4A+ L/7F/ivXP2ivEWpL8GYvEnjnXvFeiat4W+Lv9paaD4F0i2WwE9h5ksy6lblfs99/o9lBLbz/AG79 46+dPs4f43f8E2F+Nfw0+LXhrxX+ynovjf4r6jF4svtK+K+rXOhXaatLcw339kpFPNcHUfNiS4tL dIbiCK3tjb7o5cQQF8oq6T7q/ppF29dWuza91y1tjQXtHFT927S16Xvq/LS/kvi5XZP9N6K+B/28 f+CdWn+KPB3w48DeDfgfoVx8MNFt7+eXTPBHg7wQ9/pOqTGAJIE8QxtZQWci/aGme1he6aRISCFD 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 l1pmnW9xZ6jb3MKyS2dzc3FxFNAdtzqE5URlUC61lBV5qHwp6eaba+XR67pS1ulfKMGqa5neW3zS v9z1T2s+XRpu30l8cf20/hv+z34KsPEniPxd4UsvD19q9zoTandeJtK06ztryBLkyQPNeXUKGUTW zwGJC0iyn5kVElePN+G3/BRP4EfFjxhpnhjRPjJ8KL7xlqpEUXhq18Z6VeasJ9hZ7fyILiQvKgDb hGWHykgkDNfMWuf8ErfiPoek+CdRt9e/4WB4h8Lap4zW7jufiVrnw/m1O01zWzqcV42oaBbIRcgR wrNbC0+zuzkoU8lC/vH7GH7IWt/s5+NF1K+g8N6bpp+HXhzwnFpmlapf6kthc6fdavPMiz3gM00I XUIUSaV/MkMbsyR8CopxVm5Pr/n1e91Z3s7XSdmne61lzcnS9v73vpX8rRbe6vZ20aa948JeN9F8 f6bNeaDq+l63aW11PYSz2F1HcxxXEEjRTwsyEgSRyI6Op5VlYEAgitSvK/2OodZb4QXV7rfhLQPB E+reItZ1C10nStKbTdtpLqNw1tPcxMSftk8JjnnYhSZZnyqnIr1Sp6L0X321JfxNLa7+6+n4BRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFeT/ABn/AGr4/hj8QofB3h7wJ46+J/jH7BHq95o/hhLCJ9MsJJJYo7qe41C6 tLVFeWGREjExmfy3ZY2SORl9XjYvGpKlCRkqcZX244oWq5lt/l/VvVNbpg9Hyvf+n8rppryaewtF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFAHF/Db4Xa54G8W+IdS1T4keNPGVnrU/m2elaxa6RFaaAu928q1azsb edlwwXNzLO2I1+bO5m+TPjX/AME3YPiT8X/ih8QpvhX4O1fx9e/FvwZr/hfxLc2WnSaxBo1gPDgv Xhu3/fQIgtNRHlblZ8PtVvMXf9zkhQSSAB1NeTfs/wD7V6ftJawbnw94C8eQ+BLuzN7pHjfUE0+2 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 hXMv70+X6l8K/wBmL4l/An4u+IdO0rR/hb4s+H/jPxDpniPUNe1vUbqHXtPe1s7G2aNbFbSSG7df 7Pjkhna8gMTTA+W/kjzfqOitfay9rKt9qW/mubnS9FLXSz6NtaFVf3iSl0u15NpJv7klrp5X1PiX 4r/s5/Er4S+H/g7beGfC3hvx74j0746eJfGIt7rUbqx0m0s9Qh8TXUEt1dx2Vy9sY1vYE3fZ3Xzy kYb5lerXgv8AYv8Ai78EvGOkfErw3pfwo8ReO7ubxPJqvhvU9cvtO0fSv7b1C3v2NjqKWNxK5ia1 SOTdZxC5Mskp8gjy2+0KKySs+Zb6r5SSjJfNJXe/Zo0rVHVd5+rXd885p/Jzdlt3ufnH4z/4JBeN /D2j6Lb6PHoPxAin+HVh4I1iwuPin4r+HWn2z2j3jgxw6OJkvbKT7dKv2a4VGjWP5ZSJWCeufsu/ 8E+/GP7KXxjbxto+qeH9XuvEer6pb+I9Mv8AUb2a2t9Kub97qCfTJJkmktLiMbBLariC5bDSSebG szfYFFVB8s3OOjd/ubu16atd7Pe6TWVVe0ioz1tZ/NKyfysvLRabnlf7HUOst8ILq91vwloHgifV vEWs6ha6TpWlNpu20l1G4a2nuYmJP2yeExzzsQpMsz5VTkV6pRRS6JdrL7tBvVt92397uFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFcX8Nvhdrngbxb4h1LVPiR408ZWetT+bZ6VrFrpEVpoC73byrVrOxt52XDBc3M s7YjX5s7mb5M+Nf/AATdg+JPxf8Aih8QpvhX4O1fx9e/FvwZr/hfxLc2WnSaxBo1gPDgvXhu3/fQ IgtNRHlblZ8PtVvMXe6S5qkYS0Ttd9ryjH00UnJ67RepSinfXbbz/r0+R9z0V+aH7Lv7Ol38SfjO fEHhD4P3fhDxToXxj8a32q/F+Y6Oo1PTRq+tQtpsRjuZNSmRpJYUNvcW8VuDC8gbckRfx7wx+xN8 Wv2XvCOpWmm/Bv4/eJfiP488N3/gTxH4gsJ/h7HpOrz3iKs+rNcWaWepX7BY57iGbWZImDsFkfzZ 2JiLbjtZ20v1bV10bSvZO6TW9mt7qU1CrKne6jJpvslJpvfsuayuraNpn7IUV+UNv+xb5X7RlxBo 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 MsgQ5dsHbEoLvhiBhWZaH/BMX/gir4s/bWktPF/jM3/gz4XbleO62BNQ8QDPK2iMCFjxwbh1KZOE EhDhf3I+DPwU8J/s8fDnT/CPgnQbDw54d0tdsFnaqcE4AMjsSXkkbALSOWdjySa+myfKsRUSqTk4 Q3sm03/kvP7u5/MHjP4tcPZdUlgcHhqWLxqXK5ThGcaXk20+aSbfuJ2TvzWfuuD9m34T6l8GPAml 6LrXjXxN8QdZWRZb7XNcmDT3cx2hvLjX5YYhj5Y1zgfeZ2JY+x1yWm/8hG3/AOui/wAxXW1+mZVF RpuKP4Wx+JqYitKvWd5Sbbsklr2SSSXZJJLZIKKKK9U4gooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACuf8AFn/IRT/rmP5mugrn/Fn/ACEU/wCuY/ma4cw/gs0p fEZdFFFeCdB85/8ABQP/AIJlfD3/AIKEeEAuvQDQ/GWn25h0rxRZwBru1HJWKZcj7RbhiT5bEFdz bGQsxPyd/wAE8/8Ag3p074U+LpfFPxym0Xxbd6beuNK8PWTtNpcqRuQlzdMyqZg+AywFQoUjzdxZ ol/T2iuGrluGqVVXnFOS/H17n32U+J/E2W5RUyPB4qUaEv8AwKK6qEt4qXVL5Wu7oiLFGqIqoiKF VVACqAMAADgADtS0UV3HwJPpv/IRt/8Arov8xXW1yWm/8hG3/wCui/zFdbXs5Z8EvUxq9Aooor0z EKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAor4K/wCCgv8AwVA+I/gH /gob8H/2XPgDovg/V/iR44Rta8Uap4nsbq903wtoyh/3xitp4GaUiOVwGkUfLGnJmDJ03/BT3/gs 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 tSi5Ss9FzRUly2aV+pH9rZeuZewTTaaVkuVcs048y1l7zg+ZtSfK9ru/w7qP/BYTx94d0+41HUfB Wlolt8X7zwC2jw2ck2qtZxW5kjhHlXUkTXzSbYyyM0JJ4GPmrqNN/wCCm3xA0/8AY08A/ETXNB8M wa/r3xLXwbrNlY6feXcUFqLueGQ28UcrSyXAWEbcb9zdIzkCvrq3+APgO01EXkXgnwjFdrq7a+J0 0e3WQakww17uCZ+0EcGX75HepB8C/BC6FaaWPB3hUaZp+pf2za2n9k2/kW19vaT7WibNqz72ZvMA DZYnOTWWHy7MYO88RfSK26r2N30vzclS/wDj0tqa183ymaShhba3eu6tU062tzR1/u69D4z+Ef8A wUm+K37Qnxb8I6FoUHww8O6L8StV1z/hH9R1C0vL+606y0tX3W97arcwg30hMT7VlTy4ySyEsMZ6 /wDBU34reP8Awd8AT4S8K+GpNf8Aipca/YalHHYHUI5ZdLZU86wWXULKMxSYkbEs+QOAzFfn+xvE H7Jnwr8WHUjqvwz+H+pnWb0alqH2vw7ZzfbroBwLiXdGfMlAkkG9st87c8mp/F37MHw0+IGgaLpW vfDvwNrel+HITb6TZ3+g2tzb6XEQoKQI8ZWJSEQYQAYRfQVnHK8x9moSr3dld3s3a13e3u6JrRO/ Nd6pGjznKPaKUcNZa2Vk7XjUS6+9rKm9Wv4enxu3yd/wTy/aG+Jf7Wn7S+hePdefU7fwxe/Daa21 G00uO/j8Mw63Hrc0ZRFmZohdLbxoGwznDHDFME/dVcv4P+B/gr4e6naXugeD/C2h3un6f/ZNrcaf pUFtLbWXmGX7MjIoKw+YS/ljC7iTjPNdRXtYDDzoYeNKrLmkrtvu3JyfotdFd2Wl3a78LOMbSxWK dWhDkholHslol5+vXsgooorsPLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9lQ SwMEFAAGAAgAAAAhAKVefS3HBgAA1xsAABUAAAB3b3JkL3RoZW1lL3RoZW1lMS54bWzsWc9uG0UY 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 ------=_NextPart_000_0834_01D0508F.2EAEAFD0-- From david@fromorbit.com Tue Feb 24 17:34:31 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E09DF7F3F for ; Tue, 24 Feb 2015 17:34:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB0A78F80D0 for ; Tue, 24 Feb 2015 15:34:28 -0800 (PST) X-ASG-Debug-ID: 1424820865-04cbb0610e9a1a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id mpvdxPPR0UByRi2a for ; Tue, 24 Feb 2015 15:34:25 -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: A2BSDADhCe1UPDkjLHlBGg6CeFJasDgMAQEBAQIGjGKFdIVoBAICgSJEAQEBAQEBBQEBAQE4O4QPAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIJwcON9RLAQEIAiAYhW+EDn6EDBEBB0kHgxeBFAWTO4VkgRyOYoM+giQcgRNRKjEBAYEBCBeBIQEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 10:03:23 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQOyf-00052k-U1; Wed, 25 Feb 2015 10:33:21 +1100 Date: Wed, 25 Feb 2015 10:33:21 +1100 From: Dave Chinner To: Dave Hall Cc: xfs@oss.sgi.com Subject: Re: XFS/LVM/Multipath on a single RAID volume Message-ID: <20150224233321.GF4251@dastard> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume References: <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> <20150223121812.5077ff07@harpe.intellique.com> <54ECF573.9050106@binghamton.edu> <20150224223344.GE4251@dastard> <54ED01BC.6080302@binghamton.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54ED01BC.6080302@binghamton.edu> 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: 1424820865 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15797 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 [cc the XFS list again] On Tue, Feb 24, 2015 at 05:57:00PM -0500, Dave Hall wrote: > Dave, > > I'm not going to post any more of my noob questions. Which defeats the purpose of having a public, archived list - other people can find your questions and the answers through search engines like Google. > Sounds like > about the best I could do would be to get a faster HBA (planned) and > just go for it. Also sounds like I might want to look at breaking > up some the large rsyncs that are running inside rsnapshot. Perhaps > it's just the directory tree traversal that's killing my > performance. Most likely - that's small, random IO and will almost always be seek bound on spinning disks. > One last question - format options: I seem to recall that there are > some parameters on the mkfs - su, sw, etc. Do I need to specify > those when I set up this new volume or can mkfs.xfs calculate them > correctly, now? XFS has calculated them correctly for years when you are using MD or LVM for software striping. Nowdays it even works with some hardware RAID, but support is still vendor and hardware specific. That's when you may have to specify it manually, as per the FAQ: http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E > Also, I saw something about formatting differently > for a workload like email with many small files, vs. a media > workload that's focused on large files. Since rsnapshot has to > create a new directory tree for every snapshot I'm going to say it's > closer to the email workload. Any guidance on that? Set up your storage config to be optimal for your workload, and XFS should set it's defaults appropriately. If you have a random seek bound workload, though, there's very little you can tweak at the filesystem level that will make any significant different to performance. In these cases, It's better to buy big, cheap SSDs than expensive spinning disks if you need better performance for this sort of workload. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Feb 24 21:06:33 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3111A7F3F for ; Tue, 24 Feb 2015 21:06:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1147230408D for ; Tue, 24 Feb 2015 19:06:29 -0800 (PST) X-ASG-Debug-ID: 1424833587-04cbb0610da73f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hv8fpbaQnOvyfX9h for ; Tue, 24 Feb 2015 19:06: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: A2AwFgA6O+1UPDkjLHlbgwaBLIY2qhEBAQEBAgaMYotcAgIBAQKBJkQBAQEBAQEFAQEBATg7hA8BAQEEOhwjEAgDDgcDCSUPBSUDBxoTiC7UaQEBCAIgGIVvhQyEbgeEKwEEhF8HlDmTPIQkKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 13:34:52 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQSHL-0005Qt-AR; Wed, 25 Feb 2015 14:04:51 +1100 Date: Wed, 25 Feb 2015 14:04:51 +1100 From: Dave Chinner To: Namjae Jeon Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation Message-ID: <20150225030451.GG4251@dastard> X-ASG-Orig-Subj: Re: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> <1424533554-28024-11-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424533554-28024-11-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424833587 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15805 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Feb 22, 2015 at 12:45:52AM +0900, Namjae Jeon wrote: > From: Namjae Jeon > > This commit adds insert operation support for fsstress, which is > meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. This causes xfs/068 to fail because it changes the file creation pattern that results from a specific fsstress random seed. As such, I added this to xfs/068: FSSTRESS_AVOID="-f insert=0 $FSSTRESS_AVOID" To turn off the insert operation for that test and hence produce the expected tree of files. Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Tue Feb 24 22:15:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D21227F3F for ; Tue, 24 Feb 2015 22:15:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B1E148F80D4 for ; Tue, 24 Feb 2015 20:15:56 -0800 (PST) X-ASG-Debug-ID: 1424837753-04cb6c4bd09a9c0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id UZDLaGcPwjD2uO5d (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Tue, 24 Feb 2015 20:15:55 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NKB00F9K7UETW40@mailout4.samsung.com> for xfs@oss.sgi.com; Wed, 25 Feb 2015 13:15:50 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.116]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 87.85.11124.67C4DE45; Wed, 25 Feb 2015 13:15:50 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-c7-54ed4c76e2b8 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 50.74.09430.67C4DE45; Wed, 25 Feb 2015 13:15:50 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NKB000IX7UDB980@mmp1.samsung.com>; Wed, 25 Feb 2015 13:15:49 +0900 (KST) From: Namjae Jeon To: 'Dave Chinner' Cc: tytso@mit.edu, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, bfoster@redhat.com, mtk.manpages@gmail.com, linux-man@vger.kernel.org, linux-api@vger.kernel.org, 'Namjae Jeon' References: <1424533554-28024-1-git-send-email-linkinjeon@gmail.com> <1424533554-28024-11-git-send-email-linkinjeon@gmail.com> <20150225030451.GG4251@dastard> In-reply-to: <20150225030451.GG4251@dastard> Subject: RE: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation Date: Wed, 25 Feb 2015 13:15:49 +0900 X-ASG-Orig-Subj: RE: [PATCH v10 10/12] xfstests: fsstress: Add fallocate insert range operation Message-id: <003201d050b1$bcae7e10$360b7a30$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AQIw+/ucisGvdasF7eGJgn46mR7afQJ/7iI8ASG3AdqcIlwuQA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOIsWRmVeSWpSXmKPExsWyRsSkRLfM522IwcaTQhZLJ15itnj3ucpi y7F7jBbX795ittj8vYPNYua8O2wWe/aeZLG4vGsOm8Wa9TPYLU5NeMBu0drzk91iUd8tRgce j1OLJDx2zrrL7tF05iizx+oLWxk93u+7yubRt2UVo8fnTXIB7FFcNimpOZllqUX6dglcGSee r2YteM5asfB1E2MD4ymWLkYODgkBE4m1LQJdjJxAppjEhXvr2boYuTiEBJYySsxvP8gCkTCR 6Nj/lhXEFhJYxCix+qoKRNFfRolDT2YxgQxiE9CW+LNFFKRGREBDYtreI8wgNcwCC5gklj9f xgTRANT86M8nZpAqTgEdiR1XF4DZwgKREic63zODDGIRUJX4PkUSJMwrYCnxfEoPE4QtKPFj 8j2wg5gFtCTW7zzOBGHLS2xe85YZ4lAFiR1nXzNCHOEksfrFPzaIGhGJfS/eMYLcICEwl0Ni e/czsEEsAgIS3yYfgoaErMSmA1BzJCUOrrjBMoFRYhaS1bOQrJ6FZPUsJCsWMLKsYhRNLUgu KE5KLzLSK07MLS7NS9dLzs/dxAiM/9P/nvXtYLx5wPoQowAHoxIPb4LwmxAh1sSy4srcQ4ym QBdNZJYSTc4HJpm8knhDYzMjC1MTU2Mjc0szJXHeBKmfwUIC6YklqdmpqQWpRfFFpTmpxYcY mTg4pRoYlepnhlS8ViiOLDb8en3qn9sHvz33Pbf69ZRljTwFDwPSjxgukMjkrGacoCVTuCDC 7SST6YbYm3dd34S3Wt9XuDqjYM5C8cVNpwOmsE3841yxQtG4QlLpyI0nugZ5DLv6dwW+3Bag xrzpuO03gVg+lbdlxT3xc9d/fNFvckJ9yf+/95fJqRpfUWIpzkg01GIuKk4EAHgBRKP6AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEKsWRmVeSWpSXmKPExsVy+t9jAd0yn7chBhsucVksnXiJ2eLd5yqL LcfuMVpcv3uL2WLz9w42i5nz7rBZ7Nl7ksXi8q45bBZr1s9gtzg14QG7RWvPT3aLRX23GB14 PE4tkvDYOesuu0fTmaPMHqsvbGX0eL/vKptH35ZVjB6fN8kFsEc1MNpkpCampBYppOYl56dk 5qXbKnkHxzvHm5oZGOoaWlqYKynkJeam2iq5+AToumXmAB2qpFCWmFMKFApILC5W0rfDNCE0 xE3XAqYxQtc3JAiux8gADSSsYcw48Xw1a8Fz1oqFr5sYGxhPsXQxcnJICJhIdOx/ywphi0lc uLeeDcQWEljEKLH6qkoXIxeQ/ZdR4tCTWUxdjBwcbALaEn+2iILUiAhoSEzbe4QZpIZZYAGT xPLny5ggGoCaH/35xAxSxSmgI7Hj6gIwW1ggUuJE53tmkEEsAqoS36dIgoR5BSwlnk/pYYKw BSV+TL4HdhyzgJbE+p3HmSBseYnNa94yQxyqILHj7GtGiCOcJFa/+McGUSMise/FO8YJjEKz kIyahWTULCSjZiFpWcDIsopRNLUguaA4KT3XSK84Mbe4NC9dLzk/dxMjOL08k97BuKrB4hCj AAejEg9vovCbECHWxLLiytxDjBIczEoivG5fgUK8KYmVValF+fFFpTmpxYcYTYEencgsJZqc D0x9eSXxhsYmZkaWRuaGFkbG5krivEr2bSFCAumJJanZqakFqUUwfUwcnFINjMs39bv111aF vleViwqYKs57e/GkNamPg89K3nokoH2vwWBOe22XdpMJS+jGm1laImtnR9WsTs44u2cx06/d ++2jwqff80vN/n7CNWJ2/cp9y14v3/xMz+na8mYnmdnzO+q/XDp982Z94iWhm1OMHuc8uWh0 fYuezEP5Cd6BDefTZ8ZdX8+4vEKJpTgj0VCLuag4EQAgPlgsRQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1424837755 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > On Sun, Feb 22, 2015 at 12:45:52AM +0900, Namjae Jeon wrote: > > From: Namjae Jeon > > > > This commit adds insert operation support for fsstress, which is > > meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. > > This causes xfs/068 to fail because it changes the file creation > pattern that results from a specific fsstress random seed. As such, > I added this to xfs/068: > > FSSTRESS_AVOID="-f insert=0 $FSSTRESS_AVOID" > > To turn off the insert operation for that test and hence produce the > expected tree of files. Thanks for your notice :) I will check other TCs as well as insert range TC next time. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From mol@sectorgobmx.info Tue Feb 24 23:21:04 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B77937F47 for ; Tue, 24 Feb 2015 23:21:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A48B88F8039 for ; Tue, 24 Feb 2015 21:21:01 -0800 (PST) X-ASG-Debug-ID: 1424841659-04cb6c4bd29bc60001-NocioJ Received: from mail1.sectorgobmx.info (63-246-155-219.static.sagonet.net [63.246.155.219]) by cuda.sgi.com with ESMTP id G5MMphK4AwwJ6qIu for ; Tue, 24 Feb 2015 21:20:59 -0800 (PST) X-Barracuda-Envelope-From: mol@sectorgobmx.info X-Barracuda-Apparent-Source-IP: 63.246.155.219 Received: from WIN-IJR4UBKUUGI (63.246.155.218) by mail1.sectorgobmx.info id htldrc0our0u for ; Tue, 24 Feb 2015 23:20:53 -0600 (envelope-from ) user: 1474412 Message-ID: <3cd2f63944b4a0fe002f98010012d3eb@sectorgobmx.info> From: "Claudia Molina" To: Subject: Impacto Fiscal - Industria Alimentos y Bebidas 2015 Date: Tue, 24 Feb 2015 23:20:53 -0600 X-ASG-Orig-Subj: Impacto Fiscal - Industria Alimentos y Bebidas 2015 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_1059914769D" X-Barracuda-Connect: 63-246-155-219.static.sagonet.net[63.246.155.219] X-Barracuda-Start-Time: 1424841659 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.15810 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=SPLITOR00A_001_1059914769D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable La Reforma Fiscal en materia de alimentos y bebidas, incluye nuevos = impuestos a alimentos chatarra y bebidas azucaradas, adem=C3=A1s de = establecer estrictas normas adicionales para el perfeccionamiento de los = perfiles nutrimentales=2E Impacto fiscal, normativo y laboral de la industria de alimentos y = bebidas, su producci=C3=B3n y comercializaci=C3=B3n 2015 Programado en: M=C3=A9xico D.F. Hotel NH Centro Hist=C3=B3rico 06 de marzo De 9:00 a 21:00 Hrs=2E =C2=A1Aproveche el precio de Pronto Pago! Por esta raz=C3=B3n, es importante que todas las empresas del sector = alimentario sepan c=C3=B3mo enfrentar este costo fiscal, as=C3=AD como las = medidas surgidas de la misma Reforma, que ante la disminuci=C3=B3n del = ingreso petrolero por la ca=C3=ADda del precio del hidrocarburo, = agudizar=C3=A1 la fiscalizaci=C3=B3n de las autoridades para incrementar = la recaudaci=C3=B3n=2E DIRIGIDO A: Empresarios, Directores Generales, Directores de Finanzas y = Administraci=C3=B3n, Contralores, Gerentes Generales, Consejeros y todo = aquel ejecutivo que tiene bajo su responsabilidad el negocio integral de = las compa=C3=B1=C3=ADas de Alimentos y Bebidas, y que desea ponerse al = d=C3=ADa en materia de impuestos=2E Para obtener el temario completa escoja cualquiera de nuestras siguientes = opciones: 1) Responda con la palabra Impacto y los siguientes datos: -Empresa: -Nombre: -Puesto: -Tel: (LADA ) (N=C3=9AMERO) -E-mail: xfs@oss.sgi.com 2) Marque a nuestro Centro de Atenci=C3=B3n a Clientes 9991617076 Lic. Claudia Molina Tel=C3=A9fono 9991617076 Ext. 201 Ejecutiva de Cuenta -Reenv=C3=ADe esta invitaci=C3=B3n a compa=C3=B1eros que les pueda ser de = utilidad sin duda se lo agradecer=C3=A1n=2E xfs@oss.sgi.com No tiene inter=C3=A9s en recibir estas exclusivas = invitaciones? responda con la palabra feb23 ------=SPLITOR00A_001_1059914769D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

La Reforma Fiscal en materia de alimentos y = bebidas,=20 incluye nuevos impuestos a alimentos chatarra y bebidas azucaradas, = adem=C3=A1s de=20 establecer estrictas normas adicionales para el perfeccionamiento de los=20 perfiles nutrimentales.

Impacto fiscal, normativo y = laboral=20 de la industria de alimentos y bebidas, su producci=C3=B3n y = comercializaci=C3=B3n=20 2015

Programado = en:
M=C3=A9xico D.F.=20 Hotel NH Centro Hist=C3=B3rico
06 de marzo De 9:00 a 21:00=20 Hrs.
=C2=A1Aproveche el precio de Pronto Pago!

Por esta = raz=C3=B3n, es=20 importante que todas las empresas del sector alimentario sepan c=C3=B3mo = enfrentar=20 este costo fiscal, as=C3=AD como las medidas surgidas de la misma Reforma, = que ante=20 la disminuci=C3=B3n del ingreso petrolero por la ca=C3=ADda del precio del = hidrocarburo,=20 agudizar=C3=A1 la fiscalizaci=C3=B3n de las autoridades para incrementar = la=20 recaudaci=C3=B3n.

DIRIGIDO A: Empresarios, Directores Generales, = Directores de=20 Finanzas y Administraci=C3=B3n, Contralores, Gerentes Generales, = Consejeros y todo=20 aquel ejecutivo que tiene bajo su responsabilidad el negocio integral de = las=20 compa=C3=B1=C3=ADas de Alimentos y Bebidas, y que desea ponerse al = d=C3=ADa en materia de=20 impuestos.

Para obtener el temario = completa=20 escoja cualquiera de nuestras siguientes opciones:
1) Responda con la = palabra=20 Impacto y los siguientes=20 datos:
-Empresa:
-Nombre:
-Puesto:
-Tel: (LADA = )=20 (N=C3=9AMERO)
-E-mail:
xfs@oss.sgi.com

2) = Marque a=20 nuestro Centro de Atenci=C3=B3n a Clientes 9991617076

Lic. = Claudia=20 Molina
Tel=C3=A9fono 9991617076 Ext. 201
Ejecutiva de=20 Cuenta

-Reenv=C3=ADe esta = invitaci=C3=B3n a=20 compa=C3=B1eros que les pueda ser de utilidad sin duda se lo=20 agradecer=C3=A1n.

xfs@oss.sgi.com No = tiene inter=C3=A9s en=20 recibir estas exclusivas invitaciones? responda con la palabra=20 feb23

------=SPLITOR00A_001_1059914769D-- From david@fromorbit.com Wed Feb 25 00:39:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E98907F3F for ; Wed, 25 Feb 2015 00:39:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D73718F80D7 for ; Tue, 24 Feb 2015 22:39:14 -0800 (PST) X-ASG-Debug-ID: 1424846350-04cbb06110abe20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gle9XBdAk8yA7bi0 for ; Tue, 24 Feb 2015 22:39:11 -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: A2A2FQCtbO1UPDkjLHlbgwNSWrBJAQEBAQIGgUqRAAqFagICAQECgSNEAQEBAQEBBQEBAQE4O4QPAQEBAwEBAQEkExwYEAsIAxUDCSUPBRMSAwctiCcHDtQ8DAEfGIVvhQyCYYICEoMXgRQFhWSNV32EZ4EciVqBeIZOgiQcgWQqMYECBIE9AQEB Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 17:09:08 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQVch-0005iQ-5u for xfs@oss.sgi.com; Wed, 25 Feb 2015 17:39:07 +1100 Date: Wed, 25 Feb 2015 17:39:07 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Message-ID: <20150225063907.GD18360@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support References: <1423653330-25297-1-git-send-email-david@fromorbit.com> <20150219043156.GQ12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150219043156.GQ12722@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: 1424846350 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ping^2? On Thu, Feb 19, 2015 at 03:31:56PM +1100, Dave Chinner wrote: > ping? > > On Wed, Feb 11, 2015 at 10:15:30PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > Add a basic implementation of RENAME_WHITEOUT to the XFS rename > > code. The implementation options considered are documented in the > > code comments; the method chose was "copy ext4" because we are then > > bug-for-bug compatible with the implementation done by the > > overlayfs developers. > > > > I have a hacky renameat2 test for whiteouts copied from the existing > > renameat2 tests in xfstests, and this code behaves the same as ext4 > > in that rename test. I haven't done any testing with overlayfs, so > > who knows whether that explodes or not. > > > > The rename code is getting pretty spaghetti now - I'll end up > > spliting this patching whiteout support and cleanup, and I'll set > > what possible cleanups I can make that will help make the code a > > little more understandable.... > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_inode.c | 261 +++++++++++++++++++++++++++++++++++++++++------------ > > fs/xfs/xfs_iops.c | 2 +- > > 2 files changed, 205 insertions(+), 58 deletions(-) > > > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > > index bf2d2c7..eef5db7 100644 > > --- a/fs/xfs/xfs_inode.c > > +++ b/fs/xfs/xfs_inode.c > > @@ -2683,17 +2683,20 @@ xfs_remove( > > */ > > STATIC void > > xfs_sort_for_rename( > > - xfs_inode_t *dp1, /* in: old (source) directory inode */ > > - xfs_inode_t *dp2, /* in: new (target) directory inode */ > > - xfs_inode_t *ip1, /* in: inode of old entry */ > > - xfs_inode_t *ip2, /* in: inode of new entry, if it > > - already exists, NULL otherwise. */ > > - xfs_inode_t **i_tab,/* out: array of inode returned, sorted */ > > - int *num_inodes) /* out: number of inodes in array */ > > + struct xfs_inode *dp1, /* in: old (source) directory inode */ > > + struct xfs_inode *dp2, /* in: new (target) directory inode */ > > + struct xfs_inode *ip1, /* in: inode of old entry */ > > + struct xfs_inode *ip2, /* in: inode of new entry */ > > + struct xfs_inode *wino, /* in: whiteout inode */ > > + struct xfs_inode **i_tab,/* out: sorted array of inodes */ > > + int *num_inodes) /* out: inodes in array */ > > { > > xfs_inode_t *temp; > > int i, j; > > > > + ASSERT(*num_inodes == 5); > > + memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *)); > > + > > /* > > * i_tab contains a list of pointers to inodes. We initialize > > * the table here & we'll sort it. We will then use it to > > @@ -2701,20 +2704,19 @@ xfs_sort_for_rename( > > * > > * Note that the table may contain duplicates. e.g., dp1 == dp2. > > */ > > - i_tab[0] = dp1; > > - i_tab[1] = dp2; > > - i_tab[2] = ip1; > > - if (ip2) { > > - *num_inodes = 4; > > - i_tab[3] = ip2; > > - } else { > > - *num_inodes = 3; > > - i_tab[3] = NULL; > > - } > > + i = 0; > > + i_tab[i++] = dp1; > > + i_tab[i++] = dp2; > > + i_tab[i++] = ip1; > > + if (ip2) > > + i_tab[i++] = ip2; > > + if (wino) > > + i_tab[i++] = wino; > > + *num_inodes = i; > > > > /* > > * Sort the elements via bubble sort. (Remember, there are at > > - * most 4 elements to sort, so this is adequate.) > > + * most 5 elements to sort, so this is adequate.) > > */ > > for (i = 0; i < *num_inodes; i++) { > > for (j = 1; j < *num_inodes; j++) { > > @@ -2846,6 +2848,101 @@ out: > > } > > > > /* > > + * RENAME_WHITEOUT support. > > + * > > + * Whiteouts are used by overlayfs - it has a convention that a whiteout is a > > + * character device inode with a major:minor of 0:0. Somebody has to be in an > > + * altered state of mind to think this up, so whiteout inodes from this point at > > + * called "wino"s. > > + * > > + * Now, because it's not documented anywhere, here's what RENAME_WHITEOUT does > > + * on ext4: > > + > > +# echo bar > /mnt/scratch/bar > > +# ls -l /mnt/scratch > > +total 24 > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 foo > > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > > +# src/renameat2 -w /mnt/scratch/foo /mnt/scratch/bar > > +# ls -l /mnt/scratch > > +total 20 > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > > +c--------- 1 root root 0, 0 Feb 11 20:23 foo > > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > > +# cat /mnt/scratch/bar > > +foo > > +# > > + > > + * In XFS rename terms, the operation that has been done is that source (foo) > > + * has been moved to the target (bar), which is like a nomal rename operation, > > + * but rather than the source being removed, it have been replaced with a wino. > > + * > > + * We can't allocate winos within the rename transaction due to allocation > > + * being a multi-commit transaction, and rename needs to be a single, atomic > > + * commit. Hence we have several options here, form most efficient to least > > + * efficient: > > + * > > + * - use DT_WHT in the target dirent and do no wino allocation. > > + * The main issue with this approach is that we need hooks in > > + * lookup to create a virtual chardev inode to present to userspace > > + * and in places where we might need to modify the dirent e.g. unlink. > > + * Overlayfs also needs to be taught about DT_WHT. Most invasive change, > > + * lowest overhead. > > + * > > + * - create a special wino in the root directory (e.g. a ".wino" dirent and > > + * then hardlink every new whiteout to it. This means we only need to > > + * create a single wino, and rename simply creates a hardlink to it. We > > + * can use DT_WHT for these, though using DT_CHR means we won't have to > > + * modify overlayfs, nor anything in userspace. Downside is we have to > > + * look up the wino up on every operation and create it if it doesn't > > + * exist. > > + * > > + * - copy ext4: create a special whiteout chardev inode for every whiteout. > > + * This is more complex than the above options because of the lack of > > + * atomicity between inode creation and the rename operation, requiring > > + * us to create a tmpfile inode and then linking it into the directory > > + * structure during the rename. At least with a tmpfile inode crashes > > + * between the create and rename doesn't leave unreferenced inodes or > > + * directory pollution around. > > + * > > + * By far the simplest thing to do is copy ext4. It's also the most > > + * inefficient way of supporting whiteouts, but as an initial implementation we > > + * can simply reuse existing functions and add a small amount of extra code the > > + * the rename operation to handle the *fifth* inode in the transaction. > > + * > > + * Hence that is what is implemented first. When we have time or need we can > > + * come back and implement one of the more efficient whiteout methods, but it's > > + * not necessary for the first implementation. > > + */ > > + > > +/* > > + * xfs_rename_get_wino() > > + * > > + * Return a referenced, unlinked, unlocked inode that that can be used as a > > + * whiteout in a rename transaction. > > + */ > > +static int > > +xfs_rename_get_wino( > > + struct xfs_inode *dp, > > + struct xfs_inode **wino) > > +{ > > + struct xfs_inode *tmpfile; > > + int error; > > + > > + error = xfs_create_tmpfile(dp, NULL, S_IFCHR | WHITEOUT_MODE, &tmpfile); > > + if (error) > > + return error; > > + > > + /* Satisfy xfs_bumplink that this is a real tmpfile */ > > + xfs_finish_inode_setup(tmpfile); > > + VFS_I(tmpfile)->i_state |= I_LINKABLE; > > + > > + *wino = tmpfile; > > + return 0; > > +} > > + > > +/* > > * xfs_rename > > */ > > int > > @@ -2867,40 +2964,52 @@ xfs_rename( > > xfs_fsblock_t first_block; > > int cancel_flags; > > int committed; > > - xfs_inode_t *inodes[4]; > > + xfs_inode_t *inodes[5]; > > + int num_inodes = 5; > > int spaceres; > > - int num_inodes; > > + struct xfs_inode *wino = NULL; > > > > trace_xfs_rename(src_dp, target_dp, src_name, target_name); > > > > + /* > > + * If we are doing a whiteout operation, get us the wino we will be > > + * placing at the target. > > + */ > > + if (flags & RENAME_WHITEOUT) { > > + ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE))); > > + error = xfs_rename_get_wino(target_dp, &wino); > > + if (error) > > + return error; > > + > > + /* setup target dirent info as whiteout */ > > + src_name->type = XFS_DIR3_FT_CHRDEV; > > + } > > + > > new_parent = (src_dp != target_dp); > > src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > > > > - xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, > > + xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wino, > > inodes, &num_inodes); > > > > + cancel_flags = 0; > > xfs_bmap_init(&free_list, &first_block); > > tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME); > > - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > > if (error == -ENOSPC) { > > spaceres = 0; > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > > } > > - if (error) { > > - xfs_trans_cancel(tp, 0); > > - goto std_return; > > - } > > + if (error) > > + goto error_trans_cancel; > > + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > > > /* > > * Attach the dquots to the inodes > > */ > > error = xfs_qm_vop_rename_dqattach(inodes); > > - if (error) { > > - xfs_trans_cancel(tp, cancel_flags); > > - goto std_return; > > - } > > + if (error) > > + goto error_trans_cancel; > > > > /* > > * Lock all the participating inodes. Depending upon whether > > @@ -2921,6 +3030,8 @@ xfs_rename( > > xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); > > if (target_ip) > > xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); > > + if (wino) > > + xfs_trans_ijoin(tp, wino, XFS_ILOCK_EXCL); > > > > /* > > * If we are using project inheritance, we only allow renames > > @@ -2930,18 +3041,19 @@ xfs_rename( > > if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > > (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) { > > error = -EXDEV; > > - goto error_return; > > + goto error_trans_cancel; > > } > > > > /* > > * Handle RENAME_EXCHANGE flags > > */ > > if (flags & RENAME_EXCHANGE) { > > + ASSERT(!wino); > > error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > > target_dp, target_name, target_ip, > > &free_list, &first_block, spaceres); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > goto finish_rename; > > } > > > > @@ -2956,7 +3068,7 @@ xfs_rename( > > if (!spaceres) { > > error = xfs_dir_canenter(tp, target_dp, target_name); > > if (error) > > - goto error_return; > > + goto error_trans_cancel; > > } > > /* > > * If target does not exist and the rename crosses > > @@ -2967,9 +3079,9 @@ xfs_rename( > > src_ip->i_ino, &first_block, > > &free_list, spaceres); > > if (error == -ENOSPC) > > - goto error_return; > > + goto error_trans_cancel; > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > > > xfs_trans_ichgtime(tp, target_dp, > > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > @@ -2977,7 +3089,7 @@ xfs_rename( > > if (new_parent && src_is_directory) { > > error = xfs_bumplink(tp, target_dp); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > } > > } else { /* target_ip != NULL */ > > /* > > @@ -2992,7 +3104,7 @@ xfs_rename( > > if (!(xfs_dir_isempty(target_ip)) || > > (target_ip->i_d.di_nlink > 2)) { > > error = -EEXIST; > > - goto error_return; > > + goto error_trans_cancel; > > } > > } > > > > @@ -3009,7 +3121,7 @@ xfs_rename( > > src_ip->i_ino, > > &first_block, &free_list, spaceres); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > > > xfs_trans_ichgtime(tp, target_dp, > > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > @@ -3020,7 +3132,7 @@ xfs_rename( > > */ > > error = xfs_droplink(tp, target_ip); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > > > if (src_is_directory) { > > /* > > @@ -3028,9 +3140,9 @@ xfs_rename( > > */ > > error = xfs_droplink(tp, target_ip); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > } > > - } /* target_ip != NULL */ > > + } > > > > /* > > * Remove the source. > > @@ -3045,7 +3157,7 @@ xfs_rename( > > &first_block, &free_list, spaceres); > > ASSERT(error != -EEXIST); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > } > > > > /* > > @@ -3071,13 +3183,21 @@ xfs_rename( > > */ > > error = xfs_droplink(tp, src_dp); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > } > > > > - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > > + /* > > + * On a whiteout, we only update the source dirent with the wino, > > + * otherwise we are removing it. > > + */ > > + if (wino) { > > + error = xfs_dir_replace(tp, src_dp, src_name, wino->i_ino, > > + &first_block, &free_list, spaceres); > > + } else > > + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > > &first_block, &free_list, spaceres); > > if (error) > > - goto abort_return; > > + goto error_trans_abort; > > > > xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > > @@ -3090,31 +3210,58 @@ finish_rename: > > * rename transaction goes to disk before returning to > > * the user. > > */ > > - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { > > + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > > xfs_trans_set_sync(tp); > > - } > > > > error = xfs_bmap_finish(&tp, &free_list, &committed); > > - if (error) { > > - xfs_bmap_cancel(&free_list); > > - xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | > > - XFS_TRANS_ABORT)); > > - goto std_return; > > + if (error) > > + goto error_trans_abort; > > + > > + /* > > + * Last thing we do is bump the link count on the wino. This means that > > + * failures all the way up to this point leave the wino on the unlinked > > + * list and so cleanup is a simple matter of dropping the remaining > > + * reference to it. If we fail here after bumping the link count, we're > > + * shutting down the filesystem so we'll never see the intermediate > > + * state on disk. > > + */ > > + if (wino) { > > + ASSERT(wino->i_d.di_nlink == 0); > > + error = xfs_bumplink(tp, wino); > > + if (error) > > + goto error_trans_abort; > > + error = xfs_iunlink_remove(tp, wino); > > + if (error) > > + goto error_trans_abort; > > + xfs_trans_log_inode(tp, wino, XFS_ILOG_CORE); > > + > > + /* > > + * now we have a real link, clear the "I'm a tmpfile" state > > + * flag from the inode so it doesn't accidentally get misused in > > + * future. > > + */ > > + VFS_I(wino)->i_state &= ~I_LINKABLE; > > } > > > > /* > > * trans_commit will unlock src_ip, target_ip & decrement > > * the vnode references. > > */ > > - return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > > +out_release_wino: > > + if (wino) > > + IRELE(wino); > > + return error; > > > > - abort_return: > > + > > +error_trans_abort: > > cancel_flags |= XFS_TRANS_ABORT; > > - error_return: > > xfs_bmap_cancel(&free_list); > > +error_trans_cancel: > > xfs_trans_cancel(tp, cancel_flags); > > - std_return: > > - return error; > > + > > + /* Dropping the last reference on a tmpfile does the cleanup for us! */ > > + goto out_release_wino; > > } > > > > STATIC int > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > > index 6a77ea9..d4442d1 100644 > > --- a/fs/xfs/xfs_iops.c > > +++ b/fs/xfs/xfs_iops.c > > @@ -393,7 +393,7 @@ xfs_vn_rename( > > struct xfs_name oname; > > struct xfs_name nname; > > > > - if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) > > return -EINVAL; > > > > /* if we are exchanging files, we need to set i_mode of both files */ > > -- > > 2.0.0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Feb 25 00:40:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC6ED7F3F for ; Wed, 25 Feb 2015 00:40:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAE0B304032 for ; Tue, 24 Feb 2015 22:40:41 -0800 (PST) X-ASG-Debug-ID: 1424846439-04cb6c4bd29d420001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id jIYkQOHIXIlK9EFt for ; Tue, 24 Feb 2015 22:40:40 -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: A2AxFgDebe1UPDkjLHlbgwOBLIY2qhMBAQEBAgaMYotcAgIBAQKBIkQBAQEBAQEFAQEBATg7hA8BAQEDATocIwULCAMOBwMJJQ8FJQMHGhOIJwfUSwEBAQEBBQEBAQEeGIVvhQyEbgeDF4EUBZkfkzyCIR+BZCoxgkMBAQE Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 17:10:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YQVeA-0005ib-CE; Wed, 25 Feb 2015 17:40:38 +1100 Date: Wed, 25 Feb 2015 17:40:38 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: superblock buffers need to be sector sized Message-ID: <20150225064038.GE18360@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: superblock buffers need to be sector sized References: <1424761944-2034-1-git-send-email-david@fromorbit.com> <20150224133652.GB45528@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150224133652.GB45528@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: 1424846439 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 24, 2015 at 08:36:52AM -0500, Brian Foster wrote: > On Tue, Feb 24, 2015 at 06:12:24PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > In secondary_sb_wack() we zero the unused portion of both the > > on-disk superblock and the in-memory copy that we have. When > > the device sector size is 4k, this causes xfs_repair to crash like > > so: > > > > # xfs_repair /dev/ram1 > > Phase 1 - find and verify superblock... > > Phase 2 - using internal log > > - zero log... > > - scan filesystem freespace and inode maps... > > bad magic number > > bad on-disk superblock 3 - bad magic number > > primary/secondary superblock 3 conflict - AG superblock geometry info conflicts with filesystem geometry > > zeroing unused portion of secondary superblock (AG #3) > > # > > > > The stack trace is indicative: > > > > #0 memset () > > #1 0x000000000040404b in secondary_sb_wack > > #2 verify_set_agheader > > #3 0x0000000000427b4b in scan_ag > > #4 0x000000000042a2ca in worker_thread > > #5 0x00007ffff77ba0a4 in start_thread > > #6 0x00007ffff74efc2d in clone > > > > Which points at memset overrunning the in memory buffer, as it is > > only 512 bytes in length. > > > > Signed-off-by: Dave Chinner > > --- > > The patch subject line should probably say 'xfsprogs:' or 'repair:,' > otherwise this looks good to me: Right, my mistake. > Reviewed-by: Brian Foster Thanks, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Wed Feb 25 00:41:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E525D7F3F for ; Wed, 25 Feb 2015 00:41:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C45D68F80D9 for ; Tue, 24 Feb 2015 22:41:13 -0800 (PST) X-ASG-Debug-ID: 1424846471-04cbb06110abed0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id amAvDfMFUTwOtxhA for ; Tue, 24 Feb 2015 22:41:11 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DzCADebe1UPDkjLHlbgwOBLIY2qhMBAQEBAgaMYo0GRAEBAQEBAQUBAQEBODuEPS87GGoDBy2ILqtYqR+GB4oXhBUFhWSUV4Vpg1YbiEaBZwELAYIwKjGCQwEBAQ Received: from ppp121-44-35-57.lns20.syd4.internode.on.net (HELO dastard) ([121.44.35.57]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Feb 2015 17:11:11 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1YQVeg-0005jO-Fr for xfs@oss.sgi.com; Wed, 25 Feb 2015 17:41:10 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1YQVeg-0001zY-Eb for xfs@oss.sgi.com; Wed, 25 Feb 2015 17:41:10 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: remove xfs_bmap_sanity_check() Date: Wed, 25 Feb 2015 17:41:10 +1100 X-ASG-Orig-Subj: [PATCH] xfs: remove xfs_bmap_sanity_check() Message-Id: <1424846470-7623-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1424846471 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This code is redundant now that we have verifiers that sanity check the buffers as they are read from disk. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 8ae3775..b872e9c 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -244,30 +244,6 @@ xfs_bmap_forkoff_reset( } } -/* - * Debug/sanity checking code - */ - -STATIC int -xfs_bmap_sanity_check( - struct xfs_mount *mp, - struct xfs_buf *bp, - int level) -{ - struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); - - if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && - block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) - return 0; - - if (be16_to_cpu(block->bb_level) != level || - be16_to_cpu(block->bb_numrecs) == 0 || - be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) - return 0; - - return 1; -} - #ifdef DEBUG STATIC struct xfs_buf * xfs_bmap_get_bp( @@ -410,9 +386,6 @@ xfs_bmap_check_leaf_extents( goto error_norelse; } block = XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO(mp, - xfs_bmap_sanity_check(mp, bp, level), - error0); if (level == 0) break; @@ -1312,8 +1285,6 @@ xfs_bmap_read_extents( if (error) return error; block = XFS_BUF_TO_BLOCK(bp); - XFS_WANT_CORRUPTED_GOTO(mp, - xfs_bmap_sanity_check(mp, bp, level), error0); if (level == 0) break; pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); @@ -1346,9 +1317,6 @@ xfs_bmap_read_extents( XFS_ERRLEVEL_LOW, ip->i_mount, block); goto error0; } - XFS_WANT_CORRUPTED_GOTO(mp, - xfs_bmap_sanity_check(mp, bp, 0), - error0); /* * Read-ahead the next leaf block, if any. */ -- 2.0.0 From deonnkabelo@mail.com Wed Feb 25 03:34:18 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B2A277F4E for ; Wed, 25 Feb 2015 03:34:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8ECFD8F8033 for ; Wed, 25 Feb 2015 01:34:15 -0800 (PST) X-ASG-Debug-ID: 1424856850-04cb6c4bd3a2000001-NocioJ Received: from mail.baroque-japan.jp (mail.baroque-japan.jp [203.137.42.40]) by cuda.sgi.com with ESMTP id Lk3VptKo1CgtBQt6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 01:34:13 -0800 (PST) X-Barracuda-Envelope-From: deonnkabelo@mail.com X-Barracuda-Apparent-Source-IP: 203.137.42.40 Received: from W2K8SERVER1 (rrcs-67-79-122-182.se.biz.rr.com [67.79.122.182]) (authenticated (0 bits)) by mail.baroque-japan.jp (8.14.3/8.11.3) with ESMTP id t1P8e0dE013548 for ; Wed, 25 Feb 2015 18:34:08 +0900 Message-Id: <201502250934.t1P8e0dE013548@mail.baroque-japan.jp> From: "Deon Kabelo" Subject: Sent: Wed 2/25/15 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Sent: Wed 2/25/15 Content-Type: multipart/alternative; boundary="ae3Z8wdIFMZC6ql5jDI=_4qqMwn6gAjHTu0" MIME-Version: 1.0 Reply-To: deonnkabelo@gmail.com Disposition-Notification-To: "Deon Kabelo" Date: Wed, 25 Feb 2015 03:34:06 -0600 X-Barracuda-Connect: mail.baroque-japan.jp[203.137.42.40] X-Barracuda-Start-Time: 1424856851 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15818 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0646 Custom rule MV0646 This is a multi-part message in MIME format --ae3Z8wdIFMZC6ql5jDI=_4qqMwn6gAjHTu0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable - This mail is in HTML. Some elements may be ommited in plain text. - Greetings I am Deon Kabelo An Accountant by Profession, however this corresponde= nt is private. I am a financial consultant to an investor from a Mine= ral-Rich Africa Country with political background who want to invest = outside his Country. As stated above, my client had approached me with a mandate to seek fo= r a firm or reputable well-established individual that has the experie= nce in investment management that can help him channel some funds int= o a profitable investment outside Africa, where he can get good yield = for his money . Due to the sensitive position he holds in his Country and the unstable= investment environment. My client has decided not to retain any of h= is assets in his country. Kindly let me know your acceptance to this o= ffer and furnish me with a comprehensive draft of your terms and condi= tion. Yours Sincerely Deon Kabelo --ae3Z8wdIFMZC6ql5jDI=_4qqMwn6gAjHTu0 Content-Type: text/html Content-Transfer-Encoding: quoted-printable

Greetings

I am Deon Kabelo An Accountant by Profession, however this correspo= ndent is  private. I am a financial consultant to an investor fro= m a Mineral-Rich Africa Country with political background who want to = invest  outside  his Country.


As stated above, my client had approached me with a mandate to = seek for a firm or reputable well-established individual that has the = experience in investment management that can  help him channel so= me funds into a profitable investment outside Africa, where he can get= good yield for his money .


Due to the sensitive position he holds in his Country and the u= nstable investment environment. My client has decided not to retain an= y of  his assets in his country. Kindly let me know your acceptan= ce to this offer and furnish me with a comprehensive draft of your ter= ms and condition.


Yours Sincerely

Deon Kabelo

 

--ae3Z8wdIFMZC6ql5jDI=_4qqMwn6gAjHTu0-- From jack@suse.cz Wed Feb 25 04:41:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 252767F51 for ; Wed, 25 Feb 2015 04:41:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13BE78F8068 for ; Wed, 25 Feb 2015 02:41:04 -0800 (PST) X-ASG-Debug-ID: 1424860862-04cb6c4bd1a3bf0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ZVBWKBCWIoApekhJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 02:41:03 -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 BD09EAB0C; Wed, 25 Feb 2015 10:41:01 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 0DDA68274F; Wed, 25 Feb 2015 11:40:58 +0100 (CET) Date: Wed, 25 Feb 2015 11:40:57 +0100 From: Jan Kara To: xfs@oss.sgi.com Cc: Al Viro , Jan Kara Subject: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file Message-ID: <20150225104057.GA22736@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file References: <1424188630-1111-1-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424188630-1111-1-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424860862 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15820 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Ping? Can you guys please review / pick-up the fix? Thanks! Honza On Tue 17-02-15 16:57:10, Jan Kara wrote: > For filesystems without separate project quota inode field in the > superblock we just reuse project quota file for group quotas (and vice > versa) if project quota file is allocated and we need group quota file. > When we reuse the file, quota structures on disk suddenly have wrong > type stored in d_flags though. Nobody really cares about this (although > structure type reported to userspace was wrong as well) except > that after commit 14bf61ffe6ac (quota: Switch ->get_dqblk() and > ->set_dqblk() to use bytes as space units) assertion in > xfs_qm_scall_getquota() started to trigger on xfs/106 test (apparently I > was testing without XFS_DEBUG so I didn't notice when submitting the > above commit). > > Fix the problem by properly resetting ddq->d_flags when running quotacheck > for a quota file. > > CC: stable@vger.kernel.org > Reported-by: Al Viro > Signed-off-by: Jan Kara > --- > fs/xfs/xfs_qm.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > index 3e8186279541..dd0dcc7b76cd 100644 > --- a/fs/xfs/xfs_qm.c > +++ b/fs/xfs/xfs_qm.c > @@ -836,6 +836,11 @@ xfs_qm_reset_dqcounts( > */ > xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, > "xfs_quotacheck"); > + /* > + * Reset type in case we are reusing group quota file for > + * project quotas or vice versa > + */ > + ddq->d_flags = type; > ddq->d_bcount = 0; > ddq->d_icount = 0; > ddq->d_rtbcount = 0; > -- > 2.1.4 > -- Jan Kara SUSE Labs, CR From eflorac@intellique.com Wed Feb 25 05:21:17 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8C707F51 for ; Wed, 25 Feb 2015 05:21:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88C0D8F8089 for ; Wed, 25 Feb 2015 03:21:14 -0800 (PST) X-ASG-Debug-ID: 1424863271-04cb6c4bd3a4da0001-NocioJ Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id E5Lzlx2deShdEXDB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 03:21:12 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.5 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp5-g21.free.fr (Postfix) with ESMTP id A8C38D48079; Wed, 25 Feb 2015 12:20:54 +0100 (CET) Date: Wed, 25 Feb 2015 12:21:13 +0100 From: Emmanuel Florac To: Dave Hall Cc: Dave Chinner , stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: XFS/LVM/Multipath on a single RAID volume Message-ID: <20150225122113.290abf22@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume In-Reply-To: <54ECF573.9050106@binghamton.edu> References: <5143F94C.1020708@hardwarefreak.com> <20130316072126.GG6369@dastard> <515082C3.2000006@binghamton.edu> <515361B5.8050603@hardwarefreak.com> <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> <20150223121812.5077ff07@harpe.intellique.com> <54ECF573.9050106@binghamton.edu> Organization: Intellique X-Mailer: Claws Mail 3.11.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: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1424863272 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15822 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Tue, 24 Feb 2015 17:04:35 -0500 Dave Hall =C3=A9crivait: > The new hardware is an Infortrend with 16 x 2TB 6Gbps SAS drives. It=20 > has one controller with dual 6Gbps SAS ports. The server currently > has two 3Gbps SAS HBAs. On my experience with these kinds of controllers, they perform quite poorly with more than 1 RAID-6 array. I'd go for a single RAID-6 array. Then as you said you'll have to do multipath LVM to create two LVs to stripe together to use both your HBAs and get some more performance. However with only 16 7k RPM drives you can't hope much more than 1.5 GByte/s, which is achievable with only one 3Gb SAS HBA... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Wed Feb 25 05:49:49 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C2F607F54 for ; Wed, 25 Feb 2015 05:49:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B170D304039 for ; Wed, 25 Feb 2015 03:49:46 -0800 (PST) X-ASG-Debug-ID: 1424864984-04cbb06110b52e0001-NocioJ Received: from smtp5-g21.free.fr (smtp5-g21.free.fr [212.27.42.5]) by cuda.sgi.com with ESMTP id NDg7ePjDZqAoLAwV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 03:49:45 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.5 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp5-g21.free.fr (Postfix) with ESMTP id 2B634D480BD; Wed, 25 Feb 2015 12:49:27 +0100 (CET) Date: Wed, 25 Feb 2015 12:49:46 +0100 From: Emmanuel Florac To: Dave Chinner Cc: Dave Hall , stan@hardwarefreak.com, "xfs@oss.sgi.com" Subject: Re: XFS/LVM/Multipath on a single RAID volume Message-ID: <20150225124946.1784b9ca@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS/LVM/Multipath on a single RAID volume In-Reply-To: <20150224223344.GE4251@dastard> References: <5155F2B2.1010308@binghamton.edu> <20130331012231.GJ6369@dastard> <515C3BF3.60601@binghamton.edu> <51684382.50008@binghamton.edu> <5168AC0B.5010100@hardwarefreak.com> <516C649A.8010003@binghamton.edu> <20130416161841.GB13938@destitution> <54EA67B7.30805@binghamton.edu> <20150223121812.5077ff07@harpe.intellique.com> <54ECF573.9050106@binghamton.edu> <20150224223344.GE4251@dastard> Organization: Intellique X-Mailer: Claws Mail 3.11.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: smtp5-g21.free.fr[212.27.42.5] X-Barracuda-Start-Time: 1424864984 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15823 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Wed, 25 Feb 2015 09:33:44 +1100 Dave Chinner =C3=A9crivait: > > On an existing array based on similar but slightly slower hardware, > > I'm getting miserable performance. The bottleneck seems to be on > > the server side. For specifics, the array is laid out as a single > > 26TB volume and attached by a single 3Gbps SAS. =20 >=20 > So, 300MB/s max throughput. >=20 Ah yes, maybe external RAID controllers can only use one SAS channel out of the 4 available, that would definitely limit performance badly. This limitation don't apply to internal RAID controllers (Adaptec, LSI, Areca) driving a JBOD though. I'll do a short digression on external storage enclosures: they're mostly useful to provide redundant controllers. If you're using only one controller, cheap ones (such as infortrend, Promise and the like) will always perform poorly compared to a modern PCIe RAID controller. High-end storage enclosures (DotHill, NetApp, etc) with high-bandwidth attachments (FC or IB) provide better performance AND redundancy, but at a hefty price. So if you want fast, cheap arrays, definitely use Adaptec/LSI/Areca and simple JBOD chassis like supermicro's. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From cmaiolino@redhat.com Wed Feb 25 06:05:52 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F0EA97F56 for ; Wed, 25 Feb 2015 06:05:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B0A038F80A1 for ; Wed, 25 Feb 2015 04:05:48 -0800 (PST) X-ASG-Debug-ID: 1424865946-04bdf05bffb70e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GlLExPay6jJDkRn0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 04:05:46 -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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1PC5jQU028980 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 25 Feb 2015 07:05:45 -0500 Received: from hades.maiolino.org (ovpn-112-35.phx2.redhat.com [10.3.112.35]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1PC5Yc6004351 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Wed, 25 Feb 2015 07:05:39 -0500 Date: Wed, 25 Feb 2015 09:05:33 -0300 From: Carlos Maiolino To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Message-ID: <20150225120533.GA3653@hades.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: add RENAME_WHITEOUT support Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com References: <1423653330-25297-1-git-send-email-david@fromorbit.com> <20150219043156.GQ12722@dastard> <20150225063907.GD18360@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150225063907.GD18360@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424865946 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello Dave. I agree with the idea of copy ext4 for now, and make it the right way later. However, I'd say that might be better to push overlay people to write down some documentation before we actually implement it, so we can have something to base the code on. Give me until the end of the week so I can test this patch and take a more deep look at the patch (considering overlay whiteout implementation), and also test it with overlay filesystem. On Wed, Feb 25, 2015 at 05:39:07PM +1100, Dave Chinner wrote: > ping^2? > > On Thu, Feb 19, 2015 at 03:31:56PM +1100, Dave Chinner wrote: > > ping? > > > > On Wed, Feb 11, 2015 at 10:15:30PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Add a basic implementation of RENAME_WHITEOUT to the XFS rename > > > code. The implementation options considered are documented in the > > > code comments; the method chose was "copy ext4" because we are then > > > bug-for-bug compatible with the implementation done by the > > > overlayfs developers. > > > > > > I have a hacky renameat2 test for whiteouts copied from the existing > > > renameat2 tests in xfstests, and this code behaves the same as ext4 > > > in that rename test. I haven't done any testing with overlayfs, so > > > who knows whether that explodes or not. > > > > > > The rename code is getting pretty spaghetti now - I'll end up > > > spliting this patching whiteout support and cleanup, and I'll set > > > what possible cleanups I can make that will help make the code a > > > little more understandable.... > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/xfs_inode.c | 261 +++++++++++++++++++++++++++++++++++++++++------------ > > > fs/xfs/xfs_iops.c | 2 +- > > > 2 files changed, 205 insertions(+), 58 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > > > index bf2d2c7..eef5db7 100644 > > > --- a/fs/xfs/xfs_inode.c > > > +++ b/fs/xfs/xfs_inode.c > > > @@ -2683,17 +2683,20 @@ xfs_remove( > > > */ > > > STATIC void > > > xfs_sort_for_rename( > > > - xfs_inode_t *dp1, /* in: old (source) directory inode */ > > > - xfs_inode_t *dp2, /* in: new (target) directory inode */ > > > - xfs_inode_t *ip1, /* in: inode of old entry */ > > > - xfs_inode_t *ip2, /* in: inode of new entry, if it > > > - already exists, NULL otherwise. */ > > > - xfs_inode_t **i_tab,/* out: array of inode returned, sorted */ > > > - int *num_inodes) /* out: number of inodes in array */ > > > + struct xfs_inode *dp1, /* in: old (source) directory inode */ > > > + struct xfs_inode *dp2, /* in: new (target) directory inode */ > > > + struct xfs_inode *ip1, /* in: inode of old entry */ > > > + struct xfs_inode *ip2, /* in: inode of new entry */ > > > + struct xfs_inode *wino, /* in: whiteout inode */ > > > + struct xfs_inode **i_tab,/* out: sorted array of inodes */ > > > + int *num_inodes) /* out: inodes in array */ > > > { > > > xfs_inode_t *temp; > > > int i, j; > > > > > > + ASSERT(*num_inodes == 5); > > > + memset(i_tab, 0, *num_inodes * sizeof(struct xfs_inode *)); > > > + > > > /* > > > * i_tab contains a list of pointers to inodes. We initialize > > > * the table here & we'll sort it. We will then use it to > > > @@ -2701,20 +2704,19 @@ xfs_sort_for_rename( > > > * > > > * Note that the table may contain duplicates. e.g., dp1 == dp2. > > > */ > > > - i_tab[0] = dp1; > > > - i_tab[1] = dp2; > > > - i_tab[2] = ip1; > > > - if (ip2) { > > > - *num_inodes = 4; > > > - i_tab[3] = ip2; > > > - } else { > > > - *num_inodes = 3; > > > - i_tab[3] = NULL; > > > - } > > > + i = 0; > > > + i_tab[i++] = dp1; > > > + i_tab[i++] = dp2; > > > + i_tab[i++] = ip1; > > > + if (ip2) > > > + i_tab[i++] = ip2; > > > + if (wino) > > > + i_tab[i++] = wino; > > > + *num_inodes = i; > > > > > > /* > > > * Sort the elements via bubble sort. (Remember, there are at > > > - * most 4 elements to sort, so this is adequate.) > > > + * most 5 elements to sort, so this is adequate.) > > > */ > > > for (i = 0; i < *num_inodes; i++) { > > > for (j = 1; j < *num_inodes; j++) { > > > @@ -2846,6 +2848,101 @@ out: > > > } > > > > > > /* > > > + * RENAME_WHITEOUT support. > > > + * > > > + * Whiteouts are used by overlayfs - it has a convention that a whiteout is a > > > + * character device inode with a major:minor of 0:0. Somebody has to be in an > > > + * altered state of mind to think this up, so whiteout inodes from this point at > > > + * called "wino"s. > > > + * > > > + * Now, because it's not documented anywhere, here's what RENAME_WHITEOUT does > > > + * on ext4: > > > + > > > +# echo bar > /mnt/scratch/bar > > > +# ls -l /mnt/scratch > > > +total 24 > > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 foo > > > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > > > +# src/renameat2 -w /mnt/scratch/foo /mnt/scratch/bar > > > +# ls -l /mnt/scratch > > > +total 20 > > > +-rw-r--r-- 1 root root 4 Feb 11 20:22 bar > > > +c--------- 1 root root 0, 0 Feb 11 20:23 foo > > > +drwx------ 2 root root 16384 Feb 11 20:18 lost+found > > > +# cat /mnt/scratch/bar > > > +foo > > > +# > > > + > > > + * In XFS rename terms, the operation that has been done is that source (foo) > > > + * has been moved to the target (bar), which is like a nomal rename operation, > > > + * but rather than the source being removed, it have been replaced with a wino. > > > + * > > > + * We can't allocate winos within the rename transaction due to allocation > > > + * being a multi-commit transaction, and rename needs to be a single, atomic > > > + * commit. Hence we have several options here, form most efficient to least > > > + * efficient: > > > + * > > > + * - use DT_WHT in the target dirent and do no wino allocation. > > > + * The main issue with this approach is that we need hooks in > > > + * lookup to create a virtual chardev inode to present to userspace > > > + * and in places where we might need to modify the dirent e.g. unlink. > > > + * Overlayfs also needs to be taught about DT_WHT. Most invasive change, > > > + * lowest overhead. > > > + * > > > + * - create a special wino in the root directory (e.g. a ".wino" dirent and > > > + * then hardlink every new whiteout to it. This means we only need to > > > + * create a single wino, and rename simply creates a hardlink to it. We > > > + * can use DT_WHT for these, though using DT_CHR means we won't have to > > > + * modify overlayfs, nor anything in userspace. Downside is we have to > > > + * look up the wino up on every operation and create it if it doesn't > > > + * exist. > > > + * > > > + * - copy ext4: create a special whiteout chardev inode for every whiteout. > > > + * This is more complex than the above options because of the lack of > > > + * atomicity between inode creation and the rename operation, requiring > > > + * us to create a tmpfile inode and then linking it into the directory > > > + * structure during the rename. At least with a tmpfile inode crashes > > > + * between the create and rename doesn't leave unreferenced inodes or > > > + * directory pollution around. > > > + * > > > + * By far the simplest thing to do is copy ext4. It's also the most > > > + * inefficient way of supporting whiteouts, but as an initial implementation we > > > + * can simply reuse existing functions and add a small amount of extra code the > > > + * the rename operation to handle the *fifth* inode in the transaction. > > > + * > > > + * Hence that is what is implemented first. When we have time or need we can > > > + * come back and implement one of the more efficient whiteout methods, but it's > > > + * not necessary for the first implementation. > > > + */ > > > + > > > +/* > > > + * xfs_rename_get_wino() > > > + * > > > + * Return a referenced, unlinked, unlocked inode that that can be used as a > > > + * whiteout in a rename transaction. > > > + */ > > > +static int > > > +xfs_rename_get_wino( > > > + struct xfs_inode *dp, > > > + struct xfs_inode **wino) > > > +{ > > > + struct xfs_inode *tmpfile; > > > + int error; > > > + > > > + error = xfs_create_tmpfile(dp, NULL, S_IFCHR | WHITEOUT_MODE, &tmpfile); > > > + if (error) > > > + return error; > > > + > > > + /* Satisfy xfs_bumplink that this is a real tmpfile */ > > > + xfs_finish_inode_setup(tmpfile); > > > + VFS_I(tmpfile)->i_state |= I_LINKABLE; > > > + > > > + *wino = tmpfile; > > > + return 0; > > > +} > > > + > > > +/* > > > * xfs_rename > > > */ > > > int > > > @@ -2867,40 +2964,52 @@ xfs_rename( > > > xfs_fsblock_t first_block; > > > int cancel_flags; > > > int committed; > > > - xfs_inode_t *inodes[4]; > > > + xfs_inode_t *inodes[5]; > > > + int num_inodes = 5; > > > int spaceres; > > > - int num_inodes; > > > + struct xfs_inode *wino = NULL; > > > > > > trace_xfs_rename(src_dp, target_dp, src_name, target_name); > > > > > > + /* > > > + * If we are doing a whiteout operation, get us the wino we will be > > > + * placing at the target. > > > + */ > > > + if (flags & RENAME_WHITEOUT) { > > > + ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE))); > > > + error = xfs_rename_get_wino(target_dp, &wino); > > > + if (error) > > > + return error; > > > + > > > + /* setup target dirent info as whiteout */ > > > + src_name->type = XFS_DIR3_FT_CHRDEV; > > > + } > > > + > > > new_parent = (src_dp != target_dp); > > > src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > > > > > > - xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, > > > + xfs_sort_for_rename(src_dp, target_dp, src_ip, target_ip, wino, > > > inodes, &num_inodes); > > > > > > + cancel_flags = 0; > > > xfs_bmap_init(&free_list, &first_block); > > > tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME); > > > - cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > > > if (error == -ENOSPC) { > > > spaceres = 0; > > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > > > } > > > - if (error) { > > > - xfs_trans_cancel(tp, 0); > > > - goto std_return; > > > - } > > > + if (error) > > > + goto error_trans_cancel; > > > + cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > > > > > /* > > > * Attach the dquots to the inodes > > > */ > > > error = xfs_qm_vop_rename_dqattach(inodes); > > > - if (error) { > > > - xfs_trans_cancel(tp, cancel_flags); > > > - goto std_return; > > > - } > > > + if (error) > > > + goto error_trans_cancel; > > > > > > /* > > > * Lock all the participating inodes. Depending upon whether > > > @@ -2921,6 +3030,8 @@ xfs_rename( > > > xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); > > > if (target_ip) > > > xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); > > > + if (wino) > > > + xfs_trans_ijoin(tp, wino, XFS_ILOCK_EXCL); > > > > > > /* > > > * If we are using project inheritance, we only allow renames > > > @@ -2930,18 +3041,19 @@ xfs_rename( > > > if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && > > > (xfs_get_projid(target_dp) != xfs_get_projid(src_ip)))) { > > > error = -EXDEV; > > > - goto error_return; > > > + goto error_trans_cancel; > > > } > > > > > > /* > > > * Handle RENAME_EXCHANGE flags > > > */ > > > if (flags & RENAME_EXCHANGE) { > > > + ASSERT(!wino); > > > error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > > > target_dp, target_name, target_ip, > > > &free_list, &first_block, spaceres); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > goto finish_rename; > > > } > > > > > > @@ -2956,7 +3068,7 @@ xfs_rename( > > > if (!spaceres) { > > > error = xfs_dir_canenter(tp, target_dp, target_name); > > > if (error) > > > - goto error_return; > > > + goto error_trans_cancel; > > > } > > > /* > > > * If target does not exist and the rename crosses > > > @@ -2967,9 +3079,9 @@ xfs_rename( > > > src_ip->i_ino, &first_block, > > > &free_list, spaceres); > > > if (error == -ENOSPC) > > > - goto error_return; > > > + goto error_trans_cancel; > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > > > > xfs_trans_ichgtime(tp, target_dp, > > > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > > @@ -2977,7 +3089,7 @@ xfs_rename( > > > if (new_parent && src_is_directory) { > > > error = xfs_bumplink(tp, target_dp); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > } > > > } else { /* target_ip != NULL */ > > > /* > > > @@ -2992,7 +3104,7 @@ xfs_rename( > > > if (!(xfs_dir_isempty(target_ip)) || > > > (target_ip->i_d.di_nlink > 2)) { > > > error = -EEXIST; > > > - goto error_return; > > > + goto error_trans_cancel; > > > } > > > } > > > > > > @@ -3009,7 +3121,7 @@ xfs_rename( > > > src_ip->i_ino, > > > &first_block, &free_list, spaceres); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > > > > xfs_trans_ichgtime(tp, target_dp, > > > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > > @@ -3020,7 +3132,7 @@ xfs_rename( > > > */ > > > error = xfs_droplink(tp, target_ip); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > > > > if (src_is_directory) { > > > /* > > > @@ -3028,9 +3140,9 @@ xfs_rename( > > > */ > > > error = xfs_droplink(tp, target_ip); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > } > > > - } /* target_ip != NULL */ > > > + } > > > > > > /* > > > * Remove the source. > > > @@ -3045,7 +3157,7 @@ xfs_rename( > > > &first_block, &free_list, spaceres); > > > ASSERT(error != -EEXIST); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > } > > > > > > /* > > > @@ -3071,13 +3183,21 @@ xfs_rename( > > > */ > > > error = xfs_droplink(tp, src_dp); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > } > > > > > > - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > > > + /* > > > + * On a whiteout, we only update the source dirent with the wino, > > > + * otherwise we are removing it. > > > + */ > > > + if (wino) { > > > + error = xfs_dir_replace(tp, src_dp, src_name, wino->i_ino, > > > + &first_block, &free_list, spaceres); > > > + } else > > > + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > > > &first_block, &free_list, spaceres); > > > if (error) > > > - goto abort_return; > > > + goto error_trans_abort; > > > > > > xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > > xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > > > @@ -3090,31 +3210,58 @@ finish_rename: > > > * rename transaction goes to disk before returning to > > > * the user. > > > */ > > > - if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) { > > > + if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > > > xfs_trans_set_sync(tp); > > > - } > > > > > > error = xfs_bmap_finish(&tp, &free_list, &committed); > > > - if (error) { > > > - xfs_bmap_cancel(&free_list); > > > - xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | > > > - XFS_TRANS_ABORT)); > > > - goto std_return; > > > + if (error) > > > + goto error_trans_abort; > > > + > > > + /* > > > + * Last thing we do is bump the link count on the wino. This means that > > > + * failures all the way up to this point leave the wino on the unlinked > > > + * list and so cleanup is a simple matter of dropping the remaining > > > + * reference to it. If we fail here after bumping the link count, we're > > > + * shutting down the filesystem so we'll never see the intermediate > > > + * state on disk. > > > + */ > > > + if (wino) { > > > + ASSERT(wino->i_d.di_nlink == 0); > > > + error = xfs_bumplink(tp, wino); > > > + if (error) > > > + goto error_trans_abort; > > > + error = xfs_iunlink_remove(tp, wino); > > > + if (error) > > > + goto error_trans_abort; > > > + xfs_trans_log_inode(tp, wino, XFS_ILOG_CORE); > > > + > > > + /* > > > + * now we have a real link, clear the "I'm a tmpfile" state > > > + * flag from the inode so it doesn't accidentally get misused in > > > + * future. > > > + */ > > > + VFS_I(wino)->i_state &= ~I_LINKABLE; > > > } > > > > > > /* > > > * trans_commit will unlock src_ip, target_ip & decrement > > > * the vnode references. > > > */ > > > - return xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > > > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > > > +out_release_wino: > > > + if (wino) > > > + IRELE(wino); > > > + return error; > > > > > > - abort_return: > > > + > > > +error_trans_abort: > > > cancel_flags |= XFS_TRANS_ABORT; > > > - error_return: > > > xfs_bmap_cancel(&free_list); > > > +error_trans_cancel: > > > xfs_trans_cancel(tp, cancel_flags); > > > - std_return: > > > - return error; > > > + > > > + /* Dropping the last reference on a tmpfile does the cleanup for us! */ > > > + goto out_release_wino; > > > } > > > > > > STATIC int > > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > > > index 6a77ea9..d4442d1 100644 > > > --- a/fs/xfs/xfs_iops.c > > > +++ b/fs/xfs/xfs_iops.c > > > @@ -393,7 +393,7 @@ xfs_vn_rename( > > > struct xfs_name oname; > > > struct xfs_name nname; > > > > > > - if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > > > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) > > > return -EINVAL; > > > > > > /* if we are exchanging files, we need to set i_mode of both files */ > > > -- > > > 2.0.0 > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > > > > > -- > > Dave Chinner > > david@fromorbit.com > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From bfoster@redhat.com Wed Feb 25 06:45:36 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CFC6D7F51 for ; Wed, 25 Feb 2015 06:45:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4F81EAC002 for ; Wed, 25 Feb 2015 04:45:32 -0800 (PST) X-ASG-Debug-ID: 1424868327-04cbb0610eb71d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IhisG7NXh1bOIzr4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 04:45:27 -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 (8.14.4/8.14.4) with ESMTP id t1PCjQRj003936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 25 Feb 2015 07:45:26 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1PCjQHw012978; Wed, 25 Feb 2015 07:45:26 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B87F7121479; Wed, 25 Feb 2015 07:45:25 -0500 (EST) Date: Wed, 25 Feb 2015 07:45:25 -0500 From: Brian Foster To: Jan Kara Cc: xfs@oss.sgi.com, Al Viro Subject: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file Message-ID: <20150225124525.GA28053@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file References: <1424188630-1111-1-git-send-email-jack@suse.cz> <20150225104057.GA22736@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150225104057.GA22736@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424868327 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 25, 2015 at 11:40:57AM +0100, Jan Kara wrote: > Ping? Can you guys please review / pick-up the fix? Thanks! > Looks like this is in Dave's tree: commit dfcc70a8c868fe03276fa59864149708fb41930b Author: Jan Kara Date: Mon Feb 23 22:34:17 2015 +1100 xfs: Fix quota type in quota structures when reusing quota file ... Brian > Honza > > On Tue 17-02-15 16:57:10, Jan Kara wrote: > > For filesystems without separate project quota inode field in the > > superblock we just reuse project quota file for group quotas (and vice > > versa) if project quota file is allocated and we need group quota file. > > When we reuse the file, quota structures on disk suddenly have wrong > > type stored in d_flags though. Nobody really cares about this (although > > structure type reported to userspace was wrong as well) except > > that after commit 14bf61ffe6ac (quota: Switch ->get_dqblk() and > > ->set_dqblk() to use bytes as space units) assertion in > > xfs_qm_scall_getquota() started to trigger on xfs/106 test (apparently I > > was testing without XFS_DEBUG so I didn't notice when submitting the > > above commit). > > > > Fix the problem by properly resetting ddq->d_flags when running quotacheck > > for a quota file. > > > > CC: stable@vger.kernel.org > > Reported-by: Al Viro > > Signed-off-by: Jan Kara > > --- > > fs/xfs/xfs_qm.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > > index 3e8186279541..dd0dcc7b76cd 100644 > > --- a/fs/xfs/xfs_qm.c > > +++ b/fs/xfs/xfs_qm.c > > @@ -836,6 +836,11 @@ xfs_qm_reset_dqcounts( > > */ > > xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, > > "xfs_quotacheck"); > > + /* > > + * Reset type in case we are reusing group quota file for > > + * project quotas or vice versa > > + */ > > + ddq->d_flags = type; > > ddq->d_bcount = 0; > > ddq->d_icount = 0; > > ddq->d_rtbcount = 0; > > -- > > 2.1.4 > > > -- > Jan Kara > SUSE Labs, CR > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Feb 25 06:45:37 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F82B7F51 for ; Wed, 25 Feb 2015 06:45:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id ECEFCAC003 for ; Wed, 25 Feb 2015 04:45:36 -0800 (PST) X-ASG-Debug-ID: 1424868334-04cbb06110b71e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ABqHtzdA6HtrNO3G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 04:45:35 -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 (8.14.4/8.14.4) with ESMTP id t1PCjVS4010772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 25 Feb 2015 07:45:32 -0500 Received: from bfoster.bfoster (dhcp-41-237.bos.redhat.com [10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1PCjVvq024521; Wed, 25 Feb 2015 07:45:31 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AD402121479; Wed, 25 Feb 2015 07:45:30 -0500 (EST) Date: Wed, 25 Feb 2015 07:45:30 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove xfs_bmap_sanity_check() Message-ID: <20150225124530.GB28053@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove xfs_bmap_sanity_check() References: <1424846470-7623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424846470-7623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424868335 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Feb 25, 2015 at 05:41:10PM +1100, Dave Chinner wrote: > From: Dave Chinner > > This code is redundant now that we have verifiers that sanity check > the buffers as they are read from disk. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_bmap.c | 32 -------------------------------- > 1 file changed, 32 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 8ae3775..b872e9c 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -244,30 +244,6 @@ xfs_bmap_forkoff_reset( > } > } > > -/* > - * Debug/sanity checking code > - */ > - > -STATIC int > -xfs_bmap_sanity_check( > - struct xfs_mount *mp, > - struct xfs_buf *bp, > - int level) > -{ > - struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); > - > - if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && > - block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) > - return 0; > - > - if (be16_to_cpu(block->bb_level) != level || > - be16_to_cpu(block->bb_numrecs) == 0 || > - be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) > - return 0; > - > - return 1; > -} > - > #ifdef DEBUG > STATIC struct xfs_buf * > xfs_bmap_get_bp( > @@ -410,9 +386,6 @@ xfs_bmap_check_leaf_extents( > goto error_norelse; > } > block = XFS_BUF_TO_BLOCK(bp); > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, level), > - error0); > if (level == 0) > break; > > @@ -1312,8 +1285,6 @@ xfs_bmap_read_extents( > if (error) > return error; > block = XFS_BUF_TO_BLOCK(bp); > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, level), error0); > if (level == 0) > break; > pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); > @@ -1346,9 +1317,6 @@ xfs_bmap_read_extents( > XFS_ERRLEVEL_LOW, ip->i_mount, block); > goto error0; > } > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, 0), > - error0); > /* > * Read-ahead the next leaf block, if any. > */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Wed Feb 25 06:57:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E82527F5E for ; Wed, 25 Feb 2015 06:57:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92A30AC003 for ; Wed, 25 Feb 2015 04:57:58 -0800 (PST) X-ASG-Debug-ID: 1424869076-04bdf05c00b8b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ce3FZYgaOYlIedf6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 04:57:57 -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-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1PCvtWU008380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 25 Feb 2015 07:57:55 -0500 Received: from hades.maiolino.org (ovpn-112-35.phx2.redhat.com [10.3.112.35]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1PCvlMi000697 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Wed, 25 Feb 2015 07:57:53 -0500 Date: Wed, 25 Feb 2015 09:57:46 -0300 From: Carlos Maiolino To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: remove xfs_bmap_sanity_check() Message-ID: <20150225125746.GB3653@hades.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove xfs_bmap_sanity_check() Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com References: <1424846470-7623-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1424846470-7623-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1424869077 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Looks good to me, consider adding: Reviewed-by: Carlos Maiolino On Wed, Feb 25, 2015 at 05:41:10PM +1100, Dave Chinner wrote: > From: Dave Chinner > > This code is redundant now that we have verifiers that sanity check > the buffers as they are read from disk. > > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_bmap.c | 32 -------------------------------- > 1 file changed, 32 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 8ae3775..b872e9c 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -244,30 +244,6 @@ xfs_bmap_forkoff_reset( > } > } > > -/* > - * Debug/sanity checking code > - */ > - > -STATIC int > -xfs_bmap_sanity_check( > - struct xfs_mount *mp, > - struct xfs_buf *bp, > - int level) > -{ > - struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); > - > - if (block->bb_magic != cpu_to_be32(XFS_BMAP_CRC_MAGIC) && > - block->bb_magic != cpu_to_be32(XFS_BMAP_MAGIC)) > - return 0; > - > - if (be16_to_cpu(block->bb_level) != level || > - be16_to_cpu(block->bb_numrecs) == 0 || > - be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) > - return 0; > - > - return 1; > -} > - > #ifdef DEBUG > STATIC struct xfs_buf * > xfs_bmap_get_bp( > @@ -410,9 +386,6 @@ xfs_bmap_check_leaf_extents( > goto error_norelse; > } > block = XFS_BUF_TO_BLOCK(bp); > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, level), > - error0); > if (level == 0) > break; > > @@ -1312,8 +1285,6 @@ xfs_bmap_read_extents( > if (error) > return error; > block = XFS_BUF_TO_BLOCK(bp); > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, level), error0); > if (level == 0) > break; > pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); > @@ -1346,9 +1317,6 @@ xfs_bmap_read_extents( > XFS_ERRLEVEL_LOW, ip->i_mount, block); > goto error0; > } > - XFS_WANT_CORRUPTED_GOTO(mp, > - xfs_bmap_sanity_check(mp, bp, 0), > - error0); > /* > * Read-ahead the next leaf block, if any. > */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From jack@suse.cz Wed Feb 25 08:17:26 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF2387F51 for ; Wed, 25 Feb 2015 08:17:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A02C38F80C0 for ; Wed, 25 Feb 2015 06:17:23 -0800 (PST) X-ASG-Debug-ID: 1424873840-04bdf05c00bbac0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ORm4gUh5xiEufpQ2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Feb 2015 06:17:21 -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 BCDBDABA2; Wed, 25 Feb 2015 14:17:19 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id F31C38274F; Wed, 25 Feb 2015 15:17:15 +0100 (CET) Date: Wed, 25 Feb 2015 15:17:15 +0100 From: Jan Kara To: Brian Foster Cc: Jan Kara , xfs@oss.sgi.com, Al Viro Subject: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file Message-ID: <20150225141715.GB22736@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: Fix quota type in quota structures when reusing quota file References: <1424188630-1111-1-git-send-email-jack@suse.cz> <20150225104057.GA22736@quack.suse.cz> <20150225124525.GA28053@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150225124525.GA28053@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1424873840 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15827 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 25-02-15 07:45:25, Brian Foster wrote: > On Wed, Feb 25, 2015 at 11:40:57AM +0100, Jan Kara wrote: > > Ping? Can you guys please review / pick-up the fix? Thanks! > > > > Looks like this is in Dave's tree: > > commit dfcc70a8c868fe03276fa59864149708fb41930b > Author: Jan Kara > Date: Mon Feb 23 22:34:17 2015 +1100 > > xfs: Fix quota type in quota structures when reusing quota file Ah, sorry. I should have checked. Honza > > On Tue 17-02-15 16:57:10, Jan Kara wrote: > > > For filesystems without separate project quota inode field in the > > > superblock we just reuse project quota file for group quotas (and vice > > > versa) if project quota file is allocated and we need group quota file. > > > When we reuse the file, quota structures on disk suddenly have wrong > > > type stored in d_flags though. Nobody really cares about this (although > > > structure type reported to userspace was wrong as well) except > > > that after commit 14bf61ffe6ac (quota: Switch ->get_dqblk() and > > > ->set_dqblk() to use bytes as space units) assertion in > > > xfs_qm_scall_getquota() started to trigger on xfs/106 test (apparently I > > > was testing without XFS_DEBUG so I didn't notice when submitting the > > > above commit). > > > > > > Fix the problem by properly resetting ddq->d_flags when running quotacheck > > > for a quota file. > > > > > > CC: stable@vger.kernel.org > > > Reported-by: Al Viro > > > Signed-off-by: Jan Kara > > > --- > > > fs/xfs/xfs_qm.c | 5 +++++ > > > 1 file changed, 5 insertions(+) > > > > > > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > > > index 3e8186279541..dd0dcc7b76cd 100644 > > > --- a/fs/xfs/xfs_qm.c > > > +++ b/fs/xfs/xfs_qm.c > > > @@ -836,6 +836,11 @@ xfs_qm_reset_dqcounts( > > > */ > > > xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, > > > "xfs_quotacheck"); > > > + /* > > > + * Reset type in case we are reusing group quota file for > > > + * project quotas or vice versa > > > + */ > > > + ddq->d_flags = type; > > > ddq->d_bcount = 0; > > > ddq->d_icount = 0; > > > ddq->d_rtbcount = 0; > > > -- > > > 2.1.4 > > > > > -- > > Jan Kara > > SUSE Labs, CR > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs -- Jan Kara SUSE Labs, CR From adrscube@gmail.com Wed Feb 25 09:23:41 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 E3BCB7F55 for ; Wed, 25 Feb 2015 09:23:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A4D228F80CE for ; Wed, 25 Feb 2015 07:23:41 -0800 (PST) X-ASG-Debug-ID: 1424877819-04bdf05bffbef60001-NocioJ Received: from mail-pa0-f54.google.com (mail-pa0-f54.google.com [209.85.220.54]) by cuda.sgi.com with ESMTP id BFGLWnnImYCyvuFJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 25 Feb 2015 07:23:39 -0800 (PST) X-Barracuda-Envelope-From: adrscube@gmail.com Received: by paceu11 with SMTP id eu11so5912606pac.10 for ; Wed, 25 Feb 2015 07:23:39 -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 :content-type; bh=KncqOprWA4ugC0B6g+OJqoTsrwTsWfMB7GpSmYfgphc=; b=gejJdCTiiIgBz+L7OZYsNf6j77tZHSqR5R1wKrhp4GAYpT4OcjO9ic2+rO9zaHnxXr jhtyjPHI3Uy68VQXqQCkOLokXjiXZG2NrFoPxnXFslpsgMWmKa0X3rYNw37nBniI7UDi fKHa82tK20pgNtpZvta7ww0UIeuRIwKfDfd5PBfLo0aF5KhOqV2fCuId1cRR0VN23cMF 11ahjPuTI0YGBaghYABh9sXcDdpGNwgZ5BBVmnkHNdf/eE8BOPI6nMoliJRJzFx8SJNF v18kBlZ0rR2tZOOcWlyfsoqFLPfO0NDUV+SkCkKpcFt1shN5PbOo0m5BQ8C8OOKj3kZu uadw== MIME-Version: 1.0 X-Received: by 10.68.233.232 with SMTP id tz8mr6198613pbc.166.1424877819138; Wed, 25 Feb 2015 07:23:39 -0800 (PST) Received: by 10.70.7.165 with HTTP; Wed, 25 Feb 2015 07:23:39 -0800 (PST) In-Reply-To: <20150216234838.GC4251@dastard> References: <20150216234838.GC4251@dastard> Date: Wed, 25 Feb 2015 20:53:39 +0530 Message-ID: Subject: Re: [RFD] : Allowing xfs_fsr to defragment portions of a file From: Dhruvesh Rathore X-ASG-Orig-Subj: Re: [RFD] : Allowing xfs_fsr to defragment portions of a file To: xfs@oss.sgi.com, Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f54.google.com[209.85.220.54] X-Barracuda-Start-Time: 1424877819 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15830 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, Feb 17, 2015 at 5:18 AM, Dave Chinner wrote: > On Sun, Feb 15, 2015 at 08:08:46PM +0530, Dhruvesh Rathore wrote: >> A new function will have to hence focus on swapping the existing >> extents from the >> fragmented file. For this a new_swap_extent() function will be needed, >> which will take arguments >> as the current extent and the location(in free space) where it needs >> to be swapped to. > > You can't swap an in use extent with a free space location. You need > to preallocate space in a temporary file, copy the data across to > it, and then swap the extent ranges between the two files. > >> For the above functionality Dave suggested that we have a look at >> EXT4_IOC_MOVE_EXT >> and its usage. > > The extent swap between two files is exactly what that ioctl does. > Look at the API, especially the struct move_extent that defines the > information passed to the kernel to perform the extent swap > operation. The XFS APi will be similar. > Over the past few days we have been going over the XFS API for EXT4_IOC_MOVE_EXT available in misc/e4defrag.c, to lay down the groundwork of the required XFS API. ----- These are a few things that we felt do not be changed in the new API: 1) The original file will be opened in fsrfile() in xfs_fsr.c, similar to the original file being opened in file_defrag() in e4defrag.c 2) The check for sufficient freespace done in fsrfile_common() in xfs_fsr.c achieves the same objective as the check_freesize() in e4defrag.c ----- On the same lines, we have identified the following additions that will be needed in the XFS API for fsr/xfs_fsr.c 1) The read_fd_bmap() function in xfs_fsr.c which gets the block map of range of original file (map) and the defragmented file (outmap), will need to be added to when we are performing partial defragmentation. A function get_file_extents() is called in e4defrag.c twice, which populates a struct fiemap, struct fiemap_extent and struct fiemap_extent_list for both original file and donor file (temp file). The operation of this function will need to be added in xfs_fsr.c as the EXT4_IOC_MOVE_EXT ioctl primarily uses these fiemap structures. We will need both the fiemap structures and the existing part of read_fd_bmap( ) in this new XFS API. 2) The temp file getting created in xfs_fsr.c, will be made similar to the donor file of e4defrag.c. We were a bit unsure about the function of join_extents() in e4defrag.c, which finds a continuous region (extents group), and how it will fit in the XFS API. Is it similar to the process of preallocating extents[toff, tlen] in temp file ? 3) Now instead of copying data from [orig, off, len] to [temp, toff, tlen] and then calling XFS_IOC_SWPEXT, we will need to simulate the ioctl EXT4_IOC_MOVE_EXT. In call_defrag( ) in e4defrag.c, the struct fiemap_extent_list structure, which is basically a link list of extent information is used. In our XFS API we will similarly use this structure in a loop and call the IOCTL for each of the extents (off donor file) which need to be filled by swapping data blocks. In this loop the fields orig_start, donor_start, len and moved_len of struct move_extent will be populated from the fiemap_extent_list structure before each ioctl call. ----- Before all of the above we will need to select the extents that can be defragmented i.e the best possible choice, and then mark them. For this we decided to create another data structure - an array (user_array[ ]), which will store extent size information (blocks). For instance say a file has 5 extents then user_array[0] : save size of extent 1 user_array[1] : save size of extents 1, 2 user_array[2] : save size of extents 1, 2, 3 user_array[3] : save size of extents 1, 2, 3, 4 user_array[4] : save size of extents 1, 2 3, 4, 5 This way we could perform the selection efficiently, by necessary comparison with available space. ---- We would love to hear your comments or directions on the above points. After confirmation from you, we will finish creating the XFS API on the above lines. > The process in fsr is this: > > 1. bulkstat original file inode [bstat] for change > detection whilst doing copying operation. > 2. get block map of range [off, len] of orignal file > that needs to be swapped > 3. create temp file > 4. preallocate extent [toff, tlen] in temp file > 5. check the number of extents in [toff, tlen] is less than > the number of extents in [off, len] in the original file. > If it's not an improvement, abort. > 6. copy data from [orig, off, len] to [temp, toff, tlen] > 7. ioctl(orig_fd, XFS_IOC_SWAPEXT_RANGE, [bstat, off, len, temp, toff]) > > The kernel side of the ioctl is somewhat more complex, and we'll get > to that once the fsr infrastructure is ready to use it. > > Cheers, > > Dave. Regards, A-DRS From Fred@aluminumcan.com Wed Feb 25 21:19:59 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8AE1A7F47 for ; Wed, 25 Feb 2015 21:19:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 479148F8040 for ; Wed, 25 Feb 2015 19:19:56 -0800 (PST) X-ASG-Debug-ID: 1424920787-04bdf05c01d7d40001-NocioJ Received: from aluminumbottle.com (li415-235.members.linode.com [106.187.95.235]) by cuda.sgi.com with SMTP id yPJxMOiz1a2IJAGN for ; Wed, 25 Feb 2015 19:19:48 -0800 (PST) X-Barracuda-Envelope-From: Fred@aluminumcan.com X-Barracuda-Apparent-Source-IP: 106.187.95.235 Received: from Sc-201501041324[127.0.0.1] by SC-201501041324[127.0.0.1] (SMTPD32); Thu, 26 Feb 2015 09:39:48 +0800 From: "Fred@aluminumcan.com" Subject: Air freshener aerosol can To: "xfs" X-ASG-Orig-Subj: Air freshener aerosol can MIME-Version: 1.0 Sender: Fred@aluminumcan.com Reply-To: 1735725526@qq.com Date: Thu, 26 Feb 2015 09:39:48 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: li415-235.members.linode.com[106.187.95.235] X-Barracuda-Start-Time: 1424920787 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.34 X-Barracuda-Spam-Status: No, SCORE=2.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0141, BSF_SC0_SA038b, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC0_MV0141 Custom rule MV0141 0.20 BSF_SC0_SA038b Custom Rule SA038b Message-Id: <20150226031955.AED54A42183@cuda.sgi.com>

 Hi,

Do you want your product standing out from the supermarkets shelves ? Make it different now!To be the best SELLER!

Aluminum bottle is recyclable,lighter than other material,unbreakable!

If you have interests in aluminum bottle,pls contact me freely,we can send you catalogue.

Best regards,

Hellen

Skype: hellen03223

Nanchang Ever Bright industrial trade co, ltd

From i@ipartsbuy.com Thu Feb 26 01:32:38 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 949C97F47 for ; Thu, 26 Feb 2015 01:32:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 812E930405F for ; Wed, 25 Feb 2015 23:32:35 -0800 (PST) X-ASG-Debug-ID: 1424935934-04cbb0610fee0b0001-NocioJ Received: from email.sunsky-online.com ([211.154.145.8]) by cuda.sgi.com with SMTP id gwfTDgUAxnI8Gu4G for ; Wed, 25 Feb 2015 23:32:16 -0800 (PST) X-Barracuda-Envelope-From: i@ipartsbuy.com X-Barracuda-Apparent-Source-IP: 211.154.145.8 Received: from okserver-137231 ([127.0.0.1]) (envelope-sender ) by 127.0.0.1 with ESMTP for ; Thu, 26 Feb 2015 15:32:07 +0800 Message-ID: <9257765.1424935927888.JavaMail.Administrator@okserver-137231> Date: Thu, 26 Feb 2015 15:32:07 +0800 (CST) From: iPartsBuy To: xfs@oss.sgi.com Subject: New Arrivals For Spare Parts MIME-Version: 1.0 X-ASG-Orig-Subj: New Arrivals For Spare Parts Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: UNKNOWN[211.154.145.8] X-Barracuda-Start-Time: 1424935935 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15866 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 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 =09 =09New Arrivals For Spare Parts =09 =09 =20 =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=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=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 =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 =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 =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=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 =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 =09 =09=09 =09 =09 =09=09 =09
=09=09=09 =09=09=09=09Thanks for visiting
=09=09=09=09If you do not wish to receive any more emails, =09=09=09=09unsubscri= be here. =09=09=09
=09=09=09 Can't see images?=20 =09=09=09=09click here =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=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=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=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09English =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=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=09 =09=09=09=09=09=09=09= =09 =09=09=09=09=09=09=09 =09=09=09=09=09=09
=20 =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 = =09=09 =09=09=09iPhone LCD =09=09=09=09   |   = =09=09 =09 = =09=09 =09=09=09iPhone Spare Parts =09=09=09=09   |   = =09=09 =09 = =09=09 =09=09=09iPad Spare Parts =09=09=09=09   |   = =09=09 =09 = =09=09 =09=09=09Galaxy Spare Parts =09=09=09=09   |   = =09=09 =09 = =09=09 =09=09=09More Brand Parts =09=09=09=09   |   = =09=09 =09 = =09=09 =09=09=09Bac= k Cover =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 =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=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=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=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09Repair Tools =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09Thin Pry Blade Opening Repair Tool for Smart Phone =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$1.14 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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=3D"8 =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=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=09=09=09=09=09=09=09=09=09= =098 in 1 30mm Screwdriver Tools Kit =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$1.28 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Magnetic Project Mat with Marker Pen for iPhone =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$3.71 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Panel LCD Separator Glue Disassemble Machine for iPhone =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$84.20 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=09=09=09=09iPhone Spare Parts =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09Ultra Slim Replacement Top And Buttom Glass Parts For 5S =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$2.05 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Front LCD Screen Bezel Frame for iPhone 6(White) =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$2.39 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Tail Connector+Audio Jack Ribbon Flex Cable for 5S =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$3.27 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09iPartsBuy LCD Backlight Plate Replacement for iPhone 6 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$6.38 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=09=09=09=09iPad Spare Parts =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09Touch Panel Installation Adhesive kit for iPad 2 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$0.28 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Dismantling Machine Tools Split Screen Melt Adhesive Bag =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$4.40 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Original Digitizer Touch Panel for iPad Air (Black) =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$35.68 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Replacement Touch Panel LCD for iPad mini 2 Retina =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$49.63 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=09=09=09=09Galaxy Spare Parts =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09 Earphone Flex Cable for Samsung Galaxy S5 / G900 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$1.41 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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=3D"Precision =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=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=09=09=09=09=09=09=09=09=09= =09Precision Screen Refurbishment Mould Molds for Samsung Galax =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$3.53 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Touch Screen Digitizer Assembly Replacement for Galaxy S4 Ac =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$58.80 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09 LCD Display + Digitizer Assembly for Galaxy S5 mini =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$95.30 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=09=09=09=09Back Cover =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09Replacement Back Cover for Samsung Galaxy S IV / i9500 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$2.28 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Back Cover + Side Buttom Replacement for Lumia 625 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$2.87 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Full Assembly Replacement Housing Cover for iPhone 6 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$43.64 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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 =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=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=09=09=09=09=09=09=09=09=09= =09Full Assembly Replacement Housing Cover for iPhone 5S =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$42.56 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=09=09=09=09More Brand Parts =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09VIEW MORE
=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=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=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=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=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=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=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
=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=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=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=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=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=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=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=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=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=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 =09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09High Quality Tail Connector Charger for Lenovo =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$0.47 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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=3D"Front =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=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=09=09=09=09=09=09=09=09=09= =09Front Screen Outer Glass Lens for Nexus 6 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$4.66 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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=3D"Touch =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=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=09=09=09=09=09=09=09=09=09= =09Touch Screen Digitizer Replacement Part for G610 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$7.81 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=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=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=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=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=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=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=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=3D"Digitizer =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=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=09=09=09=09=09=09=09=09=09= =09Digitizer Glass Lens Replacement Part for Xiaomi Mi4 =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=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=09=09=09=09 =09=09=09=09=09=09=09= =09=09=09=09=09=09=20 =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=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=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=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=09=09=09=09=09=09=09=09=09=09=09=09=09=09$41.45 = =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=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=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=09=09=09=09=09=09=09=09=09=09Buy Now
=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=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=09=09=09=09=09 =09=09=09=09=092014 iPartsBuy.com. All Rights Reserved=20 Home &= nbsp;|   Unsubscribe =09=09=09=09=09=09
=09=09=09=09
 
Thank you for readi= ng this letter.

=
PLEASE NOTE: 

This email was s= ent to: xfs@oss.sgi.com
= iPartsBuy is a leading wholesaler of service parts specializing in mobi= le phone(Apple,Samsung,HTC,etc.) replacement parts. It is specialized in pr= oducing and supplying all kinds of cell phone parts, combine manufacture an= d trading together to meet customers's requirements for cell phone repair p= arts. Purchasing agent is also one of the role in daily business.
  
If you have any questions or want to get prompt a= nd fast after-sale service, please visit our Help Center .<= /div>
=
TEL: +86-755-83035355
Shenzhen Office: 8/F, No.614 Building, Bagua 1st Road , Futia= n District, Shenzhen ,China
=09=09 =09=09=09
From mtk.manpages@gmail.com Thu Feb 26 02:50:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 02BDB7F47 for ; Thu, 26 Feb 2015 02:50:14 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B7B1AC009 for ; Thu, 26 Feb 2015 00:50:13 -0800 (PST) X-ASG-Debug-ID: 1424940582-04bdf05c00fb790001-NocioJ Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by cuda.sgi.com with ESMTP id RMBYRNLCjt59e2ar (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 00:49:42 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] Received: by mail-wi0-f174.google.com with SMTP id em10so39197657wid.1 for ; Thu, 26 Feb 2015 00:49:41 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=s1I+s/kxb43+s55YEaCO+IyDo5dAw7YmFjbEQ+ZfFm8=; b=jtvUgUJnVfUa6suRnmAnpSXQohJlMEl+REgw6V+LSzKu+pevrTxVU4FGcy+RaYxj6+ iXQ8eyoQztUAI3A6InTJotDilSDK76jZtxxQn2A3F0lLcMHwmqU8uNk+z5Rb7X2yKsP6 ne0lkZjtIoUTzgMOvmaXIimxtADaKVtmJY2q7bNKQEfA38B00Wu/JKe9eA1hk9Y/efAu Y+b1VHoxfocOU26Q7AX10aHWIVHGiEg/Oc5l2zFbNAt9r3c1JyfHDr4/bjlO5yNRNa+l 9Z/avLuXRUE4d+zpxdgRozDn1TEnlZmoMGnmqpJ1gm2n4zm2xiSXrx5czEp4SbNzBchg z4XA== X-Received: by 10.194.19.197 with SMTP id h5mr13929257wje.109.1424940581546; Thu, 26 Feb 2015 00:49:41 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id k1sm361217wjn.9.2015.02.26.00.49.40 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Feb 2015 00:49:40 -0800 (PST) Message-ID: <54EEDE23.6080009@gmail.com> Date: Thu, 26 Feb 2015 09:49:39 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Theodore Ts'o , Eric Sandeen CC: mtk.manpages@gmail.com, Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <20150221025636.GB7922@thunk.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wi0-f174.google.com[209.85.212.174] X-Barracuda-Start-Time: 1424940582 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15869 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 Ted, On 02/21/2015 03:56 AM, Theodore Ts'o wrote: > On Fri, Feb 20, 2015 at 09:49:34AM -0600, Eric Sandeen wrote: >> >>> This mount option significantly reduces writes to the >>> inode table for workloads that perform frequent random >>> writes to preallocated files. >> >> This seems like an overly specific description of a single workload out >> of many which may benefit, but what do others think? "inode table" is also >> fairly extN-specific. > > How about somethign like "This mount significantly reduces writes > needed to update the inode's timestamps, especially mtime and actime. What is "actime" in the preceding line? Should it be "ctime"? > Examples of workloads where this could be a large win include frequent > random writes to preallocated files, as well as cases where the > MS_STRICTATIME mount option is enabled."? I think some version of the following text could also usefully go into the page, but... > (The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat system > calls will return the correctly updated atime, but those atime updates > won't get flushed to disk unless the inode needs to be updated for > file system / data consistency reasons, or when the inode is pushed > out of memory, or when the file system is unmounted.) I find the wording of there a little confusing. Is the following a correct rewrite: The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat(2) will return the correctly updated atime, but the atime updates will be flushed to disk only when (1) the inode needs to be updated for filesystem / data consistency reasons or (2) the inode is pushed out of memory, or (3) the filesystem is unmounted.) ? Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From mtk.manpages@gmail.com Thu Feb 26 02:54:03 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 95DBD7F47 for ; Thu, 26 Feb 2015 02:54:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 755EB30405F for ; Thu, 26 Feb 2015 00:54:00 -0800 (PST) X-ASG-Debug-ID: 1424940838-04cb6c4bd1e1180001-NocioJ Received: from mail-wg0-f44.google.com (mail-wg0-f44.google.com [74.125.82.44]) by cuda.sgi.com with ESMTP id 0CxVrEGv0Y4OxrvR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 00:53:59 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.44 Received: by wghl18 with SMTP id l18so8623841wgh.8 for ; Thu, 26 Feb 2015 00:53:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=9bgCW+Z+3xn1uNS8T0TqwiB7rfrursn2EXRLhOUFw1E=; b=c3+D8X2x4RHRJK+NLjMRhK09d0fulaM4TUPDuI5y7p7WFcunrH2ajPy3F6eufeHiBQ IX+B0K29KYCH017DSRXuWS+JiahVJ4gfVo/AheaH0jQV1ztPie+orqdV2YpDzbnYgLys V2YQvI/ufaDDNOGO7lXsnx97J1iDxF+KJinQUn5CYbEnaOsSOOTQ9WdxI9IzyC18twPf ZUF88XzxtOo0R6375TnVJwqt8OSKG1z6gyU/B2ZHbCSmDQCoSX43N7mhFO/yiatJqGhN VwP7WaOTyL08vPuMYclPYo1lD0BkjdFe6yLWg63Z/6s5+hz62lehRF1EmwXvXJ77A2ly tyJA== X-Received: by 10.181.8.225 with SMTP id dn1mr49015292wid.55.1424940837737; Thu, 26 Feb 2015 00:53:57 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id uc18sm1812512wib.0.2015.02.26.00.53.56 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Feb 2015 00:53:57 -0800 (PST) Message-ID: <54EEDF1F.1000703@gmail.com> Date: Thu, 26 Feb 2015 09:53:51 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Eric Sandeen , Austin S Hemmelgarn , Theodore Ts'o CC: mtk.manpages@gmail.com, Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EB1B19.8050808@gmail.com> <54EB5456.5030607@redhat.com> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <54EB5456.5030607@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f44.google.com[74.125.82.44] X-Barracuda-Start-Time: 1424940838 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15868 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 02/23/2015 05:24 PM, Eric Sandeen wrote: > On 2/23/15 6:20 AM, Austin S Hemmelgarn wrote: >> On 2015-02-20 21:56, Theodore Ts'o wrote: >>> On Fri, Feb 20, 2015 at 09:49:34AM -0600, Eric Sandeen wrote: >>>> >>>>> This mount option significantly reduces writes to the >>>>> inode table for workloads that perform frequent random >>>>> writes to preallocated files. >>>> >>>> This seems like an overly specific description of a single workload out >>>> of many which may benefit, but what do others think? "inode table" is also >>>> fairly extN-specific. >>> >>> How about somethign like "This mount significantly reduces writes >>> needed to update the inode's timestamps, especially mtime and actime. >>> Examples of workloads where this could be a large win include frequent >>> random writes to preallocated files, as well as cases where the >>> MS_STRICTATIME mount option is enabled."? >>> >>> (The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat system >>> calls will return the correctly updated atime, but those atime updates >>> won't get flushed to disk unless the inode needs to be updated for >>> file system / data consistency reasons, or when the inode is pushed >>> out of memory, or when the file system is unmounted.) >>> >> If you want to list some specific software, it should help with >> anything that uses sqlite (which notably includes firefox and >> chrome), as well as most RDMS software and systemd-journald. > > I'm really uneasy with starting to list specific workloads and applications > here. It's going to get dated quickly, and will lead to endless cargo-cult > tuning. > > I'd strongly prefer to just describe what it does (reduces the number of > certain metadata writes to disk) and leave it at that.... I'm inclined to agree that it's probably not useful to list specific applications, but I think giving some examples of workloads, as Ted proposed does help the reader get an idea. It helps some people (e.g., me) better understand what the point of the feature is. Cheers, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From 3OejuVAwJA3IblhQRUpgQavzWcQYb.SecnVieii.iWY.Sec@trix.bounces.google.com Thu Feb 26 03:32:48 2015 Return-Path: <3OejuVAwJA3IblhQRUpgQavzWcQYb.SecnVieii.iWY.Sec@trix.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 034EE7F47 for ; Thu, 26 Feb 2015 03:32:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C82DA8F8064 for ; Thu, 26 Feb 2015 01:32:44 -0800 (PST) X-ASG-Debug-ID: 1424943162-04bdf05c02fd180001-NocioJ Received: from mail-qa0-f70.google.com (mail-qa0-f70.google.com [209.85.216.70]) by cuda.sgi.com with ESMTP id gYE0WUDPUoJLfpYv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 01:32:42 -0800 (PST) X-Barracuda-Envelope-From: 3OejuVAwJA3IblhQRUpgQavzWcQYb.SecnVieii.iWY.Sec@trix.bounces.google.com Received: by mail-qa0-f70.google.com with SMTP id bm13so26390842qab.1 for ; Thu, 26 Feb 2015 01:32:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:message-id:date:subject:from:to:content-type; bh=KbniwV7YJi4QSjHOpzd4v92INJp6I1Uyg5T+MKjlz5Q=; b=fjt39KgsnVTWcUzQ0HGwQ0259rrkD8tUWB2mjJnBCsZ+bHKSFPlrpo0IN9ELI+upPb kdcGGBkZ+Uk9siNu3bl3tWIRnbJicKcoJAVfGYNW+LVgbBdxE8c/2i2rSxCstW/hNPlJ h/qt9TG1ck7fpsO2m2q2dyLw0RuWR7lEuXgaPS6knaqwoygwX7VtQsfzKS1B+aqFCc3M 5Xd1PxRhN+lKE3Gbr5dwy1C1338rENzKZdpzaf40w70lvTxzqhYYHjefQKcYGrZCWnLZ wHme8+p5ynYW/777T4XUcTpr1y1LAk/foWTXju5a7kAv7r4/14C2tntksWWpNB/Nl6Lw bOpw== MIME-Version: 1.0 X-Received: by 10.236.96.234 with SMTP id r70mt10913112yhf.39.1424943161524; Thu, 26 Feb 2015 01:32:41 -0800 (PST) X-No-Auto-Attachment: 1 Message-ID: <001a11c1f332f85300050ffa6ede@google.com> Date: Thu, 26 Feb 2015 09:32:41 +0000 Subject: =?GB2312?B?zeLDs7XEs8m5piC/qreiv827p8rHudi8/A==?= From: lvrabezqak59@gmail.com X-ASG-Orig-Subj: =?GB2312?B?zeLDs7XEs8m5piC/qreiv827p8rHudi8/A==?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c1f332fb697c050ffa6e41 X-Barracuda-Connect: mail-qa0-f70.google.com[209.85.216.70] X-Barracuda-Start-Time: 1424943162 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c1f332fb697c050ffa6e41 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 xPq6ww0KzfjC58qxtPqjrM7Sw8eyu9TZtci0/aOsv827p7K7yc/DxaOsztLDx9fUvLrW97avwarP taOsyMPE+tK7zOzBqs+1yc/N8rXEDQq/zbuno6ENCtffvfjLq8+yINb3tq/V0r/Nu6e1xMqxtPoN CjEuILT6zObK1rmko6zM4bjf0Ke5+yCjqCCw0dK1zvHUscrNt8Wz9sC008PU2rj6vfjTxdbKv827 p7rN0a/FzKOpDQoyLiC7r7G7tq/Oqtb3tq+jrMfAz8jNrNDQILHcv6rVubvho6xCMkIgya624MnZ 1uC1xNDFz6Kyu7bUs8ajqQ0KMy7M1MytyP3B97/Nu6ejrLrN08XWyr/Nu6e08r27tcCjqLHcv6q8 27jx1b2jrNf209DA+8jztcS2qbWlo6kNCjQuv+zL2bPJvbvSu8X6tqm1pSCjqM34wufX47m7tPOj rNfc09DK9NPaxOO1xMTH0Km2qbWlo6kNCsurz7LI7bz+oaMgyKvH8jIwMLbguPa5+rzSo6w3MDC2 4Lj2tdjH+MvRy/fS/cfmoaOyydPDuqPN4tPKvP63/s7xxvejrLeiDQrQxbK7z97WxqOs0rvM7MGq z7XJz83yuPa/zbunoaMNCrj8tuDP6sfpINfJ0a8yODk5Mjg2MTE1IKOoUVEpIMurz7LStc7x1LHQ ocW3IMPit9HU2s/f0d3KvsjtvP61xLmmxNy6zdCnDQq5+w0Ktee7sKO6MDIwLTM0ODI5NzE5LTgw MDINCg0KDQoNCg0KDQoNCg0KztLS0dH7x+vE+szu0LSx7bWlIM3iw7O1xLPJuaYgv6q3or/Nu6fK x7nYvPyhoyDSqszu0LS0y7HttaWjrMfrt8POyqO6DQpodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9m b3Jtcy9kLzE1LVlRUVlmUVdjbGcwNXl3d2licmJ2Z2FxSDBaWkVzcjlONmFjMFhSeXpjL3ZpZXdm b3JtP2M9MCZ3PTEmdXNwPW1haWxfZm9ybV9saW5rDQo= --001a11c1f332fb697c050ffa6e41 Content-Type: text/html; charset=GB2312 Content-Transfer-Encoding: base64 PGh0bWw+PGJvZHkgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9FbWFpbE1l c3NhZ2UiIHN0eWxlPSIiPjxkaXYgY2xhc3M9InNzLWVtYWlsLWJvZHkiIHN0eWxlPSJkaXNwbGF5 OmlubGluZTt3aWR0aDo1NzZweDsiPjxkaXYgaXRlbXByb3A9ImFjdGlvbiIgaXRlbXNjb3BlIGl0 ZW10eXBlPSJodHRwOi8vc2NoZW1hLm9yZy9WaWV3QWN0aW9uIiBzdHlsZT0iIj48bWV0YSBpdGVt cHJvcD0ibmFtZSIgY29udGVudD0izO7QtLHttaUiIHN0eWxlPSIiPgo8bWV0YSBpdGVtcHJvcD0i dXJsIiBjb250ZW50PSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kLzE1LVlRUVlmUVdj bGcwNXl3d2licmJ2Z2FxSDBaWkVzcjlONmFjMFhSeXpjL3ZpZXdmb3JtP2M9MCZhbXA7dz0xJmFt cDt1c3A9bWFpbF9nb3RvX2Zvcm0iIHN0eWxlPSIiPjwvZGl2Pgo8cCBpdGVtcHJvcD0iZGVzY3Jp cHRpb24iIHN0eWxlPSIiPsT6usM8YnI+zfjC58qxtPqjrM7Sw8eyu9TZtci0/aOsv827p7K7yc/D xaOsztLDx9fUvLrW97avwarPtaOsyMPE+tK7zOzBqs+1yc/N8rXEv827p6OhPHA+19+9+Murz7Ig 1ve2r9XSv827p7XEyrG0+jxwPjEuILT6zObK1rmko6zM4bjf0Ke5+yCjqCCw0dK1zvHUscrNt8Wz 9sC008PU2rj6vfjTxdbKv827p7rN0a/FzKOpIDxwPjIuILuvsbu2r86q1ve2r6Osx8DPyM2s0NAg sdy/qtW5u+GjrEIyQiDJrrbgydnW4LXE0MXPorK7ttSzxqOpPHA+My7M1MytyP3B97/Nu6ejrLrN 08XWyr/Nu6e08r27tcCjqLHcv6q827jx1b2jrNf209DA+8jztcS2qbWlo6k8cD40Lr/sy9mzyb27 0rvF+raptaUgo6jN+MLn1+O5u7Tzo6zX3NPQyvTT2sTjtcTEx9Cptqm1paOpPHA+y6vPssjtvP6h oyDIq8fyMjAwtuC49rn6vNKjrDcwMLbguPa12Mf4y9HL99L9x+aho7LJ08O6o83i08q8/rf+zvHG 96Ost6LQxbK7z97WxqOs0rvM7MGqz7XJz83yuPa/zbunoaM8YnI+uPy24M/qx+kg18nRrzI4OTky ODYxMTUgo6hRUSkgy6vPstK1zvHUsdChxbcgw+K30dTaz9/R3cq+yO28/rXEuabE3LrN0Ke5+zxw PrXnu7CjujAyMC0zNDgyOTcxOS04MDAyPC9wPjwvcD48L3A+PC9wPjwvcD48L3A+PC9wPjwvcD4K yOe5+8T6zt63qLLpv7S78szhvbu0y7HttaWjrL/J0tQ8YSBocmVmPSJodHRwczovL2RvY3MuZ29v Z2xlLmNvbS9mb3Jtcy9kLzE1LVlRUVlmUVdjbGcwNXl3d2licmJ2Z2FxSDBaWkVzcjlONmFjMFhS eXpjL3ZpZXdmb3JtP2M9MCZhbXA7dz0xJmFtcDt1c3A9bWFpbF9mb3JtX2xpbmsiIHN0eWxlPSIi PtTaIEdvb2dsZSCx7bWl1tDM7tC0PC9hPqGjCjxwPjwvcD4KPGRpdiBkaXI9Imx0ciIgc3R5bGU9 IiI+PGRpdiBjbGFzcz0iZm9ybS1ib2R5IiBzdHlsZT0iIj48aDEgY2xhc3M9InNzLWZvcm0tdGl0 bGUiIGRpcj0ibHRyIiBzdHlsZT0ibWFyZ2luOi42N2VtIDA7Ij7N4sOztcSzybmmIL+qt6K/zbun yse52Lz8PC9oMT48L2Rpdj4KPGRpdiBzdHlsZT0id2hpdGUtc3BhY2U6IHByZS13cmFwOyBkaXNw bGF5OiBpbmxpbmUiPgoKPC9kaXY+CjxkaXYgY2xhc3M9ImZvcm0tYm9keSIgc3R5bGU9IiI+PGRp diBjbGFzcz0ic3MtZm9ybSIgc3R5bGU9IiI+PGZvcm0gYWN0aW9uPSJodHRwczovL2RvY3MuZ29v Z2xlLmNvbS9mb3Jtcy9kLzE1LVlRUVlmUVdjbGcwNXl3d2licmJ2Z2FxSDBaWkVzcjlONmFjMFhS eXpjL2Zvcm1SZXNwb25zZSIgbWV0aG9kPSJQT1NUIiBpZD0ic3MtZm9ybSIgdGFyZ2V0PSJfc2Vs ZiIgb25zdWJtaXQ9IiIgc3R5bGU9IiI+PG9sIHJvbGU9Imxpc3QiIGNsYXNzPSJzcy1xdWVzdGlv bi1saXN0IiBzdHlsZT0icGFkZGluZy1sZWZ0OiAwbGlzdC1zdHlsZS10eXBlOm5vbmU7Ij4KCjxp bnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImRyYWZ0UmVzcG9uc2UiIHZhbHVlPSJbLCwmcXVvdDsx MjEwODkzMjQzOTg5NjE2MDQ1JnF1b3Q7XQoiIHN0eWxlPSIiPgo8aW5wdXQgdHlwZT0iaGlkZGVu IiBuYW1lPSJwYWdlSGlzdG9yeSIgdmFsdWU9IjAiIHN0eWxlPSIiPgo8aW5wdXQgdHlwZT0iaGlk ZGVuIiBuYW1lPSJ1c3AiIHZhbHVlPSJtYWlsX2Zvcm1fc3VibWl0IiBzdHlsZT0iIj4KCjxpbnB1 dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImZiengiIHZhbHVlPSIxMjEwODkzMjQzOTg5NjE2MDQ1IiBz dHlsZT0iIj4KCjxkaXYgY2xhc3M9InNzLWl0ZW0gc3MtbmF2aWdhdGUiIHN0eWxlPSJtYXJnaW46 MTJweCAwOyI+PHRhYmxlIGlkPSJuYXZpZ2F0aW9uLXRhYmxlIiBzdHlsZT0iIj48dGJvZHk+PHRy Pjx0ZCBjbGFzcz0ic3MtZm9ybS1lbnRyeSBnb29nLWlubGluZS1ibG9jayIgaWQ9Im5hdmlnYXRp b24tYnV0dG9ucyIgZGlyPSJsdHIiIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEuNWVtO3ZlcnRpY2Fs LWFsaWduOm1pZGRsZTttYXJnaW4tbGVmdDowO21hcmdpbi10b3A6MDttYXgtd2lkdGg6MTAwJTtw b3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jazsiPgo8aW5wdXQgdHlwZT0ic3Vi bWl0IiBuYW1lPSJzdWJtaXQiIHZhbHVlPSLM4b27IiBpZD0ic3Mtc3VibWl0IiBjbGFzcz0iamZr LWJ1dHRvbiBqZmstYnV0dG9uLWFjdGlvbiAiIHN0eWxlPSIiPgo8L3RkPgo8L3RyPjwvdGJvZHk+ PC90YWJsZT48L2Rpdj48L29sPjwvZm9ybT48L2Rpdj4KPGRpdiBjbGFzcz0ic3MtZm9vdGVyIiBz dHlsZT0iIj48ZGl2IGNsYXNzPSJzcy1hdHRyaWJ1dGlvbiIgc3R5bGU9IiI+PC9kaXY+CjxkaXYg Y2xhc3M9InNzLWxlZ2FsIiBzdHlsZT0iIj48ZGl2IGNsYXNzPSJkaXNjbGFpbWVyLXNlcGFyYXRv ciIgc3R5bGU9IiI+PC9kaXY+CjxkaXYgY2xhc3M9ImRpc2NsYWltZXIiIGRpcj0ibHRyIiBzdHls ZT0iIj48ZGl2IGNsYXNzPSJwb3dlcmVkLWJ5LWxvZ28iIHN0eWxlPSJtYXJnaW4tdG9wOjJlbTsi PjxzcGFuIGNsYXNzPSJwb3dlcmVkLWJ5LXRleHQiIHN0eWxlPSIiPry8yvXM4bmpo7o8L3NwYW4+ CjxhIGhyZWY9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZm9ybXMvYWJvdXQvP3V0bV9zb3VyY2U9 cHJvZHVjdCZhbXA7dXRtX21lZGl1bT1mb3Jtc19sb2dvJmFtcDt1dG1fY2FtcGFpZ249Zm9ybXMi IHN0eWxlPSIiPjxkaXYgY2xhc3M9InNzLWxvZ28tY29udGFpbmVyIiBzdHlsZT0iIj48aW1nIHNy Yz0iaHR0cHM6Ly9zc2wuZ3N0YXRpYy5jb20vZG9jcy9mb3Jtcy9mb3Jtc19sb2dvX3NtYWxsX2Rh cmsucG5nIiBhbHQ9Ikdvb2dsZSCx7bWlIiBzdHlsZT0iIj48L2Rpdj48L2E+PC9kaXY+CjxkaXYg Y2xhc3M9InNzLXRlcm1zIiBzdHlsZT0iY29sb3I6Izc3Nztmb250LXNpemU6MTFweDttYXJnaW4t dG9wOjEuNWVtOyI+PHNwYW4gY2xhc3M9ImRpc2NsYWltZXItbXNnIiBzdHlsZT0iIj60y8TayN2y u8rH08kgR29vZ2xlIMv5tLS9qKOsR29vZ2xlILK7ttTG5Nf3yM66zrWjsaOhozwvc3Bhbj4KPGJy Pgo8YSBocmVmPSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kLzE1LVlRUVlmUVdjbGcw NXl3d2licmJ2Z2FxSDBaWkVzcjlONmFjMFhSeXpjL3JlcG9ydGFidXNlP3NvdXJjZT1odHRwczov L2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kLzE1LVlRUVlmUVdjbGcwNXl3d2licmJ2Z2FxSDBaWkVz cjlONmFjMFhSeXpjL3ZpZXdmb3JtP3NpZCUzRDNiMzUxYzIxNWQzYjBlNDglMjZjJTNEMCUyNncl M0QxJTI2dG9rZW4lM0RjSXB4eFVzQkFBQS5QQWFGa0xnQnhmWE1Vbnh5d1pJeGpBLnlIbE9hcmpS eHhIelZYaHR1UzAyU0EiIHN0eWxlPSIiPr7ZsajAxNPD0NDOqjwvYT4KLQo8YSBocmVmPSJodHRw Oi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvVE9TIiBzdHlsZT0iIj63/s7xzPW/7jwvYT4KLQo8 YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vZ29vZ2xlLWQtcy90ZXJtcy5odG1sIiBzdHls ZT0iIj7G5Mv7zPW/7jwvYT48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4KPC9kaXY+PC9kaXY+Cjxi cj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiBzdHlsZT0iIj48L3N0eWxl PjwvZGl2PjwvYm9keT48L2h0bWw+ --001a11c1f332fb697c050ffa6e41-- From harry@pythonanywhere.com Thu Feb 26 07:07:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A67B07F47 for ; Thu, 26 Feb 2015 07:07:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 52421304043 for ; Thu, 26 Feb 2015 05:07:40 -0800 (PST) X-ASG-Debug-ID: 1424956055-04bdf05c01105fe0001-NocioJ Received: from darcachon.resolversystems.com (darcachon.resolversystems.com [80.68.93.186]) by cuda.sgi.com with ESMTP id RZOU4wtimL31OnU1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 05:07:37 -0800 (PST) X-Barracuda-Envelope-From: harry@pythonanywhere.com X-Barracuda-Apparent-Source-IP: 80.68.93.186 Received: from host81-136-198-183.in-addr.btopenworld.com ([81.136.198.183] helo=[192.168.0.109]) by darcachon.resolversystems.com with esmtpsa (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1YQyA9-0001p5-Nw; Thu, 26 Feb 2015 13:07:34 +0000 Message-ID: <54EF1A8F.7030505@pythonanywhere.com> Date: Thu, 26 Feb 2015 13:07:27 +0000 From: Harry User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: xfs@oss.sgi.com CC: "developers@pythonanywhere.com" References: <54EC958E.2000001@pythonanywhere.com> <20150224215907.GA18360@dastard> In-Reply-To: <20150224215907.GA18360@dastard> Content-Type: multipart/alternative; boundary="------------070400050804070909080905" X-SA-Exim-Connect-IP: 81.136.198.183 X-SA-Exim-Mail-From: harry@pythonanywhere.com Subject: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:57:07 +0000) X-ASG-Orig-Subj: Re: trying to avoid a lengthy quotacheck by deleting all quota data X-SA-Exim-Scanned: Yes (on darcachon.resolversystems.com) X-Barracuda-Connect: darcachon.resolversystems.com[80.68.93.186] X-Barracuda-Start-Time: 1424956056 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15877 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------070400050804070909080905 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Thanks Dave, * The main filesystem is currently online and seems ok, but quotas are not active. * We want to estimate how long the quotacheck will take when we reboot/remount * We're even a bit worried the disk might be in a broken state, such that the quotacheck won't actually complete successfully at all. A brief description of our setup: - we're on AWS - using mdadm to make a raid array out of 8x 200GB SSD EBS drives (and lvm) - we're using DRBD to make a live backup of all writes to another instance with a similar raid array We're not doing our experiments on our live system. Instead, we're using the drives from the DRBD target system. We take DRBD offline, so it's no longer writing, then we take snapshots of the drives, then remount those elsewhere so we can experiment without disturbing the live system. We've managed to mount the backup drives ok, with the 'noquota' option. Files look ok. But, so far, we haven't been able to get a quotacheck to complete. We've waited 12 hours+. Do you think it's possible DRBD is giving us copies of the live disks that are inconsistent somehow? How can we reassure ourselves that this live disk *will* mount successfully if we reboot the machine, and can we estimate how long it will take? /mount | grep log_storage/ /dev/drbd0 on /mnt/log_storage type xfs (rw,prjquota,allocsize=64k,_netdev) /df -i /mnt/log_storage// Filesystem Inodes IUsed IFree IUse% Mounted on /dev/drbd0 938210704 72929413 865281291 8% /mnt/log_storage /df -h /mnt/log_storage// Filesystem Size Used Avail Use% Mounted on /dev/drbd0 1.6T 1.4T 207G 88% /mnt/log_storage /xfs_info ///mnt/log_storage//// // meta-data=/dev/drbd0 isize=256 agcount=64, agsize=6553600 blks = sectsz=512 attr=2 data = bsize=4096 blocks=418906112, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=12800, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 The missing paths errors are, I think, from folders we've deleted but not yet removed from the projid/projects folders. I *think* they're a red herring here. We've also tried running xfs_repair on the backup drives. It takes about 3 hours, and shows a lot of errors about incorrect directory flags on inodes. here's one from the bottom of the log of a recent attempt: directory flags set on non-directory inode 268702898 rgds, Confused in London. On 24/02/15 21:59, Dave Chinner wrote: > On Tue, Feb 24, 2015 at 03:15:26PM +0000, Harry wrote: >> Hi there, >> >> We've got a moderately large disk (~2TB) into an inconsistent state, >> such that it's going to want a quotacheck the next time we mount it >> (it's currently mounted with quota accounting inactive). Our tests >> suggest this is going to take several hours, and cause an outage we >> can't afford. > What tests are you performing to suggest a quotacheck of a small > filesystem will take hours? (yes, 2TB is a *small* filesystem). > > (xfs_info, df -i, df -h, storage hardware, etc are all relevant > here). > >> We're wondering whether there's a 'nuke the site from orbit' option >> that will let us avoid it. The plan would be to: >> - switch off quotas and delete them completely, using the commands: >> -- disable >> -- off >> -- remove >> - remount the drive with -o prjquota, hoping that there will not be >> a quotacheck, because we've deleted all the old quota data > Mounting with a quota enabled *forces* a quota check if quotas > aren't currently enabled. You cannot avoid it; it's the way quota > consistency is created. > >> - run a script gradually restore all the quotas, one by one and in >> good time, from our own external backups (we've got the quotas in a >> database basically). > Can't be done - quotas need to be consistent with what is currently > on disk, not what you have in a backup somewhere. > >> So the questions are: >> - is there a way to remove all quota information from a mounted drive? >> (the current mount status seems to be that it tried to mount it with > mount with quotas on and turn them off via xfs_quota,i or mount > without quota options at all. Then run the remove command in > xfs_quota. > >> -o prjquota but that quota accounting is *not* active) > Not possible. > >> - will it work and let us remount the drive with -o prjquota without >> causing a quotacheck? > No. > > Cheers, > > Dave. Rgds, Harry + the PythonAnywhere team. -- Harry Percival Developer harry@pythonanywhere.com PythonAnywhere - a fully browser-based Python development and hosting environment PythonAnywhere LLP 17a Clerkenwell Road, London EC1M 5RD, UK VAT No.: GB 893 5643 79 Registered in England and Wales as company number OC378414. Registered address: 28 Ely Place, 3rd Floor, London EC1N 6TD, UK --------------070400050804070909080905 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: 8bit Thanks Dave,

* The main filesystem is currently online and seems ok, but quotas are not active.
* We want to estimate how long the quotacheck will take when we reboot/remount
* We're even a bit worried the disk might be in a broken state, such that the quotacheck won't actually complete successfully at all.

A brief description of our setup:
- we're on AWS
- using mdadm to make a raid array out of 8x 200GB SSD EBS drives (and lvm)
- we're using DRBD to make a live backup of all writes to another instance with a similar raid array

We're not doing our experiments on our live system. Instead, we're using the drives from the DRBD target system. We take DRBD offline, so it's no longer writing, then we take snapshots of the drives, then remount those elsewhere so we can experiment without disturbing the live system.

We've managed to mount the backup drives ok, with the 'noquota' option. Files look ok. But, so far, we haven't been able to get a quotacheck to complete. We've waited 12 hours+. Do you think it's possible DRBD is giving us copies of the live disks that are inconsistent somehow?

How can we reassure ourselves that this live disk *will* mount successfully if we reboot the machine, and can we estimate how long it will take?
mount | grep log_storage
/dev/drbd0 on /mnt/log_storage type xfs (rw,prjquota,allocsize=64k,_netdev)

df -i /mnt/log_storage/
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/drbd0 938210704 72929413 865281291 8% /mnt/log_storage

df -h /mnt/log_storage/
Filesystem Size Used Avail Use% Mounted on
/dev/drbd0 1.6T 1.4T 207G 88% /mnt/log_storage

xfs_info /mnt/log_storage/
<lots of errors re: cannot find mount point path `xyz`>
meta-data=/dev/drbd0 isize=256 agcount=64, agsize=6553600 blks
= sectsz=512 attr=2
data = bsize=4096 blocks=418906112, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal bsize=4096 blocks=12800, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

The missing paths errors are, I think, from folders we've deleted but not yet removed from the projid/projects folders. I *think* they're a red herring here.

We've also tried running xfs_repair on the backup drives. It takes about 3 hours, and shows a lot of errors about incorrect directory flags on inodes. here's one from the bottom of the log of a recent attempt:

directory flags set on non-directory inode 268702898

rgds,
Confused in London.



On 24/02/15 21:59, Dave Chinner wrote:
On Tue, Feb 24, 2015 at 03:15:26PM +0000, Harry wrote:
Hi there,

We've got a moderately large disk (~2TB) into an inconsistent state,
such that it's going to want a quotacheck the next time we mount it
(it's currently mounted with quota accounting inactive).  Our tests
suggest this is going to take several hours, and cause an outage we
can't afford.
What tests are you performing to suggest a quotacheck of a small
filesystem will take hours? (yes, 2TB is a *small* filesystem).

(xfs_info, df -i, df -h, storage hardware, etc are all relevant
here).

We're wondering whether there's a 'nuke the site from orbit' option
that will let us avoid it.  The plan would be to:
- switch off quotas and delete them completely, using the commands:
  -- disable
  -- off
  -- remove
- remount the drive with -o prjquota, hoping that there will not be
a quotacheck, because we've deleted all the old quota data
Mounting with a quota enabled *forces* a quota check if quotas
aren't currently enabled. You cannot avoid it; it's the way quota
consistency is created.

- run a script gradually restore all the quotas, one by one and in
good time, from our own external backups (we've got the quotas in a
database basically).
Can't be done - quotas need to be consistent with what is currently
on disk, not what you have in a backup somewhere.

So the questions are:
- is there a way to remove all quota information from a mounted drive?
(the current mount status seems to be that it tried to mount it with
mount with quotas on and turn them off via xfs_quota,i or mount
without quota options at all. Then run the remove command in
xfs_quota.

-o prjquota but that quota accounting is *not* active)
Not possible.

- will it work and let us remount the drive with -o prjquota without
causing a quotacheck?
No.

Cheers,

Dave.

Rgds,
Harry + the PythonAnywhere team.

-- 
Harry Percival
Developer
harry@pythonanywhere.com

PythonAnywhere - a fully browser-based Python development and hosting environment
<http://www.pythonanywhere.com/>

PythonAnywhere LLP
17a Clerkenwell Road, London EC1M 5RD, UK
VAT No.: GB 893 5643 79
Registered in England and Wales as company number OC378414.
Registered address: 28 Ely Place, 3rd Floor, London EC1N 6TD, UK
--------------070400050804070909080905-- From tytso@thunk.org Thu Feb 26 07:31:23 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 BB9E27F47 for ; Thu, 26 Feb 2015 07:31:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 99F548F8049 for ; Thu, 26 Feb 2015 05:31:20 -0800 (PST) X-ASG-Debug-ID: 1424957477-04cbb06110fb2a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id wcoQU3sUcXT8egWt (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 05:31:17 -0800 (PST) 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=G2otT2D/i1KJckOYzuZEYeR+qbJUIrkiPB0+7z92J40=; b=pksmJBofVw591Ch2Ijl0Xhqikkqd4lLnFuwuYba9T/zT/Hkc07H7L45EKZeddgRZ/i5ltUFSjbBqustSR/dJpYdIlhq8WvylBAw9jzVgZnnPtRRvW14r7yOJRtB798WvISAxNKD7xarpeRpDe7kCwG+aRj1K2rK2oroElZwaJK8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YQyX4-0003Xo-FC; Thu, 26 Feb 2015 13:31:14 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 82B245807D9; Thu, 26 Feb 2015 08:31:13 -0500 (EST) Date: Thu, 26 Feb 2015 08:31:13 -0500 From: Theodore Ts'o To: "Michael Kerrisk (man-pages)" Cc: Eric Sandeen , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150226133113.GD11217@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EEDE23.6080009@gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1424957477 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15878 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, Feb 26, 2015 at 09:49:39AM +0100, Michael Kerrisk (man-pages) wrote: > > How about somethign like "This mount significantly reduces writes > > needed to update the inode's timestamps, especially mtime and actime. > > What is "actime" in the preceding line? Should it be "ctime"? Sorry, no, it should be "atime". > I find the wording of there a little confusing. Is the following > a correct rewrite: > > The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat(2) > will return the correctly updated atime, but the atime updates > will be flushed to disk only when (1) the inode needs to be > updated for filesystem / data consistency reasons or (2) the > inode is pushed out of memory, or (3) the filesystem is > unmounted.) Yes, that's correct. The only other thing I might add is that in the case of a crash, the atime (or mtime) fields on disk might be out of date by at most 24 hours. - Ted From mtk.manpages@gmail.com Thu Feb 26 07:36:43 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 713EE7F47 for ; Thu, 26 Feb 2015 07:36:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6359AC006 for ; Thu, 26 Feb 2015 05:36:39 -0800 (PST) X-ASG-Debug-ID: 1424957797-04cbb0610dfb710001-NocioJ Received: from mail-wg0-f48.google.com (mail-wg0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id 3xdp1BKOpbdr6Dno (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 05:36:37 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by wggx12 with SMTP id x12so10761721wgg.11 for ; Thu, 26 Feb 2015 05:36:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=SlgVR4WrjAXS3UO14x1qK3gfDLSFWy2Ad14DVQIKQDc=; b=mqKVwb+0bmETnrClir/LdSHMk/hdpuzK+nrA9RDLhrAFf/DZ25tDV1SjuiGpTJhArY bhM1k4kEYbxW5x8hZi8J6An3KrNXIjQD4NOZh+lnSxyHeOCaLDgkBvz5Qfv8ECpods1W eLoQeKg8X1h8+Jwp6t87cu9XhowwsP7OengEVDtJ8GaLUz8G+d6vSWz4npSp+jiNBeK1 WVU5+Ih5dsRaGcrAYv3ZNgyKkrJshkF2VYDxetLS9IogXPlrUD+LVEmHDcRBfGbhyPAL 2RAcCRNrBhYuIlHGxZewFHTM8CS8lSybd+Acm7OnCXtmpUcQB++A67rq0viUF3Cekf6y HrJQ== X-Received: by 10.180.102.73 with SMTP id fm9mr17043195wib.12.1424957796878; Thu, 26 Feb 2015 05:36:36 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id e18sm1433288wjz.27.2015.02.26.05.36.35 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 26 Feb 2015 05:36:36 -0800 (PST) Message-ID: <54EF2161.90607@gmail.com> Date: Thu, 26 Feb 2015 14:36:33 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Theodore Ts'o CC: mtk.manpages@gmail.com, Eric Sandeen , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <20150226133113.GD11217@thunk.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wg0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1424957797 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15878 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 02/26/2015 02:31 PM, Theodore Ts'o wrote: > On Thu, Feb 26, 2015 at 09:49:39AM +0100, Michael Kerrisk (man-pages) wrote: >>> How about somethign like "This mount significantly reduces writes >>> needed to update the inode's timestamps, especially mtime and actime. >> >> What is "actime" in the preceding line? Should it be "ctime"? > > Sorry, no, it should be "atime". Thanks. >> I find the wording of there a little confusing. Is the following >> a correct rewrite: >> >> The advantage of MS_STRICTATIME | MS_LAZYTIME is that stat(2) >> will return the correctly updated atime, but the atime updates >> will be flushed to disk only when (1) the inode needs to be >> updated for filesystem / data consistency reasons or (2) the >> inode is pushed out of memory, or (3) the filesystem is >> unmounted.) > > Yes, that's correct. The only other thing I might add is that in the > case of a crash, the atime (or mtime) fields on disk might be out of > date by at most 24 hours. So in other words, add a sentence to that last para: The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that in the case of a system crash, the atime and mtime fields on disk might be out of date by at most 24 hours. Right? Cheers, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From sales@craigtonfabs.com Thu Feb 26 09:07:07 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8EA1F7F50 for ; Thu, 26 Feb 2015 09:07:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DF5A304059 for ; Thu, 26 Feb 2015 07:07:04 -0800 (PST) X-ASG-Debug-ID: 1424963217-04cb6c4bd3f15e0001-NocioJ Received: from mx.netmedia.co.uk (mail.netmedia.co.uk [54.229.168.1]) by cuda.sgi.com with ESMTP id 5PjUBtZwf1su59sU; Thu, 26 Feb 2015 07:06:57 -0800 (PST) X-Barracuda-Envelope-From: sales@craigtonfabs.com X-Barracuda-Apparent-Source-IP: 54.229.168.1 Received: from localhost (localhost.localdomain [127.0.0.1]) by mx.netmedia.co.uk (Postfix) with ESMTP id 31D5B309650; Thu, 26 Feb 2015 15:07:10 +0000 (GMT) X-Virus-Scanned: amavisd-new at mx.netmedia.co.uk Received: from mx.netmedia.co.uk ([127.0.0.1]) by localhost (mx.netmedia.co.uk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4-7v01XSAfCC; Thu, 26 Feb 2015 15:07:04 +0000 (GMT) Received: from mx.netmedia.co.uk (mx.netmedia.co.uk [10.0.1.169]) by mx.netmedia.co.uk (Postfix) with ESMTP id EDEE430964C; Thu, 26 Feb 2015 15:06:31 +0000 (GMT) Date: Thu, 26 Feb 2015 15:06:31 +0000 (GMT) From: "SREC GROUP hcareers@sreccompany.com" Reply-To: SREC GROUP Message-ID: <388255033.200383.1424963191917.JavaMail.root@craigtonfabs.com> Subject: Urgent Job Employment MIME-Version: 1.0 X-ASG-Orig-Subj: Urgent Job Employment Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [197.148.73.1] X-Mailer: Zimbra 7.2.6_GA_2926 (ZimbraWebClient - GC40 (Win)/7.2.6_GA_2926) To: undisclosed-recipients:; X-Barracuda-Connect: mail.netmedia.co.uk[54.229.168.1] X-Barracuda-Start-Time: 1424963217 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15880 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Urgent Job Employment Srec Company There are various jobs vacancies in our Oil and Energy company in the USA, As a result of growth and expansion of company, we require the services of intelligent, honest, resourceful and self driven individuals to fill vacant positions in our instigated office in USA. We intend to invite experienced Individuals/Expatriates or Consultancy firm in Energy, oil and gas, drilling and man power skills who are capable of rendering expertise services in various fields of Engineers, Drilling , wedding, petroleum, Refinery, offshore, Electrical, Civil, maintenance, production, chemical, Mechanical, Goescience, Health/ Safety, Oil Sand, Logistics, Management/Marketing, Technicians, Marine, Operators, Medical Nurses/Medical Doctors and others Interested applicant can apply with his/her CV to Email: careers@skylineringoenergy.ml More details plus salary and benefits will be giving by the company once your resume receive. Thanks Advert Manager. From tytso@thunk.org Thu Feb 26 18:04:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5B47F29DF7 for ; Thu, 26 Feb 2015 18:04:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EC4F0AC00B for ; Thu, 26 Feb 2015 16:04:16 -0800 (PST) X-ASG-Debug-ID: 1424995452-04cb6c4bd0100d30001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id MeJKUBLynoYAxXHI (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 26 Feb 2015 16:04:13 -0800 (PST) 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=dQoTUfr8AgFxRrZNpiaLhy5Lee2ONdtUv1z9RF4vDoI=; b=qUw4/E/6M84pt8yXqjN1H2ALRCKAWc/56Eruya1hDzjDhzbvle/WCtEGWRW/Tezb6qjCo/0/uE+2w/FVDdU6DZswbNqUqVz7gwiTV+rUVuweSUlaGNB4QUxiIHIR0hDxr+VCjcFUFMYv/WjRyWL8VNRyYVpC2KvdjuwBNcw2OFc=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YR8Pa-0008Id-Ho; Fri, 27 Feb 2015 00:04:10 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C31C15807D9; Thu, 26 Feb 2015 19:04:09 -0500 (EST) Date: Thu, 26 Feb 2015 19:04:09 -0500 From: Theodore Ts'o To: "Michael Kerrisk (man-pages)" Cc: Eric Sandeen , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150227000409.GC17174@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54EF2161.90607@gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1424995453 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15898 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, Feb 26, 2015 at 02:36:33PM +0100, Michael Kerrisk (man-pages) wrote: > > The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that > in the case of a system crash, the atime and mtime fields > on disk might be out of date by at most 24 hours. I'd change to "The disadvantage of MS_LAZYTIME is that..." and perhaps move that so it's clear it applies to any use of MS_LAZYTIME has this as a downside. Does that make sense? - Ted From david@fromorbit.com Thu Feb 26 19:56:14 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C7E7E29DF7 for ; Thu, 26 Feb 2015 19:56:14 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B67968F8039 for ; Thu, 26 Feb 2015 17:56:11 -0800 (PST) X-ASG-Debug-ID: 1425002165-04cbb0610d1151d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id SOAbSH542UuBdCB4 for ; Thu, 26 Feb 2015 17:56:06 -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: A2BeDgCTze9UPBF0LHlbgwJSWoI6g32oXgwBAQEBAQEGjGOFcIVyBAKBIk4BAQEBAQEFAQEBATg7hFAcIxgkNAUlAwctiC7XExiFb4ktTR2EFQWFbIgKhVmFZIEcgx6GLYIThlCEJSoxgQOBQAEBAQ Received: from ppp121-44-116-17.lns20.syd4.internode.on.net (HELO dastard) ([121.44.116.17]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Feb 2015 12:26:04 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YRA9r-0001w2-EL; Fri, 27 Feb 2015 12:56:03 +1100 Date: Fri, 27 Feb 2015 12:56:03 +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] xfs: updates for v4.0-rc2 Message-ID: <20150227015603.GH18360@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: updates for v4.0-rc2 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: 1425002165 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-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.15903 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the updates from the tree below? These are fixes for regressions/bugs introduced in the 4.0 merge cycle and problems discovered during the merge window that need to be pushed back to stable kernels ASAP. Thanks in advance! -Dave. The following changes since commit c517d838eb7d07bbe9507871fab3931deccff539: Linux 4.0-rc1 (2015-02-22 18:21:14 -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.0-rc2 for you to fetch changes up to 83d5f01858b56db69c8e4ca5389ef7c29bfdb5dd: xfs: cancel failed transaction in xfs_fs_commit_blocks() (2015-02-24 10:15:18 +1100) ---------------------------------------------------------------- xfs: fixes for v4.0-rc2 This update contains: o ensure quota type is reset in on-disk dquots o fix missing partial EOF block data flush on truncate extension o fix transaction leak in error handling for new pnfs block layout support o add missing target_ip check to RENAME_EXCHANGE ---------------------------------------------------------------- Dave Chinner (1): xfs: ensure truncate forces zeroed blocks to disk Eric Sandeen (2): xfs: Ensure we have target_ip for RENAME_EXCHANGE xfs: cancel failed transaction in xfs_fs_commit_blocks() Jan Kara (1): xfs: Fix quota type in quota structures when reusing quota file fs/xfs/xfs_file.c | 14 ++++++++++---- fs/xfs/xfs_inode.c | 4 ++++ fs/xfs/xfs_inode.h | 9 +++++---- fs/xfs/xfs_iops.c | 36 ++++++++++++++---------------------- fs/xfs/xfs_pnfs.c | 4 +++- fs/xfs/xfs_qm.c | 5 +++++ 6 files changed, 41 insertions(+), 31 deletions(-) -- Dave Chinner david@fromorbit.com From amy@demaxlt.com Thu Feb 26 23:09:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_QP_LONG_LINE,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 33D4A7F50 for ; Thu, 26 Feb 2015 23:09:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AA50AC004 for ; Thu, 26 Feb 2015 21:09:07 -0800 (PST) X-ASG-Debug-ID: 1425013735-04cb6c4bd31054d0001-NocioJ Received: from smtp2192-65.mail.aliyun.com (smtp2192-65.mail.aliyun.com [121.197.192.65]) by cuda.sgi.com with ESMTP id FZjFnUwk21lpzmZ8 for ; Thu, 26 Feb 2015 21:08:58 -0800 (PST) X-Barracuda-Envelope-From: amy@demaxlt.com X-Barracuda-Apparent-Source-IP: 121.197.192.65 Received: from WS-web by r46d02009.xy2.aliyun.com at Fri, 27 Feb 2015 13:08:36 +0800 Date: Fri, 27 Feb 2015 13:08:34 +0800 From: "Amy liu" To: "xfs" Reply-To: "Amy liu" Message-ID: <1b2f4d06-3926-41e4-a88a-ff4c7ec02062@demaxlt.com> Subject: =?UTF-8?B?UmU6REJETUMgSU5ET09SIFBWQyBGTE9PUklORw==?= X-Priority: 3 X-ASG-Orig-Subj: =?UTF-8?B?UmU6REJETUMgSU5ET09SIFBWQyBGTE9PUklORw==?= X-Mailer: Alimail-Mailagent MIME-Version: 1.0 X-Alimail-AntiSpam: AC=CONTINUE;BC=0.1907095|-1;FP=0|0|0|0|0|-1|-1|-1;HT=r41f05020;MF=amy@demaxlt.com;PH=DW;RN=30;RT=30;SR=0; X-Mailer: Alimail-Mailagent revision 2684282 x-aliyun-mail-creator: W4_2685091_IDMTW96aWxsYS80LjAgKGNvbXBhdGlibGU7IE1TSUUgOC4wOyBXaW5kb3dzIE5UIDYuMTsgVHJpZGVudC80LjA7IFNMQ0MyOyAuTkVUIENMUiAyLjAuNTA3Mjc7IC5ORVQgQ0xSIDMuNS4zMDcyOTsgLk5FVCBDTFIgMy4wLjMwNzI5OyB7RDlENTRGNDktRTUxQy00NDVlLTkyRjItMUVFM0MyMzEzMjQwfTsgQlJJLzI7IC5ORVQ0LjBDOyAuTkVUNC4wRSk=0x Content-Type: multipart/related; boundary="----=ALIBOUNDARY_410_5e98a940_54effbd4_34f6f" X-Barracuda-Connect: smtp2192-65.mail.aliyun.com[121.197.192.65] X-Barracuda-Start-Time: 1425013735 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.99 X-Barracuda-Spam-Status: No, SCORE=0.99 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f6f Content-Type: multipart/alternative; boundary="----=ALIBOUNDARY_410_5e98a940_54effbd4_34f70" ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f70 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =0AHey=C2=A0friend,=0ADemax building=C2=A0decoration material co.,ltd=C2=A0her= e,exporting=C2=A0interior decoration material =C2=A0with=C2=A0good=C2=A0qualit= y=C2=A0and=C2=A0low=C2=A0price=C2=A0in=C2=A0many countries.=0ACall=C2=A0me,let= 's=C2=A0talk=C2=A0details.=0ARgds,=0A=C2=A0Amy=0ADezhou demax builidng decorat= ion material=C2=A0co, ltd=0AAddress:17-1406 tianyumingcheng,dongfeng east road= ,dezhou,shandong,china=0ATel:0086-534-6051817=0AEmail:=C2=A0amy@demaxlt.com=0A= skype:liu.amy79=0A=0A=0A=0A=0A=C2=A0AMY=C2=A0=0ADezhou Demax Building Decorati= on Material Co.,Ltd(DBDMC Group)=0ADemax Livetrend=C2=A0 Glass Co.,Ltd=0ADezho= u Romantone Glass Product Co.,Ltd=0AWeb:www.demaxlt.commail:Amy@Demaxlt.com=0A= Tel:0086-534-6051817,6026837,6026297=0AFax:0086-534-8925406=0A ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f70 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
=0D=0A

Hey friend,

=0D=0A

Demax building decoration material co.,ltd&nbs= p;here,exporting interior decoration material  with good quality and low price in&nb= sp;many countries.

=0D=0A

Call me,let's talk details.

=0D=0A

Rgds,

=0D=0A

 Amy

=0D=0A=

Dezhou demax builidng decorati= on material co, ltd

=0D=0A

Address:17-1406 tianyumingcheng,dongfeng east road,dezhou,shandong,= china

=0D=0A

Tel:0086= -534-6051817

=0D=0A

E= mail: amy@demaxlt.com

=0D= =0A

skype:liu.amy79

<= /DIV>=0D=0A

=0D=0A
=0D= =0A
=0D=0A
=0D=0A
 = ;AMY 
=0D=0A
Dezhou Demax= Building Decoration Material Co.,Ltd(DBDMC Group)=0D=0A
Demax Livetrend  Glass Co.,Ltd
=0D=0A
Dezhou Romantone Glass Product C= o.,Ltd
=0D=0A
Web:www.demaxlt.com
mail:Amy@Dem= axlt.com
=0D=0A
Tel:= 0086-534-6051817,6026837,6026297
=0D=0A
Fax:0086-534-8925406
=0D=0A=

------=ALIBOUNDARY_410_5e98a940_54effbd4_34f70-- ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f6f Content-Type: application/octet-stream Content-ID: <__aliyun142501371363111751> Content-Disposition: inline; filename="=?UTF-8?B?NDMwODFf5pyq5ZG95ZCNLmpwZw==?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCADTAyEDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6C8d/ tg3WlavqVvoHgyyu7a0upLXzLqyQgsjFTyJwSMgHO0cGvP8A/ht74iZGPAXhBgT/AM8JB/7Vrwa9 1m7c60wkPz38p55z83f3rGGrXWeJCB6CvpqeBoOKbTu13PJlial2kfT1v+2549Q/6R8OPC7/AO7v jx+bGtiH9tnxLDF5t38L9D8sEZ8u6IJ9h8h5r5HXVbgN80zHFSarrFwmnxfv3Y+YFHPrWiwOH7P7 yPrNXufpjbfEG+8T2lpeeHvD2kiCe1juGgvogJELfeGQwyAQR0FNHiXxf38OeG1/7ZH/AOLrzb4I alNP4a01/O3H+z1GQeeGIxXXyalPGT+9JbPc06eBpWXur+vmcdTFVeZ+8bx8TeKANzaF4cVfeA8f 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 lx5WjStn6/4UcyCx3p1i5I+8B+FRnVLlj/rMfQVw48SeIZf9XoTf8CzSjVPFcv3dHjT/AHjRzBY7 NtQnP/LVqjN5Nn/Wvn61yPn+L2z/AKFap9WoA8Xk8x2a/jRzBY7SLU54+Gfcvo1Qtew3UzxYAbHz L6iuQaLxbJ8pa2i/2lIrV8PaLNpgklurg3F1L95uw+lVe4jnPFFq2mSsOfKblG9RXLp8Tb/Qz5Ih S8iXoHOCPxr128s4NQhaG4jWWM9Q1cne/CnRbxywWWLPZXOKhxad0WmupxN18atVIPlWFtD7sxNY 118V/El4SsVykeeghiya9NtvhPoNswLQGY/9NCTW/aeGtM04DyLOJMeiDNLlkF0eFLceNfEBwkmo Sqe/3BWjafCXxLqpDXk6wA9fOlLn8q9yACDCgKPQCm7jwM5NUodxcz6Hl+m/Amyjw1/qMs3qsKhB +Zya6nTPhv4b0rBj0yOZx/HcEyH9eK6Y5pOTVqKRN2Niijt49kKRxIP4UUKP0r1L4ZH/AIk0w/6a Zry45r074YH/AIlVwPRh/WmwW52tFFFQWfz/APx6bd8cPiPuOT/wkmon/wAmZK8/bHpXcfHKQv8A Gj4hEncD4h1A5H/XxJXBk88HP4VpH4UD3ItQJXT7kg87awbHAvYewLdfwrdvl32M4zyy45rFtU/0 iDDcbhzniq+0B+mXwCjd/CEKSAgjTYSTjtk12qIiZx061yXwAOfAjhmxiyhAJPOBnj9a6t7yEceY PwFfotHWlD0R+QYvTEVL93+Y4uEBJ+uKqSsf7HlY9Cf6ipZJUdTiTHH5VHcgDSZQp+RcZz9RzW6O N9DtvhQd0i9vmkwMd9iV11/MFuXJO7nvXI/ConzV3E7cyden3F6V1d8ha6c56dq4Yr+vmfXwf7te i/Ii3bmJ4U+ntV20CmF+Rna2V/CqKjnv6AVbgBMTDI24PGOOlU0WjybxUd3xI0YDH+pTPy9sNzVP VCftrngDORmrXiGMr8SdLGGBMKH26NVfV1DXjlW+tb0dn6nzGP8A4zZVG0gE/NnsOlaeiA+bIAvA U5rLAJXnnPetnQY9jyY3HKkc962exxRd3oeBfH8tHbaQysFKysVz67q8c1a+k/tDzwSGbk4Hv+or 2z4+2yyaTYu7H5JhkbfVzn/9VeO+J9NFrIjxAhUOCOox6ivH+1P1PusF/u8P66kllerdx5A2uDgj +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 ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f6f Content-Type: application/octet-stream Content-ID: <__aliyun142501371363111752> Content-Disposition: inline; filename="=?UTF-8?B?NDYxNzlf5ZWG5qCHLURCRE1DLS5qcGc=?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEASABIAAD/4SLWRXhpZgAATU0AKgAAAAgADQEAAAMAAAABAjcAAAEBAAMA AAABAjcAAAECAAMAAAADAAAItgEGAAMAAAABAAIAAAESAAMAAAABAAEAAAEVAAMAAAABAAMAAAEa AAUAAAABAAAIvAEbAAUAAAABAAAIxAEoAAMAAAABAAIAAAExAAIAAAAuAAAIzAEyAAIAAAAUAAAI +odpAAQAAAABAAAJDuocAAcAAAgMAAAAqgAAEV4c6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAK/IAAACcQAAr8gAAA JxBNaWNyb3NvZnQgV2luZG93cyBQaG90byBWaWV3ZXIgNi4xLjc2MDAuMTYzODUAMjAxMzowODoy MCAwOTo0MzowMAAABZAAAAcAAAAEMDIyMaABAAMAAAABAAEAAKACAAQAAAABAAAAkqADAAQAAAAB AAAA/+ocAAcAAAgMAAAJUAAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAEawB GwAFAAAAAQAAEbQBKAADAAAAAQACAAACAQAEAAAAAQAAEbwCAgAEAAAAAQAAEREAAAAAAAAASAAA AAEAAABIAAAAAf/Y/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAi LCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAoABcAwEhAAIRAQMRAf/E AB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAE EQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEB AQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXET IjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFla Y2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9p8Q6/p/hnRpdV1S Vo7SEqHZULEbmCjgc9SK40fHDwHjJ1Ocf9ukn/xNA1G4v/C8vAf/AEE7j/wEk/8AiaP+F5eA/wDo J3H/AICSf/E0BysP+F5eA/8AoKXH/gHJ/wDE1oaJ8VfCHiLU49PsNT/0mTiNZoXj8w+gJABPtUhZ lrxB8QvDvhXUksNVuJ4rh4VmVUtpJBsJIHKgjqprMHxm8Ff8/wBd/wDgBN/8RVARyfGvwNCQH1G5 XPTNlKP5rTP+F5eA/wDoKT/+Akn/AMTSGomr4f8AiF4W8b3k+laXcPdSCBpJY5bZlUx5CnO4YP3g Me9dXbwR28CQQxrHFEoREQYAUDAAHYdsUxHBfG//AJJPqw/24P8A0clfMmg+Fdd8TCc6Npst79n2 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 AAAAAQACOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAA AAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgAB AAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEA MgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////// //////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////////// /////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQIAAAAAABM AAAAAQAAAkAAAAJAAAAADAAACToBAAAghQEAAAJ9AAAAEpAAAAAWtwEAAAlBAAAADvAAAAARHwEA AAdiAQAADFcBAAALfgAAABI2ADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA0sAAAAGAAAAAAAA AAAAAAD/AAAAkgAAAAtVRmgHAC0ARABCAEQATQBDAC0AVABNAAAAAQAAAAAAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAACSAAAA/wAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAA AAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3Ag bG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAA/wAAAABSZ2h0bG9uZwAAAJIA AAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNlAAAAEgAAAAdzbGljZUlEbG9uZwAA AAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1 dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNlVHlwZQAAAABJbWcgAAAABmJvdW5kc09i amMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABC dG9tbG9uZwAAAP8AAAAAUmdodGxvbmcAAACSAAAAA3VybFRFWFQAAAABAAAAAAAAbnVsbFRFWFQA AAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFnVEVYVAAAAAEAAAAAAA5jZWxsVGV4dElz SFRNTGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAAAAlob3J6QWxpZ25lbnVtAAAAD0VTbGlj ZUhvcnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGlnbmVudW0AAAAPRVNsaWNlVmVydEFsaWdu AAAAB2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAAEUVTbGljZUJHQ29sb3JUeXBlAAAAAE5v bmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91dHNldGxvbmcAAAAAAAAADGJvdHRvbU91 dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAAOEJJTQQoAAAAAAAMAAAAAT/wAAAA AAAAOEJJTQQUAAAAAAAEAAAAGDhCSU0EDAAAAAARKAAAAAEAAABcAAAAoAAAARQAAKyAAAARDAAY AAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQA DAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwM/8AAEQgAoABcAwEiAAIRAQMRAf/dAAQABv/EAT8AAAEFAQEBAQEBAAAA AAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcG CAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZE k1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5en t8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKS Q1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2 hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9I6x1jB6L0+zqPUHmvGqLQ9zWl5G9wrb 7WS76Tlzv/jrfUr/ALl2f9sW/wDkFL/Gp/4h8/8ArUf+fql4v0n6v9a60LT0vEfl/Z9ot2R7d+70 53Ob9L03pLgARq+zf+Ov9Sv+5dn/AGxb/wCQS/8AHX+pX/cuz/ti3/yC8o/5gfXL/wAqb/8Aof8A k0v+YH1y/wDKm/8A6H/k0k8Me76v/wCOv9Sv+5dn/bFv/kFc6T/jB+qnV81mDh5n6xZpUy1j6w8/ uMfa1rPU/kLxz/mB9cv/ACpv/wCh/wCTWNkY2d07LdRkV2YmZjuEscCyxjhD2O7Ob+a9j0FcI6F+ g+tfXLoPQstuH1G2yu99Yua1lVlg2Oc+tp3VMe36VT1Q/wDHO+qH/ci7/wBhr/8A0kuB+vGbb1DN 6RnXR6uV0fEusgQN1jsix8f2nLnUVr68/wDxp/U2sgOyrROonHuH/VVqP/jr/Ur/ALl2f9sW/wDk F4r1L6df9U/lVJC1wiKfobov1y+rf1lyLendPtdkPFTrLa7Kntaa5bU+fVa1rv536K2/suP9m+ye kz7Ns9L0YGz042els+j6ez2bF47/AIl//FRl/wDhF/8A5+x17Oiitaf/0Oo/xqf+IfP/AK1H/n6p cz/iO/72/ji/kyl03+NT/wAQ+f8A1qP/AD9UuZ/xHf8Ae38cX8mUku/RfU0kkklql4t/jmYxv1qx nNaAX4NZeR3ItyGy7+yF7SvGP8dH/ipxP/CDP/P2QkUx3DV+tH0egf8Apiwvy3rFXa531O691zA6 FndNrqfQzo+HS42WbDvaLLHe3Y/821ipf+Nn9b/9Djf9v/8AqJJTxHUvp1/1T+VU10X1n+q/WOj5 OPRnsqbZdW57BXZvENdtdullf7yxv2fk/wAn/OCC8EU9t/iX/wDFRl/+EX/+fsdezrx3/E5jW0/W fLL4j7C7gzzbR/5FexJLf0n/0eo/xqf+IfP/AK1H/n6pcz/iO/72/ji/kyl03+NT/wAQ+f8A1qP/ AD9UuZ/xHf8Ae38cX8mUku/RfU0kkklql4x/jo/8VOJ/4QZ/5+yF7OvGP8dH/ipxP/CDP/P2QkUx 3D6f9T//ABKdH/8ACOP/AOe2LYXkXV/r91z6s4HQMDpzaHU29HxL3eswudvcH1ugtfX7dtTV2P8A i4+s/UvrN0fIzuoisW1ZLqWippaNorqs/Oc/86xJDzP+Nz/lnp3/AIWt/wDPla4Zdz/jc/5Z6d/4 Wt/8+VrhkkvZ/wCKf/xSZX/hJ3/n2pesLyf/ABT/APikyv8Awk7/AM+1L1hJXV//0uo/xqf+IfP/ AK1H/n6pcz/iP/72/ji/kyl1H+NCp9n1I6jsBcWei8ga6NuqLz/Zb7l5F9Ufrf1D6q5luRiMZfTk tDMjHskB207q3te36Fle5/7/APOPSXAWDT9EJLyT/wAe3qH/AJVU/wDbrv8A0ml/49vUP/Kqn/t1 3/pNJHCX1teMf46P/FTif+EGf+fshdv9Qvrxk/Wx+c27FZi/YxUW7HF+71PV53Bn0fRXEf46P/FR if8AhBn/AJ+yEikbtf61fVzrvVsf6vZHTcG7LpZ0TDrdZU0uaHj1XFm797a9q7j/ABS9K6l0roGV j9SxrMS52Y57WWt2ktNVDd7Z/N3NW/8AU/8A8SnR/wDwjj/+e2Lz3/x7c4f95VX/AG87/wBJJIAt 1P8AGd0XrHUeqYNvT8K7Lrrx7GPdUAQCXscGmXN/dXH/APNT60/+VGV/mt/8mtz/AMe7O/8AKqr/ ALed/wCkkv8Ax7s7/wAqqv8At53/AKSSTwlv/wCLTofWun9fyL8/BuxKXYjmNstAALvUqds9rne7 aF6WuQ+pH+MLE+tFluHdR9j6hUPUFQdvZZWIa59Vm1nvrc79JU//AIyv1P0vo9ekjq//0/UcjHpy aLMbIYLKbmOrtrdw5jxsex39ZpXl+Z/iTc7JsOF1MMxiZrZbUXPaP3HPY9jX7f39i7T69dTz+lfV nJzun2+hlVvpayza18B91VT/AGWtsr+g/wDdXmn/AI4H1z/8sz/2xj/+kEki+jo/+Mjnf+WtX/bL v/SqX/jI53/ltV/2y7/0qgdJ+vX1uv6v0/Hu6iX035dFVrPRoG5llrK7G7m0tc3cx35q9W6rdbj9 LzL6XbLaqLX1ugGHNY5zXQ6W/SSTxF5v6h/UfI+qb851uWzKGYKgNjCzb6fq87nP+l6y4f8Ax0f+ KjE/8Is/8/ZCysb/ABn/AF5syKq3dTlr3taf0GPwTH+gWr/jo/8AFRif+EWf+fshJUd3076nk/8A NTo+mn2LH7/8Gxee/wDjJdQ/8tKf+2nf+lF6H9Tv/En0f/wlR/57YthJAJD5J/4yXUP/AC1p/wC2 nf8ApRBzP8S3Wasay3FzqMm9gllBa6vfH5jbXOexr3fmb/Z/LrXsKSSuIvz19QLrKPrn0p7Pa43+ mZ8HtfVY3/NevoReA/Vv/wDKHif+nF3/AFdi9/QXdQfB/9TrP8Zn/iOy/wDjMb/24pXjq9i/xmf+ I3L/AOMxv/bileOpJDd6H/y90r/w9i/+fql7n1Wm3I6XmUUt3220WsrbIEucxzWNl0N+kvDOh/8A L3Sv/D2L/wCfql78kovgeN/iw+vNeRVY7pkNY9rj+nx+AZ/061f8dH/ioxP/AAiz/wA/ZC9nXjH+ Oj/xUYn/AIRZ/wCfshJUd30/6nf+JPo//hKj/wA9sWwsf6nf+JPo/wD4So/89sWwkhSSSSSnwD6t /wD5Q8T/ANOLv+rsXv68A+rf/wCUPE/9OLv+rsXv6C7qPJ//1ep/xovLPqVmuABIfjnXyvpK8Q/a V37jP+l/5Je3f41P/EPn/wBaj/z9UvBkCviNHRwesZOPn4uSyusvx76rmBwdBdW9tjQ6H/R3NXe/ +Ov9Zf8AuNg/5tv/AKXXmlP89X/Wb+VbB5SVIPaM/wAa31kdbWw42FD3sYYbbw5zWH/D/wApZ/8A jo/8VGJ/4RZ/5+yFztX8/T/xtX/nxi6L/HR/4qMT/wAIs/8AP2QkiO4fT/qd/wCJPo//AISo/wDP bFsLE+pVtVv1R6O6p4e0YlLCWmRuY0V2M/rV2Mcx620VqkkkklPgH1b/APyh4n/pxd/1di9/XgH1 b/8Ayh4n/pxd/wBXYvf0F3UeT//W6j/Gp/4h8/8ArUf+fql4MvpX6wdDxPrB0q3pWY+yui8sLnUl of7HNtbtdYy1v0mfuLkf/GW+q/8A3Lz/APtyn/3lSXRlT43T/PV/1m/lWweV6a3/ABMfVhrg4Zef IMj9JT2/9BUf/wAaT6v/APczO/z6f/eVBRlb5bV/P0/8bV/58Yuu/wAdfTL29Q6f1cAmiyo4jiBo 17HPvrDnf8My2zZ/xD10rf8AFN9X2va/7ZnEsc1wBfTEtIeP+038ldZ1HpuD1TDtweoUtyMW4RZW 7g+YLYcx7fzLGe9iKL1t+eOmfWj6w9IoON03PuxqHO3ek0gtnu5rXh2zd/JVv/n/APXL/wAtr/8A of8AkF6v/wCNT9Sv+4ln/b9v/k0v/Go+pX/cSz/t+3/yaS7ij2fKP+f/ANcv/La//of+QTj/ABgf XMGf2tdp/U/8gvVv/Go+pX/cSz/t+3/yaX/jUfUr/uJZ/wBv2/8Ak0lXHs+T/Uuyy366dLtscX2W ZbXPceS5xc5zv7Tl9Drl8D/Fv9U+nZtGdiY1jMjGeLKnG6wgOHHtc/3LqEkWLt//1/VVw2X/AI3v q7i5d+K/Ez3PxrH0vcyuot3MJY7aftI8F3K5D/Fv/Q+t/wDp5y/yUpKdHoP1x6b17pWX1TEpvrpw i5tjLmsbYSxgvd6bWW2N+g785658f45/qyRIwuoEHg+lV/71Kf1jH/Z5/wC0HJ/6q1Zv1Q/xlfVf pH1awOnZltwycestsDai4Al73fS/quSU9cPrn0w/VU/Wr0r/ALCASadrPXgW/Y/5v1fS/nPd/Pfz awP/AB5vq0BJwuoxz/NVf+9SyuuD9odA+tv1oxtemdaZg/YnHR5+yvbh5HqVf4P9NX7V6X0/XAxv +Jr/AOpakpyOtfXTpfRehYnXMuq92NnGoV11tYbWm6t2Sz1WPtrY3bXX7/0i0sPquPmdIq6vU14x 7qBktY4AP2Fvq7XNDnM37f8AhF5Xl4lWd0i7Cv3ejlfXR1NpaYdtsYa37XEO921y2D9ZOodN6B1L BxzScfpPUWdHx3PaSfs39HPrOD2tdkNZ/hP/AANJT1P1V+uvS/rU3Kd0+q+kYZYLPtDWNn1N+zZ6 Vt3+iWCf8c31aEzhdREc/oqu3/oUuZ6h0nE6L0T689Lwy84+NZ0xtZsIc73WMsduc1rPzn/ur2Jn 0G/AJKYYuQzJxqshgIZcxtjWu0cA8B4Don3e5FWd0PoWF0PGuxsN1jmZF9mS82kOO+0jeBtaz2N2 +1aKSn//0PVVyH+Lf+h9b/8ATzl/kpXXrg3/AOLLMGRk24n1izcOvKvsyHU0bmMDrHbj7a7mtc7b tZvSUy+sRH/Pz/2g5P8A1Vq0/wDF5TS/6l9KL62uPpO1LQf8JYidG+qH7PwcqjMzrOp5eQ2yuvPy Gh19VVjG1uortsdbZ6O9vq+nv9PesLH/AMVvUMahmPj/AFnz6aaxDK6y5jGid3srbftZ7ikpy/rS A2z/ABgMGjW19K2tHAkV8BemdO/5Pxv+Jr/6lqwH/Uim36r5HQ7st1uXmANyeqvYHZFuy37RR9oc 5xfd6LP1ev1LvZUsof4tOrNaAz619SaGgBoDnwANGx+sfmpKcBv9EH/08f8AfV3GZ0fNt+u2B1Nl AdgU4l1d1ssgWPduZ+iLvUd/X9NSy/qdi39O6ZhV2+i7p2ZRn23trbuyLqGmuy3Igt/TZX07b3eo 9dCkp8n+tP8AR/8AGD/xvS/+qrXqzPoN+AWPifVfDq6j1jMyi3Mq60+h9mLdW11bfQbtYPdv9X3f pPc1c7/42vWB9H62dSBH0fe/T93/ALUJKev6X1jp3V6bL+n2+tXTa6ix217IsZHqM23Nrd7dyuqr 07p+P07EZi47GtDQDY5rQze+P0l9gZ9K253vserSSn//2ThCSU0EIQAAAAAAVQAAAAEBAAAADwBB AGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMA aABvAHAAIABDAFMAMwAAAAEAOEJJTQ+gAAAAAAD4bWFuaUlSRlIAAADsOEJJTUFuRHMAAADMAAAA EAAAAAEAAAAAAABudWxsAAAAAwAAAABBRlN0bG9uZwAAAAAAAAAARnJJblZsTHMAAAABT2JqYwAA AAEAAAAAAABudWxsAAAAAQAAAABGcklEbG9uZ3HXvf8AAAAARlN0c1ZsTHMAAAABT2JqYwAAAAEA AAAAAABudWxsAAAABAAAAABGc0lEbG9uZwAAAAAAAAAAQUZybWxvbmcAAAAAAAAAAEZzRnJWbExz AAAAAWxvbmdx173/AAAAAExDbnRsb25nAAAAAAAAOEJJTVJvbGwAAAAIAAAAAAAAAAA4QklND6EA AAAAABxtZnJpAAAAAgAAABAAAAABAAAAAAAAAAEAAAAAOEJJTQQGAAAAAAAHAAgAAAABAQD/4Ub9 aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1 TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczpt ZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4xLWMwMzYgNDYuMjc2NzIwLCBNb24gRmVi IDE5IDIwMDcgMjI6NDA6MDggICAgICAgICI+DQoJPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v d3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4NCgkJPHJkZjpEZXNjcmlwdGlv biByZGY6YWJvdXQ9IiIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEv IiB4bWxuczp4YXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhhcE1NPSJo dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFk b2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9w PSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4YXBSaWdodHM9Imh0 dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9yaWdodHMvIiB4bWxuczpjcnM9Imh0dHA6Ly9ucy5h ZG9iZS5jb20vY2FtZXJhLXJhdy1zZXR0aW5ncy8xLjAvIiB4bWxuczp0aWZmPSJodHRwOi8vbnMu YWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlm LzEuMC8iIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgeGFwOkNyZWF0b3JUb29sPSJNaWNyb3NvZnQg V2luZG93cyBQaG90byBWaWV3ZXIgNi4xLjc2MDAuMTYzODUiIHhhcDpDcmVhdGVEYXRlPSIyMDEz LTAzLTA0VDIwOjQ4OjM2KzA4OjAwIiB4YXA6TW9kaWZ5RGF0ZT0iMjAxMy0wMy0xMlQwODo1NDoy OSswODowMCIgeGFwOk1ldGFkYXRhRGF0ZT0iMjAxMy0wMy0xMlQwODo1NDoyOSswODowMCIgeGFw TU06RG9jdW1lbnRJRD0idXVpZDowOUFDQzlGOEM4ODRFMjExQTI5QUM4NEYzQTg5RDY3QiIgeGFw TU06SW5zdGFuY2VJRD0idXVpZDo2M0IxM0U1N0FGOEFFMjExODU1MjlEMjMzMkI5MzhGMSIgeGFw TU06T3JpZ2luYWxEb2N1bWVudElEPSJ1dWlkOjA5QUNDOUY4Qzg4NEUyMTFBMjlBQzg0RjNBODlE NjdCIiBwaG90b3Nob3A6TGVnYWN5SVBUQ0RpZ2VzdD0iRDNDOTlGNEIzRDhERUEyODg1NDgzNTZB ODQxNTlDMkIiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJz UkdCIElFQzYxOTY2LTIuMSIgcGhvdG9zaG9wOkhpc3Rvcnk9IiIgeGFwUmlnaHRzOk1hcmtlZD0i RmFsc2UiIGNyczpBbHJlYWR5QXBwbGllZD0iVHJ1ZSIgdGlmZjpJbWFnZVdpZHRoPSI1NjciIHRp ZmY6SW1hZ2VMZW5ndGg9IjU2NyIgdGlmZjpQaG90b21ldHJpY0ludGVycHJldGF0aW9uPSIyIiB0 aWZmOlNhbXBsZXNQZXJQaXhlbD0iMyIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0 aWZmOllSZXNvbHV0aW9uPSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRp ZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEs MjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwz MzQzMjtFREVFMDVEQzFCRTI5QkFCN0U2RUJDREFEM0QzOUU0RiIgZXhpZjpFeGlmVmVyc2lvbj0i MDIyMSIgZXhpZjpDb2xvclNwYWNlPSIxIiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTQ2IiBleGlm OlBpeGVsWURpbWVuc2lvbj0iMjU1IiBleGlmOk5hdGl2ZURpZ2VzdD0iMzY4NjQsNDA5NjAsNDA5 NjEsMzcxMjEsMzcxMjIsNDA5NjIsNDA5NjMsMzc1MTAsNDA5NjQsMzY4NjcsMzY4NjgsMzM0MzQs MzM0MzcsMzQ4NTAsMzQ4NTIsMzQ4NTUsMzQ4NTYsMzczNzcsMzczNzgsMzczNzksMzczODAsMzcz ODEsMzczODIsMzczODMsMzczODQsMzczODUsMzczODYsMzczOTYsNDE0ODMsNDE0ODQsNDE0ODYs NDE0ODcsNDE0ODgsNDE0OTIsNDE0OTMsNDE0OTUsNDE3MjgsNDE3MjksNDE3MzAsNDE5ODUsNDE5 ODYsNDE5ODcsNDE5ODgsNDE5ODksNDE5OTAsNDE5OTEsNDE5OTIsNDE5OTMsNDE5OTQsNDE5OTUs NDE5OTYsNDIwMTYsMCwyLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDIw LDIyLDIzLDI0LDI1LDI2LDI3LDI4LDMwOzEyNDA3NTgyOENDMEY0MTkyREQ1Q0ZFN0ZFNTY1REJB Ij4NCgkJCTx4YXBNTTpIaXN0b3J5Pg0KCQkJCTxyZGY6U2VxPg0KCQkJCQk8cmRmOmxpIHN0RXZ0 OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QzUwQzc3QjUzMjg1RTIx MTk2QTZBM0NCRDU2NDRBMEYiIHN0RXZ0OndoZW49IjIwMTMtMDMtMDVUMDk6MzY6MjQrMDg6MDAi IHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6 Y2hhbmdlZD0iLyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omlu c3RhbmNlSUQ9InhtcC5paWQ6QzYwQzc3QjUzMjg1RTIxMTk2QTZBM0NCRDU2NDRBMEYiIHN0RXZ0 OndoZW49IjIwMTMtMDMtMDVUMDk6MzY6MjQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFk b2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCQk8cmRm OmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjZDQkVD MTYzQTg1RTIxMTk2QTZBM0NCRDU2NDRBMEYiIHN0RXZ0OndoZW49IjIwMTMtMDMtMDVUMTE6MTM6 NDQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93 cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQi IHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MkJGRkQ4ODc0NTg1RTIxMUI3NkM5N0ZBQUNDODQ1 N0IiIHN0RXZ0OndoZW49IjIwMTMtMDMtMDVUMTE6NTc6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJl QWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0K CQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p aWQ6MkNGRkQ4ODc0NTg1RTIxMUI3NkM5N0ZBQUNDODQ1N0IiIHN0RXZ0OndoZW49IjIwMTMtMDMt MDVUMTE6NTc6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBD UzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlv bj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6Q0M4NDlDNDU3MTg1RTIxMTg1M0VE RkI2NzAzMURERkIiIHN0RXZ0OndoZW49IjIwMTMtMDMtMDVUMTY6NDk6NDYrMDg6MDAiIHN0RXZ0 OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJh bWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBl ZyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVy cz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFn ZS9qcGVnIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFu Y2VJRD0ieG1wLmlpZDpDRDg0OUM0NTcxODVFMjExODUzRURGQjY3MDMxRERGQiIgc3RFdnQ6d2hl bj0iMjAxMy0wMy0wNVQxNjo0OTo0NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUg UGhvdG9zaG9wIENTNSBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkg c3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpCRDgzMUVEMjhF ODdFMjExOTlCNkQyRDRDMUZFQjEwRiIgc3RFdnQ6d2hlbj0iMjAxMy0wMy0wOFQwOToyMzo0NSsw ODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiBz dEV2dDpjaGFuZ2VkPSIvIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjb252ZXJ0ZWQi IHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0byBhcHBsaWNhdGlvbi92bmQuYWRv YmUucGhvdG9zaG9wIi8+DQoJCQkJCTxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2 dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS9qcGVnIHRvIGFwcGxpY2F0aW9uL3Zu ZC5hZG9iZS5waG90b3Nob3AiLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBz dEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkJFODMxRUQyOEU4N0UyMTE5OUI2RDJENEMxRkVCMTBG IiBzdEV2dDp3aGVuPSIyMDEzLTAzLTA4VDA5OjIzOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJ CQkJPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlk OjQxRjNFMUU4OTI4N0UyMTFBRUVFQTM0OTNDREFEMTE0IiBzdEV2dDp3aGVuPSIyMDEzLTAzLTA4 VDA5OjUzOjAxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1 IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249 ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUu cGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4NCgkJCQkJPHJkZjpsaSBzdEV2dDphY3Rpb249ImRl cml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0aW9uL3ZuZC5h ZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPg0KCQkJCQk8cmRmOmxpIHN0RXZ0OmFjdGlv bj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NDJGM0UxRTg5Mjg3RTIxMUFFRUVB MzQ5M0NEQUQxMTQiIHN0RXZ0OndoZW49IjIwMTMtMDMtMDhUMDk6NTM6MDErMDg6MDAiIHN0RXZ0 OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPg0KCQkJCTwvcmRmOlNlcT4NCgkJCTwveGFwTU06SGlzdG9yeT4NCgkJCTx4YXBNTTpE ZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjQxRjNFMUU4OTI4N0UyMTFBRUVF QTM0OTNDREFEMTE0IiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOjA5QUNDOUY4Qzg4NEUyMTFBMjlB Qzg0RjNBODlENjdCIiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InV1aWQ6MDlBQ0M5RjhDODg0 RTIxMUEyOUFDODRGM0E4OUQ2N0IiLz4NCgkJCTxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+ DQoJCQkJPHJkZjpCYWc+DQoJCQkJCTxyZGY6bGk+dXVpZDowOUFDQzlGOEM4ODRFMjExQTI5QUM4 NEYzQTg5RDY3QjwvcmRmOmxpPg0KCQkJCTwvcmRmOkJhZz4NCgkJCTwvcGhvdG9zaG9wOkRvY3Vt ZW50QW5jZXN0b3JzPg0KCQkJPHRpZmY6Qml0c1BlclNhbXBsZT4NCgkJCQk8cmRmOlNlcT4NCgkJ CQkJPHJkZjpsaT44PC9yZGY6bGk+DQoJCQkJCTxyZGY6bGk+ODwvcmRmOmxpPg0KCQkJCQk8cmRm OmxpPjg8L3JkZjpsaT4NCgkJCQk8L3JkZjpTZXE+DQoJCQk8L3RpZmY6Qml0c1BlclNhbXBsZT4N CgkJPC9yZGY6RGVzY3JpcHRpb24+DQoJPC9yZGY6UkRGPg0KPC94OnhtcG1ldGE+DQogICAgICAg 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 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 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 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 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/+IMWElDQ19QUk9G SUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVD IHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAA AAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAA AlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVh cwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgM dGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MA AAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADz UQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAA AABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3 dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MA AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAA AAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVog AAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAA AAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZ AF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA 6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGh AakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgC ogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPg A+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcF dwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdP B2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJ jwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwS DCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4P CQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJF EmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAW AxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoE GioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoe lB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNm I5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo 1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6C Lrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ40 2DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtr O6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJC tUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3 Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFS fFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1 W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tk QGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25 bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4 EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKS gvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN /45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQ mfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pamm GqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LC szizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XA cMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42 zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3Ird EN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv7 7IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8 B/yY/Sn9uv5L/tz/bf///9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4S EA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgA/wCSAwEiAAIRAQMR Af/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQEC AwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNE RUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqy s7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEB AQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEH YXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZX WFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD xMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/VOkyKjfJY8H A9D/AJ9q/BL9qb9pP4ueHv2lfinpelfFPxrpmmWfiXULe1srPxDdxQwRrO4VERZQFUAAAAYFJuxp CDm7I/fHIoyK/m9/4ar+Nf8A0WHx9/4U17/8do/4ar+Nf/RYPH3/AIU17/8AHaXMbfV5dz+kLIoy K/m9/wCGq/jX/wBFg8ff+FNe/wDx2j/hqv41/wDRYPH3/hTXv/x2jmF9Xl3P6QuKOPav5vf+Gq/j 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 LRQAUUUUAf/Z ------=ALIBOUNDARY_410_5e98a940_54effbd4_34f6f-- From mtk.manpages@gmail.com Fri Feb 27 02:01:29 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 379AA7F50 for ; Fri, 27 Feb 2015 02:01:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9AC8AC006 for ; Fri, 27 Feb 2015 00:01:25 -0800 (PST) X-ASG-Debug-ID: 1425024079-04cbb0610e11b3c0001-NocioJ Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by cuda.sgi.com with ESMTP id N7U5wHXUvyAMqjAc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Feb 2015 00:01:20 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.179 Received: by wevl61 with SMTP id l61so18130070wev.2 for ; Fri, 27 Feb 2015 00:01:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=CbuRlvMYiiPyVfbIuEgM7Cqj8IRwy29YvFQIbE4fuFk=; b=R4S2xweTbiKD8Nhj7fjDPDGJFJ92ZlhRqmsprIF6wH6Gm6DkyuU3S3juPy9N0Q9hgq 1VW9j9fQ/8KH2YF5oJEHjMR1uAGKzDNpyDw5N+QVaNEud4G08mqIHpEoTn09mbOtDdmf JSR6aobXMRCPYwyZJTghKq8zuOf0bomVQqamDVqNn0VYUhWbtFS6Hy3bbfNfinsMJ+7V ycy/QmYV9BV3dc+uvXnZOM62Mkx08oSrGY3OGNT773GIud3O3HBXkFTkGkqEwpBFjmJP 7+VKGG0m5QvZQlKdAz5yflA3/KxW0HpYOTda6YZb74+9K0oxZLzNXavzl5uzsPhDq1eK biPA== X-Received: by 10.195.13.104 with SMTP id ex8mr24829850wjd.12.1425024079450; Fri, 27 Feb 2015 00:01:19 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id m4sm4776164wjb.25.2015.02.27.00.01.18 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Feb 2015 00:01:18 -0800 (PST) Message-ID: <54F02446.2050008@gmail.com> Date: Fri, 27 Feb 2015 09:01:10 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Theodore Ts'o CC: mtk.manpages@gmail.com, Eric Sandeen , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> <20150227000409.GC17174@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <20150227000409.GC17174@thunk.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-we0-f179.google.com[74.125.82.179] X-Barracuda-Start-Time: 1425024080 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15915 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 02/27/2015 01:04 AM, Theodore Ts'o wrote: > On Thu, Feb 26, 2015 at 02:36:33PM +0100, Michael Kerrisk (man-pages) wrote: >> >> The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that >> in the case of a system crash, the atime and mtime fields >> on disk might be out of date by at most 24 hours. > > I'd change to "The disadvantage of MS_LAZYTIME is that..." and > perhaps move that so it's clear it applies to any use of MS_LAZYTIME > has this as a downside. > > Does that make sense? Thanks, Ted. Got it. So, now we have: MS_LAZYTIME (since Linux 3.20) Reduce on-disk updates of inode timestamps (atime, mtime, ctime) by maintaining these changes only in mem‐ ory. The on-disk timestamps are updated only when: (a) the inode needs to be updated for some change unre‐ lated to file timestamps; (b) the application employs fsync(2), syncfs(2), or sync(2); (c) an undeleted inode is evicted from memory; or (d) more than 24 hours have passed since the inode was written to disk. This mount significantly reduces writes needed to update the inode's timestamps, especially mtime and atime. However, in the event of a system crash, the atime and mtime fields on disk might be out of date by up to 24 hours. Examples of workloads where this option could be of sig‐ nificant benefit include frequent random writes to pre‐ allocated files, as well as cases where the MS_STRICTA‐ TIME mount option is also enabled. (The advantage of (MS_STRICTATIME | MS_LAZYTIME) is that stat(2) will return the correctly updated atime, but the atime updates will be flushed to disk only when (1) the inode needs to be updated for filesystem / data consistency reasons or (2) the inode is pushed out of memory, or (3) the filesystem is unmounted.) Cheers, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From osandov@osandov.com Fri Feb 27 02:08:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 430507F54 for ; Fri, 27 Feb 2015 02:08:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 318E430406B for ; Fri, 27 Feb 2015 00:08:04 -0800 (PST) X-ASG-Debug-ID: 1425024481-04cb6c4bd2108310001-NocioJ Received: from mail-pd0-f169.google.com (mail-pd0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id PoTJAJflM0LSfBRl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Feb 2015 00:08:02 -0800 (PST) X-Barracuda-Envelope-From: osandov@osandov.com Received: by pdjp10 with SMTP id p10so19426131pdj.3 for ; Fri, 27 Feb 2015 00:08:01 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=PHl6oh2wVlF12h3sDubPZXwx6ORddmcLFPyr/yS3ZqU=; b=ar2rIhAI8a74Z4wnAvm9mLlxn5DPp/yT5Ehzyt4RE5s5tG6hcGUG0N2aqeUeIfZvc1 Rg2AGcSJxPfELD5jrc2iyOfwoaKJ2Aeb9aIm2cb9UdAh1YNeD/kOAytQDh9VngjMi49W YJsfzTG9t5gdag5g/ZLqzKux9N2JNsLo7Rk2Su2Cft8W0oEEu+4dLGo0WCuYNHmU2nmN NgpaC+ov0C3YCTjHlWeCnH3uHsuiOBH2/FytieYOg/cEMjjEwzb3PDOlV3OX58BsHECE VONtzNGuLAH/2lh4NIBFoIgw3EjdHDavswFDEc/WolsVKTzIohnh6I0CMRRKwJF/6D3I Vjuw== X-Gm-Message-State: ALoCoQkO9hG6ZQYP6ueV6m3osOVuS71daH4cTyAJEBlhRMtbvcyeS5KMRj9DhgwuP4mjIELE6WAS X-Received: by 10.68.172.193 with SMTP id be1mr22143310pbc.64.1425024481785; Fri, 27 Feb 2015 00:08:01 -0800 (PST) Received: from mew (c-76-104-211-44.hsd1.wa.comcast.net. [76.104.211.44]) by mx.google.com with ESMTPSA id hu12sm3143443pdb.41.2015.02.27.00.08.00 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Feb 2015 00:08:01 -0800 (PST) Date: Fri, 27 Feb 2015 00:08:00 -0800 X-Barracuda-Apparent-Source-IP: 76.104.211.44 From: Omar Sandoval To: "Michael Kerrisk (man-pages)" Cc: Theodore Ts'o , Eric Sandeen , linux-man@vger.kernel.org, Linux API , XFS Developers , Linux-Fsdevel , Ext4 Developers List , Linux btrfs Developers List Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150227080800.GA20442@mew> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> <20150227000409.GC17174@thunk.org> <54F02446.2050008@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <54F02446.2050008@gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-pd0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1425024482 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15914 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Feb 27, 2015 at 09:01:10AM +0100, Michael Kerrisk (man-pages) wrote: > On 02/27/2015 01:04 AM, Theodore Ts'o wrote: > > On Thu, Feb 26, 2015 at 02:36:33PM +0100, Michael Kerrisk (man-pages) wrote: > >> > >> The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that > >> in the case of a system crash, the atime and mtime fields > >> on disk might be out of date by at most 24 hours. > > > > I'd change to "The disadvantage of MS_LAZYTIME is that..." and > > perhaps move that so it's clear it applies to any use of MS_LAZYTIME > > has this as a downside. > > > > Does that make sense? > > Thanks, Ted. Got it. So, now we have: > > MS_LAZYTIME (since Linux 3.20) > Reduce on-disk updates of inode timestamps (atime, > mtime, ctime) by maintaining these changes only in mem‐ > ory. The on-disk timestamps are updated only when: > > (a) the inode needs to be updated for some change unre‐ > lated to file timestamps; > > (b) the application employs fsync(2), syncfs(2), or > sync(2); > > (c) an undeleted inode is evicted from memory; or > > (d) more than 24 hours have passed since the inode was > written to disk. > > This mount significantly reduces writes needed to update "This mount option"? > the inode's timestamps, especially mtime and atime. > However, in the event of a system crash, the atime and > mtime fields on disk might be out of date by up to 24 > hours. > > Examples of workloads where this option could be of sig‐ > nificant benefit include frequent random writes to pre‐ > allocated files, as well as cases where the MS_STRICTA‐ > TIME mount option is also enabled. (The advantage of > (MS_STRICTATIME | MS_LAZYTIME) is that stat(2) will > return the correctly updated atime, but the atime > updates will be flushed to disk only when (1) the inode > needs to be updated for filesystem / data consistency > reasons or (2) the inode is pushed out of memory, or (3) > the filesystem is unmounted.) Is it necessary to repeat the reasons for flushing, which are stated above? > > Cheers, > > Michael > > > -- > Michael Kerrisk > Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ > Linux/UNIX System Programming Training: http://man7.org/training/ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Thanks! -- Omar From mtk.manpages@gmail.com Fri Feb 27 02:36:13 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8A6677F50 for ; Fri, 27 Feb 2015 02:36:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EC3A5AC004 for ; Fri, 27 Feb 2015 00:36:12 -0800 (PST) X-ASG-Debug-ID: 1425026170-04cbb0610d11c050001-NocioJ Received: from mail-we0-f174.google.com (mail-we0-f174.google.com [74.125.82.174]) by cuda.sgi.com with ESMTP id g0qfUh33vh5NETOO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Feb 2015 00:36:10 -0800 (PST) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.174 Received: by wevk48 with SMTP id k48so18339949wev.3 for ; Fri, 27 Feb 2015 00:36:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=d7SEj/vOJMo//QRUaZFB/9bF0HKADu2RGLaX3SFLRZs=; b=S76k37EcVcaDEQ+gsxRxINRRdf/s1IaJQa6rtoqltTXpWyl/qwowzmHZrysisz95cu sPZzFCeEwPLqaeLua8NWo0Pa+DUMpMq1O5e4v0gWSKCjw0We6IsS/HMBQQ2U2rdg0MEP nlmz87VPq6IE7g4DGLVqhWpqy7HwX/uoEGnyFZeWvyfFHVZsoM6BkPa/zpr6ALJqQXmN kFnbhlgbekTsw73tLP3D4eYIHGnqMi6GAQuoL1xH0juVDlUY44WkX4SnJiPq5cqC4/Ko SRuX+Gra6ThJJTJ4N+g80TSGn7HQ37dmQtgkz6jOKTjD8XnQepEOa/PHqjm+QlVWP+kM oUbA== X-Received: by 10.180.82.40 with SMTP id f8mr4184459wiy.60.1425026169894; Fri, 27 Feb 2015 00:36:09 -0800 (PST) Received: from [192.168.234.98] (mail.jambit.com. [95.157.63.22]) by mx.google.com with ESMTPSA id m4sm4894158wjb.25.2015.02.27.00.36.08 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Feb 2015 00:36:09 -0800 (PST) Message-ID: <54F02C73.5090601@gmail.com> Date: Fri, 27 Feb 2015 09:36:03 +0100 From: "Michael Kerrisk (man-pages)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Omar Sandoval CC: mtk.manpages@gmail.com, Theodore Ts'o , Eric Sandeen , linux-man@vger.kernel.org, Linux API , XFS Developers , Linux-Fsdevel , Ext4 Developers List , Linux btrfs Developers List Subject: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> <20150227000409.GC17174@thunk.org> <54F02446.2050008@gmail.com> <20150227080800.GA20442@mew> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME In-Reply-To: <20150227080800.GA20442@mew> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail-we0-f174.google.com[74.125.82.174] X-Barracuda-Start-Time: 1425026170 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15916 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 Omar, On 02/27/2015 09:08 AM, Omar Sandoval wrote: > On Fri, Feb 27, 2015 at 09:01:10AM +0100, Michael Kerrisk (man-pages) wrote: >> On 02/27/2015 01:04 AM, Theodore Ts'o wrote: >>> On Thu, Feb 26, 2015 at 02:36:33PM +0100, Michael Kerrisk (man-pages) wrote: >>>> >>>> The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that >>>> in the case of a system crash, the atime and mtime fields >>>> on disk might be out of date by at most 24 hours. >>> >>> I'd change to "The disadvantage of MS_LAZYTIME is that..." and >>> perhaps move that so it's clear it applies to any use of MS_LAZYTIME >>> has this as a downside. >>> >>> Does that make sense? >> >> Thanks, Ted. Got it. So, now we have: >> >> MS_LAZYTIME (since Linux 3.20) >> Reduce on-disk updates of inode timestamps (atime, >> mtime, ctime) by maintaining these changes only in mem‐ >> ory. The on-disk timestamps are updated only when: >> >> (a) the inode needs to be updated for some change unre‐ >> lated to file timestamps; >> >> (b) the application employs fsync(2), syncfs(2), or >> sync(2); >> >> (c) an undeleted inode is evicted from memory; or >> >> (d) more than 24 hours have passed since the inode was >> written to disk. >> >> This mount significantly reduces writes needed to update > "This mount option"? Thanks, fixed. >> the inode's timestamps, especially mtime and atime. >> However, in the event of a system crash, the atime and >> mtime fields on disk might be out of date by up to 24 >> hours. >> >> Examples of workloads where this option could be of sig‐ >> nificant benefit include frequent random writes to pre‐ >> allocated files, as well as cases where the MS_STRICTA‐ >> TIME mount option is also enabled. (The advantage of >> (MS_STRICTATIME | MS_LAZYTIME) is that stat(2) will >> return the correctly updated atime, but the atime >> updates will be flushed to disk only when (1) the inode >> needs to be updated for filesystem / data consistency >> reasons or (2) the inode is pushed out of memory, or (3) >> the filesystem is unmounted.) > Is it necessary to repeat the reasons for flushing, which are stated > above? Good point. I replaced this piece with just a few words referring to the list above. Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From tytso@thunk.org Fri Feb 27 08:18:20 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 D8A487F50 for ; Fri, 27 Feb 2015 08:18:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B50BB30406A for ; Fri, 27 Feb 2015 06:18:17 -0800 (PST) X-ASG-Debug-ID: 1425046695-04cb6c4bd0110a20001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 1Sab85hjrifQGBn1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 27 Feb 2015 06:18:15 -0800 (PST) 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=9fynNmerS5B0yYD6fzJBcgBfkWu3yuC11dwJhN+BX0c=; b=e0NfUnUQBZibkk73jJbIuf2Zs/2zR/0ohx3o23PprlRcwbg1VZdrl11Lk2aPvVVdrVfVALPND9+JVR8aWavGd2S8GcEi0SIpoz25TJifk4cT/ERPeOce+24+nT88tHvgdPK8NXVO8SI2zbo7CtkVKsTa2N+fxEaaCV4E1Sm9zbg=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YRLk4-00063L-4P; Fri, 27 Feb 2015 14:18:12 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5F43E5807D9; Fri, 27 Feb 2015 09:18:11 -0500 (EST) Date: Fri, 27 Feb 2015 09:18:11 -0500 From: Theodore Ts'o To: "Michael Kerrisk (man-pages)" Cc: Omar Sandoval , Eric Sandeen , linux-man@vger.kernel.org, Linux API , XFS Developers , Linux-Fsdevel , Ext4 Developers List , Linux btrfs Developers List Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150227141811.GA5404@thunk.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> <20150227000409.GC17174@thunk.org> <54F02446.2050008@gmail.com> <20150227080800.GA20442@mew> <54F02C73.5090601@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54F02C73.5090601@gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1425046695 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15928 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 With Omar's suggestions, this looks great. Thanks!! - Ted From darrick.wong@oracle.com Fri Feb 27 11:52:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EEAB7F51 for ; Fri, 27 Feb 2015 11:52:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BAB5FAC00B for ; Fri, 27 Feb 2015 09:52:09 -0800 (PST) X-ASG-Debug-ID: 1425059527-04cbb0610d138030001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id NIv31XYsVaNvKuXb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Feb 2015 09:52:07 -0800 (PST) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id t1RHq2c9002664 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 Feb 2015 17:52:03 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1RHq1kv008593 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 27 Feb 2015 17:52:02 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id t1RHq1Uu028867; Fri, 27 Feb 2015 17:52:01 GMT Received: from localhost (/10.145.179.157) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 27 Feb 2015 09:52:01 -0800 Date: Fri, 27 Feb 2015 09:51:59 -0800 From: "Darrick J. Wong" To: "Michael Kerrisk (man-pages)" Cc: "Theodore Ts'o" , Eric Sandeen , Ext4 Developers List , Linux btrfs Developers List , XFS Developers , linux-man@vger.kernel.org, Linux-Fsdevel , Linux API Subject: Re: Documenting MS_LAZYTIME Message-ID: <20150227175159.GC11031@birch.djwong.org> X-ASG-Orig-Subj: Re: Documenting MS_LAZYTIME References: <54E7578E.4090809@redhat.com> <20150221025636.GB7922@thunk.org> <54EEDE23.6080009@gmail.com> <20150226133113.GD11217@thunk.org> <54EF2161.90607@gmail.com> <20150227000409.GC17174@thunk.org> <54F02446.2050008@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <54F02446.2050008@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1425059527 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15935 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 27, 2015 at 09:01:10AM +0100, Michael Kerrisk (man-pages) wrote: > On 02/27/2015 01:04 AM, Theodore Ts'o wrote: > > On Thu, Feb 26, 2015 at 02:36:33PM +0100, Michael Kerrisk (man-pages) wrote: > >> > >> The disadvantage of MS_STRICTATIME | MS_LAZYTIME is that > >> in the case of a system crash, the atime and mtime fields > >> on disk might be out of date by at most 24 hours. > > > > I'd change to "The disadvantage of MS_LAZYTIME is that..." and > > perhaps move that so it's clear it applies to any use of MS_LAZYTIME > > has this as a downside. > > > > Does that make sense? > > Thanks, Ted. Got it. So, now we have: > > MS_LAZYTIME (since Linux 3.20) "since Linux 4.0". --D > Reduce on-disk updates of inode timestamps (atime, > mtime, ctime) by maintaining these changes only in mem‐ > ory. The on-disk timestamps are updated only when: > > (a) the inode needs to be updated for some change unre‐ > lated to file timestamps; > > (b) the application employs fsync(2), syncfs(2), or > sync(2); > > (c) an undeleted inode is evicted from memory; or > > (d) more than 24 hours have passed since the inode was > written to disk. > > This mount significantly reduces writes needed to update > the inode's timestamps, especially mtime and atime. > However, in the event of a system crash, the atime and > mtime fields on disk might be out of date by up to 24 > hours. > > Examples of workloads where this option could be of sig‐ > nificant benefit include frequent random writes to pre‐ > allocated files, as well as cases where the MS_STRICTA‐ > TIME mount option is also enabled. (The advantage of > (MS_STRICTATIME | MS_LAZYTIME) is that stat(2) will > return the correctly updated atime, but the atime > updates will be flushed to disk only when (1) the inode > needs to be updated for filesystem / data consistency > reasons or (2) the inode is pushed out of memory, or (3) > the filesystem is unmounted.) > > Cheers, > > Michael > > > -- > Michael Kerrisk > Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ > Linux/UNIX System Programming Training: http://man7.org/training/ > -- > 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 vbabka@suse.cz Fri Feb 27 12:24:44 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C24B7F54 for ; Fri, 27 Feb 2015 12:24:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB0F9AC008 for ; Fri, 27 Feb 2015 10:24:43 -0800 (PST) X-ASG-Debug-ID: 1425061477-04cbb06110139930001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id zXmcsGOkJb5txv65 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Feb 2015 10:24:38 -0800 (PST) X-Barracuda-Envelope-From: vbabka@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 51864AC47; Fri, 27 Feb 2015 18:24:36 +0000 (UTC) Message-ID: <54F0B662.8020508@suse.cz> Date: Fri, 27 Feb 2015 19:24:34 +0100 From: Vlastimil Babka User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: Dave Chinner , Andrew Morton CC: Johannes Weiner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150222172930.6586516d.akpm@linux-foundation.org> <20150223073235.GT4251@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? In-Reply-To: <20150223073235.GT4251@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1425061478 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 02/23/2015 08:32 AM, Dave Chinner wrote: >> > And then there will be an unknown number of >> > slab allocations of unknown size with unknown slabs-per-page rules >> > - how many pages needed for them? > However many pages needed to allocate the number of objects we'll > consume from the slab. I think the best way is if slab could also learn to provide reserves for individual objects. Either just mark internally how many of them are reserved, if sufficient number is free, or translate this to the page allocator reserves, as slab knows which order it uses for the given objects. >> > And to make it much worse, how >> > many pages of which orders? Bless its heart, slub will go and use >> > a 1-order page for allocations which should have been in 0-order >> > pages.. > The majority of allocations will be order-0, though if we know that > they are going to be significant numbers of high order allocations, > then it should be simple enough to tell the mm subsystem "need a > reserve of 32 order-0, 4 order-1 and 1 order-3 allocations" and have > memory compaction just do it's stuff. But, IMO, we should cross that > bridge when somebody actually needs reservations to be that > specific.... Note that watermark checking for higher-order allocations is somewhat fuzzy compared to order-0 checks, but I guess some kind of reservations could work there too. From david@fromorbit.com Fri Feb 27 18:04:11 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B18D7F54 for ; Fri, 27 Feb 2015 18:04:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6909B304043 for ; Fri, 27 Feb 2015 16:04:08 -0800 (PST) X-ASG-Debug-ID: 1425081841-04cb6c4bd012cc30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0iV6r04wcIdc2VDl for ; Fri, 27 Feb 2015 16:04:02 -0800 (PST) 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: A2AkDAAWBfFUPPxQLHlbgwKBLII7g32pBQEBAQEBAQaYRAQCAoEjTgEBAQEBAQUBAQEBODuEEAEFOhwjEAgDDgoJJQ8FJQMHGhMbiBPXAAErGIVuhQyEbgeEKwWVa4NPiwiITYQlKjGCQwEBAQ Received: from ppp121-44-80-252.lns20.syd4.internode.on.net (HELO dastard) ([121.44.80.252]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Feb 2015 10:34:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1YRUsx-00049w-It; Sat, 28 Feb 2015 11:03:59 +1100 Date: Sat, 28 Feb 2015 11:03:59 +1100 From: Dave Chinner To: Vlastimil Babka Cc: Andrew Morton , Johannes Weiner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150228000359.GL4251@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150222172930.6586516d.akpm@linux-foundation.org> <20150223073235.GT4251@dastard> <54F0B662.8020508@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54F0B662.8020508@suse.cz> 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: 1425081842 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 27, 2015 at 07:24:34PM +0100, Vlastimil Babka wrote: > On 02/23/2015 08:32 AM, Dave Chinner wrote: > >> > And then there will be an unknown number of > >> > slab allocations of unknown size with unknown slabs-per-page rules > >> > - how many pages needed for them? > > However many pages needed to allocate the number of objects we'll > > consume from the slab. > > I think the best way is if slab could also learn to provide reserves for > individual objects. Either just mark internally how many of them are reserved, > if sufficient number is free, or translate this to the page allocator reserves, > as slab knows which order it uses for the given objects. Which is effectively what a slab based mempool is. Mempools don't guarantee a reserve is available once it's been resized, however, and we'd have to have mempools configured for every type of allocation we are going to do. So from that perspective it's not really a solution. Further, the kmalloc heap is backed by slab caches. We do *lots* of variable sized kmalloc allocations in transactions the size of which aren't known until allocation time. In that case, we have to assume it's going to be a page per object, because the allocations could actually be that size. AFAICT, the worst case is a slab-backing page allocation for every slab object that is allocated, so we may as well cater for that case from the start... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Sat Feb 28 09:18:05 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9233D7F54 for ; Sat, 28 Feb 2015 09:18:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8069A8F8039 for ; Sat, 28 Feb 2015 07:18:02 -0800 (PST) X-ASG-Debug-ID: 1425136676-04cb6c4bd013e2a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id HMBGvrR2aRoGAlJm (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 28 Feb 2015 07:17:56 -0800 (PST) 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=UkaohAsHWBxA2zbzlKtkWABR90VVqmioQJQdCTHXqRM=; b=PG/k5Nn9+MByvG79ipDNF25y+aurNVddzCwSvPfoEs19ihEi+Q/RlMOlY2Jq14TKnQtAN3XhEW7LTGvj+seby7Sr4rjstJ7UFmSz+OZTxFcjta3U6SadBUFG9z7BZPK7AMMTXE4baFteUjBCjTADEbys7Kp1C9HFn6Rmysdvzq4=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YRj9I-0007wZ-BL; Sat, 28 Feb 2015 15:17:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 2A08E58037B; Sat, 28 Feb 2015 10:17:48 -0500 (EST) Date: Sat, 28 Feb 2015 10:17:48 -0500 From: Theodore Ts'o To: Dave Chinner Cc: Vlastimil Babka , Andrew Morton , Johannes Weiner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150228151748.GD5404@thunk.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150222172930.6586516d.akpm@linux-foundation.org> <20150223073235.GT4251@dastard> <54F0B662.8020508@suse.cz> <20150228000359.GL4251@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150228000359.GL4251@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1425136676 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15979 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Feb 28, 2015 at 11:03:59AM +1100, Dave Chinner wrote: > > I think the best way is if slab could also learn to provide reserves for > > individual objects. Either just mark internally how many of them are reserved, > > if sufficient number is free, or translate this to the page allocator reserves, > > as slab knows which order it uses for the given objects. > > Which is effectively what a slab based mempool is. Mempools don't > guarantee a reserve is available once it's been resized, however, > and we'd have to have mempools configured for every type of > allocation we are going to do. So from that perspective it's not > really a solution. The bigger problem is it means that the upper layer which is making the reservation before it starts taking lock won't necessarily know exactly which slab objects it and all of the lower layers might need. So it's much more flexible, and requires less accuracy, if we can just request that (a) the mm subsystems reserves at least N pages, and (b) tell it that at this point in time, it's safe for the requesting subsystem to block until N pages is available. Can this be guaranteed to be accurate? No, of course not. And in some cases, it may be possible since it might depend on whether the iSCSI device needs to reconnect to the target, or some sort of exception handling, before it can complete its I/O request. But it's better than what we have now, which is that once we've taken certain locks, and/or started a complex transaction, we can't really back out, so we end up looping either using GFP_NOFAIL, or around the memory allocation request if there are still mm developers who are delusional enough to believe, ala like King Canute, to say, "You must always be able to handle memory allocation at any point in the kernel and GFP_NOFAIL is an indicatoin of a subsystem bug!" I can imagine using some adjustment factors, where a particular voratious device might require hint to the file system to boost its memory allocation estimate by 30%, or 50%. So yes, it's a very, *very* rough estimate. And if we guess wrong, we might end up having to loop ala GFP_NOFAIL anyway. But it's better than not having such an estimate. I also grant that this doesn't work very well for emergency writeback, or background writeback, where we can't and shouldn't block waiting for enough memory to become free, since page cleaning is one of the ways that we might be able to make memory available. But if that's the only problem we have, we're in good shape, since that can be solved by either (a) doing a better job throttling memory allocations or memory reservation requests in the first place, and/or (b) starting the background writeback much more aggressively and earlier. - Ted From hannes@cmpxchg.org Sat Feb 28 10:30:10 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 478F37F3F for ; Sat, 28 Feb 2015 10:30:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 32C418F8039 for ; Sat, 28 Feb 2015 08:30:09 -0800 (PST) X-ASG-Debug-ID: 1425141006-04cbb0610f157040001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id MKMlzo6FiAetk289 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Feb 2015 08:30:08 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Sat, 28 Feb 2015 11:29:43 -0500 From: Johannes Weiner To: Dave Chinner Cc: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150228162943.GA17989@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150223004521.GK12722@dastard> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1425141007 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15981 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Mon, Feb 23, 2015 at 11:45:21AM +1100, Dave Chinner wrote: > On Sat, Feb 21, 2015 at 06:52:27PM -0500, Johannes Weiner wrote: > > On Fri, Feb 20, 2015 at 09:52:17AM +1100, Dave Chinner wrote: > > > I will actively work around aanything that causes filesystem memory > > > pressure to increase the chance of oom killer invocations. The OOM > > > killer is not a solution - it is, by definition, a loose cannon and > > > so we should be reducing dependencies on it. > > > > Once we have a better-working alternative, sure. > > Great, but first a simple request: please stop writing code and > instead start architecting a solution to the problem. i.e. we need a > design and have that documented before code gets written. If you > watched my recent LCA talk, then you'll understand what I mean > when I say: stop programming and start engineering. This code was for the sake of argument, see below. > > > I really don't care about the OOM Killer corner cases - it's > > > completely the wrong way line of development to be spending time on > > > and you aren't going to convince me otherwise. The OOM killer a > > > crutch used to justify having a memory allocation subsystem that > > > can't provide forward progress guarantee mechanisms to callers that > > > need it. > > > > We can provide this. Are all these callers able to preallocate? > > Anything that allocates in transaction context (and therefor is > GFP_NOFS by definition) can preallocate at transaction reservation > time. However, preallocation is dumb, complex, CPU and memory > intensive and will have a *massive* impact on performance. > Allocating 10-100 pages to a reserve which we will almost *never > use* and then free them again *on every single transaction* is a lot > of unnecessary additional fast path overhead. Hence a "preallocate > for every context" reserve pool is not a viable solution. You are missing the point of my question. Whether we allocate right away or make sure the memory is allocatable later on is a matter of cost, but the logical outcome is the same. That is not my concern right now. An OOM killer allows transactional allocation sites to get away without planning ahead. You are arguing that the OOM killer is a cop-out on the MM site but I see it as the opposite: it puts a lot of complexity in the allocator so that callsites can maneuver themselves into situations where they absolutely need to get memory - or corrupt user data - without actually making sure their needs will be covered. If we replace __GFP_NOFAIL + OOM killer with a reserve system, we are putting the full responsibility on the user. Are you sure this is going to reduce our kernel-wide error rate? > And, really, "reservation" != "preallocation". That's an implementation detail. Yes, the example implementation was dumb and heavy-handed, but a reservation system that works based on watermarks, and considers clean cache readily allocatable, is not much more complex than that. I'm trying to figure out if the current nofail allocators can get their memory needs figured out beforehand. And reliably so - what good are estimates that are right 90% of the time, when failing the allocation means corrupting user data? What is the contingency plan? From tytso@thunk.org Sat Feb 28 10:42:08 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 AA1227F3F for ; Sat, 28 Feb 2015 10:42:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 94D418F8040 for ; Sat, 28 Feb 2015 08:42:08 -0800 (PST) X-ASG-Debug-ID: 1425141725-04cbb0610f157330001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id agxTwnah2vPliSGs (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 28 Feb 2015 08:42:06 -0800 (PST) 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=gL7v0/cU6wWLO7k1uCud18m0RrPutmZ4XJTUIXQXj4Y=; b=GH7CRukjfTIX8TElTzfxIRftLxqSqeW9dJGtcqtapE3G+EzmftE3pi6kGHJywZWHHGIAA65GDzRiHgxjkpcKrioLTB+ySxIwbliKYCVYYwGLVWY7sI6r9YOpTO+ATezNzl+MSUJ9kbh30xgA8p/9v/Yhf2f3itcglOBBugN5mv4=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1YRkSl-0008NT-ID; Sat, 28 Feb 2015 16:41:59 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CB3A758037B; Sat, 28 Feb 2015 11:41:58 -0500 (EST) Date: Sat, 28 Feb 2015 11:41:58 -0500 From: Theodore Ts'o To: Johannes Weiner Cc: Dave Chinner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150228164158.GE5404@thunk.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150228162943.GA17989@phnom.home.cmpxchg.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150228162943.GA17989@phnom.home.cmpxchg.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1425141726 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15981 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Feb 28, 2015 at 11:29:43AM -0500, Johannes Weiner wrote: > > I'm trying to figure out if the current nofail allocators can get > their memory needs figured out beforehand. And reliably so - what > good are estimates that are right 90% of the time, when failing the > allocation means corrupting user data? What is the contingency plan? In the ideal world, we can figure out the exact memory needs beforehand. But we live in an imperfect world, and given that block devices *also* need memory, the answer is "of course not". We can't be perfect. But we can least give some kind of hint, and we can offer to wait before we get into a situation where we need to loop in GFP_NOWAIT --- which is the contingency/fallback plan. I'm sure that's not very satisfying, but it's better than what we have now. - Ted From vbabka@suse.cz Sat Feb 28 12:36:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 502807F4E for ; Sat, 28 Feb 2015 12:36:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3EE0E8F8040 for ; Sat, 28 Feb 2015 10:36:12 -0800 (PST) X-ASG-Debug-ID: 1425148566-04cbb0610d1594d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id UvGpXfMHp0jNjspj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Feb 2015 10:36:07 -0800 (PST) X-Barracuda-Envelope-From: vbabka@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 8C407ABED; Sat, 28 Feb 2015 18:36:04 +0000 (UTC) Message-ID: <54F20A93.6080704@suse.cz> Date: Sat, 28 Feb 2015 19:36:03 +0100 From: Vlastimil Babka User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: Dave Chinner , Johannes Weiner CC: Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? References: <201502092044.JDG39081.LVFOOtFHQFOMSJ@I-love.SAKURA.ne.jp> <201502102258.IFE09888.OVQFJOMSFtOLFH@I-love.SAKURA.ne.jp> <20150210151934.GA11212@phnom.home.cmpxchg.org> <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? In-Reply-To: <20150223004521.GK12722@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1425148567 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On 23.2.2015 1:45, Dave Chinner wrote: > On Sat, Feb 21, 2015 at 06:52:27PM -0500, Johannes Weiner wrote: >> On Fri, Feb 20, 2015 at 09:52:17AM +1100, Dave Chinner wrote: >>> I will actively work around aanything that causes filesystem memory >>> pressure to increase the chance of oom killer invocations. The OOM >>> killer is not a solution - it is, by definition, a loose cannon and >>> so we should be reducing dependencies on it. >> >> Once we have a better-working alternative, sure. > > Great, but first a simple request: please stop writing code and > instead start architecting a solution to the problem. i.e. we need a > design and have that documented before code gets written. If you > watched my recent LCA talk, then you'll understand what I mean > when I say: stop programming and start engineering. About that... I guess good engineering also means looking at past solutions to the same problem. I expect there would be a lot of academic work on this, which might tell us what's (not) possible. And maybe even actual implementations with real-life experience to learn from? >>> I really don't care about the OOM Killer corner cases - it's >>> completely the wrong way line of development to be spending time on >>> and you aren't going to convince me otherwise. The OOM killer a >>> crutch used to justify having a memory allocation subsystem that >>> can't provide forward progress guarantee mechanisms to callers that >>> need it. >> >> We can provide this. Are all these callers able to preallocate? > > Anything that allocates in transaction context (and therefor is > GFP_NOFS by definition) can preallocate at transaction reservation > time. However, preallocation is dumb, complex, CPU and memory > intensive and will have a *massive* impact on performance. > Allocating 10-100 pages to a reserve which we will almost *never > use* and then free them again *on every single transaction* is a lot > of unnecessary additional fast path overhead. Hence a "preallocate > for every context" reserve pool is not a viable solution. But won't even the reservation have potentially large impact on performance, if as you later suggest (IIUC), we don't actually dip into our reserves until regular reclaim starts failing? Doesn't that mean potentially lot of wasted memory? Right, it doesn't have to be if we allow clean reclaimable pages to be part of reserve, but still... > And, really, "reservation" != "preallocation". > > Maybe it's my filesystem background, but those to things are vastly > different things. > > Reservations are simply an *accounting* of the maximum amount of a > reserve required by an operation to guarantee forwards progress. In > filesystems, we do this for log space (transactions) and some do it > for filesystem space (e.g. delayed allocation needs correct ENOSPC > detection so we don't overcommit disk space). The VM already has > such concepts (e.g. watermarks and things like min_free_kbytes) that > it uses to ensure that there are sufficient reserves for certain > types of allocations to succeed. > > A reserve memory pool is no different - every time a memory reserve > occurs, a watermark is lifted to accommodate it, and the transaction > is not allowed to proceed until the amount of free memory exceeds > that watermark. The memory allocation subsystem then only allows > *allocations* marked correctly to allocate pages from that the > reserve that watermark protects. e.g. only allocations using > __GFP_RESERVE are allowed to dip into the reserve pool. > > By using watermarks, freeing of memory will automatically top > up the reserve pool which means that we guarantee that reclaimable > memory allocated for demand paging during transacitons doesn't > deplete the reserve pool permanently. As a result, when there is > plenty of free and/or reclaimable memory, the reserve pool > watermarks will have almost zero impact on performance and > behaviour. > > Further, because it's just accounting and behavioural thresholds, > this allows the mm subsystem to control how the reserve pool is > accounted internally. e.g. clean, reclaimable pages in the page > cache could serve as reserve pool pages as they can be immediately > reclaimed for allocation. This could be acheived by setting reclaim > targets first to the reserve pool watermark, then the second target > is enough pages to satisfy the current allocation. Hmm but what if the clean pages need us to take some locks to unmap and some proces holding them is blocked... Also we would need to potentally block a process that wants to dirty a page, is that being done now? > And, FWIW, there's nothing stopping this mechanism from have order > based reserve thresholds. e.g. IB could really do with a 64k reserve > pool threshold and hence help solve the long standing problems they > have with filling the receive ring in GFP_ATOMIC context... I don't know the details here, but if the allocation is done for incoming packets i.e. something you can't predict then how would you set the reserve for that? If they could predict, they would be able to preallocate necessary buffers already. > Sure, that's looking further down the track, but my point still > remains: we need a viable long term solution to this problem. Maybe > reservations are not the solution, but I don't see anyone else who > is thinking of how to address this architectural problem at a system > level right now. We need to design and document the model first, > then review it, then we can start working at the code level to > implement the solution we've designed. Right. A conference to discuss this on could come handy :) > Cheers, > > Dave. > From hannes@cmpxchg.org Sat Feb 28 16:16:16 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A7B27F4E for ; Sat, 28 Feb 2015 16:16:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 395A2304032 for ; Sat, 28 Feb 2015 14:16:12 -0800 (PST) X-ASG-Debug-ID: 1425161770-04cbb0610d15f660001-NocioJ Received: from gum.cmpxchg.org (gum.cmpxchg.org [85.214.110.215]) by cuda.sgi.com with ESMTP id bdfCzsFBfMDc0P6t (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Feb 2015 14:16:11 -0800 (PST) X-Barracuda-Envelope-From: hannes@cmpxchg.org X-Barracuda-Apparent-Source-IP: 85.214.110.215 Date: Sat, 28 Feb 2015 17:15:58 -0500 From: Johannes Weiner To: Theodore Ts'o Cc: Dave Chinner , Tetsuo Handa , mhocko@suse.cz, dchinner@redhat.com, linux-mm@kvack.org, rientjes@google.com, oleg@redhat.com, akpm@linux-foundation.org, mgorman@suse.de, torvalds@linux-foundation.org, xfs@oss.sgi.com Subject: Re: How to handle TIF_MEMDIE stalls? Message-ID: <20150228221558.GA23028@phnom.home.cmpxchg.org> X-ASG-Orig-Subj: Re: How to handle TIF_MEMDIE stalls? References: <201502111123.ICD65197.FMLOHSQJFVOtFO@I-love.SAKURA.ne.jp> <201502172123.JIE35470.QOLMVOFJSHOFFt@I-love.SAKURA.ne.jp> <20150217125315.GA14287@phnom.home.cmpxchg.org> <20150217225430.GJ4251@dastard> <20150219102431.GA15569@phnom.home.cmpxchg.org> <20150219225217.GY12722@dastard> <20150221235227.GA25079@phnom.home.cmpxchg.org> <20150223004521.GK12722@dastard> <20150228162943.GA17989@phnom.home.cmpxchg.org> <20150228164158.GE5404@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150228164158.GE5404@thunk.org> X-Barracuda-Connect: gum.cmpxchg.org[85.214.110.215] X-Barracuda-Start-Time: 1425161771 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Feb 28, 2015 at 11:41:58AM -0500, Theodore Ts'o wrote: > On Sat, Feb 28, 2015 at 11:29:43AM -0500, Johannes Weiner wrote: > > > > I'm trying to figure out if the current nofail allocators can get > > their memory needs figured out beforehand. And reliably so - what > > good are estimates that are right 90% of the time, when failing the > > allocation means corrupting user data? What is the contingency plan? > > In the ideal world, we can figure out the exact memory needs > beforehand. But we live in an imperfect world, and given that block > devices *also* need memory, the answer is "of course not". We can't > be perfect. But we can least give some kind of hint, and we can offer > to wait before we get into a situation where we need to loop in > GFP_NOWAIT --- which is the contingency/fallback plan. Overestimating should be fine, the result would a bit of false memory pressure. But underestimating and looping can't be an option or the original lockups will still be there. We need to guarantee forward progress or the problem is somewhat mitigated at best - only now with quite a bit more complexity in the allocator and the filesystems. The block code would have to be looked at separately, but doesn't it already use mempools etc. to guarantee progress? From gmartinova29@gmail.com Sat Feb 28 17:39:02 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.4 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,MIME_HTML_MOSTLY,PLING_QUERY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 828D07F4E for ; Sat, 28 Feb 2015 17:39:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62390304039 for ; Sat, 28 Feb 2015 15:38:59 -0800 (PST) X-ASG-Debug-ID: 1425166736-04cbb0610e160c30001-NocioJ Received: from nsv1795.vdsserver.net (nsv1795.vdsserver.net [93.89.239.75]) by cuda.sgi.com with ESMTP id NF8leeZIO742QfdG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Feb 2015 15:38:57 -0800 (PST) X-Barracuda-Envelope-From: gmartinova29@gmail.com X-Barracuda-Apparent-Source-IP: 93.89.239.75 Received: from localhost ([127.0.0.1]:44486 helo=Unknown) by nsv1795.vdsserver.net with esmtps (TLSv1.2:DHE-RSA-AES256-GCM-SHA384:256) (Exim 4.85) (envelope-from ) id 1YRqyA-00045g-Qf; Sun, 01 Mar 2015 01:38:51 +0200 Message-ID: <848137646FBB94E73B3E77C86CF77C60@gpltsgl> Reply-To: "gmartinova29@gmail.com" From: "gmartinova29@gmail.com" To: =?windows-1251?B?4cLC4eLCwg==?= Subject: =?windows-1251?B?x+Tw4OLx8uLz6fLlISDC4PEg6O3y5fDl8fP+?= =?windows-1251?B?8iDq6+jl7fLx6ujlIOHg5/sg5ODt7fv1Pw==?= Date: Sun, 1 Mar 2015 05:37:48 +0700 X-ASG-Orig-Subj: =?windows-1251?B?x+Tw4OLx8uLz6fLlISDC4PEg6O3y5fDl8fP+?= =?windows-1251?B?8iDq6+jl7fLx6ujlIOHg5/sg5ODt7fv1Pw==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1469_01D053E1.DA237C10" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - nsv1795.vdsserver.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: nsv1795.vdsserver.net: acl_c_authenticated_local_user: ruhsatk4 X-Barracuda-Connect: nsv1795.vdsserver.net[93.89.239.75] X-Barracuda-Start-Time: 1425166737 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.34 X-Barracuda-Spam-Status: No, SCORE=1.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, MIME_HTML_MOSTLY, PLING_QUERY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.15995 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_MESSAGE BODY: HTML included in message 1.33 PLING_QUERY Subject has exclamation mark and question mark 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1469_01D053E1.DA237C10 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable ------=_NextPart_000_1469_01D053E1.DA237C10 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C7=E4=F0=E0=E2=F1=F2=E2=F3= =E9=F2=E5! =C2=E0=F1 =E8=ED=F2=E5=F0=E5=F1=F3=FE=F2 =EA=EB=E8=E5=ED=F2=F1= =EA=E8=E5=20 =E1=E0=E7=FB =E4=E0=ED=ED=FB=F5?
------=_NextPart_000_1469_01D053E1.DA237C10-- From root@krios.tbi.univie.ac.at Sat Feb 28 23:25:12 2015 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A2E3A7F54 for ; Sat, 28 Feb 2015 23:25:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91CEA8F8039 for ; Sat, 28 Feb 2015 21:25:09 -0800 (PST) X-ASG-Debug-ID: 1425187506-04cb6c4bd314d0f0001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id zY4NO3eSZOezov93 for ; Sat, 28 Feb 2015 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 916515EC83; Sun, 1 Mar 2015 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 824005ED66; Sun, 1 Mar 2015 06:25:03 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20150301052503.824005ED66@krios.tbi.univie.ac.at> Date: Sun, 1 Mar 2015 06:25:03 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1425187506 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.16007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1